From b281532092ad49316cbeb9207fb4dd810144c5e3 Mon Sep 17 00:00:00 2001 From: Omer Cohen <639682+omercnet@users.noreply.github.com> Date: Fri, 25 Sep 2026 10:35:51 +0000 Subject: [PATCH] fix(paseo-omp): require Paseo 0.9.2 provider fixes --- bun.lock | 48 +++++++++++----------- package.json | 10 ++--- paseo-omp/README.md | 6 +-- paseo-omp/SUPPORT.md | 4 +- paseo-omp/TESTING.md | 2 +- paseo-omp/canary/Dockerfile | 2 +- paseo-omp/canary/smoke.ts | 2 +- paseo-omp/docs/alpha-release-checklist.md | 2 +- paseo-omp/docs/installation.md | 4 +- paseo-omp/paseo-plugin.json | 2 +- paseo-omp/tests/provider-interrupt.test.ts | 36 ++++++++++++++++ paseo-omp/tests/server-bundle.test.ts | 6 +-- 12 files changed, 80 insertions(+), 44 deletions(-) diff --git a/bun.lock b/bun.lock index fd37e85b..3b537244 100644 --- a/bun.lock +++ b/bun.lock @@ -10,7 +10,7 @@ }, "agent-crew": { "name": "@omercnet/paseo-agent-crew", - "version": "0.3.0", + "version": "1.0.0", "devDependencies": { "@biomejs/biome": "catalog:", "@getpaseo/cli": "catalog:", @@ -31,7 +31,7 @@ }, "agent-monitor": { "name": "@omercnet/paseo-agent-monitor", - "version": "0.5.0", + "version": "1.0.0", "devDependencies": { "@biomejs/biome": "catalog:", "@getpaseo/cli": "catalog:", @@ -53,7 +53,7 @@ }, "context-mode": { "name": "@omercnet/paseo-context-mode", - "version": "0.1.0", + "version": "1.0.0", "dependencies": { "context-mode": "1.0.169", }, @@ -76,7 +76,7 @@ }, "fresh-worktrees": { "name": "@omercnet/paseo-fresh-worktrees", - "version": "1.2.1", + "version": "2.0.0", "devDependencies": { "@biomejs/biome": "catalog:", "@getpaseo/client": "catalog:", @@ -91,7 +91,7 @@ }, "paseo-beads": { "name": "@omercnet/paseo-beads", - "version": "0.2.0", + "version": "1.0.0", "devDependencies": { "@biomejs/biome": "catalog:", "@getpaseo/cli": "catalog:", @@ -112,7 +112,7 @@ }, "paseo-dracula": { "name": "@omercnet/paseo-dracula", - "version": "0.3.0", + "version": "1.0.0", "devDependencies": { "@biomejs/biome": "catalog:", "@getpaseo/client": "catalog:", @@ -127,7 +127,7 @@ }, "paseo-gas-city": { "name": "@omercnet/paseo-gas-city", - "version": "0.2.0", + "version": "1.0.0", "devDependencies": { "@biomejs/biome": "catalog:", "@getpaseo/cli": "catalog:", @@ -148,7 +148,7 @@ }, "paseo-omp": { "name": "@omercnet/paseo-omp", - "version": "0.4.0", + "version": "1.0.0", "dependencies": { "@getpaseo/protocol": "catalog:", "@modelcontextprotocol/sdk": "catalog:", @@ -178,7 +178,7 @@ }, "paseo-shared-browser": { "name": "@omercnet/paseo-shared-browser", - "version": "0.4.2", + "version": "1.0.0", "dependencies": { "@getpaseo/plugin": "catalog:", "@modelcontextprotocol/sdk": "catalog:", @@ -199,7 +199,7 @@ }, "pr-radar": { "name": "@omercnet/paseo-pr-radar", - "version": "0.4.1", + "version": "1.0.0", "devDependencies": { "@biomejs/biome": "catalog:", "@getpaseo/cli": "catalog:", @@ -220,7 +220,7 @@ }, "queens": { "name": "@omercnet/paseo-queens", - "version": "0.1.0", + "version": "1.0.0", "devDependencies": { "@biomejs/biome": "catalog:", "@getpaseo/plugin": "catalog:", @@ -235,7 +235,7 @@ }, "tell-agent": { "name": "@omercnet/paseo-tell-agent", - "version": "0.3.0", + "version": "1.0.0", "devDependencies": { "@biomejs/biome": "catalog:", "@getpaseo/client": "catalog:", @@ -253,11 +253,11 @@ }, "catalog": { "@biomejs/biome": "^2.5.10", - "@getpaseo/cli": "0.9.0", - "@getpaseo/client": "0.9.0", - "@getpaseo/plugin": "0.9.0", - "@getpaseo/protocol": "0.9.0", - "@getpaseo/server": "0.9.0", + "@getpaseo/cli": "0.9.2", + "@getpaseo/client": "0.9.2", + "@getpaseo/plugin": "0.9.2", + "@getpaseo/protocol": "0.9.2", + "@getpaseo/server": "0.9.2", "@modelcontextprotocol/sdk": "1.30.0", "@tanstack/react-query": "^5.102.3", "@types/node": "^24.10.1", @@ -455,19 +455,19 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g=="], - "@getpaseo/cli": ["@getpaseo/cli@0.9.0", "", { "dependencies": { "@clack/prompts": "^1.0.0", "@getpaseo/client": "0.9.0", "@getpaseo/protocol": "0.9.0", "@getpaseo/server": "0.9.0", "chalk": "^5.3.0", "commander": "^12.0.0", "mime-types": "^2.1.35", "tree-kill": "^1.2.2", "ws": "^8.14.2", "yaml": "^2.8.4", "zod": "^4.4.3" }, "bin": { "paseo": "bin/paseo" } }, "sha512-ARdG5pIP8a8TDj3voQ6ITLlmnyMlhDXSHimd0BfyaNh1ytXEvB0hQPQvncnsH7y5X30JSgVS5OESTIfwv2ZXLQ=="], + "@getpaseo/cli": ["@getpaseo/cli@0.9.2", "", { "dependencies": { "@clack/prompts": "^1.0.0", "@getpaseo/client": "0.9.2", "@getpaseo/protocol": "0.9.2", "@getpaseo/server": "0.9.2", "chalk": "^5.3.0", "commander": "^12.0.0", "mime-types": "^2.1.35", "tree-kill": "^1.2.2", "ws": "^8.14.2", "yaml": "^2.8.4", "zod": "^4.4.3" }, "bin": { "paseo": "bin/paseo" } }, "sha512-7ikeESKFNBnr6q5TanwNu1tc5WmXwKc9Q7xSfOjL6ts7o1CKIhBC0hj1Laud+c9uhbK13OyF47O1cViap+9cCQ=="], - "@getpaseo/client": ["@getpaseo/client@0.9.0", "", { "dependencies": { "@getpaseo/protocol": "0.9.0", "@getpaseo/relay": "0.9.0", "zod": "^4.4.3" } }, "sha512-NEYNV+dQhGZIz6pEALKBYn9RTXp/+K8uOAn1kEJ/TupCtHJb58HqgaVmlWgkuFhb5RVWNOHF67BZwF4lbXcrcg=="], + "@getpaseo/client": ["@getpaseo/client@0.9.2", "", { "dependencies": { "@getpaseo/protocol": "0.9.2", "@getpaseo/relay": "0.9.2", "zod": "^4.4.3" } }, "sha512-MvStNVcWF3JhEaCAOhrPQ5qaLQJtkz1bvPop+wp8npqHB0z2PjAwPMZUYP/2T3kWrZj2ukWmODxjihKnwd0qTQ=="], - "@getpaseo/highlight": ["@getpaseo/highlight@0.9.0", "", { "dependencies": { "@codemirror/language": "6.12.4", "@codemirror/legacy-modes": "^6.5.3", "@lezer/common": "^1.5.0", "@lezer/cpp": "^1.1.5", "@lezer/css": "^1.3.0", "@lezer/go": "^1.0.1", "@lezer/highlight": "^1.2.3", "@lezer/html": "^1.3.13", "@lezer/java": "^1.1.3", "@lezer/javascript": "^1.5.4", "@lezer/json": "^1.0.3", "@lezer/lr": "^1.4.8", "@lezer/markdown": "^1.6.2", "@lezer/php": "^1.0.5", "@lezer/python": "^1.1.18", "@lezer/rust": "^1.0.2", "@lezer/xml": "^1.0.6", "@lezer/yaml": "^1.0.4", "lezer-elixir": "^1.1.2" } }, "sha512-rPgBp6KvPr9aUi9/kvxI4S/hRTj5LwWJppITvZpRzbmmwQ6Pn6ht9i+uC1Z5C0Si/Fti/st5FnGFw4uD62A3Zg=="], + "@getpaseo/highlight": ["@getpaseo/highlight@0.9.2", "", { "dependencies": { "@codemirror/language": "6.12.4", "@codemirror/legacy-modes": "^6.5.3", "@lezer/common": "^1.5.0", "@lezer/cpp": "^1.1.5", "@lezer/css": "^1.3.0", "@lezer/go": "^1.0.1", "@lezer/highlight": "^1.2.3", "@lezer/html": "^1.3.13", "@lezer/java": "^1.1.3", "@lezer/javascript": "^1.5.4", "@lezer/json": "^1.0.3", "@lezer/lr": "^1.4.8", "@lezer/markdown": "^1.6.2", "@lezer/php": "^1.0.5", "@lezer/python": "^1.1.18", "@lezer/rust": "^1.0.2", "@lezer/xml": "^1.0.6", "@lezer/yaml": "^1.0.4", "lezer-elixir": "^1.1.2" } }, "sha512-VNHYq0dte+W0HmfEnXdPJyE2a9gtf/PXO2ntwbcW50TiGMjkJJB8ZRTsv7xJ7w2KfuJW0THsQ3YDmwevT2oz5g=="], - "@getpaseo/plugin": ["@getpaseo/plugin@0.9.0", "", { "dependencies": { "@agentclientprotocol/sdk": "^1.4.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@getpaseo/client": "0.9.0", "@getpaseo/protocol": "0.9.0", "react": "~19.1.0", "react-native": ">=0.81.5", "zod": "^4.4.3" }, "optionalPeers": ["react-native"] }, "sha512-Y2vf/prkaktql4rWB2TeoDDUyZyZvXVJAOBacgRHL/RfMSL7BZRPDhooVFIzDpF6S6mnP3lU3axTmiDxAavj+w=="], + "@getpaseo/plugin": ["@getpaseo/plugin@0.9.2", "", { "dependencies": { "@agentclientprotocol/sdk": "^1.4.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@getpaseo/client": "0.9.2", "@getpaseo/protocol": "0.9.2", "react": "~19.1.0", "react-native": ">=0.81.5", "zod": "^4.4.3" }, "optionalPeers": ["react-native"] }, "sha512-g10IFjhcAlws4udHhDUdR1TBIudzP1bNL9ixfMdezkU4HcHJbULhkEtZo/KP0WF/sL+w0UW/msawtzL++1neGQ=="], - "@getpaseo/protocol": ["@getpaseo/protocol@0.9.0", "", { "dependencies": { "semver": "^7.8.5", "zod": "^4.4.3" } }, "sha512-Ozzg8Wop6Ixm1z8iG4I3Moyx+WokUnfXhJEqnK5o510zi1fc0T3pLoen4tUbqsIfPvDg6a0VHq26ZgmBgNoBfQ=="], + "@getpaseo/protocol": ["@getpaseo/protocol@0.9.2", "", { "dependencies": { "semver": "^7.8.5", "zod": "^4.4.3" } }, "sha512-CGfyfqOVNxETLCgVhQGeaP6PtP17FvP5wBuRxmVQ+WIw3F/qCNju/a5aSDF+vbh+62Qf2qtha9MpQB9DrVJehA=="], - "@getpaseo/relay": ["@getpaseo/relay@0.9.0", "", { "dependencies": { "base64-js": "^1.5.1", "tweetnacl": "^1.0.3", "ws": "^8.14.2" } }, "sha512-9cjR/4VzZWy5V7aCu/iXZS4RzVvmUDf1keWLU5zSTQkwL48AMdOu7m524iI9sSLLcYWTV1A0h3QgPonwJeYvUg=="], + "@getpaseo/relay": ["@getpaseo/relay@0.9.2", "", { "dependencies": { "base64-js": "^1.5.1", "tweetnacl": "^1.0.3", "ws": "^8.14.2" } }, "sha512-jlnePwu5unMX04yWtvkY35bTi5yFZYfwlYPhVgwWxfEmFwGMJE4TgI62HO2bY9uS9GfehXIyn4wBmOvYPkNlwA=="], - "@getpaseo/server": ["@getpaseo/server@0.9.0", "", { "dependencies": { "@agentclientprotocol/sdk": "^0.17.1", "@anthropic-ai/claude-agent-sdk": "0.3.246", "@anthropic-ai/sdk": "^0.104.2", "@getpaseo/client": "0.9.0", "@getpaseo/highlight": "0.9.0", "@getpaseo/plugin": "0.9.0", "@getpaseo/protocol": "0.9.0", "@getpaseo/relay": "0.9.0", "@isaacs/ttlcache": "^2.1.4", "@modelcontextprotocol/sdk": "1.29.0", "@opencode-ai/sdk": "1.14.46", "@xterm/headless": "^6.0.0", "ai": "5.0.78", "ajv": "^8.20.0", "bcryptjs": "^3.0.3", "dotenv": "^17.2.3", "esbuild": "^0.25.12", "express": "^4.18.2", "fast-deep-equal": "^3.1.3", "lru-cache": "^11.5.1", "markdown-it": "^10.0.0", "mnemonic-id": "^3.2.7", "node-pty": "1.2.0-beta.15", "openai": "^6.44.0", "p-limit": "^7.3.0", "p-memoize": "^8.0.0", "p-throttle": "^8.1.0", "pino": "^10.2.0", "pino-pretty": "^13.1.3", "qrcode": "^1.5.4", "rotating-file-stream": "^3.2.9", "semver": "^7.8.5", "sherpa-onnx-node": "1.12.28", "strip-ansi": "^7.1.2", "tree-kill": "^1.2.2", "typescript": "^5.9.3", "uuid": "^9.0.1", "which": "^5.0.0", "ws": "^8.14.2", "zod": "^4.4.3" } }, "sha512-XfBsQh0MGRDZUCgVFONHJQGXkg8LC1l9wCFIxTbo1/Z4L/0h7P4Avr1SOoherx2x9EfoMofZqp8tHlCOlQpC6Q=="], + "@getpaseo/server": ["@getpaseo/server@0.9.2", "", { "dependencies": { "@agentclientprotocol/sdk": "^0.17.1", "@anthropic-ai/claude-agent-sdk": "0.3.246", "@anthropic-ai/sdk": "^0.104.2", "@getpaseo/client": "0.9.2", "@getpaseo/highlight": "0.9.2", "@getpaseo/plugin": "0.9.2", "@getpaseo/protocol": "0.9.2", "@getpaseo/relay": "0.9.2", "@isaacs/ttlcache": "^2.1.4", "@modelcontextprotocol/sdk": "1.29.0", "@opencode-ai/sdk": "1.14.46", "@xterm/headless": "^6.0.0", "ai": "5.0.78", "ajv": "^8.20.0", "bcryptjs": "^3.0.3", "dotenv": "^17.2.3", "esbuild": "^0.25.12", "express": "^4.18.2", "fast-deep-equal": "^3.1.3", "lru-cache": "^11.5.1", "markdown-it": "^10.0.0", "mnemonic-id": "^3.2.7", "node-pty": "1.2.0-beta.15", "openai": "^6.44.0", "p-limit": "^7.3.0", "p-memoize": "^8.0.0", "p-throttle": "^8.1.0", "pino": "^10.2.0", "pino-pretty": "^13.1.3", "qrcode": "^1.5.4", "rotating-file-stream": "^3.2.9", "semver": "^7.8.5", "sherpa-onnx-node": "1.12.28", "strip-ansi": "^7.1.2", "tree-kill": "^1.2.2", "typescript": "^5.9.3", "uuid": "^9.0.1", "which": "^5.0.0", "ws": "^8.14.2", "zod": "^4.4.3" } }, "sha512-9Rm6xIgEhD2XcWiWRyQgVVoOv9OPZ93hyoRrwI8ZEYJEtf0S71NfcEsOypYZFeha51bXPGW/zMACewQlVYGl/g=="], "@google-automations/git-file-utils": ["@google-automations/git-file-utils@3.2.1", "", { "dependencies": { "@octokit/rest": "^20.1.1", "minimatch": "^10.2.4" } }, "sha512-LYOjAnGu/xtEkYYh6W3/1RmeK9HB/fV+xMe7nHc+WiDYrnxAJWBfcyUucoJtYS8XAhVUzNWrQvYDPRbxe67DNQ=="], diff --git a/package.json b/package.json index 53d74413..624d793e 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,11 @@ ], "catalog": { "@biomejs/biome": "^2.5.10", - "@getpaseo/cli": "0.9.0", - "@getpaseo/client": "0.9.0", - "@getpaseo/plugin": "0.9.0", - "@getpaseo/protocol": "0.9.0", - "@getpaseo/server": "0.9.0", + "@getpaseo/cli": "0.9.2", + "@getpaseo/client": "0.9.2", + "@getpaseo/plugin": "0.9.2", + "@getpaseo/protocol": "0.9.2", + "@getpaseo/server": "0.9.2", "@modelcontextprotocol/sdk": "1.30.0", "@tanstack/react-query": "^5.102.3", "@types/node": "^24.10.1", diff --git a/paseo-omp/README.md b/paseo-omp/README.md index 0a3177f7..9d34e449 100644 --- a/paseo-omp/README.md +++ b/paseo-omp/README.md @@ -20,7 +20,7 @@ before capture. ## Quick start -Requirements: Paseo `^0.9.0`, OMP `18.1.15` or newer, and OMP RPC protocol v2. Paseo 0.9 is required for the Help report's supported copy and external-link APIs, nested provider-subagent ancestry, spawning-tool links, npm-managed installation, and the complete client integration. +Requirements: Paseo `^0.9.2`, OMP `18.1.15` or newer, and OMP RPC protocol v2. Paseo 0.9.2 is required for reliable plugin-provider request failure containment, reload cleanup, and daemon shutdown ordering, in addition to the 0.9 client APIs used by the plugin. ```bash paseo plugin install npm:@omercnet/paseo-omp@ @@ -50,7 +50,7 @@ Profile selection is request-local: concurrent clients cannot change each other' ## Paseo provider SDK coverage -This matrix inventories the complete capability set exported by the pinned `@getpaseo/plugin` 0.9.0 provider SDK. It measures strict SDK surface coverage, not general product quality. +This matrix inventories the complete capability set exported by the pinned `@getpaseo/plugin` 0.9.2 provider SDK. It measures strict SDK surface coverage, not general product quality. **Current capability completeness: 61.8%.** The provider advertises 11 of 17 capabilities (64.7%); ten are complete and `session.configure` is partial. @@ -113,7 +113,7 @@ Existing agents whose provider is `omp` remain owned by the bundled provider. Ne OMP `18.1.15` is the oldest version tested end to end. The direct provider's hard compatibility gate is `rpc-ui` protocol v2: metadata-free legacy ready frames and v1-only runtimes are rejected before a provider session opens because they cannot support the advertised persistence and conversation-rewind capabilities. Typed tool approvals remain capability-gated and fall back as described above. For terminal completion, a matching `agent_end.requestId` is authoritative and mismatches are ignored before state changes. Released OMP 18.2.x builds that omit that field use an ordered fallback requiring a fresh correlated native user entry followed by current-turn assistant activity, an idle non-compacting runtime, and no conflicting permission, tool, steer, or child-session work. Ambiguous events while OMP is active are ignored; unresolved ambiguity after confirmed idle fails only the Paseo turn. This trades a bounded residual same-agent stale-event risk for compatibility with released OMP instead of terminating and lazily restarting the runtime after every later prompt. Paseo clients, including mobile clients inside reconnect grace, do not own or terminate the daemon-managed OMP session. -Paseo 0.9.0 is the minimum supported release. The verified controlled canary evidence remains on the 0.9.0-beta.1 image, where the full Docker canary passed with OMP 18.1.15 and 18.2.0. That canary preserved nested provider-subagent ancestry and spawning-tool links, and validated npm-managed plugin sources, platform-owned external URL opening, and whole-item timeline transforms before Overview grouping. +Paseo 0.9.2 is the minimum supported release. The controlled Docker canary uses the pinned official 0.9.2 image; its compatibility matrix covers OMP 18.1.15 and 18.2.0. The canary preserves nested provider-subagent ancestry and spawning-tool links, and validates npm-managed plugin sources, platform-owned external URL opening, and whole-item timeline transforms before Overview grouping. Install, update, disable, or remove `paseo-omp` independently of the bundled provider. Verify the provider snapshot contains `omp-plugin` after installation; a bundled `omp` entry may remain present and is not modified by this plugin. diff --git a/paseo-omp/SUPPORT.md b/paseo-omp/SUPPORT.md index b0519594..223450f9 100644 --- a/paseo-omp/SUPPORT.md +++ b/paseo-omp/SUPPORT.md @@ -16,7 +16,7 @@ Do not put credentials, private repository paths, session transcripts, or unreda ## Supported versions -- Paseo: `^0.9.0` on both the daemon and every app loading the client entry. The 0.9 floor provides the supported plugin copy and external-link APIs as well as nested provider-subagent ancestry and spawning-tool links. +- Paseo: `^0.9.2` on both the daemon and every app loading the client entry. The 0.9.2 floor includes the plugin-provider request, reload-cleanup, and daemon-shutdown fixes required for reliable OMP provider operation. - OMP: `18.1.15` is the oldest supported release. The required full Docker canary passes with 18.1.15 and 18.2.0; the hard runtime contract remains `rpc-ui` protocol v2, not the version string alone. - Plugin release channel: alpha. Backward compatibility is best effort until stable `0.1.0`; every known migration requirement must be stated in the release notes. - Typed approvals: optional. When both peers negotiate `typedToolApprovals: 1`, the plugin uses typed tool permissions. Otherwise it retains the bounded generic extension-question flow. @@ -32,7 +32,7 @@ Do not put credentials, private repository paths, session transcripts, or unreda - `qwen2.5:0.5b` is provided only for free exploratory inference. It may ignore exact-output instructions and is not a deterministic protocol or tool-use oracle; use `canary-mock/Deterministic Canary` for assertions. - The deterministic mock does not implement OMP's compaction-summary contract, so `/compact` reports `OMP compaction failed` in the canary; compaction remains covered by protocol fixtures. - `/handoff` reports `OMP command failed` in the controlled canary even with deterministic role models configured; treat handoff as unavailable there until its native prerequisite is isolated. -- Paseo 0.9.0 or newer is required for platform-owned plugin URL opening and reliable image-card transformation before Overview grouping. +- Paseo 0.9.2 or newer is required for reliable plugin-provider lifecycle handling, platform-owned plugin URL opening, and image-card transformation before Overview grouping. - Native Fast mode and a first-class plan mode are not exposed. `/handoff` is implemented but is not reproducible in the controlled canary without its native OMP workflow prerequisites. - Terminal-started OMP sessions are discoverable and importable but are not registered automatically through a terminal hook. - Paseo clients do not own OMP sessions. Mobile or desktop disconnects remain subject to Paseo's reconnect grace while the daemon-owned provider and OMP child continue independently; reconnecting can reveal an existing turn but does not transfer or sever runtime ownership. diff --git a/paseo-omp/TESTING.md b/paseo-omp/TESTING.md index 111eae30..9ada2c2d 100644 --- a/paseo-omp/TESTING.md +++ b/paseo-omp/TESTING.md @@ -1,6 +1,6 @@ # OMP provider parity audit -Validated against the Paseo plugin SDK versions pinned in `package.json` and the real OMP compatibility matrix: high-use historical releases 17.2.15, 17.3.4, 18.0.11, and 18.1.10; minimum supported release 18.1.15; latest published 18.1 patch 18.1.22; and current release 18.2.0. On 2026-09-18, the full controlled canary passed against OMP 18.1.15 and 18.2.0 on official Paseo image `0.9.0-beta.1@sha256:f75a0eb3547ad3cc6bbdeaa7277d2d50eb4d06a9dd669d480371d7adf1c911b5`. +Validated against the Paseo plugin SDK versions pinned in `package.json` and the real OMP compatibility matrix: high-use historical releases 17.2.15, 17.3.4, 18.0.11, and 18.1.10; minimum supported release 18.1.15; latest published 18.1 patch 18.1.22; and current release 18.2.0. The full controlled canary is pinned to official Paseo image `0.9.2@sha256:d413ff361bc4018d559da3d517a6d5a9eaca721fbb1b71ae8df3dcf7a965c136`; the required canary matrix validates OMP 18.1.15 and 18.2.0. Classifications: diff --git a/paseo-omp/canary/Dockerfile b/paseo-omp/canary/Dockerfile index 4f3aa10a..57cf94af 100644 --- a/paseo-omp/canary/Dockerfile +++ b/paseo-omp/canary/Dockerfile @@ -12,7 +12,7 @@ RUN tarball="$(mktemp /tmp/paseo-omp-XXXXXX.tgz)" && \ cd /opt/paseo-omp && \ bun install --production --ignore-scripts -FROM ghcr.io/getpaseo/paseo:0.9.0-beta.1@sha256:f75a0eb3547ad3cc6bbdeaa7277d2d50eb4d06a9dd669d480371d7adf1c911b5 +FROM ghcr.io/getpaseo/paseo:0.9.2@sha256:d413ff361bc4018d559da3d517a6d5a9eaca721fbb1b71ae8df3dcf7a965c136 ARG TARGETARCH ARG OMP_VERSION=18.1.15 diff --git a/paseo-omp/canary/smoke.ts b/paseo-omp/canary/smoke.ts index 5c5f7ad4..58fb0078 100644 --- a/paseo-omp/canary/smoke.ts +++ b/paseo-omp/canary/smoke.ts @@ -32,7 +32,7 @@ async function connectCanaryClient(): Promise { password, clientId: `paseo-omp-canary-${randomUUID()}`, clientType: "cli", - appVersion: "0.9.0-beta.1", + appVersion: "0.9.2", reconnect: { enabled: false }, }); try { diff --git a/paseo-omp/docs/alpha-release-checklist.md b/paseo-omp/docs/alpha-release-checklist.md index ff5f4972..68332be4 100644 --- a/paseo-omp/docs/alpha-release-checklist.md +++ b/paseo-omp/docs/alpha-release-checklist.md @@ -7,7 +7,7 @@ This checklist prepares `paseo-omp-v0.1.0-alpha.1`. It does not authorize public - [ ] Release Please proposes `0.1.0-alpha.1` from manifest version `0.0.0`. - [ ] Package and tag names are `@omercnet/paseo-omp` and `paseo-omp-v0.1.0-alpha.1`. - [ ] Provider identity remains `omp-plugin`; bundled `omp` remains independent and enabled or disabled by the user. -- [ ] Paseo requirement remains the reviewed range, currently `^0.9.0`. +- [ ] Paseo requirement remains the reviewed range, currently `^0.9.2`. - [ ] Minimum tested OMP version, checksum, CI job, README, SUPPORT, and TESTING agree. ## Required gates diff --git a/paseo-omp/docs/installation.md b/paseo-omp/docs/installation.md index e4a24cfe..f69021bd 100644 --- a/paseo-omp/docs/installation.md +++ b/paseo-omp/docs/installation.md @@ -4,7 +4,7 @@ Paseo plugins are trusted, unsandboxed code. Review this plugin and its package ## Requirements -- Paseo daemon and apps: `^0.9.0`; the 0.9 floor provides the supported plugin copy and external-link APIs, nested provider-subagent ancestry, and spawning-tool links +- Paseo daemon and apps: `^0.9.2`; the 0.9.2 floor includes the plugin-provider request, reload-cleanup, and daemon-shutdown fixes required for reliable OMP provider operation - OMP: `18.1.15` or newer is the supported floor - OMP RPC: protocol v2 must negotiate successfully @@ -12,7 +12,7 @@ The first public build is an alpha. Alpha releases are compatibility previews an ## Install or update from npm on Paseo 0.9 -Paseo 0.9.0 can acquire the published package directly from npm on the daemon host: +Paseo 0.9.2 can acquire the published package directly from npm on the daemon host: ```bash paseo plugin install npm:@omercnet/paseo-omp@ diff --git a/paseo-omp/paseo-plugin.json b/paseo-omp/paseo-plugin.json index 79a51dd2..10570dde 100644 --- a/paseo-omp/paseo-plugin.json +++ b/paseo-omp/paseo-plugin.json @@ -1,6 +1,6 @@ { "id": "paseo-omp", "description": "Paseo integration for OMP, including its direct provider and workspace tooling.", - "requirements": { "paseo": "^0.9.0" }, + "requirements": { "paseo": "^0.9.2" }, "build": [["node", "scripts/prepare-dependencies.mjs"]] } diff --git a/paseo-omp/tests/provider-interrupt.test.ts b/paseo-omp/tests/provider-interrupt.test.ts index d5902935..88176138 100644 --- a/paseo-omp/tests/provider-interrupt.test.ts +++ b/paseo-omp/tests/provider-interrupt.test.ts @@ -69,6 +69,42 @@ describe("OMP direct provider", () => { ); await connection.close(); }); + test("settles Stop after the OMP runtime exits", async () => { + const { connection, events, runtime } = await createHarness(); + await openSession(connection, events); + const turnId = turnIdFrom(await startPrompt(connection, events, "runtime-exit-stop", "work")); + const session = sessionAt(runtime); + + session.emit({ type: "process_exit", error: "OMP exited" }); + await events.waitFor( + (event) => + event.type === "session.turn" && event.turnId === turnId && event.state === "failed", + ); + await connection.send({ + type: "session.interrupt", + requestId: "stop-after-runtime-exit", + sessionId: "session-1", + }); + await expect( + events.waitFor( + (event) => + event.type === "request.completed" && event.requestId === "stop-after-runtime-exit", + ), + ).resolves.toEqual(expect.objectContaining({ type: "request.completed" })); + + expect( + events.filter( + (event) => + event.type === "session.turn" && event.turnId === turnId && event.state !== "started", + ), + ).toEqual([expect.objectContaining({ state: "failed" })]); + expect( + events.some( + (event) => event.type === "request.failed" && event.requestId === "stop-after-runtime-exit", + ), + ).toBe(false); + await connection.close(); + }); test("keeps a genuine native failure failed and allows a later turn", async () => { const { connection, events, runtime } = await createHarness(); await openSession(connection, events); diff --git a/paseo-omp/tests/server-bundle.test.ts b/paseo-omp/tests/server-bundle.test.ts index ae3fd2e2..bdd39cb7 100644 --- a/paseo-omp/tests/server-bundle.test.ts +++ b/paseo-omp/tests/server-bundle.test.ts @@ -81,13 +81,13 @@ async function supportReportFromBundle(entryPath: string): Promise { } describe("plugin server bundle", () => { - test("declares the supported Paseo 0.9 manifest contract", async () => { + test("declares the supported Paseo 0.9.2 manifest contract", async () => { const manifest = JSON.parse(await readFile(join(pluginRoot, "paseo-plugin.json"), "utf8")); expect(manifest).toEqual({ id: "paseo-omp", description: "Paseo integration for OMP, including its direct provider and workspace tooling.", - requirements: { paseo: "^0.9.0" }, + requirements: { paseo: "^0.9.2" }, build: [["node", "scripts/prepare-dependencies.mjs"]], }); const packageManifest = JSON.parse(await readFile(join(pluginRoot, "package.json"), "utf8")); @@ -98,7 +98,7 @@ describe("plugin server bundle", () => { await readFile(join(pluginRoot, "server", "provider", "omp-rpc.ts"), "utf8"), ).not.toContain("@oh-my-pi/"); expect(packageManifest.files).not.toContain("tests"); - expect(await readFile(join(pluginRoot, "README.md"), "utf8")).toContain("Paseo `^0.9.0`"); + expect(await readFile(join(pluginRoot, "README.md"), "utf8")).toContain("Paseo `^0.9.2`"); const releaseConfig = JSON.parse( await readFile(join(pluginRoot, "..", "release-please-config.json"), "utf8"), ) as { packages: Record };