Skip to content

Replace chat upgrade switch with primary Enable Now button - #28113

Merged
nwparker merged 1 commit into
mainfrom
nwparker/turn-on-chat-mode
Oct 13, 2026
Merged

nwparker merged 1 commit into
mainfrom
nwparker/turn-on-chat-mode

Conversation

@nwparker

@nwparker nwparker commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor
Files Added Deleted Net
Test 1 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​52 $\color{#cf222e}{\Huge{\mathbf{−}}}$​35 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​17
Prod 3 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​43 $\color{#cf222e}{\Huge{\mathbf{−}}}$​56 $\color{#cf222e}{\Huge{\mathbf{−}}}$​13

ELI5

The chat upgrade dialog now offers a clear primary button to enable chat mode instead of a switch.

What Changed

The switch is removed in every state. When chat mode is on, the dialog shows only Got It. When it is off, it shows Okay and the primary Enable Now button. Okay dismisses without changing the setting; Enable Now saves the setting and then dismisses. A failed save keeps the dialog open for retry.

The actions follow the current Chat UI setting for both upgrade audiences. They reuse the existing dialog actions, button primitives, settings persistence, and dismissal paths.

Why

Enabling chat belongs beside the acknowledgement action. Using the current setting avoids offering an enable action after chat is already on, while removing the switch avoids a separate toggle-and-dismiss step.

Linked Issue

Requested directly by a maintainer; no linked issue.

Visual Proof

Chat mode off — before:

Before: chat mode off

Chat mode off — after:

After: Okay and primary Enable Now

Chat mode on — before:

Before: chat mode on

Chat mode on — after:

After: Got It only

Testing

  • Manually tested on macOS through Playwright CDP against this worktree's hidden Electron app with an isolated profile. Inspected dark and light rendering. Exercised Okay, Enable Now, and Got It; verified persisted settings, both upgrade audiences with chat on/off, and an injected save failure that remains open and does not mark the tip seen.
  • Updated automated tests for action labels, primary/ghost variants, dismissal callbacks, busy controls, and absence of the switch.
  • Passed: ORCA_BACKGROUND_LAUNCH=1 pnpm test src/renderer/src/components/feature-tips/NativeChatUpgradeTipDialog.test.tsx src/renderer/src/components/feature-tips/feature-tip-modal-state.test.ts (15 tests), pnpm tc:web, pnpm run check:code-quality:changed, and git diff --check.
  • The Electron dev build completed. Full production build and full-repository checks are left to CI. Linux, Windows, and SSH were not run locally.

Review

Agent skill upstream boundary

  • Not applicable; this change copies no upstream skill-installer source or assets.

Notes

This changes renderer dialog actions using the existing global Chat UI setting. It introduces no platform-specific paths, shortcuts, execution-host logic, or remote protocol changes. The dialog still supports folder workspaces and git worktrees.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Before/after screenshots attached
  • Self-reviewed for correctness, security, and performance
  • Cross-platform, SSH/remote, and path/shortcut impact considered
  • Full lint, typecheck, test, and production build pass in CI; focused local checks passed as listed above

@coderabbitai

coderabbitai Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

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: 28811f74-8138-403b-95f8-582d12682d2c
📥 Commits

Reviewing files that changed from the base of the PR and between 5e83ca0 and 64bd5b9.

📒 Files selected for processing (4)
  • src/renderer/src/components/feature-tips/FeatureTipsModal.tsx
  • src/renderer/src/components/feature-tips/NativeChatUpgradeTipDialog.test.tsx
  • src/renderer/src/components/feature-tips/NativeChatUpgradeTipDialog.tsx
  • src/renderer/src/i18n/locales/en.json

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

📝 Walkthrough

Walkthrough

The native chat upgrade dialog now bases its offer on the current chat-mode setting and no longer includes a chat-mode switch. Its buttons and English strings reflect whether chat mode is on or off. The modal waits for the settings update before marking the tip seen. If the update fails, it shows an error and leaves the tip and modal open.

Priority: ⬇️ Low

Merge Risk: ⚪ Minimal · up to 64bd5

No actionable merge-blocking issue remains. A failed attempt to enable chat mode leaves the dialog open for retry.

Pre-merge checks · Passed 4 · Failed 1

Failed Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 5 functions across 3 files. (1 skipped: 1 … Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks (4 passed)
Check name Status Explanation
Title check Passed The title clearly and concisely describes the primary change: replacing the chat upgrade switch with an "Enable Now" button.
Description check Passed The description covers the user-visible changes, rationale, testing, visual proof, scope, and checklist. It states that no issue is linked, but it provides a maintainer-request rationale, and the rema…
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.
Full details: Docstring Coverage

Explanation

Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 5 functions across 3 files. (1 skipped: 1 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 2
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🛠️ Fix failing CI checks 💡
  • Commit to this branch
  • Create a new PR
  • Autofix · 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.

@nwparker
nwparker merged commit bdf0157 into main Oct 13, 2026
23 of 25 checks passed
karlorz added a commit to karlorz/orca that referenced this pull request Oct 13, 2026
* Update README downloads badge

* fix(i18n): drop chat-mode keys removed from en.json in stablyai#28113 (stablyai#28131)

* Speed up Mobile Checks by overlapping typechecks and tests (stablyai#28127)

Overlap mobile typechecks with tests and avoid repeated filesystem probes and unused device substitutes in recording replays. Keep state isolated between loaders, give exhaustive snapshot cases an explicit execution deadline, and retire obsolete locale keys that blocked repository validation.

* fix(orcad): identify instances by kernel start ticks, not drifting wall-clock start time (stablyai#28125)

* fix(orcad): identify instances by kernel start ticks, not drifting wall-clock start time

On Linux the start time is derived from /proc/stat btime, which drifts (WSL2, NTP),
so a live orcad was read as a reused PID and its managed stop reported exited
without ever writing the request. The lock and stop request now carry optional
linuxStartTicks + bootId; readers prefer them, and a wall-clock mismatch on Linux
for records without them is unverifiable, never proof of exit.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(orcad): match stop receipts without the incarnation an older client drops

A request recovered by an older client loses linuxStartTicks/bootId, which made
the newer host reject its own receipts and decision records as mismatched. Also
exercise the incarnation reader against a real Linux /proc.

---------

Co-authored-by: Claude <noreply@anthropic.com>

* docs(readme): point the Android APK links at 0.0.55 (stablyai#28134)

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* perf(runtime): stop re-sending the worktree list to mobile pollers on every terminal chunk (stablyai#28062)

* perf(runtime): let worktree.ps pollers opt out of per-chunk activity churn

worktree.ps carries `preview` and an exact `lastOutputAt` on every row, both
of which move on each PTY chunk, so the content-addressed snapshot id changed
on every poll while any agent printed and the whole catalog was resent.

Add an optional `coarseActivity: true` param. When set, the host drops
`preview` and floors `lastOutputAt` to 30 s before hashing, so the id holds
while only chunk-level activity moves. Callers without the param get the
byte-identical response they get today; older hosts strip the unknown key.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* perf(mobile): stop re-sending the worktree list on every terminal chunk

The host-screen snapshot poll now asks worktree.ps for `coarseActivity`, so
the catalog's snapshot id survives terminal output and the 3 s poll gets a
tiny `unchanged` reply instead of the whole catalog. `preview` is optional on
mobile rows because a coarse host leaves it out; old hosts ignore the param
and keep sending it.

Re-records the three worktree.catalog-snapshot goldens; the only semantic
change is the new request param.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* perf(runtime): coarsen worktree.ps activity for every snapshot poller

Drop the `coarseActivity` param: the only caller that sends
`afterSnapshotId` is the mobile snapshot poll, which never renders
`preview` and uses `lastOutputAt` only to rank rows. Snapshot polls now
always get a blank `preview` and a 30 s-floored `lastOutputAt`, so
already-shipped apps stop re-downloading the catalog on every terminal
chunk with only a desktop update. Callers without `afterSnapshotId`
still get the byte-identical response.

Reverts the mobile param, its scenario steps and the three re-recorded
goldens, and removes the unread `preview` field from mobile row types.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* fix(runtime): rank coarsened worktree.ps rows so in-bucket swaps keep the snapshot id

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* test: drop preview from row fixtures and keep the runtime cast on one line

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* fix(mobile): load markdown tabs from any desktop split group; center load-error Retry (stablyai#28132)

* fix(mobile): load markdown tabs from any desktop split group and center load-error Retry

The desktop answered markdown.readTab only for tabs in its focused split
group, so a phone opening a markdown tab from another group got
tab_not_found and showed "Couldn't load markdown". Resolve the tab across
all of the worktree's groups.

Load-error states now share one component that centers the message and its
Retry button; the markdown reader's button was pinned to the left.

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* test(renderer): mobile markdown read picks the requested tab across groups

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* refactor(renderer): resolve mobile markdown tab to one file id

Claude-Session: https://claude.ai/code/session_01JNnE9qzUZMMnqpZWCqM3nb

* fix(wsl): run WSL git with Windows Git line-ending settings on checkouts Windows Git wrote (stablyai#27778)

* fix(wsl): run WSL git with Windows Git settings on Windows-authored drive checkouts

* fix(wsl): detect Windows Git checkouts from host autocrlf plus a whole-tree sample

* fix(wsl): keep WSL-created worktrees on Linux Git defaults and never commit CRLF on an unproven checkout

- worktree add / clone write a new checkout whose .git points at /mnt/..., which Windows Git
  cannot open; injecting autocrlf=true there produced CRLF files later read unflagged.
- Writes on a host-autocrlf=true checkout whose sample is unproven run with autocrlf=input,
  so staging normalizes CRLF without ever writing CRLF to disk.
- Writes wait for a stale host answer and re-check checkout identity after joining a sample.

* fix(wsl): compare a joined sample with the checkout identity read after it settles

* fix(runtime): stop a project's terminals before the host forgets the project (stablyai#28024)

* fix(runtime): stop a project's terminals before the host forgets the project

Removing a project on a runtime host (an SSH-managed or paired server) sent repo.rm first; the
host resolves terminal.stop through the project's workspace rows, which repo.rm deletes, so the
stop failed and the shells kept running on the host. Terminals stop first now. The removal toast
also drops the IPC wrapper from its message.

* fix(runtime): only stop host terminals when the host will accept the project removal

Probe with repo.show (same resolver as repo.rm) so a removal the host rejects, such as an
ambiguous project id, no longer kills the shells first. Also poll through terminal_not_writable
in the paired-client e2e.

* test(e2e): read the host shell pid through sh so non-POSIX login shells work

* fix: preserve relay pane claims across managed tab mirrors

* fix(mobile): cancel bridge-post retries when a terminal document stops

Mobile Checks verify failed on an unhandled ReferenceError: window is not
defined inside postToReactNativeWebView's scheduled send() retry while
viewport-frame.test.ts ran. Retries lived outside the document lifecycle, so
a stop left timers that later read a torn-down window.

Bind the default postToHost per scope, clear its timers on stop, no-op posts
after stop, and guard window before reading ReactNativeWebView. Preserve
bounded retry and deliver-when-bridge-appears behavior.

* fix(mobile): use supported own-property check for host overrides

* fix(mobile): align bridge retry teardown with document lifecycle contract

* style(mobile): format bridge retry lifecycle regression test

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Jinwoo Hong <73622457+Jinwoo-H@users.noreply.github.com>
registered2nd pushed a commit to registered2nd/orca that referenced this pull request Oct 14, 2026
registered2nd pushed a commit to registered2nd/orca that referenced this pull request Oct 14, 2026
brennanb2025 pushed a commit that referenced this pull request Oct 15, 2026
brennanb2025 pushed a commit that referenced this pull request Oct 15, 2026
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