FN-9007: upgrade Pi runtime to 0.84.1

Upgrade the bundled Pi runtime closure to version 0.84.1.

- Pin direct and transitive Pi runtime packages to a coherent 0.84.1 closure.
- Adapt runtime interfaces and test assertions for Pi 0.84.1 behavior.
- Guard the added Pi client, protocol, and telemetry packages in desktop packaging checks.

Files changed:
 .changeset/fn-9007-pi-0-84-1.md                    |   7 +
 packages/cli/package.json                          |   4 +-
 packages/cli/src/__tests__/package-config.test.ts  |   6 +-
 packages/cli/vitest.config.ts                      |   2 +-
 packages/core/package.json                         |   2 +-
 packages/dashboard/package.json                    |   4 +-
 packages/dashboard/src/routes.ts                   |   6 +-
 packages/engine/package.json                       |   4 +-
 packages/engine/src/__tests__/pi.test.ts           |  45 ++--
 .../src/__tests__/provider-registration.test.ts    |   4 +-
 packages/engine/src/auth/auth-storage.ts           |  20 +-
 packages/engine/src/pi.ts                          |   5 +
 packages/pi-claude-cli/package.json                |   8 +-
 pnpm-lock.yaml                                     | 283 ++++++++++++---------
 pnpm-workspace.yaml                                |  14 +-
 .../__tests__/check-pi-versions-pinned.test.mjs    |  27 +-
 scripts/check-pi-versions-pinned.mjs               |   8 +
 17 files changed, 279 insertions(+), 170 deletions(-)

Fusion-Task-Id: FN-9007

Fusion-Task-Lineage: 89045e86-d4c8-4fc3-bbf6-5ba38fc786e7

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
This commit is contained in:
gsxdsm
2026-08-12 14:07:30 -07:00
parent 508ebc3812
commit c4467b0a5b
17 changed files with 279 additions and 170 deletions

View File

@@ -0,0 +1,7 @@
---
"@runfusion/fusion": patch
---
summary: Upgrade the bundled Pi runtime to 0.84.1 for updated provider and model support.
category: internal
dev: Advance the exact Pi closure from 0.82.1 to 0.84.1 and guard pi-client, pi-protocol, and pi-telemetry.

View File

