chore: bump @earendil-works/pi to 0.81.1 (#2399)

## Summary
- Bump `@earendil-works/pi-ai` and `@earendil-works/pi-coding-agent`
from **0.80.10 → 0.81.1** (exact matched pins).
- Update `pnpm-workspace.yaml` overrides so floating `*` consumers
(`droid-cli`, `pi-llama-cpp`, runtime plugins) stay on the same
ModelRuntime surface.
- Refresh pin-guard tests, package-config assertions, and FNXC notes for
the new pin.

## What's new in pi 0.81.x
- Qwen Token Plan providers
- Expanded usage accounting (tools/compaction/branch summaries)
- Resilient compaction retries + retry lifecycle events
- Full provider-extension registration API
- Built-in llama.cpp router management
- Provider/catalog fixes (Bedrock env credentials, OpenAI Responses
early-stream retry, Codex 272K defaults, extension stream-fallback
restore)

## Test plan
- [x] `scripts/check-pi-versions-pinned` (4/4)
- [x] Typecheck: core, engine, dashboard, cli, pi-claude-cli
- [x] `package-config.test.ts` (35)
- [x] `provider-registration.test.ts` (14)
- [x] `auth-storage-concurrency` + `model-registry-refresh` (15)
- [x] `register-model-routes-kimi-k3-supplemental` (1)
- [ ] CI gate green
- [ ] Spot-check Anthropic OAuth + API key session
- [ ] Spot-check openai-codex model picker / supplemental models

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Updates**
  * Updated the bundled Pi runtime to version 0.81.1.
* Added support for newer models and providers, including Qwen Token
Plan.
  * Improved usage accounting and session reliability.
* Strengthened compaction retry handling and provider catalog accuracy.
  * Added support for the expanded maximum thinking level.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
gsxdsm
2026-07-22 01:32:14 -07:00
committed by GitHub
parent ddb5c5eca4
commit 241a5c94ea
15 changed files with 528 additions and 469 deletions

View File

@@ -0,0 +1,7 @@
---
"@runfusion/fusion": patch
---
summary: Bump the bundled pi runtime to 0.81.1 for newer models, providers, and session reliability.
category: internal
dev: Pins @earendil-works/pi-ai and @earendil-works/pi-coding-agent from 0.80.10 to 0.81.1 (exact matched set + pnpm-workspace overrides). Brings Qwen Token Plan, expanded usage accounting, resilient compaction retries, and provider/catalog fixes.

View File

@@ -64,8 +64,8 @@
}, },
"dependencies": { "dependencies": {
"@agentclientprotocol/sdk": "0.24.0", "@agentclientprotocol/sdk": "0.24.0",
"@earendil-works/pi-ai": "0.80.10", "@earendil-works/pi-ai": "0.81.1",
"@earendil-works/pi-coding-agent": "0.80.10", "@earendil-works/pi-coding-agent": "0.81.1",
"claude-code-cli-acp": "0.1.1", "claude-code-cli-acp": "0.1.1",
"dockerode": "^4.0.12", "dockerode": "^4.0.12",
"electron": "^33.4.11", "electron": "^33.4.11",

View File

@@ -56,7 +56,7 @@ function assertRuntimeDepsAreNotOptionalPeers(pkg: any, label: string): void {
for (const dependencyName of ["@earendil-works/pi-coding-agent", "@earendil-works/pi-ai"]) { for (const dependencyName of ["@earendil-works/pi-coding-agent", "@earendil-works/pi-ai"]) {
expect(dependencies, `${label}: ${dependencyName} must remain a required runtime dependency`).toHaveProperty( expect(dependencies, `${label}: ${dependencyName} must remain a required runtime dependency`).toHaveProperty(
dependencyName, dependencyName,
"0.80.10", "0.81.1",
); );
expect(dependencies[dependencyName], `${label}: ${dependencyName} must be a clean exact semver`).toMatch( expect(dependencies[dependencyName], `${label}: ${dependencyName} must be a clean exact semver`).toMatch(
EXACT_SEMVER, EXACT_SEMVER,

View File

@@ -46,7 +46,7 @@
"test:pg-gate": "vitest run --config vitest.pg.config.ts src/__tests__/postgres/handoff-to-review-atomicity.pg.test.ts src/__tests__/postgres/store-list.pg.test.ts src/__tests__/postgres/task-lifecycle-e2e.pg.test.ts src/__tests__/postgres/soft-delete-resurrection-FN-5233.pg.test.ts src/__tests__/postgres/agent-logs-and-monitor.pg.test.ts src/__tests__/postgres/todo-store.pg.test.ts src/__tests__/postgres/workflow-definitions.pg.test.ts src/__tests__/postgres/message-store.pg.test.ts src/__tests__/postgres/insight-store.pg.test.ts src/__tests__/postgres/insight-run-execution.pg.test.ts src/__tests__/postgres/research-store.pg.test.ts src/__tests__/postgres/mission-store.pg.test.ts src/__tests__/postgres/goal-store.pg.test.ts src/__tests__/postgres/artifacts-documents-evals.pg.test.ts src/__tests__/postgres/command-center-analytics.pg.test.ts src/__tests__/postgres/command-center-remaining-analytics.pg.test.ts src/__tests__/postgres/research-execution.pg.test.ts src/__tests__/postgres/async-store-events.pg.test.ts src/__tests__/postgres/signal-ingestion.pg.test.ts src/__tests__/postgres/mission-autopilot.pg.test.ts src/__tests__/postgres/workflow-create.pg.test.ts src/__tests__/postgres/monitor-trait-storm-guard.pg.test.ts src/__tests__/postgres/agent-wake-getagent.pg.test.ts --silent=passed-only --reporter=dot" "test:pg-gate": "vitest run --config vitest.pg.config.ts src/__tests__/postgres/handoff-to-review-atomicity.pg.test.ts src/__tests__/postgres/store-list.pg.test.ts src/__tests__/postgres/task-lifecycle-e2e.pg.test.ts src/__tests__/postgres/soft-delete-resurrection-FN-5233.pg.test.ts src/__tests__/postgres/agent-logs-and-monitor.pg.test.ts src/__tests__/postgres/todo-store.pg.test.ts src/__tests__/postgres/workflow-definitions.pg.test.ts src/__tests__/postgres/message-store.pg.test.ts src/__tests__/postgres/insight-store.pg.test.ts src/__tests__/postgres/insight-run-execution.pg.test.ts src/__tests__/postgres/research-store.pg.test.ts src/__tests__/postgres/mission-store.pg.test.ts src/__tests__/postgres/goal-store.pg.test.ts src/__tests__/postgres/artifacts-documents-evals.pg.test.ts src/__tests__/postgres/command-center-analytics.pg.test.ts src/__tests__/postgres/command-center-remaining-analytics.pg.test.ts src/__tests__/postgres/research-execution.pg.test.ts src/__tests__/postgres/async-store-events.pg.test.ts src/__tests__/postgres/signal-ingestion.pg.test.ts src/__tests__/postgres/mission-autopilot.pg.test.ts src/__tests__/postgres/workflow-create.pg.test.ts src/__tests__/postgres/monitor-trait-storm-guard.pg.test.ts src/__tests__/postgres/agent-wake-getagent.pg.test.ts --silent=passed-only --reporter=dot"
}, },
"devDependencies": { "devDependencies": {
"@earendil-works/pi-coding-agent": "0.80.10", "@earendil-works/pi-coding-agent": "0.81.1",
"@types/dockerode": "^3.3.41", "@types/dockerode": "^3.3.41",
"@types/node": "^25.5.0", "@types/node": "^25.5.0",
"@vitest/coverage-v8": "^4.1.0", "@vitest/coverage-v8": "^4.1.0",

View File

@@ -106,7 +106,7 @@
"@codemirror/state": "^6.5.2", "@codemirror/state": "^6.5.2",
"@codemirror/theme-one-dark": "^6.1.2", "@codemirror/theme-one-dark": "^6.1.2",
"@codemirror/view": "^6.36.4", "@codemirror/view": "^6.36.4",
"@earendil-works/pi-coding-agent": "0.80.10", "@earendil-works/pi-coding-agent": "0.81.1",
"@fusion-plugin-examples/claude-runtime": "workspace:*", "@fusion-plugin-examples/claude-runtime": "workspace:*",
"@fusion-plugin-examples/cli-printing-press": "workspace:*", "@fusion-plugin-examples/cli-printing-press": "workspace:*",
"@fusion-plugin-examples/compound-engineering": "workspace:*", "@fusion-plugin-examples/compound-engineering": "workspace:*",

View File

@@ -6,7 +6,7 @@ import { registerModelRoutes } from "../routes/register-model-routes.js";
/* /*
FNXC:ModelCatalog 2026-07-16-19:05: FNXC:ModelCatalog 2026-07-16-19:05:
FN-8180 requires Kimi K3 to reach both model-catalog consumers. This route-level FN-8180 requires Kimi K3 to reach both model-catalog consumers. This route-level
coverage uses pi 0.80.10's actual built-in ModelRuntime catalog after refresh, so an coverage uses pi 0.81.1's actual built-in ModelRuntime catalog after refresh, so an
SDK catalog regression cannot leave the Dashboard dropdown missing K3 while the engine SDK catalog regression cannot leave the Dashboard dropdown missing K3 while the engine
registry test remains green. registry test remains green.
*/ */

View File

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

View File

@@ -129,7 +129,7 @@ describe("seedDashboardProviders", () => {
it("keeps native Kimi K3 available through the installed pi model registry", async () => { it("keeps native Kimi K3 available through the installed pi model registry", async () => {
// FNXC:ModelCatalog 2026-07-16-19:05: FN-8180 requires catalog coverage to // FNXC:ModelCatalog 2026-07-16-19:05: FN-8180 requires catalog coverage to
// exercise pi's real 0.80.10 built-in registry, not a hand-written Kimi fixture. // exercise pi's real 0.81.1 built-in registry, not a hand-written Kimi fixture.
const modelRegistry = await createInMemoryModelRegistry(); const modelRegistry = await createInMemoryModelRegistry();
await modelRegistry.refresh(); await modelRegistry.refresh();

View File

@@ -224,9 +224,9 @@ plus a per-provider read-modify-merge (FileAuthStorageBackend.persistProviderCha
refreshOAuthTokenWithLock re-read the file under a lock and spread refreshOAuthTokenWithLock re-read the file under a lock and spread
{...currentData, [provider]: credential} rather than flushing a whole-file in-memory {...currentData, [provider]: credential} rather than flushing a whole-file in-memory
snapshot). packages/engine/package.json already floors this at snapshot). packages/engine/package.json already floors this at
"@earendil-works/pi-coding-agent": "^0.80.3" (caret bounds it to >=0.80.3 <0.81.0, which is "@earendil-works/pi-coding-agent": "0.81.1" (exact pin; locked per-provider merge requires
where this locked per-provider merge landed) — do not downgrade below 0.80.x, and re-verify >=0.80.3) — do not downgrade below 0.80.x, and re-verify this comment against
this comment against dist/core/auth-storage.js if the range is ever widened. See dist/core/auth-storage.js if the pin is ever lowered. See
packages/engine/src/__tests__/auth-storage-concurrency.test.ts for the regression coverage. packages/engine/src/__tests__/auth-storage-concurrency.test.ts for the regression coverage.
*/ */

View File

@@ -2534,9 +2534,15 @@ export async function createFnAgent(options: AgentOptions): Promise<AgentResult>
} }
/* /*
FNXC:ModelCatalog 2026-07-16-18:00: FNXC:ModelCatalog 2026-07-16-18:00:
pi 0.80.10's createAgentSession accepts an optional options parameter, but Fusion createAgentSession accepts an optional options parameter; Fusion constructs and augments
constructs and augments an options object before dispatch. Narrow away undefined so an options object before dispatch. Narrow away undefined so the ModelRuntime-capable SDK
the ModelRuntime-capable SDK contract remains type-safe as tool allowlists are added. contract remains type-safe as tool allowlists are added.
FNXC:ModelCatalog 2026-07-22-12:00:
Bumped @earendil-works/pi-ai and pi-coding-agent from 0.80.10 to 0.81.1 (exact matched pin).
0.81 adds full provider extensions, expanded usage accounting, Qwen Token Plan, llama.cpp
router management, and resilient compaction retries; Fusion session creation stays on the
ModelRuntime path already adopted in 0.80.8.
*/ */
const createSessionOptions: NonNullable<Parameters<typeof createAgentSession>[0]> = { const createSessionOptions: NonNullable<Parameters<typeof createAgentSession>[0]> = {
cwd: options.cwd, cwd: options.cwd,

View File

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

View File

@@ -6,7 +6,7 @@
* becomes high and high becomes max, leveraging their superior reasoning capability. * becomes high and high becomes max, leveraging their superior reasoning capability.
* *
* FNXC:DroidThinking 2026-07-16-18:20: * FNXC:DroidThinking 2026-07-16-18:20:
* Fusion now resolves pi 0.80.10 workspace-wide, whose ThinkingLevel adds `max`. * Fusion now resolves pi 0.81.1 workspace-wide, whose ThinkingLevel includes `max`.
* Keep both exhaustive mappings explicit: non-Opus must still avoid the CLI's max * Keep both exhaustive mappings explicit: non-Opus must still avoid the CLI's max
* effort, while Opus may use it. * effort, while Opus may use it.
* *

930
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -21,8 +21,10 @@ overrides:
# FNXC:ModelCatalog 2026-07-16-18:15: Keep floating @fusion/droid-cli and # FNXC:ModelCatalog 2026-07-16-18:15: Keep floating @fusion/droid-cli and
# @fusion/pi-llama-cpp imports on the ModelRuntime-capable pi SDK so the # @fusion/pi-llama-cpp imports on the ModelRuntime-capable pi SDK so the
# workspace cannot resolve conflicting pi type surfaces. # workspace cannot resolve conflicting pi type surfaces.
'@earendil-works/pi-ai': 0.80.10 # FNXC:ModelCatalog 2026-07-22-12:00: Bumped workspace override pin 0.80.10 → 0.81.1
'@earendil-works/pi-coding-agent': 0.80.10 # to match guarded package manifests (cli/core/engine/dashboard/pi-claude-cli).
'@earendil-works/pi-ai': 0.81.1
'@earendil-works/pi-coding-agent': 0.81.1
# FNXC:DesktopEmbeddedPostgres 2026-07-14-09:30: # FNXC:DesktopEmbeddedPostgres 2026-07-14-09:30:
# Desktop release jobs cross-build Intel and ARM64 artifacts on one host. Install # 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 # optional native payloads for both CPU families on the current OS so each

View File

@@ -7,8 +7,8 @@ import {
const pinnedManifest = { const pinnedManifest = {
dependencies: { dependencies: {
"@earendil-works/pi-ai": "0.80.10", "@earendil-works/pi-ai": "0.81.1",
"@earendil-works/pi-coding-agent": "0.80.10", "@earendil-works/pi-coding-agent": "0.81.1",
}, },
}; };
@@ -22,7 +22,7 @@ describe("check-pi-versions-pinned", () => {
}); });
it("rejects caret, tilde, wildcard, x, and comparator ranges", () => { it("rejects caret, tilde, wildcard, x, and comparator ranges", () => {
for (const version of ["^0.80.10", "~0.80.10", "*", "0.80.x", ">=0.80.10"]) { for (const version of ["^0.81.1", "~0.81.1", "*", "0.81.x", ">=0.81.1"]) {
const violations = validate({ const violations = validate({
...pinnedManifest, ...pinnedManifest,
dependencies: { ...pinnedManifest.dependencies, "@earendil-works/pi-ai": version }, dependencies: { ...pinnedManifest.dependencies, "@earendil-works/pi-ai": version },
@@ -34,7 +34,7 @@ describe("check-pi-versions-pinned", () => {
it("rejects a matched-set version mismatch", () => { it("rejects a matched-set version mismatch", () => {
const violations = validate({ const violations = validate({
...pinnedManifest, ...pinnedManifest,
dependencies: { ...pinnedManifest.dependencies, "@earendil-works/pi-coding-agent": "0.80.11" }, dependencies: { ...pinnedManifest.dependencies, "@earendil-works/pi-coding-agent": "0.81.2" },
}); });
assert.equal(violations.some((violation) => violation.includes("same exact version")), true); assert.equal(violations.some((violation) => violation.includes("same exact version")), true);
}); });