fix(agents): launch omp through its local CLI instead of the npx bridge - #855
Merged
Conversation
Migration 031 seeded omp as `npx -y @oh-my-pi/pi-coding-agent acp` with `binary_name: "omp"`, copying the shape the Registry-listed npx rows use. That shape does not fit omp, for two independent reasons. There is no Registry entry to conform to. Audited against the public ACP Registry catalogue, 11 of the 13 npx rows match their Registry entry's package and args exactly — for those, npx IS the vendor's declared ACP distribution and bridging is correct. omp and mimo-code are the only non-Registry builtins, so omp's bridge was chosen by analogy rather than from a declared distribution. And the package is not an adapter. `@oh-my-pi/pi-coding-agent` ships bin `omp`; `omp acp` is the vendor's own entrypoint, and the vendor also publishes standalone binaries. Meanwhile `binary_name: "omp"` already made a local `omp` on $PATH mandatory — `probe_resolved_command` fails the row with `PrimaryMissing` without one, and `cli_probe::validate_with_budget` already runs the local `omp --version`. So the bridge re-downloaded a CLI the user had to have installed before the row was even offered. Measured spawn to `initialize` response: 81.0s on a cold npx cache and 10.0s warm, against 0.7s for the local binary. The cold figure is from a fast link and exceeded the 30s handshake budget outright, which is the failure reported in iOfficeAI/AionUi#4009. 039 is written as an UPDATE of the launch columns rather than a re-seed: `agent_capabilities` and `auth_methods` hold what a live handshake learned on the user's install, and an `ON CONFLICT DO UPDATE` listing them resets that to an integration-time snapshot. An UPDATE cannot reach them at all. Version pinning follows the launch path off the bridge: the release-lock entry is dropped and the two lock-count assertions fall to 12, so omp now tracks the user's installed CLI exactly as qwen and agy do. The omp case leaves the npx migration test for a dedicated one, and the team-capability case moves out of that file's npx grouping. Refs iOfficeAI/AionUi#4009
kaizhou-lab
added a commit
that referenced
this pull request
Aug 14, 2026
…d versions (#859) ## Summary Scheduled ACP Registry version sync. Four npx pins drifted since #848, each backed by a fresh serial ACP probe of the exact pinned version. Lock-only change — four lines; no metadata, migration, or entrypoint edits, and no lock-derived test assertion embeds any of these versions. | backend | package | old → new | initialize | session/new | |---|---|---|---|---| | dimcode | `dimcode` | 0.3.12 → **0.3.13** | ok (agentInfo version 0.3.13) | auth required (`-32000`, "Provider credentials are required") | | dirac | `dirac-cli` | 0.4.35 → **0.4.36** | ok (agentInfo dirac 0.4.36) | success (modes plan/act) | | grok | `@xai-official/grok` | 1.0.3 → **1.0.4** | ok (protocolVersion 1) | auth required (`-32000`, "no auth method id provided") | | kilo | `@kilocode/cli` | 7.4.21 → **7.4.22** | ok (agentInfo Kilo 7.4.22) | success | All four meet the release-lock criterion: `initialize` succeeds and `session/new` either succeeds or returns a clearly classified authentication requirement. Probes ran serially with no inherited HOME or credentials. The other 7 Registry-pinned packages (autohand, codebuddy, deepagents, glm-acp-agent, nova, pi, sigit) match the snapshot exactly. Package names and entrypoint args are unchanged for all 11. Drifted but not upgraded: none. **Note on the manifest's shape, unrelated to this bump:** the lock now holds 12 entries rather than 13 — #855 moved `omp` off the npx bridge to its local CLI, so it no longer needs a pin. What remains is 11 Registry-pinned packages plus `mimo-code`, the one non-Registry builtin (no `registry_json_id`), which stays excluded from drift reconciliation. dimcode continues to self-report `agentInfo.title` as "DimAgent" while the public Registry card and CDN entry still say "DimCode" (`dimcode.dev` unchanged), so the seeded display name is untouched — same standing observation as #837/#848. ## Registry snapshot - Audit pinned to release tag [`v2026.08.14-ec4f9f7`](https://cdn.agentclientprotocol.com/registry/v1/v2026.08.14-ec4f9f7/registry.json) of `agentclientprotocol/registry`, fetched via the versioned CDN path for reproducibility. - No newly listed and no delisted agents versus the previous baseline (38 ids). ## Validation - `just migration-check` — pass - `just lint-fix` (`cargo fix` + `clippy --fix --workspace -D warnings`) — clean - `just fmt` — clean - **Local `cargo nextest` intentionally skipped, by standing policy for lock-only bumps** (established 2026-08-11; #810, #814, #822, #837 and #848 all merged green under it). The Test check on this PR is the authority for this change: the merge decision depends on CI rather than the local run, and this host's load only manufactures timeout-shaped test failures, which nothing in the local steps above is subject to. ## Logging No logging changes: lock-only version bumps; existing startup/session error paths already identify a failing agent by backend. Co-authored-by: zk <>
piorpua
pushed a commit
that referenced
this pull request
Aug 17, 2026
🤖 I have created a release *beep* *boop* --- ## [0.1.68](v0.1.67...v0.1.68) (2026-08-17) ### Features * **codex:** auto-name sessions and label command steps ([#868](#868)) ([7aedbbd](7aedbbd)) * **conversation:** mid-turn interjection — deliver messages while a turn is in flight ([#836](#836)) ([484327d](484327d)) ### Bug Fixes * **acp:** give a first-run npx agent room to install before initialize times out ([#854](#854)) ([f6131a4](f6131a4)) * **acp:** stop collapsing agent failures into an opaque -32603 ([#869](#869)) ([27fc006](27fc006)) * **agents:** launch omp through its local CLI instead of the npx bridge ([#855](#855)) ([13b5dd4](13b5dd4)) * **antigravity:** read the HTTP status before parsing the hook decision ([#867](#867)) ([60bab79](60bab79)) * **auth:** stop CSRF rejecting agy's PreToolUse callback ([#860](#860)) ([1d91312](1d91312)) * **runtime:** find agent CLIs installed by bun and by vendor installers ([#856](#856)) ([8881980](8881980)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Migration 031 seeded omp as
npx -y @oh-my-pi/pi-coding-agent acpwithbinary_name: "omp", copying the shape the Registry-listed npx rows use. That shape does not fit omp, and the row ended up paying both launch paths' costs while getting neither's benefit.There is no Registry entry to conform to. Audited against the public ACP Registry catalogue: 11 of the 13
command='npx'builtin rows match their Registry entry's package and args exactly.@autohandai/autohand-acp-y @autohandai/autohand-acp@tencent-ai/codebuddy-code--acp-y --package … codebuddy --acpdeepagents-acpdimcode acpdirac-cli --acpglm-acp-agent@xai-official/grok agent stdio@kilocode/cli acp@compass-ai/nova acppi-acp@smbcloud/sigitFor the 11, npx is the vendor's declared ACP distribution and bridging is correct — this PR does not touch them. omp is one of the two non-Registry builtins, so its bridge was chosen by analogy rather than from a declared distribution.
And the package is not an adapter.
@oh-my-pi/pi-coding-agentshipsbin: {omp: dist/cli.js};omp acpis the vendor's own entrypoint (packages/coding-agent/src/commands/acp.ts, built on@agentclientprotocol/sdk), and the vendor publishes standalone binaries per release. Contrastpi-acp("ACP adapter for pi coding agent") or@autohandai/autohand-acp("ACP adapter for the Autohand CLI"), wherebinary_namenames a different CLI the package wraps and the PATH gate is genuinely required.The local binary was already mandatory.
binary_name: "omp"makesprobe_resolved_commandfail the row withPrimaryMissingwhenompis absent, andcli_probe::validate_with_budgetalready runs the localomp --version. Confirmed on a simulated clean machine (HOMEpointed at an empty dir, minimalPATH):So the row required a local install, probed it, executed it — and then spawned a different copy through npx.
What that cost, spawn to
initializeresponse:81s on a fast link, against a 30s handshake budget — the failure reported in iOfficeAI/AionUi#4009.
What changed
039_omp_direct_cli_launch.sqlsetscommand='omp',args=["acp"],agent_source_info={"binary_name":"omp"}(bridge dropped). The release-lock entry goes with it, and the two lock-count assertions fall to 12.Written as an UPDATE, not a re-seed.
agent_capabilitiesandauth_methodshold what a live handshake learned on the user's own install; anON CONFLICT DO UPDATEthat lists them resets that to an integration-time snapshot (dead code on a fresh row, silent data loss on an existing one — the migration-023 shape). An UPDATE of the launch columns cannot reach those columns at all, so the guarantee is structural rather than review-dependent.Verification
Real-path check, doctor run from this branch's build against a freshly migrated DB:
Catalogue still 43 rows, availability unchanged at 41/2, and
pi/mimo-codestill resolve tonpx— the change is scoped to omp. Seeded row after 039:cargo test -p aionui-db -p aionui-runtime -p aionui-ai-agent— all green (331 / 12 suites / 939 + 38)cargo clippyon those three with-D warnings— cleancargo fmt --all -- --check— cleanjust migration-check— passedcommandwasSome("npx"); the lock still carried omp). The third test is a guard that passes before and after — its job is to catch a re-seed clobbering the probed handshake columns.nextestnot run (work-hours policy); CI's Test check is the authority.Trade-off
omp's version is no longer pinned by
acp-registry-npx-lock.json— it now tracks whatever the user has installed, exactly as the other direct-CLI builtins (qwen, agy) do. Version upkeep moves to theVERIFIED_*path.Not in scope
glm-acp-agentis a different shape again — a pure ACP package with no separate product CLI, whosebinary_namegate looks questionable but which should drop the gate, not go direct; left for its own change with its own evidence.platform_extra_bins()covers.cargo/bin,go/bin,.deno/bin,.local/bin,.volta/binand nvm — but not~/.bun/bin(where omp lands via bun) or~/.mimocode/bin(where mimo's own installer puts it). A user who follows the vendor's install and lacks that directory in their login-shell PATH still gets a hidden row. That is the broader half of AionUi#4009 proposal 1 and affects every agent, so it belongs in its own change.Migration number 039 is contested
039is currently claimed by three open PRs — this one, #644 (039_project_knowledge.sql) and #815 (039_user_scope_assistant_ids.sql) — and038is likewise claimed by #815, #644 and the sidebar stack. Whichever lands first takes the number; the others must rebase and rename.This is caught, not silent:
scripts/migration/check-immutability.shrejects duplicate numeric prefixes. Verified by putting both 039 files in a scratch checkout ofmain:(exit 1). So if another 039 merges first, this PR's CI turns red on rebase and the fix is a one-file rename — no risk of two different
039s reaching a release. Renumbering pre-emptively would not help: #644 also claims040and041.Closes iOfficeAI/AionUi#4009
Scope note on that link: the issue's timeout and npm-cache halves are covered (the first by #854, the second already shipped), and its primary ask — use the installed omp instead of forcing npx — is what this PR does. What it does NOT add is a scan of extra install locations such as
%LOCALAPPDATA%\omp: detection still goes through the app's resolved PATH, so an omp that is installed but not on PATH stays hidden. That gap is agent-agnostic and tracked separately.