Repository navigation
feat(native-chat): chat agents are offered wherever their chat program runs, not only where their CLI is installed - #28709
Conversation
|
Review complete on The six cumulative source-review rounds and final mechanism comparison remain accepted through QA head Main was integrated in Brennan's updated October 23 rule preserves QA across main merges, including conflicts. The accepted screenshots and real results on The completion marker records merged source head Under the updated per-flow QA rules, Claude and Codex's accepted saved-chat restart/replies cover shared chat behavior. The other successful agent runs remain valid additional evidence, with their existing provenance qualifications. An Antigravity-only branch is covered by a contract fed recorded host and detection output. The new renderer contract builds rows from the recorded host/detection boundary values and verifies an enabled Antigravity chat row, no terminal button or separate CLI row, and ArrowRight followed by Enter selecting chat exactly once. Existing detected-agent terminal mouse and keyboard contracts remain. Prior native/SSH setup attempts remain BLOCKED; they are not relabeled passing captures. Accepted head8 follow-up on QA head
The head8 lead reports continuous ticket1622 admission and isolated launch from the exact-head ticket build using the same saved QA profile. Recorded-launch identity was checked by qa-drive. App and source-fixture stop receipts were reviewed. One real Codex-config hash changed on the shared machine with no attribution established; config contents were not read. Prior admission and Windows cleanup qualifications below remain disclosed. These procedural issues are not source defects or successful cleanup claims beyond the recorded receipts. The remainder of this comment preserves historical evidence and qualifications. Older pending-QA and CI statements are superseded by this completed review. The earlier blocked negative-picker and subfolder-pwd attempts remain blocked observations; their revised contract obligations are met by tests. Earlier review history and visual evidenceAntigravity chat uses a program Orca manages, but agent choices previously required the separate Fresh Loop 3: source accepted; runtime acceptance pending at The earlier source corrections remain accepted:
Independent measurement of the committed change gives 1,798 production / 599 test changed lines against merged main Runtime evidence accepted, with exact provenance: Earlier On the previously accepted head Additional restart checks passed on Windows follow-up PASS on prior head Picker correction accepted in source: The shared picker now retains disabled rows and their reasons even when the caller supplies only runnable agents. This corrects an enabled-but-unavailable agent disappearing from Create worktree, Create folder and continuation pickers. Rendering still disables those rows and excludes their actions; the existing regression test now supplies a restricted caller catalog. The owner reports eight named tests passing. Current-head Create and continuation captures now confirm the disabled row remains visible, searchable and unselectable. Baseline behavior retained: I withdrew the second picker finding after checking main’s unchanged helper and preserved Create regression. Before submission, a changed host or provider setting can repair the displayed choice to “Claude (CLI)”; Create’s existing test explicitly expects that label and terminal submission after a host change. The same detected-CLI continuation input uses the unchanged helper. My helper reproduction established that pre-submit transition, but did not establish a PR regression or a silent app launch. A separate unchanged continuation contract preserves an explicit Chat request after Start across asynchronous preparation and reports a later host decline without opening a terminal. Targeted QA will compare the editable field and submitted result with main, and retain that post-submit boundary. Historical Windows follow-up at Current-head Windows evidence ( Current-head Mac replies accepted, with provenance qualifications: Claude, Codex, Pi, OpenCode, OMP and Antigravity retained saved conversations and models and returned FIVE/SIX on the same QA profile. Together with Windows OpenCode 2, this covers all seven required agents. The owner records a successful build at Current-head picker and continuation evidence accepted: Actual local discovery includes Antigravity, and an explicit Create terminal selection reached its CLI login-method screen; no sign-in was needed for that check. An OMP source conversation continued into a new Antigravity chat with its context and received a real OK in 8 seconds. OpenCode 2 stayed visible, disabled with “Not installed,” searchable and unselectable by click/Enter in Create and continuation. Create-folder Antigravity returned a real OK in the existing folder workspace under the isolated sign-in fixture; this does not establish creation of a new filesystem folder at the requested root. Claude terminal creation reached its welcome screen. These observations close the corresponding partial picker gaps. Settings transition remains untested: The earlier provider-off script called the settings IPC method directly, ignored its returned settings and waited for an update the main process deliberately does not echo to the originating window. The renderer therefore retained stale settings. Its apparent PASS is withdrawn; the screenshots establish only agreement between the displayed field and submitted result under that stale state. This is a rig error, with no proven source defect. The next admitted continuation uses the Settings UI only. If the modal cannot remain mounted while Settings is used, that limitation will be stated separately from the preserved mounted regression; actual Providers/Open-as UI synchronization is still required. Remaining runtime gate: Subfolder CLI directory, cancellation/context handoff, setup/default tabs/prompt, the integrated default Chat/CLI control and direct commit-failure recovery remain incomplete. The exact no-CLI terminal-button/ArrowRight capture is also still owed. Its Windows attempt was blocked: Antigravity was detected despite the narrowed launch PATH, and the dedicated SSH fixture could not connect because of server-template/Node setup failures. No picker PASS is claimed from that attempt. The owner is arranging one narrow native-host capture without changing installed programs or repeating agent replies. The successful Windows unavailable-agent/Fix Checks reply evidence remains accepted as scoped above. grok waived by Brennan on October 21: "You don't have to run grok". Grok is covered by tests only for the final runtime roster. Historical sign-in evidence remains attributed to its earlier head; no changed sign-in implementation requires repeating it. QA procedure qualification: The Mac admission expired at 12:40, but the owner continued the copy/driver until stopping them at 13:52. The continuation-search capture was made after expiry; it remains an observed UI result with that procedural limit. The other accepted picker/context checks preceded expiry. The owner reports the driver stopped, and my process check found neither recorded app PID. The profile and artifacts are preserved, with resumption restricted to a new admission. Real-config hash drift remains unattributed. The Windows negative-capture report and cleanup records have now transferred. I independently compared all 62 original before/after config entries with no differences and matched the report checksum. The supplied final verification records no remaining recorded roots or ticket-port listeners, and the guest record reports its dedicated server stopped and temporary access revoked. The cleanup transcript contains no individual stop output, and the final check covers its recorded roots and port block; this is bounded evidence, not a complete machine-wide process audit. The owner reports all 43 transferred files matched their remote hashes; no full remote manifest was supplied for independent verification of that broader claim. No duplicate QA or new source round was started by this loop. Recovery evidence boundary: Earlier paired commit-failure Customize launch and Windows PR-conflict Resolve exercised the saved-action dialog. They do not establish a real launch through the separate direct commit/push-failure recovery helper. The owner has been asked for an existing receipt or one harmless direct commit-failure action through to a real reply in the queued QA. A live discovery-scan failure was not forced; controlled production acquisition evidence is recorded separately. The completion marker remains withheld pending current-head runtime artifacts and final readiness. Deferred concerns remain recovery validation order, refusal details and catalog feedback. An old discovery completion may clear a shared busy flag, but the exercised current saved cycle stays pending, hidden and unstarted; that behavior predates this PR. No rendered dashboard launcher exists in either compared build, and setup-tab output/exit was not verified. This is a bounded integration review, retaining cumulative history at six. No additional full review round or panel has been opened. For Brennan's review Saved Antigravity default, main then branch (fresh main No saved default, main then branch; both open a shell: Explicit Blank Terminal, main then branch: Historical authentication at aec0b4f (the sign-in implementation is unchanged): Prior-head ( Additional prior-head ( Windows OpenCode 2 release then PR, with the saved conversation retained: SSH menu, main desktop then PR desktop against the same PR server: Windows main then branch (historical paired comparison): Current-head Mac saved chats (owner build/restart receipt plus retained rendered history/model; timing qualifications above): Current-head Windows restart evidence (previous main build then Current-head Windows Fix Checks, main then branch unavailable-agent feedback, followed by the branch's real Claude reply: Current-head continuation and disabled-row captures (the continuation search occurred after the admission expired, as qualified above): Three places where human judgment matters: For Brennan's review — accepted follow-up on QA head Create field after the Settings UI switches Claude to CLI, then its submitted terminal tab (the host process cap refused startup): Subfolder continuation offers CLI rows and explains why chat rows are disabled: Providers and Agents Chat/CLI controls agree after each change: Setup/default-tab creation followed by a manual reply, and direct commit-failure recovery followed by a real reply: |
…t chat start An ACP launch spec may name a pinned runtime Orca installs under its locked data folder. The stock lookup searches it last (Command, PATH, install directories, managed folder); a start whose lookup missed installs it under the acquisition's signal, then resolves the launch again. A Command setting, restart-recovery reads and catalog probes never install. The pinned-runtime materializer can now publish a verified multi-member folder: extract once into staging, check each member's sha256, rename into place, with a per-asset download size limit. Node's runtime path is unchanged.
Once per host start, the ACP registration removes every version beside an agent's current managed runtime folder, and staging left by an earlier process. One host owns the data root and ACP servers are never reattached across host runs, so nothing runs from them. This process's own staging is kept (a publish may be in flight). Best effort: a failure is logged and never holds up a launch.
…r turn signed out An agent that waits for a browser sign-in prints a link on stderr and blocks for minutes. A launch spec can now name that line (signInPrompt); the connection then closes with a typed sign-in failure through the existing process owner, so a start reads notSignedIn and a running turn fails signed out instead of settling unknown. The matched line, which carries the sign-in URL, never enters the retained stderr tail, errors or diagnostics.
…session config option An optional launch-spec field names the session config option and its ask/full values. Every new or reopened session gets the value for the chat's full-access posture before it is exposed, and a refusal fails the start. With the field present Orca no longer answers permission requests for the person. No agent sets it yet.
…t's own mode The launch spec maps each chat permission mode to its session option value; a start sets the value for the mode the host launches with (ask when it names none), replacing the global Agent Permissions full-access read. A mid-chat change takes effect through the host's existing restart of a child launched with another mode before the next send.
With the experimental chat setting on, Antigravity chats run Google's Antigravity ACP server, which Orca installs on the first chat start: a pinned 1.3.0 release whose archive and both executables are verified by hash (macOS arm64/x64, Linux x64/arm64). Each host keeps one private sign-in folder for these chats under Orca's data folder, made owner-only before every start; the server keeps its sign-in there as a file. A chat signs in with the server's Google method through the existing auth-required retry; with no saved sign-in the server's sign-in prompt ends the chat signed out. The Agent Permissions setting maps to the server's own mode, and a question the server asks shows as a question that takes one of its choices, never auto-answered. A chat reopens its session with session/resume.
…per chat Each mode maps to the server's own (default, auto_edit, yolo). No Approve for me: the server has no automatic reviewer. Accept edits gets its own description, since auto_edit approves file edit tools only.
A host now marks each agentSession.agents row whose chat program Orca provides there (an ACP managed runtime with a pinned build on this host). With Chat UI on, the tab-bar picker, the empty-workspace default chat and the new-agent shortcut offer those agents beside the detected ones when the launch opens as a chat. Terminal launches still follow detection, and an older host that sends no mark keeps today's detection-only offer.
7e7d134 to
7ebb0e6
Compare
de63d58 to
8df1cde
Compare
f95fef4 to
9d3ee05
Compare
…ctive workspace's host changes Both dashboard publishers now watch the active workspace and its selected host, which own its launch options. Two QuickLaunchButton tests assert the current "couldn't list terminal agents" wording. Restores base forms and drops a duplicate workspace helper to stay inside the change budget.
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to GitHub limitations.
🟠 Major · Fix the typecheck failure: widen… · useDashboardPopoutBridge.test.tsx:62
src/renderer/src/components/dashboard/useDashboardPopoutBridge.test.tsx:62
🎯 Functional Correctness | 🟠 Major | ⚡ Quick winFix the typecheck failure: widen
DashboardSnapshotWatchStatein the test.CI fails at Line 288. The test-local
DashboardSnapshotWatchStatetype on Line 62 isDashboardSnapshotState & Pick<AppState, 'agentStatusEpoch'>. It does not includeactiveWorkspaceExecutionHostId. The production type now adds that field throughPartial<Pick<AppState, 'activeWorktreeId' | 'activeWorkspaceExecutionHostId'>>.Import the exported type, or add the same
Partial<Pick<...>>to the local alias. The object literal then type-checks.🐛 Proposed fix
-type DashboardSnapshotWatchState = DashboardSnapshotState & Pick<AppState, 'agentStatusEpoch'> +type DashboardSnapshotWatchState = DashboardSnapshotState & + Pick<AppState, 'agentStatusEpoch'> & + Partial<Pick<AppState, 'activeWorktreeId' | 'activeWorkspaceExecutionHostId'>>Source: Pipeline failures
🧹 Nitpick comments: 1
src/renderer/src/components/agent-session-continuation/AgentSessionContinuationDialog.tsx: 1
72-79: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueCompute
offeredandagentsfrom reactive state.The code reads
useAppStore.getState()during render at Lines 72 and 77. The component does not subscribe to the state thatagentsOfferedForLaunchandagentChoicePendingread. These include host availability, the catalog, and capabilities.
useChatProgramFactssubscribes only to the facts version and the context revision. Store changes outsidesettingscan therefore leave the agent list stale until another re-render occurs. Subscribe to the inputs that these helpers read. Alternatively, derive the list with a selector hook such asuseAppStore(useShallow(...)).
ℹ️ Review info
⚙️ Run configuration
- Configuration used: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
b267b81b-80e8-44a3-9c31-dd3b29d7c409
📒 Files selected for processing: 11
src/main/runtime/structured-agent-availability.test.tssrc/renderer/src/components/agent-session-continuation/AgentSessionContinuationDialog.tsxsrc/renderer/src/components/dashboard/useDashboardPopoutBridge.test.tsxsrc/renderer/src/components/dashboard/useDashboardPopoutBridge.tssrc/renderer/src/components/dashboard/useLiveDashboardSnapshot.tssrc/renderer/src/components/right-sidebar/SourceControlAgentActionDialog.test.tsxsrc/renderer/src/components/tab-bar/QuickLaunchButton.launch-status.test.tsxsrc/renderer/src/components/tab-bar/QuickLaunchButton.test.tssrc/renderer/src/components/tab-bar/use-new-tab-agent-menu-rows.tssrc/renderer/src/lib/empty-workspace-default-agent-chat.tssrc/renderer/src/lib/new-tab-agent-menu-rows.test.ts
💤 Files with no reviewable changes: 2
- src/renderer/src/components/right-sidebar/SourceControlAgentActionDialog.test.tsx
- src/renderer/src/lib/new-tab-agent-menu-rows.test.ts
🚧 Files skipped from review as they are similar to previous changes: 1
- src/main/runtime/structured-agent-availability.test.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 0 remain after this review.
…d Source Control discovery settles every outcome Both dashboard publishers observe and derive launch options from one exhaustive, compiler-checked view of the store slices the launch-route readers take, so a route input can no longer be missed by one list. A saved Source Control action's discovery now ends as success, cancelled or failed; only success can auto-start, and a cancelled or failed attempt reveals the editable dialog instead of launching on a replacement runtime. Restores base forms and shares one worktree workspace helper to stay inside the change budget.
…-8b-picker-without-agy
… and a saved Checks agent keeps its message
…-8b-picker-without-agy # Conflicts: # src/main/runtime/structured-agent-availability.ts # src/renderer/src/lib/launch-agent-in-new-tab-structured-route.ts # src/renderer/src/lib/structured-agent-session-launch-admission.ts # src/renderer/src/lib/structured-agent-session-provisional-tab.ts
…e opening a declined terminal; compact to the size cap
…-8b-picker-without-agy
…-8b-picker-without-agy
…-8b-picker-without-agy # Conflicts: # src/renderer/src/components/NewWorkspaceComposerModal.tsx # src/renderer/src/components/agent-session-continuation/AgentSessionContinuationDialog.test.tsx # src/renderer/src/components/agent-session-continuation/AgentSessionContinuationDialog.tsx # src/renderer/src/components/dashboard/dashboard-worktree-launch-options.ts # src/renderer/src/components/dashboard/useLiveDashboardSnapshot.ts # src/renderer/src/components/tab-bar/use-new-tab-agent-menu-rows.ts # src/renderer/src/lib/launch-agent-session-continuation.test.ts # src/renderer/src/lib/launch-agent-session-continuation.ts
…n instead of hiding it The Create workspace and continuation pickers only searched the agents the caller could launch, so an enabled agent with no chat on this host (for example Antigravity when the host can't run it) lost its disabled row, while the + menu showed it.
…at disabled rows are listed
…-8b-picker-without-agy # Conflicts: # src/renderer/src/components/settings/AgentDefaultSetting.tsx # src/renderer/src/components/settings/AgentLaunchSettingsCatalog.tsx # src/renderer/src/components/settings/NativeChatProvidersSetting.tsx
…-8b-picker-without-agy # Conflicts: # src/main/runtime/structured-agent-availability.test.ts # src/renderer/src/lib/structured-agent-session-action-launch.ts # src/renderer/src/lib/structured-agent-session-launch-admission.test.ts
Resolve conflicts with #31971 (paired host launch preferences) and #28569 (Resolve with AI): the + menu, new-agent shortcut and default-agent pick use the host's disabled list and default together with the host chat program answer; the Source Control dialog uses main's availability helper over the PR's launchable agents. Main's new auto-start test lands its detected agents in the store the dialog reads.
187 commits landed on main between f045046 and 7cafdb0. All seven catalogs conflicted along with en-runtime-required.json, so they are taken from main and the prune is recomputed in one pass. It is the previous 1,624 keys plus 9: five lost their reader when stablyai#32284 unified the single and multiple PR hover details, two when stablyai#31688 moved skill updates to Orca's own installer, and two when stablyai#28709 reworked where chat agents are offered. None left the set. Since stablyai#32782 filled the missing entries in the other catalogs, all seven now shed the same 1,633 keys. en.json goes from 16,992 entries to 15,359; en-runtime-required.json keeps 615 of them. native-chat-shared-copy-matches-catalog.test.ts merged cleanly this time and still differs from main by exactly the branch's edit.












































ELI5
With Chat UI on, Orca decided whether an agent could open as a chat by checking whether its terminal program (its CLI) is installed. For most agents that's the same thing, because the chat runs the CLI. Antigravity is different: its chat runs a server that Orca downloads and manages itself, not Google's
agyCLI. So on a Mac or Linux machine withoutagy, Antigravity never appeared as a chat in the + menu, was never used as the default chat, and couldn't be picked from Source Control actions, Fix Checks, work items or the new-workspace composer, even though the chat would work (it opens with an Install button if the runtime isn't downloaded yet). Switching it on in Settings → Chat → Providers showed it disabled as "Not installed", which was false.What Changed
Before: "can open as a chat" and "has a terminal CLI" were the same fact everywhere. Chat-only agents were hidden or shown as "Not installed".
After: wherever Orca offers a chat agent, it asks whether the agent's chat program can run on the workspace's machine:
The terminal parts keep using the real CLI check: "(CLI)" rows, the terminal button on chat rows, CLI settings and usage bars. So on a Mac without
agy, Antigravity shows as a chat row with no terminal button and no "(CLI)" row.Automatic picks don't change: Orca never newly auto-selects an agent whose CLI isn't installed. If you have no agent CLIs and no default, an empty workspace still opens a shell. A chat-only agent is used when you choose it, or make it your default.
Settings: the Providers switch for an agent you never touched shows on when its CLI is installed or its runtime is installed (downloaded or found on PATH). The + menu offers it wherever it can run, per the earlier ruling that routing and the switch display are separate.
Terminal fallback: when a chat can't start and the agent's CLI isn't installed, Orca now says why instead of opening a terminal that would fail. A caller's own fallback, like an empty workspace's shell, still opens.
Windows, SSH, WSL, Chat UI off: unchanged. Antigravity has no build for Windows, so it stays a disabled "No chat on this host" row there.
Mechanism
chatProgramper agent (available/installable/missing/unknown). It is found through each agent's own launch resolver, without starting anything, and refreshed when launch settings change, on agent Refresh, and when a managed runtime is installed or removed. Health state and reason are unchanged, and old clients ignore the field.src/renderer/src/lib/host-chat-program.ts, answers "can this agent open as a chat on this host" for every consumer. When the host sends the field, it wins. Hosts without it get a permanent fallback: the host marks the agent's runtime as managed by Orca and supports runtime install, or the CLI is detected. Released servers (v1.4.229 / v1.4.230) have the mark and the install feature but not the snapshot, so they use the fallback. Facts not yet loaded read as "unknown", never as "no".structured-agent-session-launch-admission.ts) serves both new-tab and work-item launches.Why this design
The common pattern is that the host decides whether a provider's chat program is present, by resolving the program the chat actually runs, never an unrelated CLI. This follows it. The fallback is kept indefinitely because there is no minimum server version. Alternatives considered:
Differences from the common pattern:
Visual Proof
Pending Electron QA (screenshots will be added here).
Testing
agyand the runtime absent, managed or external; a machine with no CLIs; new client with a paired v1.4.230 server; Windows; Chat UI off.CI is the lint and typecheck gate.
Linked Issue
N/A (maintainer). Follow-up for mobile tracked in STA-11197.
AI Disclosure
Review
In review: a full review loop runs next.
Agent skill upstream boundary
Notes
Author: @BrennanKB5. This PR earlier stacked on #28595 (merged). Its old picker change was replaced, and its branch was brought to main's content before this work, without a force-push.
Checklist