Skip to content

Show sign-in guidance for all native chat agents - #26544

Merged
brennanb2025 merged 14 commits into
mainfrom
brennanb2025/agent-auth-parity
Oct 8, 2026
Merged

brennanb2025 merged 14 commits into
mainfrom
brennanb2025/agent-auth-parity

Conversation

@brennanb2025

@brennanb2025 brennanb2025 commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor
Files Added Deleted Net
Test 34 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​1611 $\color{#cf222e}{\Huge{\mathbf{−}}}$​44 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​1567
Prod 72 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​1050 $\color{#cf222e}{\Huge{\mathbf{−}}}$​326 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​724

ELI5

Signed-out agents in native chat produced inconsistent failures: generic rejection text, raw errors, or references to accounts that Orca does not manage. The sign-in command was often missing, startup diagnostics could disappear, and the same failure could repeat above the composer and in the transcript. Chats now name the agent and its sign-in method, keep its diagnostic, and show one explanation while still telling users when a message was not sent. Send remains available.

What Changed

Agent Authentication evidence Sign-in guidance
Claude Startup refusal and the captured typed authentication failure during a response; its matching result is suppressed. claude auth login; managed accounts keep Claude Accounts settings guidance.
Codex Its unauthorized kind and defined HTTP error kinds with status 401; retry behavior is preserved. codex login; managed accounts keep Codex Accounts settings guidance.
Grok Agent Client Protocol (ACP) authentication errors at startup and on a prompt, including string error data. grok login, with Grok's diagnostic retained.
OpenCode ACP's typed authentication error at startup and on a prompt. opencode auth login.
Pi Its existing missing-key prefix, used for prompt replies and accepted-turn assistant errors. Run pi and use /login on the computer running the chat; keep the missing-key detail.
OMP ACP's typed authentication error, plus its demonstrated -32603 internal error whose data.details starts with its missing-key prefix. Other internal errors remain ordinary failures. Agent-specific sign-in advice and the literal provider diagnostic.

One shared table supplies agent-specific guidance. Desktop and mobile queued-message cards receive the chat's agent identity and keep their existing Send controls. Loaded authentication rows suppress matching catalog and delivery explanations; rejected messages still say they were not sent. Desktop transcript rows translate complete authentication facts when they fully explain either standard host sentence, including startup rows that ask the user to resend. Diagnostics stay literal. Command instructions, other failures and unknown facts keep the host wording. Failed desktop launches retain the host-composed authentication diagnostic beside Retry. The phone retains the authentication rejection fact with its existing temporary banner and derives the banner from the transcript after its normal display filtering and folding. A hidden child row cannot remove the only visible sign-in guidance. It keeps sign-in guidance when no row explains the failure, then says only that the message was not sent when a matching row appears, regardless of reply and row arrival order. Failure-fact scans run only for existing consumers, and desktop cards and delivery notices share their derived facts. Startup replies before any message was submitted omit resend instructions, including the phone's direct-create fallback. English, Spanish, French, Japanese, Korean, Chinese and the English runtime catalog are covered.

When an authentication diagnostic lacks ending punctuation, retry advice now starts a separate sentence. Existing periods, question marks, exclamation marks and punctuation inside closing quotes or parentheses stay intact. The provider fact remains literal, details without following advice stay unchanged, and all six locale catalogs are unchanged. This fixes the captured Pi 1.0.4 message ending in docs/models.md as well as other unpunctuated details.

Signing in while a chat is open now takes effect on the next send. Before: when a chat whose agent was already running reported "not signed in", Orca kept that agent running. The user signed in from a terminal, sent again as the chat told them to, and some agents failed again, because they read their saved login only when they start. Measured locally with each real agent in a throwaway home folder and a local fake model server (no real accounts): OMP 17.0.5 kept failing with "No model selected" in the same process, even in a new session, while a freshly started OMP used the new login; OpenCode 2.0.14 used the new login in the same process. Grok (grok agent stdio) keeps its login in memory and re-reads it from disk only on reconnect or token refresh (from its source, not run). After: before handing the next message to a running agent, Orca checks whether that agent itself reported "not signed in": a message it rejected for that reason, or a sign-in failure row written by the chat's own agent (not a subagent). Both are tied to the agent by the fence each agent gets when it starts, so a fresh agent is never restarted for an earlier agent's failure. If the agent reported it and owes no other work, Orca stops it quietly, the way the idle sweep puts an agent to rest, and the send starts a fresh agent that reads the new login. "Owes no other work" is the idle sweep's own check, now shared: no running turn, no running child agent, no open orchestration dispatch, no send the agent is still holding, and no unanswered prompt. It also waits while background work has finished since the agent's last turn ended, since the agent may still owe the turn that reads that result; the idle sweep covers that case with its 30-minute window, which a restart before the next send does not have. The check is skipped while a person's Stop is still ending the turn, since the send is not handed over then anyway. The chat, its history and its tab are unchanged, and nothing is shown for the restart. The check reads the transcript without building a snapshot, so a message waiting on a Stop costs no extra transcript reads. If the stop cannot be confirmed, the start waits on or refuses it exactly as for any other stop, and the failure is logged; it never blocks the send on bookkeeping.

OMP 18.4.0 source: the missing-key check constructs the error; the ACP prompt path forwards it; the transport wraps it as an internal error with data.details. This is why the classifier checks both the code and the demonstrated prefix.

Why

Each protocol has one authentication classification point, and clients reuse the existing failure-word construction and journal facts. This keeps sign-in advice consistent without adding probes, stored presentation flags, credential access or a new surface. Unknown facts keep the host's fallback rather than receiving advice based on a partial read.

Naming the agent's sign-in method, preserving its diagnostic, and starting a fresh agent before the next turn after a sign-in failure follow the common pattern. Keeping Send available follows it for an existing chat; for a brand-new chat whose agent is known to be signed out, the common pattern disables Send until sign-in, which Orca does not do here (intended: Orca has no sign-in check before the first send yet, so it cannot know; see PR2 below). Other intended differences: Orca keeps its existing surfaces and managed-account settings guidance; OMP uses generic sign-in advice because a command at Orca's supported release floor remains unverified. Temporary difference: additional pre-send checks remain PR2. An interactive sign-in action is separate work.

Linked Issue

Builds on #25666. Requested by @BrennanKB5.

Visual Proof

Hidden-window QA on macOS at 3627aaf58f3 with stand-in agents built from this PR's own fixtures (never the real CLIs), isolated config folders, real config files unchanged. Every scenario passed. The only later change is the sentence-boundary fix below (the Grok and Pi shots still show the old run-on "… Then send"), covered by scripted tests.

What Screenshot
Claude signed out: the chat fails as it opens, one line naming claude auth login A1-open
Claude, after sending while still signed out: one more line for that attempt, and "Your message was not sent." A1-send
Claude fails mid-reply: one line with the sign-in sentence and Claude's own detail A2-claude-midturn
Codex: the notice before sending ("Codex isn't signed in. Run codex login.") A3-notice
Codex after sending: one line with Codex's detail; the notice steps aside A3-send
Grok: names grok login and keeps Grok's detail A4-grok
OpenCode: names opencode auth login A5-opencode
Pi: names pi and /login, keeps "No API key found for …" A6-pi
OMP: "Sign in to OMP." with OMP's detail A7-omp
A rate limit is not called "not signed in" (Codex shown; Claude, Grok, OMP, Pi also checked) A8-codex
Spanish: translated sentence, the agent's own detail left as sent A9-es-grok
Signed in: a normal reply, no notice A10-codex

Testing

  • I manually tested these changes locally (hidden-window QA with stand-in agents; see Visual Proof)
  • Automated tests added/updated

QA follow-up scripted validation on macOS: 983 root tests in an explicit 64-file list and 139 mobile tests in an explicit 9-file list passed. The lists include every changed test in this PR, tests importing the changed sentence module, and tests importing its immediate production importers. Coverage includes the existing captured Pi 1.0.4 signed-out reply, punctuation controls, closing quotes and parentheses, and all six locales. One ablation removed the sentence boundary: eight intended assertions failed (the captured Pi reply, one shared case and six locale cases), while 36 controls passed. Restoring the source passed all 44 focused tests.

The earlier round-3 lists passed 504 root and 254 mobile tests, including the actual startup-row writer and mobile display filtering and folding. Both round-3 ablations detected their intended failures. Prior rounds also passed their documented classification, fallback, startup, arrival-order and scan-count coverage; the round-2 importer lists passed 840 root and 272 mobile tests. These are targeted lists, not claims that the entire repository suite passed.

Serial tc-gate node, web, CLI and mobile typechecks passed; the mobile test typecheck ratchet also passed with no newly failing files. Pre-push orca-ci-checks --no-typecheck passed 21 of 22 checks. Its sole failure is five existing mobile import-cycle warnings, reproduced in the prior baseline audit; all four affected files are unchanged from the PR base. An earlier wider root run also reproduced a pre-existing viewport anchoring failure on the PR base. No warnings were suppressed or unrelated code refactored. Commit-hook lint, React checks and formatting passed. No real agent CLI, account credentials or desktop input were used for this follow-up. Windows, Linux, SSH execution, managed-account interaction and current-head Electron verification remain unverified.

Restart after a sign-in failure (commits 496b4037d05, 96884850ca2, 729dbacf1e2): structured-agent-session-signed-out-child.test.ts runs on the real host test rig: a send the running agent rejects as not signed in makes the next send stop that agent and start a new one, the new agent is kept for the send after that, and any other rejection keeps the agent. Unit cases: a row an earlier agent or a subagent wrote, another failure kind, an agent still starting; and the agent is kept while a turn runs, a prompt is unanswered, an orchestration dispatch is open, or it still holds a send; a failed stop is logged. Removing the subagent filter or the open-work guard fails exactly those cases. A second review round confirmed those fixes and found two more, both now fixed: a possible lost wake-up turn after background work finishes, and a transcript walk on every delivery step while a send waits on a Stop. The first review found the first version scanned a full transcript snapshot on every delivery step (CI caught it as six reads where three are allowed), ignored work the idle sweep protects, and counted subagent rows; all three are fixed. Under Node, 885 test files across native chat, ACP, Pi, Claude and Codex pass, then 216 host-session files after the last fix; pnpm tc:node passed.

Merge with main at 5de53910aa1 (commit 8c8617b00af): main reverted Claude per-account folders (#26638), which removed the Claude "Sign in" button from failure rows. The resolution keeps this PR's failure-row wording and drops that button. The start-failure scan no longer runs for every Claude chat (that condition existed only for the removed button); it runs when a queued card was returned or a send was rejected, which are its remaining readers. To stay under the file-length limit, the Claude account the transcript wording reads now lives on the acquisition attempt rather than a separate variable; behavior is unchanged. #26416 (messages wait until the agent has started) composes with the restart: the check already skips an agent that is still starting. After the merge, orca-ci-checks passed 22 of 23 including typecheck; the one failure is five mobile/ import-cycle warnings caused by ignored generated files in the local checkout, which pass in a clean checkout. PR and overlapping main tests (121 files) show no failures outside the local bun runtime's missing node:sqlite.

Review

All eight round-1, four round-2 and two round-3 findings were verified and addressed; none was disputed. Reviewed protocol classification, account guidance, diagnostic preservation, duplicate suppression, retry behavior, localization and unknown-fact compatibility. The execution host still owns classification; no new wire fields or opcodes are exchanged. Folder workspaces and remote chats use the same existing paths.

The QA OpenCode finding needs no code change: the longer data.message was invented by the stand-in. At the supported 1.x floor (1.18.31), the prompt service keeps only the provider identifier for an authentication error, and the error serializer emits the short message provider authentication required. At the supported 2.x floor (2.0.14), the prompt service delegates to the stream, the authentication branch constructs an error with no fields, and the serializer emits the same short message with empty data. Neither sends the longer authentication detail. Orca retains the message it receives. This is source verification, not a real CLI run.

The extra “Worked for 0s” and “Claude stopped while this response was in progress” beside a signed-out /compact refusal are pre-existing under the timing described by QA. The host opens the command turn before startup completes; if the child ends before command-refusal cleanup, the translator interrupts that open turn, existing exit handling adds the stopped row, and the interrupted turn uses the worked-duration label. Eight files on that path and the translator's ended-event branch are byte-identical to merge base 5252884a9c7a34ab556ee8e3e1d8d4decae4982b. The base is therefore expected to do the same under that timing. This is a code-comparison inference; the base app and real Claude timing were not run. No lifecycle change is included in this follow-up.

Agent skill upstream boundary

  • Not applicable, or this change copies or mechanically translates no upstream skill-installer source, tests, fixtures, registry entries, path tables, comments or documentation.

Notes

Both lockfiles are unchanged from the PR merge base. No merge or auto-merge is enabled. No new probes, process-launch behavior, shortcuts or UI surfaces.

Checklist

  • This PR is small and focused
  • I explained what changed and why (ELI5, user-facing behavior, mechanism and alternatives)
  • Before/after screenshots or videos attached for UI changes
  • Self-reviewed for correctness, security and performance
  • Cross-platform, SSH/remote and path/shortcut impact considered
  • All local checks and build pass; see the exact validation results above

@brennanb2025

Copy link
Copy Markdown
Contributor Author

Review summary

The problem

In the updated native chat, a signed-out agent was recognized inconsistently: Claude only when the chat started, Pi only on send, and Codex, Grok, OpenCode and OMP mostly never. Users saw lines like "The provider did not accept this message: Authentication required." with no agent name and no sign-in command, Codex's raw error, or "…is not signed in for the selected account." for agents that have no Orca accounts. No message named the agent's own sign-in command.

What changes for you

  • Whichever agent it is, a sign-in failure, at chat start or on your first message, now shows one sentence naming that agent's own command: claude auth login, codex login, grok login, opencode auth login, pi then /login, or "Sign in to OMP". The agent's own detail is kept after it.
  • One explanation per attempt: the Codex notice steps aside when the transcript already says it; queued messages that come back keep the agent-specific sentence; the phone banner shortens only when a visible transcript row carries the guidance.
  • Nothing says "send your message again" before you've sent anything. Send is never disabled, and there is no new surface.
  • Translated in all six languages; lines that carry command instructions (e.g. "Run /compact again") keep the host's wording so the instruction isn't lost.

Review

  • Four rounds by a fresh read-only reviewer; all findings fixed, none disputed: OMP's real missing-key error shape (and nothing broader), Pi failures after a reply starts, Grok's startup explanation kept, agent-specific queued-message cards, one explanation across notice/row/banner, localization of the new rows without losing command instructions, no resend wording before a send, two stale Claude-copy tests, the phone banner only reacting to visible rows.
  • QA follow-up fixed: an agent detail without a final period (real Pi wording) no longer runs into the next sentence.
  • Checked and left: OpenCode only sends "provider authentication required" (verified in its source at both supported versions), so there's no longer detail to keep. The extra "Claude stopped while this response was in progress" line beside a signed-out /compact is pre-existing (that code path is identical to the merge base).
  • Deferred: one end-to-end render test lives under config/scripts as JavaScript, outside the typechecks (it spans the renderer/host boundary).

What was verified

  • Targeted test lists each round (latest: 983 desktop + 139 phone tests), ablations for every fix, node/web/CLI/mobile typechecks, pre-push checks 21/22 (the one failure is the existing phone import-cycle warning on main).
  • Hidden-window QA at 3627aaf58f3 with stand-in agents for all six: every scenario passed (screenshots in the PR body), including rate limits not being called sign-in failures and Spanish.

Not verified

  • Real agent CLIs, managed accounts, the phone app live, Windows, Linux, SSH/WSL, languages other than Spanish. The final sentence-boundary fix is covered by tests only.

@brennanb2025
brennanb2025 marked this pull request as ready for review October 8, 2026 15:13
@coderabbitai

coderabbitai Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: c723b2fd-1acd-4c9c-b59e-dbae1143f316
📥 Commits

Reviewing files that changed from the base of the PR and between 8c8617b and 729dbac.

📒 Files selected for processing (4)
  • src/main/native-chat/agent-session-wire/structured-agent-session-host-delivery.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-idle-sweep.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-signed-out-child.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-signed-out-child.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 3 remain after this review.


📝 Walkthrough

Walkthrough

The change classifies sign-in failures across ACP, Claude, Codex, and Pi. It preserves provider diagnostics and account context in failure facts. Shared wording now selects agent-specific login commands and retry guidance. Native-chat and mobile flows localize these failures and avoid duplicate resend instructions. Signed-out provider children are retired before replacement when no open work remains. Tests cover provider classification, rendering, mobile delivery, and child lifecycle behavior.

Priority: ➖ Normal

Merge Risk: 🔵 Low · up to 729db

Some sign-in guidance may still be missing from mobile message cards or OMP launch guidance. The changed child-replacement path does not send to a closing agent, but these guidance concerns warrant owner follow-up.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 42.11% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 57 functions across 68 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly summarizes the primary change: adding sign-in guidance for all native chat agents.
Description check ✅ Passed The description is detailed and covers the required sections, including the change, rationale, linked issue, visual proof, testing, review notes, and checklist context. It also documents known validat…
  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 2
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
⚔️ Resolve merge conflicts 💡
  • Resolve merge conflict in branch brennanb2025/agent-auth-parity
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: bcf4849e-f16a-4ef7-8a1a-1af97030d195
📥 Commits

Reviewing files that changed from the base of the PR and between 907cb6e and 13af239.

📒 Files selected for processing (101)
  • config/scripts/structured-agent-session-start-failure-row-render.test.mjs
  • config/scripts/vitest-sqlite-runtime-files.mjs
  • mobile/src/session/mobile-dictation-refused-start-routing.test.tsx
  • mobile/src/session/mobile-native-chat-render-data.ts
  • mobile/src/session/mobile-structured-agent-session-launch.test.ts
  • mobile/src/session/mobile-structured-agent-session-send.ts
  • mobile/src/session/mobile-structured-queued-message-cards.test.ts
  • mobile/src/session/mobile-structured-queued-message-cards.ts
  • mobile/src/session/mobile-structured-send-delivery.test.ts
  • mobile/src/session/mobile-structured-send-delivery.ts
  • mobile/src/session/use-mobile-native-chat-controller.ts
  • mobile/src/session/use-mobile-native-chat-send-error.test.ts
  • mobile/src/session/use-mobile-native-chat-send-error.ts
  • mobile/src/session/use-mobile-native-chat-session-lane.ts
  • mobile/src/session/use-mobile-session-native-chat-dictation.ts
  • mobile/src/session/use-mobile-structured-agent-session-queued.test.tsx
  • mobile/src/session/use-mobile-structured-agent-session-send.test.tsx
  • mobile/src/session/use-mobile-structured-agent-session.ts
  • mobile/src/session/use-mobile-structured-queued-message-controls.ts
  • mobile/src/session/use-mobile-structured-send-with-outcome.ts
  • src/main/acp/acp-dialects/acp-dialect.ts
  • src/main/acp/acp-dialects/grok-dialect.ts
  • src/main/acp/acp-dialects/omp-dialect.ts
  • src/main/acp/acp-launch-specs.ts
  • src/main/acp/acp-structured-acquire.ts
  • src/main/acp/acp-structured-sign-in.test.ts
  • src/main/acp/acp-structured-turns.ts
  • src/main/acp/acp-timeline-translator.ts
  • src/main/acp/acp-turn-failures.ts
  • src/main/claude/claude-authentication-failures.ts
  • src/main/claude/claude-message-journaling.ts
  • src/main/claude/claude-result-journaling.ts
  • src/main/claude/claude-structured-journal-translation.ts
  • src/main/claude/claude-structured-session-acquisition.ts
  • src/main/claude/claude-structured-session-journal-control.ts
  • src/main/claude/claude-structured-sign-in.test.ts
  • src/main/codex/codex-authentication-failure.ts
  • src/main/codex/codex-structured-dispatch-echo.ts
  • src/main/codex/codex-structured-journal-contracts.ts
  • src/main/codex/codex-structured-journal-generic-frames.ts
  • src/main/codex/codex-structured-session-acquire.ts
  • src/main/codex/codex-structured-session-journal.ts
  • src/main/codex/codex-structured-session-state.ts
  • src/main/codex/codex-structured-sign-in.test.ts
  • src/main/codex/codex-structured-turn-end-settlement.test.ts
  • src/main/codex/codex-structured-turn-end-settlement.ts
  • src/main/codex/codex-structured-turn-start.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-failed-create-refusal.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-failure-text.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-failure-text.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-pre-spawn-first-answer.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-refusal-details.test.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-startup-failure-exit.test.ts
  • src/main/pi/rpc-capture-replay.test.ts
  • src/main/pi/rpc-prompt-delivery.test.ts
  • src/main/pi/rpc-prompt-delivery.ts
  • src/main/pi/rpc-turn-races.test.ts
  • src/main/pi/rpc-turns.ts
  • src/main/runtime/claude-structured-session-integration.test.ts
  • src/main/runtime/structured-agent-runtime-registrations.ts
  • src/renderer/src/components/native-chat/NativeChatMessageList.tsx
  • src/renderer/src/components/native-chat/NativeChatMessageRow.tsx
  • src/renderer/src/components/native-chat/NativeChatNoticeRow.test.tsx
  • src/renderer/src/components/native-chat/NativeChatNoticeRow.tsx
  • src/renderer/src/components/native-chat/NativeChatQueuedMessageCard.tsx
  • src/renderer/src/components/native-chat/NativeChatQueuedMessageList.test.tsx
  • src/renderer/src/components/native-chat/NativeChatQueuedMessageList.tsx
  • src/renderer/src/components/native-chat/NativeChatStructuredSession.availability-notice.test.tsx
  • src/renderer/src/components/native-chat/NativeChatStructuredSession.launch-lifecycle.test.tsx
  • src/renderer/src/components/native-chat/NativeChatStructuredSession.tsx
  • src/renderer/src/components/native-chat/NativeChatTranscriptRow.tsx
  • src/renderer/src/components/native-chat/agent-session-availability-words-text.ts
  • src/renderer/src/components/native-chat/agent-session-failure-words-text.test.ts
  • src/renderer/src/components/native-chat/native-chat-structured-session-notices.ts
  • src/renderer/src/components/native-chat/structured-agent-session-delivery-notices.ts
  • src/renderer/src/components/native-chat/structured-conversation-command-send.test.ts
  • src/renderer/src/components/native-chat/use-native-chat-availability-notice.test.tsx
  • src/renderer/src/components/native-chat/use-native-chat-availability-notice.ts
  • src/renderer/src/components/native-chat/use-structured-agent-session-delivery-notices.ts
  • src/renderer/src/i18n/en-runtime-required.json
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/i18n/locales/fr.json
  • src/renderer/src/i18n/locales/ja.json
  • src/renderer/src/i18n/locales/ko.json
  • src/renderer/src/i18n/locales/zh.json
  • src/renderer/src/i18n/native-chat-locales.test.ts
  • src/renderer/src/lib/structured-agent-session-launch-failure.ts
  • src/renderer/src/lib/structured-agent-session-launch-outcome-tracking.ts
  • src/renderer/src/lib/structured-agent-session-launch-registry.ts
  • src/shared/agent-session-availability-sentences.ts
  • src/shared/agent-session-availability.test.ts
  • src/shared/agent-session-availability.ts
  • src/shared/agent-session-failure-copy.ts
  • src/shared/agent-session-failure-words.test.ts
  • src/shared/agent-session-failure-words.ts
  • src/shared/agent-session-refusal-notice.test.ts
  • src/shared/agent-session-sign-in.test.ts
  • src/shared/agent-session-sign-in.ts
  • src/shared/agent-session-visible-failures.ts
  • src/shared/structured-agent-session-status-block.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.

pendingPrompt,
agentName: args.agentName,
statedFailures: queuedMessages?.some((draft) => draft.state === 'returned')
? agentSessionVisibleFailureFacts(args.journalItems ?? [])

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Exclude hidden child failures before shortening returned-card captions.

If a child-agent status has the same notSignedIn fact as a returned root card, agentSessionVisibleFailureFacts includes it. The mobile transcript hides child-agent rows, but the card then says only “Your message was not sent.” Filter journal items to the root conversation before collecting stated failures, as the transcript fold does.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: ef046bc1-cc80-4e09-907c-de83e936d857
📥 Commits

Reviewing files that changed from the base of the PR and between 13af239 and 45761ab.

📒 Files selected for processing (9)
  • src/main/acp/acp-launch-specs.ts
  • src/renderer/src/components/native-chat/NativeChatQueuedMessageList.tsx
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/i18n/locales/fr.json
  • src/renderer/src/i18n/locales/ja.json
  • src/renderer/src/i18n/locales/ko.json
  • src/renderer/src/i18n/locales/zh.json
  • src/shared/agent-session-refusal-notice.test.ts
🚧 Files skipped from review as they are similar to previous changes (6)
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/zh.json
  • src/renderer/src/i18n/locales/fr.json
  • src/renderer/src/i18n/locales/ko.json
  • src/renderer/src/i18n/locales/ja.json

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 7 remain after this review.

env: {},
dialect: GROK_ACP_DIALECT,
loginCommand: ['grok', 'login'],
loginCommand: agentSessionSignInFor('grok')?.loginCommand ?? [],

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🔎 Supported by static analysis

🏁 Script executed:

#!/bin/bash
set -euo pipefail
rg -n -C 5 'grok|opencode|omp|loginCommand' src/shared/agent-session-sign-in.ts

Repository: stablyai/orca

Length of output: 843


🏁 Script executed:

set -euo pipefail
printf '%s\n' '--- current launch specs ---'
nl -ba src/main/acp/acp-launch-specs.ts | sed -n '55,140p'
printf '%s\n' '--- merge-base launch specs ---'
git show 3e27e62f434ec612474bb9631d19e5c89f341805:src/main/acp/acp-launch-specs.ts | nl -ba | sed -n '55,140p'
printf '%s\n' '--- shared sign-in declaration ---'
nl -ba src/shared/agent-session-sign-in.ts | sed -n '1,35p'

Repository: stablyai/orca

Length of output: 9819


Restore OMP’s login command in the shared sign-in table.

grok and opencode retain their commands, but the shared omp entry is explicitly empty. This changes OMP’s launch specification from ['omp'] to [] and removes its /login guidance.

🐛 Suggested fix
-  { agent: 'omp', loginCommand: [] }
+  { agent: 'omp', loginCommand: ['omp'] }

…th-parity

# Conflicts:
#	src/main/claude/claude-structured-session-journal-control.ts
#	src/renderer/src/components/native-chat/NativeChatNoticeRow.tsx
#	src/renderer/src/components/native-chat/NativeChatStructuredSession.tsx

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 7a612325-8f4c-44aa-a7fc-e7966372edf8
📥 Commits

Reviewing files that changed from the base of the PR and between 496b403 and 8c8617b.

📒 Files selected for processing (26)
  • config/scripts/vitest-sqlite-runtime-files.mjs
  • src/main/acp/acp-dialects/omp-dialect.ts
  • src/main/acp/acp-structured-acquire.ts
  • src/main/claude/claude-structured-session-acquisition.ts
  • src/main/claude/claude-structured-session-journal-control.ts
  • src/main/claude/claude-structured-session-state.ts
  • src/main/codex/codex-structured-session-acquire.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-attach-orchestration.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-failure-text.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-host-types.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-host.ts
  • src/main/native-chat/agent-session-wire/structured-agent-session-pre-spawn-first-answer.test.ts
  • src/main/runtime/structured-agent-runtime-registrations.ts
  • src/renderer/src/components/native-chat/NativeChatNoticeRow.tsx
  • src/renderer/src/components/native-chat/NativeChatStructuredSession.tsx
  • src/renderer/src/components/native-chat/native-chat-structured-session-notices.ts
  • src/renderer/src/i18n/en-runtime-required.json
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/i18n/locales/fr.json
  • src/renderer/src/i18n/locales/ja.json
  • src/renderer/src/i18n/locales/ko.json
  • src/renderer/src/i18n/locales/zh.json
  • src/renderer/src/i18n/native-chat-locales.test.ts
  • src/shared/agent-session-failure-copy.ts
  • src/shared/agent-session-failure-words.ts
🚧 Files skipped from review as they are similar to previous changes (8)
  • src/main/native-chat/agent-session-wire/structured-agent-session-pre-spawn-first-answer.test.ts
  • src/renderer/src/i18n/en-runtime-required.json
  • src/renderer/src/i18n/locales/en.json
  • src/renderer/src/i18n/locales/es.json
  • src/renderer/src/i18n/locales/fr.json
  • src/renderer/src/i18n/locales/ko.json
  • src/renderer/src/i18n/locales/ja.json
  • src/renderer/src/i18n/locales/zh.json

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 0 remain after this review.

const cause =
lifecycle === 'failed' && failure
? agentSessionWriteNoticeText(
? (failure.authStartupMessage ??

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🔎 Supported by static analysis

🏁 Script executed:

#!/bin/bash
# Inspect the value's producer and the launch-notice assertions.
rg -n -C 5 'authStartupMessage' src/renderer/src/lib src/renderer/src/components/native-chat

Repository: stablyai/orca

Length of output: 3619


Verify the locale of authStartupMessage.

structuredLaunchFailure stores error.message directly in authStartupMessage, and native-chat-structured-session-notices.ts displays that value before the translated refusal-cause path. If the host error is not localized, failed launches can show English text in other locales. Build this notice from translated failure facts, or localize the stored message before displaying it.

…th-parity

# Conflicts:
#	mobile/src/session/mobile-structured-queued-message-cards.test.ts
#	mobile/src/session/mobile-structured-queued-message-cards.ts
#	mobile/src/session/use-mobile-native-chat-controller.ts
#	mobile/src/session/use-mobile-native-chat-send-error.test.ts
#	mobile/src/session/use-mobile-native-chat-send-error.ts
#	mobile/src/session/use-mobile-native-chat-session-lane.ts
#	mobile/src/session/use-mobile-structured-agent-session.ts
#	mobile/src/session/use-mobile-structured-queued-message-controls.ts
#	mobile/src/session/use-mobile-structured-send-with-outcome.ts
#	src/renderer/src/i18n/locales/en.json
#	src/renderer/src/i18n/locales/es.json
#	src/renderer/src/i18n/locales/fr.json
#	src/renderer/src/i18n/locales/ja.json
#	src/renderer/src/i18n/locales/ko.json
#	src/renderer/src/i18n/locales/zh.json
@brennanb2025
brennanb2025 merged commit ff4a51c into main Oct 8, 2026
35 checks passed
@brennanb2025
brennanb2025 deleted the brennanb2025/agent-auth-parity branch October 8, 2026 22:00
brennanb2025 added a commit that referenced this pull request Oct 9, 2026
…ain)

Rebuilds #26561 on main now that #26416 is squash-merged. Same change as
before, re-applied onto what main has since:

- Every adapter answers acquire at spawn and reports `started` on protocol
  readiness with its real handle (Claude initialize, Codex thread, ACP
  session new/load plus restore, Pi session file plus restore). No bridge,
  no per-adapter phase or Stop opt-outs.
- Picks made while starting are intents applied model then effort before
  the start is accepted; rewind, goal, rewind recovery and compact wait for
  a proven start outside the session queue.
- One Stop rule: Stop ends the session for every agent (Codex: interrupt,
  up to 2 s for the turn to end, then close).
- Orchestration worker starts share one deadline; a send's answer copies
  its row; a re-attach during start keeps the start wait.

Integrated with main:
- ACP: the subagent-stop probe, child-work delivery and new/loaded origin
  move into the handshake; the sign-in rule (#26544) classifies a failed
  handshake; acpAgentName stays in acp-structured-agent-definitions.
- Codex: the session journal translator and account kind (#26407) reach the
  start step.
- Pi: the start choice (#26821) and the signed-out verdict (#26743) are read
  in Pi's start, so both exist when `started` is reported; commands follow.
- openWithAgent keeps main's pre-agent check and replay rule.
- A report with no model drops the saved one, as #26587 decided.
- The renderer re-reads a start's sign-in verdict once the start is proven.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant