Commit Graph
20927 Commits
Author SHA1 Message Date
Kelvin Amoaba 9cf03cbb90 test(plugins): pin the catalog repo's initial branch in the CLI install test
The test reads the catalog at ref master but created it with plain git init, so
it failed wherever init.defaultBranch is main (e.g. Xcode's git on macOS).
2026-11-12 08:49:56 +00:00
OrcaWinandOrcaWin f70465cf3a test: remove low-value renderer adapter and projection checks (#41462)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 00:42:28 -08:00
Jinjing e881c7e76c Highlight featured and newly added plugins (#41460)
* feat(plugins): Featured and Newly added rows in the plugin catalog

Featured shows the most installed plugin per category; Newly added lists plugins
by the catalog's new entry-level addedAt (hidden when no catalog dates entries),
with a New badge for 24h and an Added this week filter. Snapshots move to a v3
cache key so older builds never read addedAt.

* feat(plugins): derive Newly added dates from release dates, as the website does

Drops the catalog-level addedAt field (schema, docs, v3 snapshot key). Main now
estimates a listing date for each non-official plugin from its oldest dated
release, and the Newly added row, New badge and This week filter read it through
shared helpers that mirror orca-site's pluginNew.ts: 30-day window, newest first,
dates more than an hour in the future ignored, "just now / N hours ago / N days ago".

* feat(plugins): show nine Newly added plugins, drop the counts release dates inflate

Listing dates come from each community plugin's oldest kept release, and
catalogs keep only recent releases, so almost every plugin looks new: 181
of 182 fall in the 30-day window and 142 count as this week. Remove what
that inflates rather than flag it: the "N this week" count and its See all,
the This week filter, and the 24h New badge.

The Newly added row now offers the website's nine in the catalog's normal
wrapping grid, the same columns and card widths as the catalog groups.

* fix(plugins): pick Featured winners by every kind a plugin belongs to

Featured used only a plugin's first filter kind, while the category filters
count every kind, so category order could change winners or drop a kind's only
candidate. Each plugin, walked by installs with a key tie-break, now fills one
unfilled kind it belongs to (the one with the fewest candidates left, then by
name). Also note why Featured is a capped one-row teaser and pin the cap.

* fix(plugins): hide Featured when Newly added is empty

Without Newly added, Featured sat directly on the Official catalog, whose
leading cards are the same popular plugins in the same columns, so back-to-back
rows repeated and read as a render bug. Featured now shows only alongside
Newly added. Leaving featured plugins out of their catalog instead would move a
card into the catalog the moment it's installed and skew the catalog's N of M.

Adds a PluginManager test that no plugin card shows twice in the empty state,
and page-level fixtures (390, 600, 1440, empty 1440) for screenshots.

* fix(plugins): cap Newly added at two full rows of the current columns

At phone width nine stacked cards pushed the catalogs about 3.5 screens
down. The grid now shows two full rows of its container-query column
count (8 at four columns, 4 at two, 2 at one), hides a partial last row,
and the pick renders at most eight. Hidden plugins stay listed in their
catalog group, so there's no See all.

* Correct plugin catalog fixture evidence

* Make plugin highlight tests match observable behavior
2026-11-12 00:40:31 -08:00
NeilandJinjing 789ead4484 perf(sidebar): avoid repeated DOM scans in review visibility reports (#41318)
* perf(sidebar): share mounted row scans across review visibility checks

* refactor(sidebar): drop review-visibility parameters the hook no longer uses

The hook now gates on enabled and filters on-screen cards itself, so visibleReviewCardIds no longer needs enabled or isOnScreen.

---------

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-11-12 00:39:09 -08:00
Kelvin Amoaba 7e2810e653 fix(sidebar): keep the session name first on a monitoring agent row (#41458)
* fix(sidebar): keep the session name first on a monitoring agent row

Leading with "Monitoring background tasks" made every monitoring row in a
narrow sidebar truncate to the same text. The row's dot already draws the
monitoring glyph, so the status can trail the name like every other state.

* fix(agents): keep a monitoring child row's name first too

Sub-agent rows (desktop sidebar, chat strip and mobile) share one lead/trail
rule that also put "Monitoring background tasks" before the name.
2026-11-12 08:38:03 +00:00
NeilandJinjing 62edc2d8a7 perf(sidebar): avoid repeated DOM scans in review visibility reports (#41318)
* perf(sidebar): share mounted row scans across review visibility checks

* refactor(sidebar): drop review-visibility parameters the hook no longer uses

The hook now gates on enabled and filters on-screen cards itself, so visibleReviewCardIds no longer needs enabled or isOnScreen.

---------

Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-11-12 00:36:25 -08:00
Kelvin Amoaba 5971e67757 fix(sidebar): keep the session name first on a monitoring agent row (#41458)
* fix(sidebar): keep the session name first on a monitoring agent row

Leading with "Monitoring background tasks" made every monitoring row in a
narrow sidebar truncate to the same text. The row's dot already draws the
monitoring glyph, so the status can trail the name like every other state.

* fix(agents): keep a monitoring child row's name first too

Sub-agent rows (desktop sidebar, chat strip and mobile) share one lead/trail
rule that also put "Monitoring background tasks" before the name.
2026-11-12 08:36:10 +00:00
Kelvin Amoaba 68d2314615 fix(plugins): only auto-close short brackets when a syntax omits autoClosingPairs (#41451)
Monaco falls back to brackets for auto-closing, so a plugin bracket up to 128
characters was typed into the file as you type. The shared schema now fills in
autoClosingPairs with the brackets that pass the 8-character typed-pair rule.
2026-11-12 08:27:20 +00:00
OrcaWinandOrcaWin dac6392709 test: remove low-value CLI, shortcut, and relay checks (#41452)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 00:26:04 -08:00
Jinjing aaf5295a7f feat(tab-group): split pane landing as a command card (#41441)
* feat(tab-group): split pane landing as a command card

The empty split pane becomes one bordered card. The caret starts in the search field with the default-agent row highlighted; Enter opens it, arrow keys move the highlight, → opens the agent picker from the default row with an empty query, and Esc clears the query. Late agent and file rows re-highlight the first row only while the user hasn't moved the highlight since the last query change, and a picked row that disappears hands the lead back. Under a 300px card the field says "Search"; under 280px the shortcut column hides. Styling lives in an opt-in Command density="card" variant plus a scoped selected-row rule in main.css.

* fix(tab-group): keep landing search accessible on narrow cards

* fix(tab-group): track actual landing highlight moves
2026-11-12 00:23:06 -08:00
Neil fb58871bdb refactor(claude): group root modules by defining owners (#41437) 2026-11-12 00:20:10 -08:00
Kelvin Amoaba 1ed47daf1f fix(workspace-cleanup): show merged and unchanged workspaces instead of flagging landed commits as unpushed (#41408)
* feat(workspace-cleanup): mark merged and unchanged workspaces from git evidence

Squash-merged branches whose remote was deleted were flagged as unpushed
and needed a forced delete. The scan now reads what HEAD holds beyond the
workspace's base (ancestor, Git's squash proof, or a cached merged PR) and
reports merged/unchanged reasons; landed commits no longer count as at risk.
A gone upstream no longer hides unpushed commits. Renames idle-clean to
inactive and drops the dead tier, selectedByDefault and volatile-local-context.

* fix(workspace-cleanup): read HEAD once, skip a reused branch as its own base

Merge evidence now compares the cached PR and the base against the HEAD it
reads, not the listing's possibly stale one; a workspace opened on an
existing branch no longer counts that branch as its base; the proof
wrapper settles the WSL route before building its caches; a visit keeps
merged/unchanged reasons; landed rows stop sorting as unpushed.

* fix(workspace-cleanup): qualify base refs and trust the branch proof only for HEAD

Base refs resolve through the worktree base-ref qualifier so a tag cannot
shadow them and only the branch's own family is skipped, including the
repo default; SHA-256 pinned commits are not bases; the squash proof runs
only while the branch ref is the HEAD just read; expanded details stop
counting landed commits as unpushed.

* test(workspace-cleanup): build the repo fixture without a cast

* fix(workspace-cleanup): never take a tag as a workspace's base
2026-11-12 08:14:14 +00:00
Kelvin Amoaba 322b66fab4 fix(attachments): stop naming unrecognised image uploads .png (#41448) 2026-11-12 08:13:09 +00:00
OrcaWinandOrcaWin 9ee5ec9fa0 test: remove low-value account wrapper and routing checks (#41447)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-12 00:04:18 -08:00
NeilandDuncan 34bde5edd4 fix(floating-terminal): keep east resize handle off the terminal scrollbar (#41443)
Fixes #33825

Co-authored-by: Duncan <dfierens@infitex.fr>
2026-11-11 23:56:17 -08:00
Kelvin AmoabaandWooseong Kim 34ae456a8b fix(cli): agent hooks status reports the running app and its SQLite file (#41445)
* fix(cli): report connected agent hook status from the sqlite file

Status always said appliedBy offline and named orca-data.json, even when the app was connected and the setting lived only in profile-state.db.

* fix(cli): read agent hook status from the running app

When the runtime answers, status takes agentStatusHooksEnabled from
settings.get instead of the disk, so appliedBy: runtime is true. The
settings path rule lives next to the reader, and on/off report the
SQLite file when the runtime applied the change.

---------

Co-authored-by: Wooseong Kim <innocarpe@gmail.com>
2026-11-12 07:54:47 +00:00
Neilandbbingz 435a1a2760 fix(cli): add concise group-level root --help entries for undiscoverable command groups (#41444)
Fixes #13201

Co-authored-by: bbingz <zzb@gxsmjx.com>
2026-11-11 23:51:57 -08:00
Kelvin Amoaba d1c52bd6dc fix(native-chat): attach SVG, BMP and ICO as files instead of refusing the message (#41394) 2026-11-12 07:49:36 +00:00
Wooseong KimandKelvin Amoaba b4ca378c61 fix(agent-hooks): keep the Claude session model on hook status (#41058)
* fix(agent-hooks): keep the Claude session model on later hook status

SessionStart reports the model, but the Claude handler dropped it, so the
mobile composer chip stayed on "Model". Publish that model and retain it
when later lead and child events omit it.

* fix(agent-hooks): keep the Claude model across an Orca restart

Claude reports its model only on SessionStart. After a restart the listener's
lead state is empty, so the next hook dropped the saved model from the row.

* test: run the Claude model restart test in the node pool

* fix(agent-hooks): keep the Claude model when a terminal status row lands first

* refactor(agent-hooks): read the Claude lead model once to keep claude-events under the line limit

---------

Co-authored-by: Kelvin Amoaba <97001695+AmoabaKelvin@users.noreply.github.com>
2026-11-12 07:48:50 +00:00
Neil 10c91a3ef9 fix(terminal): pass unselected Ctrl+Shift+C through to Kitty TUIs on Linux/Windows (#41442)
Fixes #9727
2026-11-11 23:48:19 -08:00
OrcaWinandOrcaWin b4d87ff410 test: remove low-value worker and model inventory cases (#41439)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-11 23:47:13 -08:00
OrcaWinandOrcaWin 4dcf689fb2 test: remove low-value mobile and host policy suites (#41436)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-11 23:25:07 -08:00
Kelvin AmoabaandVyacheslav Scherbinin 443a0ee846 fix(tabs): reopen the last closed tab from the welcome screen (#41430)
* fix(tabs): reopen the final closed tab from the welcome screen

* fix(tabs): activate a reopened folder workspace through the workspace activator

History entries can be folder workspace keys, so welcome-screen reopen
activates through the same activator history replay uses. Adds a
regression test for the welcome-screen shortcut.

* fix(tabs): let the shortcut recorder capture workspace shortcuts and open reopened workspaces as user opens

---------

Co-authored-by: Vyacheslav Scherbinin <gentslava@mail.ru>
2026-11-12 07:04:27 +00:00
OrcaWinandOrcaWin 0a0f8d5a9f test: remove low-value approval and cloud push suites (#41420)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-11 23:00:12 -08:00
Brennan Benson a72bfaefe7 Fold legacy models the same way in every model picker (#41019)
* feat(agent-picker): fold legacy models the same way in every model picker

Claude aliases whose versioned model is listed, and Codex models superseded
in their family or by a newer major line, fold under Legacy models in the
agent launch picker, text-generation pickers, and native chat on desktop and
mobile. The default and current model always stay listed.

* feat(agent-picker): expand legacy models in place instead of a separate list

* feat(source-control): fold legacy models in the action model menu

* fix(agent-picker): keep model rows keyed across sections; let launch search find legacy models

* fix(agent-picker): keep rows in place while picking; classify each model catalog once

Legacy membership no longer depends on the selected model; a picker opens the
legacy section when the current model is in it. Classification is one pass and
cached per catalog, so streamed chat renders don't reclassify an unchanged list.
Typing on a closed Select no longer swallows its next close.

* fix(agent-picker): reopen menus with the current legacy model shown; PTY chats classify their discovered list

* test(agent-picker): wait on the menu instead of sleeping

* fix(agent-picker): keep the Legacy models row last, expanding older models above it

* fix(agent-picker): label the folded section More models, matching mobile
2026-11-11 22:54:21 -08:00
Kelvin Amoaba c259923c33 fix(ime): stop a commit key with no keyup from blocking the next Enter (#41425)
* fix(ime): stop a commit key with no keyup from eating the next Enter

compositionend only scheduled the carry's expiry when it armed a new carry. A marked commit key (Process/229 with an unknown code) whose keyup never arrives left its carry armed forever, so the next bare Enter in the chat composer and every IME text field was swallowed while Ctrl/Cmd+Enter still submitted. compositionend now always schedules the expiry.

Refs #41072, STA-14827

* fix(ime): expire an unidentified commit key's carry on every composition end

Keep a carry armed by a key known to be Enter until its keyup, so a confirm Enter held across a frame still swallows macOS's redispatch. Route setComposing(false), which the chat composer, file explorer, quick commands and comment box use, through the same settle step as onCompositionEnd.

* fix(ime): expire an unknown-code commit key's carry outside a composition
2026-11-12 06:51:05 +00:00
Jinwoo Hong 4d50c440be perf(orchestration): read released worker output from its original instead of a saved copy (#41374)
* perf(orchestration): read released worker output from its original instead of a saved copy

* fix(orchestration): keep refusal codes on released chat reads and locate legacy remote transcripts

* test(orchestration): prune flaky-pattern baseline for removed archive tests; guard a cursor read

* fix(orchestration): keep locator fields when stripping copies; never let the optional receipt page block remote release

* test(orchestration): drop removed archive tests from the node-runtime test list

* refactor(orchestration): drop the background strip; old rows keep their saved copy and its reader

* fix(orchestration): give reference rows the empty copy fields older Orca reads, with a note

* test(orchestration): give the slow-exit release mock a stored archive body

* fix(orchestration): record a transcript reference only for agents the reader can open
2026-11-12 01:45:22 -05:00
Kelvin Amoaba a3bbd507fd fix(mobile): tell the user when closing a session tab fails (#41404)
The close actions swallowed refusals and transport errors, so a tap on
close did nothing when the host refused (for example while the desktop
window is still loading). Show a short toast instead, with a specific
message for runtime_unavailable.
2026-11-12 06:42:25 +00:00
Neil 176943e8fe refactor(mobile-tasks): group modules by concrete feature owners (#41410)
* refactor(mobile-tasks): group modules by concrete feature owners

* refactor(mobile-tasks): consolidate concrete owner imports

* refactor(mobile-tasks): point recording loaders at concrete owners
2026-11-11 22:40:18 -08:00
Jinwoo Hong 9eede69216 fix(orchestration): hide approve from help; approval follow-ups (#41403)
* fix(orchestration): hide approve from help; approval follow-ups

- Hide 'orchestration approve' from group help; its own --help still works.
- Mark a terminal worker's approval reported only once its escalation was sent,
  so a prompt whose report was skipped gets no stray closing line.
- Hold back a worker approval receipt older than every loaded chat message
  instead of drawing it below newer replies.

* fix(orchestration): count a stored stop report as sent when its wake fails
2026-11-11 22:37:48 -08:00
OrcaWinandOrcaWin affd908567 test: remove narrow parser, policy, and native projection tests (#41407)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-11 22:30:38 -08:00
Kelvin Amoaba e5a92090cf fix(plugins): allow syntax comment markers longer than 8 characters (#41411)
Liquid's {% comment %} / {% endcomment %} were dropped by hosts and refused by
validate:plugin. Comment markers are only inserted by Toggle Comment, so they
share the 128-character printable one-line rule with brackets; typed pairs keep 8.
2026-11-12 06:30:01 +00:00
Jinjing e9f06774c9 fix(i18n): refine dictation translations 2026-11-11 22:27:24 -08:00
Kelvin Amoaba bda1ad0d55 fix(browser): reveal waiting popups when the user returns through an origin-bar popup (#41415) 2026-11-12 06:18:09 +00:00
HrithikandHrithik Saini 1b940ba30a fix(i18n): improve Korean translations for Undo, Quit, and Stop (#37042)
- auto.components.activity.clearCompleted.undo: '끄르다' -> '실행 취소'
- rendererRecovery.quit: '그만두다' -> '종료'
- components.native-chat.backgroundTasks.stop: '멈추다' -> '중지'
- auto.components.settings.terminal.search.stop: '멈추다' -> '중지'
- Add key overrides to locale-ko-key-overrides.json

Fixes #37042

Adapted from https://github.com/stablyai/orca/pull/37078 by @hrithiksaini99.
Reported and wording proposed by @Tomk2d in #37042.

Co-authored-by: Hrithik Saini <49943287+hrithiksaini99@users.noreply.github.com>
2026-11-11 22:17:09 -08:00
NeilandClaude e7d25df3ed feat(wsl): turn WSL hosts on by default (flag-on; owner decides) (#36501)
* feat(wsl): turn WSL hosts on by default; ORCA_INTERNAL_WSL_HOSTS=0, false, off or no turns them off

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

* fix(wsl): review follow-ups for WSL hosts on by default

- Off words also match when quoted (cmd.exe's set NAME="0" keeps the quotes).
- The refusal now says WSL hosts are turned off for this launch, not missing from the build.
- New preload test pins when the renderer gets the WSL hosts API.
- Unit tests no longer inherit the gate state an Orca terminal publishes.

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-11-11 22:03:29 -08:00
Brennan Benson 7d9290ee8d fix(native-chat): keep Send's round size while Cmd/Ctrl previews steer (#40820)
Holding Cmd/Ctrl swapped the round Send/Stop button for a wide labeled pill,
pushing the model picker, context ring and mic left. The preview now keeps
Send's round button and only swaps its icon (CornerDownRight for steer,
ListEnd for queue); the label stays as the aria-label. With Steer queued,
the head queued card's Steer button also fills as the primary.

The phone composer had the same pill and now follows the same rule.
2026-11-11 22:00:14 -08:00
Kelvin Amoaba 5e27264fd4 refactor(settings): compose workspace cleanup settings from their feature module (#41406)
Two merges each added lines to global-settings-types.ts and pushed it past
the 300-line cap on main. Move workspaceCleanupPolicy into a group owned by
the workspace cleanup policy module, composed through GlobalSettingsBase like
the other feature settings. No behaviour change.
2026-11-12 05:57:46 +00:00
Kelvin Amoaba e9a3d8b28b fix(native-chat): send images up to 20 MB inline to ACP agents instead of as a file path (#41400)
* fix(native-chat): send images up to 20 MB inline to ACP agents instead of as a file path

The 16 MiB line limit left ~11 MiB for images, so phone photos reached the agent only as a path.

* refactor(native-chat): name ACP image caps by scope and pin the 20 MiB boundary
2026-11-12 05:55:14 +00:00
Neil 46b225e473 chore(links): point website, docs and download links at orca.dev (#41376)
The site now lives at orca.dev; the old onorca.dev and www.onorca.dev hosts
redirect there. Linking to orca.dev directly skips that redirect.

Only page links change. Service hosts, sign-in and relay endpoints stay as they are.
2026-11-11 21:50:37 -08:00
Neil b9e3912ff8 Call orca.dev for feedback, plugin lists and update notes; accept orca.dev share and download links (#41380)
* chore(endpoints): call orca.dev for feedback, plugin lists and update notes

The site moved to orca.dev. Feedback, connection diagnostics, plugin install
stats, the plugin kill list, update nudges and the changelog feed now use
orca.dev, as do the diagnostics token URL baked into builds and the release
download mirror (downloads.orca.dev). The old hosts serve the same paths,
so released builds keep working.

Skill share links on share.orca.dev are accepted, and the mobile scanner
recognizes the orca.dev Android download code. The old hosts stay accepted.

* chore(ci): leave the release JavaScript benchmark workflow unchanged

Editing it triggers the benchmark, whose parity check currently fails on
arm64 because max-quality brotli output for the mobile page differs by
architecture. The benchmark only needs some diagnostics URL, and the old
host still serves it.
2026-11-11 21:50:31 -08:00
Neil a919371cee refactor(codex-accounts): organize concrete domain owners (#41388)
* refactor(codex-accounts): organize concrete domain owners

* test(codex-accounts): retire vacuous account selection case
2026-11-11 21:49:43 -08:00
Eotel abe77d5b63 fix(activity): name a resumed session by its own title in the agents list (#41127)
The Agents list titled a thread with the tab's generated title, the first
prompt that tab saw. After `claude --resume` in a new tab, that is the
message sent after the resume, so the list kept a status note as the
thread's name while the tab and the agent row showed the session's own
name. Rank a named provider title of the pane's own session above the
generated title, as resolveTabNameSource does, and share the session
ownership check with the agent row.
2026-11-12 05:46:32 +00:00
Neil d860f32322 fix(new-workspace): keep the GitLab source steady across composer opens (#41399)
GitLab showed in the new-workspace source tabs on some opens and not others. Its availability required the app-wide preflight status to match the current host/workspace context, and opening the composer for another context invalidated it until the async glab probe returned. Remember the last known glab answer per preflight context while a fresh probe runs, and keep a chosen GitLab tab during the re-check, as Linear already does.
2026-11-12 05:45:26 +00:00
Brennan Benson e944b31538 Own chat approval observation in the installed host (#41390) 2026-11-11 21:43:25 -08:00
Kelvin Amoaba a6dd56b429 feat(workspace-cleanup): store cleanup rules in settings with per-project overrides (#41398)
Adds off-by-default workspace cleanup rules (merged, unchanged, inactive,
automation runs, orchestration workers, keep-when) to global settings and
an inherit/off/custom override on each repo. resolveWorkspaceCleanupPolicy
is the single source of truth for the coming background runner, and the
rules are exposed to paired clients through settings.get/settings.update.
No UI and no behaviour change yet.
2026-11-12 05:43:15 +00:00
buf0-bot[bot] bf181d0385 Update README downloads badge (#41401)
Co-authored-by: buf0-bot[bot] <252831055+buf0-bot[bot]@users.noreply.github.com>
2026-11-12 05:39:05 +00:00
OrcaWinandOrcaWin 86f23bbb6b test: remove low-value policy and parser samples (#41397)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-11-11 21:35:14 -08:00
Jinwoo Hong d4ce08f8b0 feat(cmd-j): extra sources can lead the empty list and draw in the workspace row box (#41360)
* feat(cmd-j): extra sources can lead the empty list and draw in the workspace row box

A source sets emptyQueryPlacement 'first' to sit above Recent Chats & Terminals; the default
selection stays on the first row below it. Extra rows use the workspace row box with the line
inline after the title. Public registers no sources, so nothing changes in public builds.

* refactor(cmd-j): palette rows share one row-box variant; extra rows reuse the tab title line

* fix(cmd-j): the empty query's default row follows recent tabs that arrive after mount

The deferred-query reset committed the first render's list head, before the recent-tab
snapshot existed, so Enter landed on the first workspace instead of the latest tab.

* test(cmd-j): pin the empty query's Enter default to the latest recent tab under StrictMode

Real cmdk, StrictMode render: the re-run deferred-query effect committed the first render's
head (a workspace) before the recent-tab snapshot existed. Dev builds only; production does
not re-run mount effects.
2026-11-12 00:32:48 -05:00
Jinwoo Hong 2e7e992027 feat(orchestration): let coordinators approve worker permission prompts (opt-in) (#41306)
* feat(orchestration): let coordinators approve worker permission prompts when the user turns it on

One setting on the orchestration page, off by default. When on, the
escalation offers orchestration approve and deny, both with a reason, and
the user still sees Allow/Deny: the first answer wins. A prompt the
worker's agent lets only a person approve is refused and stays with the
user. The machine running the worker enforces its own setting.

* fix(native-chat): a worker approval's receipt shows the command, not its tool input as JSON

* test(orchestration): list every worker-side case in the coordinator approval table

* chore(i18n): ship the coordinator approval setting's search keywords in the runtime catalog

* fix(orchestration): a reasonless allow keeps the person's refusal, and terminal checks no hook may approve are person-only

* fix(orchestration): address review on coordinator approvals

- A person-only chat prompt answered meanwhile reports as closed.
- A terminal allow reads Claude's warning from the screen it checks, so a
  late-painted person-only warning still refuses before the hook is used.
- The receipt keeps a chat worker's whole command.
- orchestration approve prints the reason it sent.

* fix(native-chat): read the receipt's command through a parsed shape, not Reflect

* docs(skills): drop worker permission prompt guidance; the escalation carries it
2026-11-12 00:30:27 -05:00