* fix(notifications): lift toasts and corner cards onto a shared notice surface
* fix(notifications): keep corner-card shadows unclipped and match the StarNag toast
* fix(notifications): keep the stack's scrollbar on screen and its overflow off the status bar
* fix(notifications): collapse stack shadow room while scrolling and paint lower cards above upper shadows
* fix(notifications): pair re-pointed surfaces with popover foregrounds and keep close-hover border
* fix(notifications): keep notice text readable on plugin themes and catch card growth in a capped stack
* fix(notifications): track stack cards from mutation records and tidy test types
* fix(notifications): check painted notice colors and outline unfilled secondary buttons
* fix(notifications): paint app-theme notice colors as the exact hex measured, with a one-step margin
* fix(notifications): keep muted panels on the notice surface's polarity for app themes
* fix(notifications): keep toast descriptions and outline buttons readable on notice surfaces
The surface lift now also keeps the 80% toast description blend readable, so
mid-gray dark popovers no longer drop descriptions under 4.5:1. The notice scope
remaps --background with --foreground, so outline buttons keep a dark surface
under light popover text in light-base themes with dark popovers.
* perf(orchestration): rank empty-check hint candidates in one pass over the Run
* perf(orchestration): take the oldest candidate without spreading arguments
* perf(plugins): pause a plugin's automations in one batched write
* perf(plugins): limit the automation batch path to pause fields; test batch/single parity
This reverts commit 6854ab5ae9.
Conflict resolution: native-chat-new-rows-marker.test.tsx (pre-existing) and
native-chat-new-rows-marker.journal.test.tsx (added by #41735) stay deleted, as
#41782 removed/trimmed them on main after #41735 landed.
The queued list cached each row's height by message id for the life of the
chat, so a long conversation kept one entry per message ever queued and a
requeued id could place a failed row by the height it left with. Keep heights
only for queued ids, and drop a layout a departed row reports late.
* feat(workspace-cleanup): keep workspaces a paired client has unsaved edits in
* fix(workspace-cleanup): keep each window's unsaved-editor report and send them in order
* fix(github): keep the selected workspace's PR on its one-minute refresh
Follow-up reads inherited the priority of whatever entry ran last. A workspace
selected while its cached PR was still fresh never got a foreground entry, so
its follow-ups competed with every visible card for the shared list budget and
were read about every five minutes with 25 visible open PRs. Previously
selected workspaces kept priority 80 forever. Follow-ups now take foreground
priority only while their workspace is selected.
* feat(source-control): say when a merged workspace is safe to delete
Source Control's committed list is a merge-base diff against the base ref. A
squash or rebase merge copies the commits onto the base with new IDs, so the
list looks the same after the merge as before it. A notice now states whether
the merged review contains everything: HEAD is the review's head (or the
provider confirmed it is contained) and nothing is uncommitted.
* fix(sidebar): keep PR status visible on sleeping workspaces
The sleeping moon replaced the review glyph, hiding whether a sleeping
workspace's PR was open, failing or merged. Review status now keeps the lane;
the dimmed row already shows sleep and the accessible label names both.
Co-authored-by: Tobias Diez <code@tobiasdiez.com>
Co-authored-by: alpenshtokk <wawesandways@gmail.com>
* fix(source-control): wait for a git status read before judging a merged workspace
Before the first status read the change count is zero and HEAD may be stale,
so the notice could call a dirty workspace safe to delete. Use the HEAD from
the latest successful status read and say nothing until one completes.
* chore(i18n): ship the merged-review plural copy in the runtime English catalog
* fix: satisfy design-system, cast and flaky-test gates for the merged notice
Use the callout-important token instead of raw purple, let Button own its
type size, build the fixture worktree with the shared factory, pin the test
clock and give the long simulated-time tests a reason for their timeout.
* fix(github): align selected-refresh regression with feature ownership
* refactor(github): give refresh queue aliases their concrete owner
* fix(source-control): preserve cleanup warnings and reserve refresh fairness
* fix(source-control): describe missing merged-head proof as unverified
---------
Co-authored-by: Tobias Diez <code@tobiasdiez.com>
Co-authored-by: alpenshtokk <wawesandways@gmail.com>
* Show matching settings as a results list in the Settings sidebar
Typing in the Settings search now replaces the nav with a ranked list of
individual settings (pane title on the second line, matched text marked).
The first result is selected and previewed: its pane opens unfiltered,
scrolled to the setting with the target highlight. Arrow keys move and
preview, Enter or a click picks and keeps the query, Esc or the clear
button returns to the nav while leaving the shown pane open.
The sidebar query no longer filters page content. The Back to app row is
now 48px so its border lines up with the Settings header.
* Highlight settings search targets with a full-bleed bar and find unanchored rows
Matches in the results list are marked with semibold text (the jump palette's
HighlightedText) instead of a grey box. The landed-on row gets a tint from card
edge to card edge with a left bar that fades after ~3s, replacing the inset
grey block that sat off-center in the card padding. Integration provider rows
get anchors, and rows not wrapped in SearchableSetting are found by their
visible label.
* Fit the search highlight to each row's enclosing card
Settings cards pad differently (groups, plain sections, shadcn cards, the
Appearance accordion), so the highlight now measures the gap from the row to
its nearest card's inner edges instead of assuming one gutter. A group title
match highlights that group's card rather than the heading text.
* Give the settings target highlight a single owner
Components applied the highlight through SettingsTargetHighlightContext while the
page effect applied it to whatever element the jump scrolled to; when those
differed (Jira's provider row vs. its card shell) two highlights showed. The
effect now owns it alone, and the context, its provider and the macOS
Permissions prop are removed. Jira and Linear reuse their existing anchor ids.
* Use a plain fading tint for the settings target highlight
Drops the left bar; the tint still spans the enclosing card and fades after ~3s.
* Mark settings result titles with the ranking fold
The title highlight lowercased by hand and skipped titles whose length changed,
so İstanbul matching "stan" (or a query of İ) ranked but was never marked. Fold
per code point with the ranking's own fold and map offsets back to the title.
* Make settings search list-only until a pick and reveal collapsed targets
Typing now only changes the result rows: nothing is selected and the page does
not move until Enter or a click (arrows move the selection only). This removes
previews that discarded the Open in draft, re-ran repo hook checks, mounted a
pane per keystroke and drifted after deep links.
- Rank once on a deferred query, cap the list at 50 with a 'keep typing' hint,
and skip rendering the normal nav while searching.
- A settings jump dispatches a reveal event from its target; Appearance sections,
Advanced disclosures and the network/mobile collapsibles (now kept mounted)
open themselves instead of reading the search query.
- Nested scrollers (Shortcuts) scroll the target into view; General sub-page
results open their page; mirror recovery deep-links to the mirror field; a
target that never mounts drops its pending jump; group-title matches use
data-settings-group.
* Fix follow-ups from the settings search repair review
- Two more e2e specs pick a result with ArrowDown + Enter instead of relying on
typing to navigate.
- After a jump reveals a growing section, re-scroll once if the row is still cut off.
- Hide 'No settings match' while the deferred ranking catches up.
- The reveal hook is a ref callback so disclosures that mount later still open.
- The Advanced disclosure fixture shows the real forced-open case (unsaved edits).
* Give every settings search result a reachable row
* Type the General sub-page anchors as a list instead of casting map entries
* Keep the reveal callback ref out of render
* Match the e2e shortcut labels to main's sentence-case names
* Highlight the result's card, not its section title or a bare label
* feat(markdown): open clicked URLs in Orca, middle-click in system browser, and show link menu on hover
* fix(markdown): share click handling and dismiss stale link edits
* fix(markdown): respect disabled editors and browser availability
* Improve bug report template for desktop, remote, and mobile
Capture where users hit the bug (local desktop, SSH, remote server, WSL, mobile, web) without extra host jargon, and collect remote OS when relevant. Extend the OS labeler for mobile.
* Reconcile OS and mobile labels from the bug form's current state
Form: one "Where were you using Orca?" choice (Desktop only, + SSH host,
+ Orca server, + WSL, Mobile app, Web browser, Other), device OS with iOS
and Android, optional remote host OS, shorter help copy and per-platform
version instructions. Main's English request is kept.
Labeler: read the issue as it is now instead of the webhook snapshot,
recognize only a bug form at the very start of the body (optionally after
the exact machine-translation note line), and stop at the free-text
heading. Unknown, repeated, out-of-order or multi-line metadata leaves
labels untouched. Only os:macos, os:Windows, os:linux, os:mobile and
mobile are ever added or removed, one label at a time, so labels added
concurrently by people or other workflows survive. Each pass is verified
by a re-read and retried up to three times; runs are serialized per issue.
Fixes stale mobile labels after an edit to desktop, stale OS labels after
an edit to Other or blank, empty sections reading the next heading as a
value, quoted form sections relabeling unrelated issues, and prototype
names such as "constructor" being sent as labels. Retired Where option
strings and the Client / Host operating system headings keep working for
open issues.
Tests run the workflow's inline script against a stateful mock of the
issues API.
* Trim OS labeler tests to behaviour that fails when the fix is reverted
Review finding F11140-C1-1: several added tests pinned form copy, option
inventories, schema keys, workflow constants or script source, and kept
passing with the production change reverted.
- Delete bug-report-issue-form.test.mjs (schema keys, copy, option lists,
About-menu source regexes). The form/labeler contract is kept as one
behavioural case: every option the shipped form offers is recognised.
- Drop the workflow-constant and script-source regex tests, the log-copy
assertion, the note-length check and the plain-string label case.
- Replace the Where x OS matrix (with its test-side oracle) and the other
Cartesian tables with one literal case per distinct behaviour.
- Point negative fixtures at an OS the old script would label, so each
kept case fails against the reverted workflow rather than passing because
the old script skipped iOS.
220 -> 59 tests; all 59 fail with only the workflow reverted to main.
Test-only change; no runtime path changed.
* Keep the shadowed legacy value case in the heading-presence test
It covers a distinct rule (an invalid legacy value is ignored when the
current heading is present) and was dropped by mistake in the trim.
Scan merge proofs run with lazy fetches and transports off, so partial
clones never download blobs; direct WSL reads forward those variables.
Base and coordinator refs resolve once per repo per scan, and the squash
search lists target commits once and only patch-ids commits that touch
the branch's exact file set.
The split-focus guard treated the replayed snapshot making the new leaf
active (its own focus intent) as the viewer moving away, so it dropped
the focus call whenever the host's layout push beat the split reply.
* feat(workspace-cleanup): run cleanup rules in the background on the owning host
* fix(workspace-cleanup): keep workspaces whose own orca.yaml has an archive script
* feat(native-chat): draw the New line only when it helps, then fade it once seen
* fix(native-chat): adapt the New line port to public main (test helper, class-names, no notice field)
* fix(native-chat): a queued send that ran behind a turn with no reply drawn yet still draws the New line
* fix(native-chat): judge a running turn from the host's turn record, not row liveness, for the New line
A workspace a worker start created gets the 'orchestration-worker' reason once every dispatch on it released its terminal and its work landed in the default branch, a merged review or the coordinator's branch. Commits the coordinator's branch already holds no longer count as unpushed.
The fetch queue checked each queued-refresh flag once per loop, in a fixed
order. A forced refresh queued after its flag was checked stayed set when the
loop ended, so nothing ran it: after two quick account switches during a
refresh the meter stayed on fetching with no numbers, and the switch never
read the new account. One drain loop now re-reads every flag after each cycle.
* fix(terminal): draw the hardware cursor in remounted panes before first focus
xterm withholds the cursor until its textarea gets a focus event or a
keystroke. A remounted pane (reload, reattach) keeps DOM focus, so no
event fires and TUIs that use the hardware cursor, like agy, show no
cursor until the next keypress. Set showCursorImmediately so DECTCEM
alone decides visibility, matching the mobile fix in #11387.
* test(terminal): drop xterm-behavior cases and casts from cursor init test