@@ -67,8 +67,8 @@
"dependencies": {
"@agentclientprotocol/sdk": "0.24.0",
"agent-browser": "0.26.0",
"@earendil-works/pi-ai": "0.82.1",
"@earendil-works/pi-coding-agent": "0.82.1",
"@earendil-works/pi-ai": "0.84.1",
"@earendil-works/pi-coding-agent": "0.84.1",
"claude-code-cli-acp": "0.1.1",
"dockerode": "^4.0.12",
"electron": "^33.4.11",

View File

@@ -55,12 +55,12 @@ function assertRuntimeDepsAreNotOptionalPeers(pkg: any, label: string): void {
).not.toBe(true);
}
// FNXC:DesktopPackaging 2026-07-26-22:55: Exact matched Pi runtime pin — keep in sync with
// pnpm-workspace.yaml overrides and check-pi-versions-pinned.mjs (currently 0.82.1).
// FNXC:DesktopPackaging 2026-08-12-20:46: Exact matched Pi runtime pin — keep in sync with
// pnpm-workspace.yaml overrides and check-pi-versions-pinned.mjs (currently 0.84.1).
for (const dependencyName of ["@earendil-works/pi-coding-agent", "@earendil-works/pi-ai"]) {
expect(dependencies, `${label}: ${dependencyName} must remain a required runtime dependency`).toHaveProperty(
dependencyName,
"0.82.1",
"0.84.1",
);
expect(dependencies[dependencyName], `${label}: ${dependencyName} must be a clean exact semver`).toMatch(
EXACT_SEMVER,

View File

@@ -130,7 +130,7 @@ export default defineConfig({
alias: [
/*
FNXC:CliTests 2026-08-11-04:50:
pnpm resolves pi-coding-agent 0.82.1 into peer-hashed instances because dashboard pins zod
pnpm resolves pi-coding-agent 0.84.1 into peer-hashed instances because dashboard pins zod
^3.25.76 while CLI/engine use zod 4.x and different ws versions. vi.mock is resolved-path
scoped, so unify its exact package root here or CLI mocks silently miss dashboard/engine and
run the real pi runtime plus vendored pi-claude-cli. Keep this anchored root alias after any

View File

@@ -67,7 +67,7 @@
"test:unit-gate": "vitest run src/__tests__/task-merge.test.ts src/__tests__/legacy-adoption.test.ts src/__tests__/no-hardcoded-lifecycle-columns.test.ts src/__tests__/sync-workflow-ir-callsite-allowlist.test.ts --silent=passed-only --reporter=dot"
},
"devDependencies": {
"@earendil-works/pi-coding-agent": "0.82.1",
"@earendil-works/pi-coding-agent": "0.84.1",
"@types/dockerode": "^3.3.41",
"@types/node": "^25.5.0",
"@vitest/coverage-v8": "^4.1.10",

View File

@@ -108,7 +108,7 @@
"@codemirror/state": "^6.7.1",
"@codemirror/theme-one-dark": "^6.1.2",
"@codemirror/view": "^6.36.4",
"@earendil-works/pi-coding-agent": "0.82.1",
"@earendil-works/pi-coding-agent": "0.84.1",
"@fusion-plugin-examples/claude-runtime": "workspace:*",
"@fusion-plugin-examples/cli-printing-press": "workspace:*",
"@fusion-plugin-examples/compound-engineering": "workspace:*",
@@ -161,7 +161,7 @@
"sherpa-onnx-node": "1.13.4"
},
"devDependencies": {
"@earendil-works/pi-ai": "0.82.1",
"@earendil-works/pi-ai": "0.84.1",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.2",
"@testing-library/user-event": "^14.5.0",

View File

@@ -121,8 +121,12 @@ export interface ModelRegistryLike {
* FNXC:ModelCatalog 2026-07-16-17:55:
* pi 0.80.8 refreshes asynchronously, so the models endpoint must wait for it
* before reading getAvailable() and surface any refresh failure to the caller.
*
* FNXC:ModelCatalog 2026-08-12-20:46:
* Pi 0.84.1 returns refresh metadata instead of void. Preserve it as unknown because
* the route needs only completion while structural compatibility must track the SDK.
*/
refresh(): Promise<void>;
refresh(): Promise<unknown>;
/** Optional runtime passthrough lets request refreshes use the engine abort-aware path. */
modelRuntime?: {
refresh: (options?: { allowNetwork?: boolean; signal?: AbortSignal; force?: boolean }) => Promise<unknown>;

View File

@@ -38,8 +38,8 @@
"test:watch": "vitest src/__tests__/executor-*.test.ts --watch"
},
"dependencies": {
"@earendil-works/pi-ai": "0.82.1",
"@earendil-works/pi-coding-agent": "0.82.1",
"@earendil-works/pi-ai": "0.84.1",
"@earendil-works/pi-coding-agent": "0.84.1",
"@fusion/core": "workspace:*",
"@fusion/pi-claude-cli": "workspace:*",
"@modelcontextprotocol/sdk": "^1.0.0",

View File

@@ -892,9 +892,12 @@ describe("session failure diagnostics", () => {
it("forwards materialized MCP servers into session creation and prompt options for supported providers", async () => {
const createAgentSessionMock = vi.mocked(createAgentSession);
// FNXC:SessionIdentity 2026-08-12-20:46: createFnAgent wraps session.prompt to bind the
// request principal, so retain the original spy when asserting the prompt reaches Pi.
const prompt = vi.fn();
const session = {
model: { provider: "test", id: "primary-model" },
prompt: vi.fn(),
prompt,
subscribe: vi.fn(),
dispose: vi.fn(),
sessionFile: undefined,
@@ -916,14 +919,15 @@ describe("session failure diagnostics", () => {
await (created.session as any).promptWithFallback("Use docs");
expect(createAgentSessionMock.mock.calls[0]?.[0]).not.toHaveProperty("mcpServers");
expect(session.prompt).toHaveBeenCalledWith("Use docs", expect.objectContaining({ mcpServers }));
expect(prompt).toHaveBeenCalledWith("Use docs", expect.objectContaining({ mcpServers }));
});
it("skips MCP forwarding for unsupported mock provider and emits a content-free skip log", async () => {
const createAgentSessionMock = vi.mocked(createAgentSession);
const prompt = vi.fn();
const session = {
model: { provider: "test", id: "primary-model" },
prompt: vi.fn(),
prompt,
subscribe: vi.fn(),
dispose: vi.fn(),
sessionFile: undefined,
@@ -944,7 +948,7 @@ describe("session failure diagnostics", () => {
await (created.session as any).promptWithFallback("Use docs");
expect(createAgentSessionMock.mock.calls[0]?.[0]).not.toHaveProperty("mcpServers");
expect(session.prompt).toHaveBeenCalledWith("Use docs");
expect(prompt).toHaveBeenCalledWith("Use docs");
const skipLog = consoleErrorSpy.mock.calls.find(([message]) => String(message).includes("mcp.forwarding.skipped"));
expect(skipLog?.[0]).toContain('"skippedCount":1');
expect(skipLog?.[0]).toContain('"provider":"mock"');
@@ -1169,10 +1173,13 @@ describe("piLog structured diagnostics", () => {
it("throws a bounded fallback exhaustion error when prompt-time fallback also fails", async () => {
const createAgentSessionMock = vi.mocked(createAgentSession);
const onFallbackModelUsed = vi.fn();
const primaryPrompt = vi.fn().mockRejectedValue(new Error("429 Too Many Requests"));
const fallbackPrompt = vi.fn().mockRejectedValue(new Error("401 invalid api key for fallback"));
const primaryRetryPrompt = vi.fn().mockRejectedValue(new Error("429 Too Many Requests"));
const primarySession = {
model: { provider: "openai", id: "gpt-4o" },
prompt: vi.fn().mockRejectedValue(new Error("429 Too Many Requests")),
prompt: primaryPrompt,
subscribe: vi.fn(),
dispose: vi.fn(),
setThinkingLevel: vi.fn(),
@@ -1181,7 +1188,7 @@ describe("piLog structured diagnostics", () => {
const fallbackSession = {
model: { provider: "anthropic", id: "claude-3-5-haiku-20241022" },
prompt: vi.fn().mockRejectedValue(new Error("401 invalid api key for fallback")),
prompt: fallbackPrompt,
state: { errorMessage: "", messages: [] },
subscribe: vi.fn(),
dispose: vi.fn(),
@@ -1192,7 +1199,7 @@ describe("piLog structured diagnostics", () => {
createAgentSessionMock.mockReset();
const primaryRetrySession = {
model: { provider: "openai", id: "gpt-4o" },
prompt: vi.fn().mockRejectedValue(new Error("429 Too Many Requests")),
prompt: primaryRetryPrompt,
subscribe: vi.fn(), dispose: vi.fn(), setThinkingLevel: vi.fn(), sessionFile: undefined,
} as unknown as AgentSession;
createAgentSessionMock
@@ -1220,9 +1227,9 @@ describe("piLog structured diagnostics", () => {
});
expect(createAgentSessionMock).toHaveBeenCalledTimes(3);
expect(primarySession.prompt).toHaveBeenCalledTimes(1);
expect(fallbackSession.prompt).toHaveBeenCalledTimes(1);
expect(primaryRetrySession.prompt).toHaveBeenCalledTimes(1);
expect(primaryPrompt).toHaveBeenCalledTimes(1);
expect(fallbackPrompt).toHaveBeenCalledTimes(1);
expect(primaryRetryPrompt).toHaveBeenCalledTimes(1);
expect((createAgentSessionMock.mock.calls[2]?.[0] as any).model.id).toBe("gpt-4o");
expect(onFallbackModelUsed).toHaveBeenCalledTimes(1);
expect(onFallbackModelUsed).toHaveBeenCalledWith(expect.objectContaining({
@@ -1272,6 +1279,7 @@ describe("piLog structured diagnostics", () => {
const createAgentSessionMock = vi.mocked(createAgentSession);
const onFallbackModelUsed = vi.fn();
const primaryState = { errorMessage: "", messages: [] };
const fallbackPrompt = vi.fn().mockResolvedValue(undefined);
const modelAuthTierError =
"Codex error: 400 invalid_request_error — \"The 'gpt-5.3-codex' model is not supported when using Codex with a ChatGPT account.\"";
@@ -1289,7 +1297,7 @@ describe("piLog structured diagnostics", () => {
const fallbackSession = {
model: { provider: "test", id: "fallback-model" },
prompt: vi.fn().mockResolvedValue(undefined),
prompt: fallbackPrompt,
state: { errorMessage: "", messages: [] },
subscribe: vi.fn(),
dispose: vi.fn(),
@@ -1315,7 +1323,7 @@ describe("piLog structured diagnostics", () => {
await (session as any).promptWithFallback("prompt text");
expect(fallbackSession.prompt).toHaveBeenCalledWith("prompt text");
expect(fallbackPrompt).toHaveBeenCalledWith("prompt text");
expect(createAgentSessionMock).toHaveBeenCalledTimes(2);
expect(onFallbackModelUsed).toHaveBeenCalledWith(
expect.objectContaining({
@@ -1330,6 +1338,10 @@ describe("piLog structured diagnostics", () => {
const onFallbackModelUsed = vi.fn();
const sonnet5NotFoundError =
'Error: 404 {"type":"error","error":{"type":"not_found_error","message":"Not found"},"request_id":"req_011CcawcZ3Ra9CennJXM8oWC"}';
const sonnetPrompt = vi.fn(async () => {
throw new Error(sonnet5NotFoundError);
});
const fallbackPrompt = vi.fn(async (_prompt: string, _options?: unknown) => undefined);
createAgentSessionMock.mockReset();
createAgentSessionMock.mockImplementation(async (options: any) => {
@@ -1337,9 +1349,7 @@ describe("piLog structured diagnostics", () => {
return {
session: {
model: { provider: "anthropic", id: "claude-sonnet-5" },
prompt: vi.fn(async () => {
throw new Error(sonnet5NotFoundError);
}),
prompt: sonnetPrompt,
state: { errorMessage: "", messages: [] },
subscribe: vi.fn(),
dispose: vi.fn(),
@@ -1351,7 +1361,7 @@ describe("piLog structured diagnostics", () => {
return {
session: {
model: { provider: "zai", id: "glm-5.1" },
prompt: vi.fn(async (_prompt: string, _options?: unknown) => undefined),
prompt: fallbackPrompt,
state: { errorMessage: "", messages: [{ role: "assistant", content: "Fallback reply" }] },
subscribe: vi.fn(),
dispose: vi.fn(),
@@ -1374,9 +1384,8 @@ describe("piLog structured diagnostics", () => {
await expect((session as any).promptWithFallback("prompt text", { temperature: 0 })).resolves.toBeUndefined();
const fallbackPrompt = vi.mocked((session as any).prompt).mock;
expect(createAgentSessionMock).toHaveBeenCalledTimes(2);
expect(fallbackPrompt.calls).toEqual([["prompt text", { temperature: 0 }]]);
expect(fallbackPrompt).toHaveBeenCalledWith("prompt text", { temperature: 0 });
expect((session as any).state.errorMessage ?? "").toBe("");
expect(onFallbackModelUsed).toHaveBeenCalledWith(expect.objectContaining({
triggerPoint: "prompt-time",

View File

@@ -123,8 +123,8 @@ describe("seedDashboardProviders", () => {
});
it("keeps native Kimi K3 available through the installed pi model registry", async () => {
// FNXC:ModelCatalog 2026-07-24-12:00: FN-8564 keeps catalog coverage on Pi
// 0.82.0's real built-in registry, not a hand-written Kimi fixture.
// FNXC:ModelCatalog 2026-08-12-20:46: FN-9007 keeps catalog coverage on Pi
// 0.84.1's real built-in registry, not a hand-written Kimi fixture.
const modelRegistry = await createInMemoryModelRegistry();
await modelRegistry.refresh();

View File

@@ -364,19 +364,15 @@ FNXC:ProviderAuth 2026-07-07-00:00:
FN-7646: the cross-process ~/.fusion/agent/auth.json coordination invariant (concurrent
writers merge per-provider instead of clobbering each other's credentials) depends on the
vendored @earendil-works/pi-coding-agent AuthStorage backend using proper-lockfile locking
plus a per-provider read-modify-merge (FileAuthStorageBackend.persistProviderChange /
refreshOAuthTokenWithLock re-read the file under a lock and spread
{...currentData, [provider]: credential} rather than flushing a whole-file in-memory
snapshot). packages/engine/package.json already pins this at
"@earendil-works/pi-coding-agent": "0.82.1" (exact matched runtime pair; locked per-provider
merge requires >=0.80.3) — do not downgrade below 0.80.x, and re-verify this comment against
dist/core/auth-storage.js if the pin is ever lowered. See
FNXC:ProviderAuth 2026-07-24-12:00:
FN-8564 retains Fusion's credential-store adapter on Pi 0.82.x. The release adds Kimi Code and
OpenRouter OAuth, so new upstream login providers must still use the same queued, cross-process
credential persistence contract rather than bypassing Fusion auth storage.
plus a per-provider read-modify-merge. See
packages/engine/src/__tests__/auth-storage-concurrency.test.ts for the regression coverage.
FNXC:ProviderAuth 2026-08-12-20:46:
FN-9007 re-verified pi-coding-agent@0.84.1 dist/core/auth-storage.js: FileAuthStorageBackend's
proper-lockfile-guarded withLockAsync rereads auth.json and AuthStorage.modify merges
{ ...currentData, [provider]: next } before writing. This preserves the per-provider
read-modify-merge contract rather than flushing a whole-file in-memory snapshot as the
credential-store adapter handles new upstream providers.
*/
/*

View File

@@ -2705,6 +2705,11 @@ export async function createFnAgent(options: AgentOptions): Promise<AgentResult>
provider-verified reasoning levels and adds Kimi/OpenRouter OAuth plus constrained tools;
retain Fusion's ModelRuntime session construction and supplemental catalog merges rather
than duplicating upstream provider behavior.
FNXC:ModelCatalog 2026-08-12-20:46:
FN-9007 advances the exact matched Pi runtime closure from 0.82.1 to 0.84.1.
Keep constructing sessions through ModelRuntime so Fusion inherits the updated provider
catalog and SDK behavior without duplicating upstream runtime policy.
*/
const createSessionOptions: NonNullable<Parameters<typeof createAgentSession>[0]> = {
cwd: options.cwd,

View File

@@ -23,12 +23,12 @@
"@agentclientprotocol/sdk": "0.24.0"
},
"peerDependencies": {
"@earendil-works/pi-ai": "0.82.1",
"@earendil-works/pi-coding-agent": "0.82.1"
"@earendil-works/pi-ai": "0.84.1",
"@earendil-works/pi-coding-agent": "0.84.1"
},
"devDependencies": {
"@earendil-works/pi-ai": "0.82.1",
"@earendil-works/pi-coding-agent": "0.82.1",
"@earendil-works/pi-ai": "0.84.1",
"@earendil-works/pi-coding-agent": "0.84.1",
"@types/node": "^22.0.0",
"typescript": "^5.7.0",
"vitest": "^4.1.10"

283
pnpm-lock.yaml generated
View File

@@ -7,10 +7,13 @@ settings:
overrides:
'@types/node': ^25.5.2
protobufjs: ^7.5.8
'@earendil-works/pi-agent-core': 0.82.1
'@earendil-works/pi-ai': 0.82.1
'@earendil-works/pi-coding-agent': 0.82.1
'@earendil-works/pi-tui': 0.82.1
'@earendil-works/pi-agent-core': 0.84.1
'@earendil-works/pi-ai': 0.84.1
'@earendil-works/pi-client': 0.84.1
'@earendil-works/pi-coding-agent': 0.84.1
'@earendil-works/pi-protocol': 0.84.1
'@earendil-works/pi-telemetry': 0.84.1
'@earendil-works/pi-tui': 0.84.1
importers:
@@ -56,11 +59,11 @@ importers:
specifier: 0.24.0
version: 0.24.0(zod@4.4.3)
'@earendil-works/pi-ai':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)
'@earendil-works/pi-coding-agent':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)
agent-browser:
specifier: 0.26.0
version: 0.26.0
@@ -218,8 +221,8 @@ importers:
version: 2.9.0
devDependencies:
'@earendil-works/pi-coding-agent':
specifier: 0.82.1
version: 0.82.1
specifier: 0.84.1
version: 0.84.1
'@types/dockerode':
specifier: ^3.3.41
version: 3.3.47
@@ -267,8 +270,8 @@ importers:
specifier: ^6.36.4
version: 6.40.0
'@earendil-works/pi-coding-agent':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))(ws@8.21.1)(zod@3.25.76)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))(ws@8.21.1)(zod@3.25.76)
'@fusion-plugin-examples/claude-runtime':
specifier: workspace:*
version: link:../../plugins/fusion-plugin-claude-runtime
@@ -412,8 +415,8 @@ importers:
version: 3.25.76
devDependencies:
'@earendil-works/pi-ai':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))(ws@8.21.1)(zod@3.25.76)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))(ws@8.21.1)(zod@3.25.76)
'@testing-library/jest-dom':
specifier: ^6.9.1
version: 6.9.1
@@ -540,11 +543,11 @@ importers:
packages/droid-cli:
dependencies:
'@earendil-works/pi-ai':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@earendil-works/pi-coding-agent':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@fusion-plugin-examples/droid-runtime':
specifier: workspace:*
version: link:../../plugins/fusion-plugin-droid-runtime
@@ -562,11 +565,11 @@ importers:
packages/engine:
dependencies:
'@earendil-works/pi-ai':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@earendil-works/pi-coding-agent':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@fusion/core':
specifier: workspace:*
version: link:../core
@@ -680,11 +683,11 @@ importers:
version: 0.24.0(zod@4.4.3)
devDependencies:
'@earendil-works/pi-ai':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@earendil-works/pi-coding-agent':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@types/node':
specifier: ^25.5.2
version: 25.9.5
@@ -698,8 +701,8 @@ importers:
packages/pi-llama-cpp:
dependencies:
'@earendil-works/pi-coding-agent':
specifier: 0.82.1
version: 0.82.1
specifier: 0.84.1
version: 0.84.1
devDependencies:
'@types/node':
specifier: ^25.5.2
@@ -797,11 +800,11 @@ importers:
specifier: 0.24.0
version: 0.24.0(zod@4.4.3)
'@earendil-works/pi-ai':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@earendil-works/pi-coding-agent':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@fusion/core':
specifier: workspace:*
version: link:../../packages/core
@@ -847,11 +850,11 @@ importers:
specifier: 0.24.0
version: 0.24.0(zod@4.4.3)
'@earendil-works/pi-ai':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@earendil-works/pi-coding-agent':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@fusion/core':
specifier: workspace:*
version: link:../../packages/core
@@ -970,11 +973,11 @@ importers:
plugins/fusion-plugin-cursor-runtime:
dependencies:
'@earendil-works/pi-ai':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@earendil-works/pi-coding-agent':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@fusion/plugin-sdk':
specifier: workspace:*
version: link:../../packages/plugin-sdk
@@ -1026,11 +1029,11 @@ importers:
plugins/fusion-plugin-droid-runtime:
dependencies:
'@earendil-works/pi-ai':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@earendil-works/pi-coding-agent':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@fusion/plugin-sdk':
specifier: workspace:*
version: link:../../packages/plugin-sdk
@@ -1073,11 +1076,11 @@ importers:
specifier: 0.24.0
version: 0.24.0(zod@4.4.3)
'@earendil-works/pi-ai':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@earendil-works/pi-coding-agent':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@fusion/core':
specifier: workspace:*
version: link:../../packages/core
@@ -1157,11 +1160,11 @@ importers:
specifier: 0.24.0
version: 0.24.0(zod@4.4.3)
'@earendil-works/pi-ai':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@earendil-works/pi-coding-agent':
specifier: 0.82.1
version: 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
specifier: 0.84.1
version: 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@fusion/core':
specifier: workspace:*
version: link:../../packages/core
@@ -1845,22 +1848,34 @@ packages:
resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==}
engines: {node: '>=20.19.0'}
'@earendil-works/pi-agent-core@0.82.1':
resolution: {integrity: sha512-Z3kloziJIE2dmrisRckZX8zDca/gIv9/YdFAzeoqpHiLV2wsni6bL4hInNSjVKLbqT+4kqLIkph2JQLKvSepjg==}
'@earendil-works/pi-agent-core@0.84.1':
resolution: {integrity: sha512-evyzXYWCLQGmcaBYHlmSku02r8qoN4SGI60GZABo6iV+H+nqX+P9ud8fEZ4GmRq9mUSREvvfX+w9dA9ThF9C6w==}
engines: {node: '>=22.19.0'}
'@earendil-works/pi-ai@0.82.1':
resolution: {integrity: sha512-3WFYRhEp3lQB3444EhPMBcM7zSaEUE3eJgHOR7s4081NLqbw/FsWilIKWXSua0Gv3sRr7m9xMidR3pPDE7jI/A==}
'@earendil-works/pi-ai@0.84.1':
resolution: {integrity: sha512-wMsAdJMxuNri08vLqTyYVI201DQQezGhPSTkzYsHdw5dYX3rCNwEmSvpaAwhi7ELKI/2tE/CEgSWg/6iRxSgdQ==}
engines: {node: '>=22.19.0'}
hasBin: true
'@earendil-works/pi-coding-agent@0.82.1':
resolution: {integrity: sha512-zbkAhoIuDPMF3pKuja0ajZabrMWU29FUMV9A/XMXT/XC1yXs5xt6t6t13GogQFsDrDqbFP4DkZQO1w8rWRAzYA==}
'@earendil-works/pi-client@0.84.1':
resolution: {integrity: sha512-/V5hGHE4Zq+jG0GtwIB9PyBUOGd6gBLZ7lkQYFKchKnxYHeH3rmWC5xw4kpnZKKBuBuFTdLVbU9vEjlAGMMb2A==}
engines: {node: '>=22.19.0'}
'@earendil-works/pi-coding-agent@0.84.1':
resolution: {integrity: sha512-ncAqFrG+iybuPGOhMiZoEHkEzTpJgz3guYD32pD+M7ucc0WeHmauP6wa7qwP8V/KWvsZDVNa5XGsdZ7fkC7w7A==}
engines: {node: '>=22.19.0'}
hasBin: true
'@earendil-works/pi-tui@0.82.1':
resolution: {integrity: sha512-9yN8hALfKaxZq7n54EMxqhFCWnMi6LHkraMJ/1YjHiATq75XrI6XDMVppn9EDtiK7Fks8hUe1SDXUTrIvwRWfQ==}
'@earendil-works/pi-protocol@0.84.1':
resolution: {integrity: sha512-Ox1pciyeSPGEEUcxvR0/dJcrY7C6hrEGA8y71rOsvSIUlXN1Cbp/be/eoL71OGDBk5O97TeQPfWN6Ju/2Ehjww==}
engines: {node: '>=22.19.0'}
'@earendil-works/pi-telemetry@0.84.1':
resolution: {integrity: sha512-180/xGJtsq7IoR3p9EKWjRd0e9M4DkxInhlo9xyD7prDC7Qrhqq+nhvwrW0lFjPfXcEI2FSHmGCSyvSJE9GsaQ==}
engines: {node: '>=22.19.0'}
'@earendil-works/pi-tui@0.84.1':
resolution: {integrity: sha512-udeXFbgEhJ6JiB0uguwNVNkDy2FENfmtQwPcY+/iJ8GWeq18wkal1tKqa5YyeH0IqtX1vG0cGh8zfSYzyzVuLA==}
engines: {node: '>=22.19.0'}
'@electron/asar@3.4.1':
@@ -5371,6 +5386,10 @@ packages:
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
grok-mermaid@0.2.2:
resolution: {integrity: sha512-XcJEP5dDC8liHBh52mlLjU18fNvu1ckFsu0QpIG3+APZ270fsj9wxpiA6cOURmbUEuoMVgjbC2+UYgTdCqqgzA==}
engines: {node: '>=18'}
hachure-fill@0.5.2:
resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==}
@@ -7639,6 +7658,9 @@ packages:
typebox@1.1.38:
resolution: {integrity: sha512-pZ0aQPmMmXoUvSbeuWf/Hzsc+avNw/Zd6VeE8CFgkVGWyuHPJvqeJJDeJqLve+K70LvjYIoleGcoJHPT17cWoA==}
typebox@1.3.7:
resolution: {integrity: sha512-meKuifc33Pccx0O6PdIzYMq3Og8zvP4TIi/a+Bw3AEMZMxOD0+RHGQvpglEe6Zdy3wZ8nqn/j95h8LUZLk/6Hg==}
typedarray@0.0.6:
resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
@@ -7668,8 +7690,8 @@ packages:
resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==}
engines: {node: '>=20.18.1'}
undici@8.5.0:
resolution: {integrity: sha512-xamtWoB1EshgjpmlXd7GGm2VfdDtw1+rD8uhry8pSNW3If6S8E0m2T2+orSKeZXEn/aPJMviCpDBA65WJt8zhg==}
undici@8.9.0:
resolution: {integrity: sha512-aWZpUj7XoGonMClx4gdDRfgBjqeA+F473aDmROQQbM9n6PRfK/u1q/a0X4wMTgcHfT8H6fpbt98PFuDUwFg2YA==}
engines: {node: '>=22.19.0'}
unicorn-magic@0.3.0:
@@ -8806,12 +8828,13 @@ snapshots:
'@csstools/css-tokenizer@4.0.0': {}
'@earendil-works/pi-agent-core@0.82.1':
'@earendil-works/pi-agent-core@0.84.1':
dependencies:
'@earendil-works/pi-ai': 0.82.1
'@earendil-works/pi-ai': 0.84.1
'@earendil-works/pi-telemetry': 0.84.1
diff: 8.0.4
ignore: 7.0.5
typebox: 1.1.38
typebox: 1.3.7
yaml: 2.9.0
transitivePeerDependencies:
- '@modelcontextprotocol/sdk'
@@ -8821,12 +8844,13 @@ snapshots:
- ws
- zod
'@earendil-works/pi-agent-core@0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))(ws@8.21.1)(zod@3.25.76)':
'@earendil-works/pi-agent-core@0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))(ws@8.21.1)(zod@3.25.76)':
dependencies:
'@earendil-works/pi-ai': 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))(ws@8.21.1)(zod@3.25.76)
'@earendil-works/pi-ai': 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))(ws@8.21.1)(zod@3.25.76)
'@earendil-works/pi-telemetry': 0.84.1
diff: 8.0.4
ignore: 7.0.5
typebox: 1.1.38
typebox: 1.3.7
yaml: 2.9.0
transitivePeerDependencies:
- '@modelcontextprotocol/sdk'
@@ -8836,12 +8860,13 @@ snapshots:
- ws
- zod
'@earendil-works/pi-agent-core@0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)':
'@earendil-works/pi-agent-core@0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)':
dependencies:
'@earendil-works/pi-ai': 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)
'@earendil-works/pi-ai': 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)
'@earendil-works/pi-telemetry': 0.84.1
diff: 8.0.4
ignore: 7.0.5
typebox: 1.1.38
typebox: 1.3.7
yaml: 2.9.0
transitivePeerDependencies:
- '@modelcontextprotocol/sdk'
@@ -8851,12 +8876,13 @@ snapshots:
- ws
- zod
'@earendil-works/pi-agent-core@0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)':
'@earendil-works/pi-agent-core@0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)':
dependencies:
'@earendil-works/pi-ai': 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@earendil-works/pi-ai': 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@earendil-works/pi-telemetry': 0.84.1
diff: 8.0.4
ignore: 7.0.5
typebox: 1.1.38
typebox: 1.3.7
yaml: 2.9.0
transitivePeerDependencies:
- '@modelcontextprotocol/sdk'
@@ -8866,10 +8892,11 @@ snapshots:
- ws
- zod
'@earendil-works/pi-ai@0.82.1':
'@earendil-works/pi-ai@0.84.1':
dependencies:
'@anthropic-ai/sdk': 0.91.1
'@aws-sdk/client-bedrock-runtime': 3.1048.0
'@earendil-works/pi-telemetry': 0.84.1
'@google/genai': 1.52.0
'@mistralai/mistralai': 2.2.6(@opentelemetry/api@1.9.0)
'@opentelemetry/api': 1.9.0
@@ -8878,7 +8905,7 @@ snapshots:
https-proxy-agent: 7.0.6
openai: 6.26.0
partial-json: 0.1.7
typebox: 1.1.38
typebox: 1.3.7
transitivePeerDependencies:
- '@modelcontextprotocol/sdk'
- bufferutil
@@ -8887,10 +8914,11 @@ snapshots:
- ws
- zod
'@earendil-works/pi-ai@0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))(ws@8.21.1)(zod@3.25.76)':
'@earendil-works/pi-ai@0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))(ws@8.21.1)(zod@3.25.76)':
dependencies:
'@anthropic-ai/sdk': 0.91.1(zod@3.25.76)
'@aws-sdk/client-bedrock-runtime': 3.1048.0
'@earendil-works/pi-telemetry': 0.84.1
'@google/genai': 1.52.0(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))
'@mistralai/mistralai': 2.2.6(@opentelemetry/api@1.9.0)
'@opentelemetry/api': 1.9.0
@@ -8899,7 +8927,7 @@ snapshots:
https-proxy-agent: 7.0.6
openai: 6.26.0(ws@8.21.1)(zod@3.25.76)
partial-json: 0.1.7
typebox: 1.1.38
typebox: 1.3.7
transitivePeerDependencies:
- '@modelcontextprotocol/sdk'
- bufferutil
@@ -8908,10 +8936,11 @@ snapshots:
- ws
- zod
'@earendil-works/pi-ai@0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)':
'@earendil-works/pi-ai@0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)':
dependencies:
'@anthropic-ai/sdk': 0.91.1(zod@4.4.3)
'@aws-sdk/client-bedrock-runtime': 3.1048.0
'@earendil-works/pi-telemetry': 0.84.1
'@google/genai': 1.52.0(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))
'@mistralai/mistralai': 2.2.6(@opentelemetry/api@1.9.0)
'@opentelemetry/api': 1.9.0
@@ -8920,7 +8949,7 @@ snapshots:
https-proxy-agent: 7.0.6
openai: 6.26.0(ws@8.21.1)(zod@4.4.3)
partial-json: 0.1.7
typebox: 1.1.38
typebox: 1.3.7
transitivePeerDependencies:
- '@modelcontextprotocol/sdk'
- bufferutil
@@ -8929,10 +8958,11 @@ snapshots:
- ws
- zod
'@earendil-works/pi-ai@0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)':
'@earendil-works/pi-ai@0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)':
dependencies:
'@anthropic-ai/sdk': 0.91.1(zod@4.4.3)
'@aws-sdk/client-bedrock-runtime': 3.1048.0
'@earendil-works/pi-telemetry': 0.84.1
'@google/genai': 1.52.0(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))
'@mistralai/mistralai': 2.2.6(@opentelemetry/api@1.9.0)
'@opentelemetry/api': 1.9.0
@@ -8941,7 +8971,7 @@ snapshots:
https-proxy-agent: 7.0.6
openai: 6.26.0(ws@8.21.3)(zod@4.4.3)
partial-json: 0.1.7
typebox: 1.1.38
typebox: 1.3.7
transitivePeerDependencies:
- '@modelcontextprotocol/sdk'
- bufferutil
@@ -8950,16 +8980,23 @@ snapshots:
- ws
- zod
'@earendil-works/pi-coding-agent@0.82.1':
'@earendil-works/pi-client@0.84.1':
dependencies:
'@earendil-works/pi-agent-core': 0.82.1
'@earendil-works/pi-ai': 0.82.1
'@earendil-works/pi-tui': 0.82.1
'@earendil-works/pi-protocol': 0.84.1
'@earendil-works/pi-coding-agent@0.84.1':
dependencies:
'@earendil-works/pi-agent-core': 0.84.1
'@earendil-works/pi-ai': 0.84.1
'@earendil-works/pi-client': 0.84.1
'@earendil-works/pi-protocol': 0.84.1
'@earendil-works/pi-tui': 0.84.1
'@silvia-odwyer/photon-node': 0.3.4
chalk: 5.6.2
cross-spawn: 7.0.6
diff: 8.0.4
glob: 13.0.6
grok-mermaid: 0.2.2
highlight.js: 10.7.3
hosted-git-info: 9.0.3
ignore: 7.0.5
@@ -8967,8 +9004,8 @@ snapshots:
minimatch: 10.2.5
proper-lockfile: 4.1.2
semver: 7.8.0
typebox: 1.1.38
undici: 8.5.0
typebox: 1.3.7
undici: 8.9.0
yaml: 2.9.0
optionalDependencies:
'@mariozechner/clipboard': 0.3.9
@@ -8980,16 +9017,19 @@ snapshots:
- ws
- zod
'@earendil-works/pi-coding-agent@0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))(ws@8.21.1)(zod@3.25.76)':
'@earendil-works/pi-coding-agent@0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))(ws@8.21.1)(zod@3.25.76)':
dependencies:
'@earendil-works/pi-agent-core': 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))(ws@8.21.1)(zod@3.25.76)
'@earendil-works/pi-ai': 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))(ws@8.21.1)(zod@3.25.76)
'@earendil-works/pi-tui': 0.82.1
'@earendil-works/pi-agent-core': 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))(ws@8.21.1)(zod@3.25.76)
'@earendil-works/pi-ai': 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@3.25.76))(ws@8.21.1)(zod@3.25.76)
'@earendil-works/pi-client': 0.84.1
'@earendil-works/pi-protocol': 0.84.1
'@earendil-works/pi-tui': 0.84.1
'@silvia-odwyer/photon-node': 0.3.4
chalk: 5.6.2
cross-spawn: 7.0.6
diff: 8.0.4
glob: 13.0.6
grok-mermaid: 0.2.2
highlight.js: 10.7.3
hosted-git-info: 9.0.3
ignore: 7.0.5
@@ -8997,8 +9037,8 @@ snapshots:
minimatch: 10.2.5
proper-lockfile: 4.1.2
semver: 7.8.0
typebox: 1.1.38
undici: 8.5.0
typebox: 1.3.7
undici: 8.9.0
yaml: 2.9.0
optionalDependencies:
'@mariozechner/clipboard': 0.3.9
@@ -9010,16 +9050,19 @@ snapshots:
- ws
- zod
'@earendil-works/pi-coding-agent@0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)':
'@earendil-works/pi-coding-agent@0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)':
dependencies:
'@earendil-works/pi-agent-core': 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)
'@earendil-works/pi-ai': 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)
'@earendil-works/pi-tui': 0.82.1
'@earendil-works/pi-agent-core': 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)
'@earendil-works/pi-ai': 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.1)(zod@4.4.3)
'@earendil-works/pi-client': 0.84.1
'@earendil-works/pi-protocol': 0.84.1
'@earendil-works/pi-tui': 0.84.1
'@silvia-odwyer/photon-node': 0.3.4
chalk: 5.6.2
cross-spawn: 7.0.6
diff: 8.0.4
glob: 13.0.6
grok-mermaid: 0.2.2
highlight.js: 10.7.3
hosted-git-info: 9.0.3
ignore: 7.0.5
@@ -9027,8 +9070,8 @@ snapshots:
minimatch: 10.2.5
proper-lockfile: 4.1.2
semver: 7.8.0
typebox: 1.1.38
undici: 8.5.0
typebox: 1.3.7
undici: 8.9.0
yaml: 2.9.0
optionalDependencies:
'@mariozechner/clipboard': 0.3.9
@@ -9040,16 +9083,19 @@ snapshots:
- ws
- zod
'@earendil-works/pi-coding-agent@0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)':
'@earendil-works/pi-coding-agent@0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)':
dependencies:
'@earendil-works/pi-agent-core': 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@earendil-works/pi-ai': 0.82.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@earendil-works/pi-tui': 0.82.1
'@earendil-works/pi-agent-core': 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@earendil-works/pi-ai': 0.84.1(@modelcontextprotocol/sdk@1.28.0(zod@4.4.3))(ws@8.21.3)(zod@4.4.3)
'@earendil-works/pi-client': 0.84.1
'@earendil-works/pi-protocol': 0.84.1
'@earendil-works/pi-tui': 0.84.1
'@silvia-odwyer/photon-node': 0.3.4
chalk: 5.6.2
cross-spawn: 7.0.6
diff: 8.0.4
glob: 13.0.6
grok-mermaid: 0.2.2
highlight.js: 10.7.3
hosted-git-info: 9.0.3
ignore: 7.0.5
@@ -9057,8 +9103,8 @@ snapshots:
minimatch: 10.2.5
proper-lockfile: 4.1.2
semver: 7.8.0
typebox: 1.1.38
undici: 8.5.0
typebox: 1.3.7
undici: 8.9.0
yaml: 2.9.0
optionalDependencies:
'@mariozechner/clipboard': 0.3.9
@@ -9070,7 +9116,13 @@ snapshots:
- ws
- zod
'@earendil-works/pi-tui@0.82.1':
'@earendil-works/pi-protocol@0.84.1':
dependencies:
typebox: 1.3.7
'@earendil-works/pi-telemetry@0.84.1': {}
'@earendil-works/pi-tui@0.84.1':
dependencies:
get-east-asian-width: 1.6.0
marked: 18.0.5
@@ -9415,7 +9467,7 @@ snapshots:
google-auth-library: 10.9.0
p-retry: 4.6.2
protobufjs: 7.6.5
ws: 8.21.1
ws: 8.21.3
transitivePeerDependencies:
- bufferutil
- supports-color
@@ -9426,7 +9478,7 @@ snapshots:
google-auth-library: 10.9.0
p-retry: 4.6.2
protobufjs: 7.6.5
ws: 8.21.1
ws: 8.21.3
optionalDependencies:
'@modelcontextprotocol/sdk': 1.28.0(zod@3.25.76)
transitivePeerDependencies:
@@ -9439,7 +9491,7 @@ snapshots:
google-auth-library: 10.9.0
p-retry: 4.6.2
protobufjs: 7.6.5
ws: 8.21.1
ws: 8.21.3
optionalDependencies:
'@modelcontextprotocol/sdk': 1.28.0(zod@4.4.3)
transitivePeerDependencies:
@@ -9944,7 +9996,7 @@ snapshots:
'@mistralai/mistralai@2.2.6(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/semantic-conventions': 1.43.0
ws: 8.21.1
ws: 8.21.3
zod: 3.25.76
zod-to-json-schema: 3.25.2(zod@3.25.76)
optionalDependencies:
@@ -12683,6 +12735,8 @@ snapshots:
graceful-fs@4.2.11: {}
grok-mermaid@0.2.2: {}
hachure-fill@0.5.2: {}
happy-dom@20.10.1:
@@ -15322,6 +15376,8 @@ snapshots:
typebox@1.1.38: {}
typebox@1.3.7: {}
typedarray@0.0.6: {}
typescript-eslint@8.66.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3):
@@ -15345,7 +15401,7 @@ snapshots:
undici@7.29.0: {}
undici@8.5.0: {}
undici@8.9.0: {}
unicorn-magic@0.3.0: {}
@@ -15598,8 +15654,7 @@ snapshots:
ws@8.21.1: {}
ws@8.21.3:
optional: true
ws@8.21.3: {}
xml-name-validator@5.0.0: {}

View File

@@ -31,10 +31,16 @@ overrides:
# FNXC:DesktopPackaging 2026-07-26-22:55: Advance the matched closure 0.82.0 → 0.82.1 so
# electron-builder's production-dependency walk accepts pi-agent-core's pi-ai@^0.82.1 requirement
# (Desktop packaging PR-lane failure when deploy resolved a newer agent-core patch beside 0.82.0 ai).
'@earendil-works/pi-agent-core': 0.82.1
'@earendil-works/pi-ai': 0.82.1
'@earendil-works/pi-coding-agent': 0.82.1
'@earendil-works/pi-tui': 0.82.1
# FNXC:DesktopPackaging 2026-08-12-20:46: Advance the matched closure 0.82.1 → 0.84.1.
# pi-coding-agent@0.84.1 adds pi-client and pi-protocol while pi-ai@0.84.1 adds pi-telemetry;
# none were in the pre-bump lockfile, so pin every sibling for electron-builder's lockfile-free walk.
'@earendil-works/pi-agent-core': 0.84.1
'@earendil-works/pi-ai': 0.84.1
'@earendil-works/pi-client': 0.84.1
'@earendil-works/pi-coding-agent': 0.84.1
'@earendil-works/pi-protocol': 0.84.1
'@earendil-works/pi-telemetry': 0.84.1
'@earendil-works/pi-tui': 0.84.1
# FNXC:DesktopEmbeddedPostgres 2026-07-14-09:30:
# Desktop release jobs cross-build Intel and ARM64 artifacts on one host. Install
# optional native payloads for both CPU families on the current OS so each

View File

@@ -9,12 +9,12 @@ import {
/*
FNXC:DesktopPackaging 2026-07-26-22:55:
Fixture versions track the workspace's exact matched Pi runtime pin (currently 0.82.1).
Fixture versions track the workspace's exact matched Pi runtime pin (currently 0.84.1).
Keep these in sync when advancing overrides/manifests so the policy guard still exercises
matched-set and range rejection against the live pin surface.
*/
const PINNED_VERSION = "0.82.1";
const OTHER_VERSION = "0.82.0";
const PINNED_VERSION = "0.84.1";
const OTHER_VERSION = "0.84.0";
const pinnedManifest = {
dependencies: {
@@ -33,7 +33,7 @@ describe("check-pi-versions-pinned", () => {
});
it("rejects caret, tilde, wildcard, x, and comparator ranges", () => {
for (const version of [`^${PINNED_VERSION}`, `~${PINNED_VERSION}`, "*", "0.82.x", `>=${PINNED_VERSION}`]) {
for (const version of [`^${PINNED_VERSION}`, `~${PINNED_VERSION}`, "*", "0.84.x", `>=${PINNED_VERSION}`]) {
const violations = validate({
...pinnedManifest,
dependencies: { ...pinnedManifest.dependencies, "@earendil-works/pi-ai": version },
@@ -80,5 +80,24 @@ describe("check-pi-versions-pinned", () => {
.some((violation) => violation.includes("one exact version")),
true,
);
for (const packageName of [
"@earendil-works/pi-client",
"@earendil-works/pi-protocol",
"@earendil-works/pi-telemetry",
]) {
assert.equal(
validateWorkspaceOverrides({ ...coherentOverrides, [packageName]: undefined })
.some((violation) => violation.includes(packageName) && violation.includes("must be pinned")),
true,
`${packageName} must remain in the desktop closure`,
);
assert.equal(
validateWorkspaceOverrides({ ...coherentOverrides, [packageName]: OTHER_VERSION })
.some((violation) => violation.includes("one exact version")),
true,
`${packageName} must share the desktop closure pin`,
);
}
});
});

View File

@@ -22,11 +22,19 @@ The legacy desktop deploy resolves pi-coding-agent's transitive pi-mono ranges
without the workspace lockfile. Keep every Pi package in that staged runtime
closure on one exact override so a new agent-core or tui patch cannot be hoisted
beside older direct ai/coding-agent dependencies.
FNXC:DesktopPackaging 2026-08-12-20:46:
pi-coding-agent@0.84.1 transitively adds pi-client and pi-protocol while pi-ai
adds pi-telemetry. Guard these siblings too so electron-builder's lockfile-free
production walk cannot hoist them into a split Pi runtime closure.
*/
export const PI_RUNTIME_PACKAGES = [
"@earendil-works/pi-agent-core",
"@earendil-works/pi-ai",
"@earendil-works/pi-client",
"@earendil-works/pi-coding-agent",
"@earendil-works/pi-protocol",
"@earendil-works/pi-telemetry",
"@earendil-works/pi-tui",
];