When the ACP adapter binary is found but the underlying CLI is missing
(e.g. codex-acp installed without codex), classify_provider now returns
CliMissing instead of Available. The adapter can't function without the
CLI, so Doctor shows an amber warning with an Install button that will
set up the missing CLI.
Re-run button now clears the binary resolve cache so it actually
re-probes the filesystem instead of returning stale cached results.
Replace global AtomicBool install guard with per-provider
Mutex<HashSet<String>> so concurrent installs for different providers
(e.g. claude + codex) can proceed in parallel.
Add codex CLI install command (npm install -g @openai/codex) so
clicking Install when both CLI and adapter are missing installs both.
Compute install_hint dynamically based on availability state so the
UI accurately describes what the Install button will do.
Goose has native ACP support (no separate adapter), so the install
script belongs in cli_install_commands, not adapter_install_commands.
Also sets underlying_cli to "goose" since the CLI binary exists.
Codex ACP adapter is available on npm as @zed-industries/codex-acp —
enable auto-install and point docs link to the actual adapter repo
instead of the main Codex repo.
Tauri does not open external URLs via <a target="_blank"> — the click
is silently swallowed. Use openUrl() from @tauri-apps/plugin-opener
which correctly dispatches to the system default browser.
Replace window.open() with <a target="_blank"> for "View instructions"
links — Tauri blocks window.open but handles anchor tags correctly.
Fix Claude Code adapter install command: the package is
@agentclientprotocol/claude-agent-acp (not @anthropic-ai/claude-agent-acp
which doesn't exist on npm).
Strip NPM_CONFIG_PREFIX, NPM_CONFIG_CACHE, and COREPACK_HOME from the
install subprocess environment so npm uses the user's normal registry
rather than inheriting hermit's project-local Artifactory proxy config.
The onboarding E2E test passed `{ acpProviders: [] }` to the mock
bridge, but the bridge handler was renamed to read
`acpProvidersCatalog` during consolidation. The stale field name was
silently ignored, causing the default catalog (with available
providers) to be returned instead of an empty list.
Fix CI-breaking missing `AcpAvailabilityStatus` import in tauri.ts,
eliminate zombie process leak on install timeout by saving PID before
thread move and sending SIGTERM, remove duplicate Map keys in
check-file-sizes.mjs that silently shadowed earlier entries, clean up
dead `MockAcpProvider` type from e2eBridge, and add missing
`classify_provider` test for the no-underlying-CLI code path.
The original implementation created a second parallel Tauri command
(discover_all_acp_providers) alongside the existing one to avoid
changing the return type. This produced two commands, two hooks, two
query keys, and two raw type converters. Consolidates into a single
command returning the full catalog, with a useAvailableAcpProviders
hook that type-narrows for callers needing non-null command/binaryPath.
Also fixes: pipe deadlock in install command (#1), UTF-8 truncation
panic (#2/#4), adds install concurrency guard (#11), exact provider ID
match (#15), error display stdout fallback (#5), success banner
suppression when already available (#12), misleading re-run text (#13),
IIFE refactor in PersonaDialog (#14), hidden internal query lift (#7),
configurable e2e mocks (#9), shared raw type exports (#8), and
classify_provider unit tests (#10).
The "Preferred runtime" dropdown in Agents > Add Persona and the Doctor
panel only showed runtimes with a resolved ACP adapter binary, silently
hiding Claude Code and Codex when their adapters weren't installed.
Add three-state availability detection (Available / AdapterMissing /
NotInstalled) to distinguish "CLI present but adapter missing" from
"nothing installed." Expose a full provider catalog via
`discover_all_acp_providers` and an `install_acp_runtime` command that
runs server-defined install scripts in a login shell with a 5-minute
timeout.
Doctor panel now shows all four known runtimes with status badges and
Install buttons. PersonaDialog shows all runtimes with status labels so
users can store a preference for later. CreateAgentDialog shows a hint
when additional runtimes are available to install.