Commit Graph
18014 Commits
Author SHA1 Message Date
Brennan Benson ca2148a30d Settings: choose Chat or CLI in each agent's row; remove Chat → Providers (#36185)
* feat(settings): choose chat or CLI per agent in the Agents list

Each agent's open-as-chat choice lived in two places: Settings > Chat >
Providers and a Chat | CLI control under Default Agent. The choice now
lives only in each chat agent's row of Settings > Agents > Installed,
writing the same per-agent setting. Agents whose chat runs without their
CLI (a downloaded chat runtime) are listed as installed with CLI
unavailable, and the downloaded runtime and chat sign-in move into the
agent's row. Search and the install card's hint point at Agents. Shown
only while Chat UI is on, as before.

* Preserve agent choices and setup across inventory changes

* Fix settings regression test type conformity
2026-10-29 20:07:00 -07:00
Kelvin Amoaba 1ed54cf4b5 fix(mobile): restore alerts without native push (#36125)
* fix(mobile): restore alerts without native push

* test(mobile): refresh notification reply matrix
2026-10-30 03:03:19 +00:00
Kelvin Amoaba 6b937c7e5f fix(source-control): resolve delete/modify conflicts and complete merges from the panel (#35347)
* fix(source-control): resolve delete/modify conflicts and complete merges from the panel

* fix(source-control): address review findings on conflict resolution

* fix(source-control): save every view of the file before marking a conflict resolved

* fix(source-control): match unsaved conflict views by physical file only

* test(source-control): prove completeMerge refuses with a commit template set

* refactor(source-control): reuse autosave view matching and refresh only after a completed merge

* fix(source-control): drop the untranslated Complete merge fallback text

* fix(source-control): refuse Keep file when the file is gone and re-read unsaved views on retry

* fix(source-control): let Keep file stage conflicted symlinks with missing targets

* fix(source-control): run one conflict resolution per file at a time
2026-10-30 02:56:42 +00:00
Neil a17b6706f5 fix(explorer): open folder links that lead outside the project again (#36191)
* fix(explorer): open folder links that lead outside the project again

#24489 replaced in-memory path grants with declared file access, and the
explorer started refusing folder links out of the project with a toast.
fs:readDir now accepts user-named access; the explorer retries a contained
listing that main refuses only as outside the project, and files listed
that way open by absolute path so their tabs keep access after restart.

* fix(explorer): let main verify outside folder links, and list them only on a gesture

Review follow-ups:
- New project-folder-link access kind, accepted only for fs:readDir: main
  lists a folder only when the nearest project folder above it holds a
  symlink on the path, so an unregistered root's child or an arbitrary
  folder stays refused. user-file no longer lists folders.
- The explorer follows a link only on a user act or under a folder already
  listed as outside; refreshes never upgrade a contained listing.
- A link target that fails to list (EPERM, ENOENT) shows its own error.
- Open Markdown Preview opens outside rows by absolute path too.
- New/Duplicate/Rename/Delete are disabled on rows listed through an
  outside link, since writes stay inside projects.

* fix(explorer): keep keyboard edits off outside-link rows, and follow listed link rows on reveal

- Enter-to-rename and the delete binding skip rows listed through an outside
  folder link, matching the disabled context-menu items.
- A folder the parent listing shows as a symlink may follow the link without
  a click, so reveal and re-expansion after a workspace switch list it; a
  folder that only became a link stays refused until clicked.
- Pass followProjectFolderLink only when set, so existing read-call
  expectations hold.

* fix(explorer): limit folder-link listings to project roots; no rename on outside-row double-click

- Orca's floating folder is not a project, so a link there no longer
  authorizes an outside listing (direct IPC callers included).
- Double-clicking an outside-link row's name pins the preview instead of
  starting a rename main would refuse.
2026-10-29 19:48:09 -07:00
OrcaWinandOrcaWin 6be126d65f test: remove low-value copy, layout, and equivalence checks (#36192)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 19:35:42 -07:00
OrcaWinandOrcaWin 2c4eb87240 fix(mobile): retain editor styling when switching color schemes (#35171)
* fix(mobile): retain editor styling when switching color schemes

* test(mobile): fit theme-switch harness hooks under the file line cap

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 19:28:48 -07:00
OrcaWinandOrcaWin 8a5c96349b fix(mobile): align task checkboxes with their first text line (#35157)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 19:19:51 -07:00
OrcaWinandOrcaWin 5d5073be6c fix(mobile): preserve blocks and images when formatting inline code (#35110)
* fix(mobile): preserve blocks and images when formatting inline code

* test(mobile): drop collapsed-selection inline code case

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 19:13:25 -07:00
OrcaWinandOrcaWin 3eda769de3 fix(mobile): preserve empty tasks through save and reload (#35085)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 19:02:59 -07:00
Brennan Benson b578e3012e fix(pi): the thinking menu before the first message matches the chat's (#34592)
* fix(pi): the thinking menu before the first message matches the chat's

Pi's pre-session catalog now asks Pi for its models over RPC and builds each
menu with the same projection a running chat uses, falling back to the text
listing only when Pi cannot answer over RPC.

* fix(pi): preserve remembered off effort on precise model lists

* test(pi): focus effort regression and stop fallback contracts

* test(pi): allow metadata reads between ordered option writes

* fix(pi): derive supported effort without replacing accepted intent

* test: cover host effort projection and refreshed frozen queues

* test: consolidate session option imports

* test: normalize absent catalog fixture records

* test: isolate host fixture types from client projects

* Preserve legacy effort capture for other agents
2026-10-29 18:59:25 -07:00
Neil 3931660639 fix(windows): start the WSL holder outside Orca's jobs so a crash doesn't take it down (#36178)
* fix(windows): start the WSL holder outside Orca's jobs so a crash doesn't take it down

* test(windows): prove the job closed with a non-breakaway control before checking the holder
2026-10-29 18:57:42 -07:00
Jinjing 8784a55f6f Leave the Plugins shortcut to focused browser pages (#36176)
* Allow plugin shortcuts in browser guest pages

* Clarify plugin shortcut availability in the UI
2026-10-29 18:56:14 -07:00
OrcaWinandOrcaWin 649cced481 fix(mobile): name task checkboxes from their current task text (#35081)
Task checkboxes take their own text (excluding the checkbox label, nested lists and code blocks) as an aria-label, refreshed on every change, with 'Task' as the fallback for an empty item.

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 18:56:04 -07:00
OrcaWinandOrcaWin ec62243ded fix(mobile): keep table/list line breaks, item paragraphs and list code blocks through rich Markdown saves (#35259)
* fix(mobile): keep table-cell and list-item line breaks on their own source line

Table cells and list items save line breaks as <br /> (and sibling P/DIV
blocks inside an item as breaks), and reopen attribute-free <br> tokens
as breaks, so Shift+Enter or Enter no longer splits a row or ends a list.
Typed '<br>' text gets only its '<' entity-escaped, raw text newlines
become spaces, and browser caret placeholder breaks are dropped (a cell
that holds only a placeholder saves empty; a cleared item keeps a <br />
so its marker still parses).

* fix(mobile): keep fenced code blocks inside Markdown list items

Indented fences under a list item (README steps such as
'1. Install:' followed by an indented bash fence) now read as a code
block inside the item and save back under the item's continuation
indent. Only items whose continuation holds a fence change; headings,
quotes, rules and tables after the fence end the item and read as
before. Top-level and list code blocks share one PRE writer, blank
separator lines are not indented, and a fence needs no blank line
beside it so tight items stay tight.

* fix(mobile): keep caret code blocks out of the paragraph they follow

Code block with a collapsed caret after text in its block ran native
insertHTML, which merged the PRE into that paragraph as prose. Prepend
a <br> only when content precedes the caret, so block-start, empty-line
and empty-document insertions stay as they were.

* fix(mobile): keep authored runs of trailing table-cell breaks

* fix(mobile): use template literal for list code-fence probe

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 18:31:17 -07:00
Neil 3fb6dc7301 refactor(jira): group favourite picker owners (#36157) 2026-10-29 18:29:55 -07:00
Neil 4f052ad0c3 perf(native-chat): skip WSL distro walk for host-native transcript hook paths (STA-3786) (#36152)
A host-native hook path proves the agent ran on the host, so the 5s
session-ID fallback no longer walks every running distro's roots over 9P
while the transcript is unflushed. Mirrors the existing guest-hook-path rule.
2026-10-29 18:26:04 -07:00
Brennan Benson 373f226c0a Card headings name the coordinator and worker without 'your' (#36168)
The cards are read by the user, not the agent, so 'your coordinator' read as if addressed to the agent.
2026-10-29 18:24:03 -07:00
Neil d1a0ac73f4 test(relay): assert drain placement contention without a sampled lock-wait mean (#36181)
The Asia drain and departing-redial runs asserted a 20ms-sampled mean of lock-waiting director
backends under 0.5; it flaked at 0.56 and 0.57 on loaded runners. A focused test now holds the
source cell row and proves a reconnect placement still lands on a target (and that holding the
target rows does block one); the load runs keep their outcome assertions and report the mean.
2026-10-29 18:21:37 -07:00
OrcaWinandOrcaWin 523d8b14cd Preserve nested list content when leaving an empty item (#35236)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:59:08 -07:00
OrcaWinandOrcaWin 349f46f608 test: remove low-value catalog cases and source guard suites (#36175)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:51:18 -07:00
OrcaWinandOrcaWin 5058476b15 fix(editor): preserve trailing mixed-list items when outdenting (#35176)
* fix(editor): preserve trailing mixed-list items when outdenting

* fix(editor): keep ordered numbering for trailing items moved by outdent

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:49:57 -07:00
Brennan Benson 70209b9b11 Keep chats stopped by a delivered kill readable after downgrading (#36142)
* fix(native-chat): keep chats stopped by a delivered kill readable after a downgrade

v1.4.244 accepts only three death kinds and sets aside any other record,
so a chat Stop force-killed (exit never observed) vanished after a
downgrade. Store the delivered kill as the absent pid an older build's
restart probe would itself record, plus an exact marker this build reads
back; in-memory code still sees kill-delivered.

* test(native-chat): explain release-checkout timeout

* test(native-chat): cover downgrade recovery and workspace rekeying

* test(native-chat): preserve checked record types at test boundaries
2026-10-29 17:42:38 -07:00
OrcaWinandOrcaWin 5951dbbf92 fix(editor): task-list parsing fixes (ordered parents, wrapped markup, tight continuations, bare markers) (#35187)
* fix(editor): preserve sibling tasks beneath ordered list items

* fix(editor): preserve wrapped inline markup in task items

* fix(editor): keep nested task continuations valid and editable

* fix(editor): keep literal task markers out of mixed checklists

* fix(editor): apply review fixes to task-list parsing stack

- Trim synthetic test matrices to the behavioral cases
- Regenerate pnpm-lock (drops a stale github-slugger importer entry)
- Assert the plain bullet's node type under an ordered parent

* fix(editor): keep one-column-deeper ordered tasks as sibling checkboxes

Dedent an ordered item's task block by the first task's column instead of
keeping its leading whitespace. A task one column deeper stays a sibling
checkbox, and text at or within the first task's column stays nested as
before. Strip leftover paragraph indent from task children.

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:38:19 -07:00
OrcaWinandOrcaWin e988b5dd77 fix(mobile): preserve code, quotes and code blocks through rich Markdown edits (#35056)
* fix(mobile): preserve literal code through rich Markdown edits

* fix(mobile): preserve inline code containing backticks

* Preserve adjacent inline-code text when saving mobile Markdown

* Preserve quote paragraphs and blocks in mobile Markdown

* fix(mobile): preserve selected text when creating code blocks

* test(mobile): choose native history shortcut from browser host

* Preserve paragraph-owned mobile code blocks when saving

* Preserve code selected inside mobile headings after saving

* fix(mobile): keep code serialization space-normalized and trim review tests

- Inline code and code blocks keep turning browser-created NBSPs into spaces;
  only the reader-side entity fix is needed for literal code.
- Inline code line breaks save as spaces so table rows and headings stay intact.
- Code blocks keep trimming trailing newlines left by placeholder <br>s.
- Heading- and paragraph-owned code blocks join adjacent inline code runs.
- Empty nested quotes reopen as a plain empty paragraph.
- Trim synthetic and behavior-locking tests.

* fix(mobile): keep quoted text literal when block reading would rewrite it

Quoted list continuations and lazy lines were restructured on save because the list reader drops them; reopen quote blocks only when they save the source or the same bytes as the literal paragraph.

* test(mobile): use template literal for saved code-block markdown

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:38:16 -07:00
OrcaWinandOrcaWin cb33f2b2d8 fix(editor): save pasted blob: images beside the note without withholding the paste (#35625)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:36:53 -07:00
Neil 5121f25a5a perf(mobile): batch iOS push-dismissal ledger writes per page (STA-7366) (#36145)
Catch-up pages called the native ledger once per dismissal, each call
re-reading, encoding and writing the full 24h UserDefaults ledger. A new
rememberAll bridge merges a whole page in one locked read/encode/write with
identical semantics (max seq per identity, refreshed 24h expiry).
2026-10-29 17:36:12 -07:00
Neil a892fca5a1 Plugins settings: one list with Installed badge, inline switch, install-state filter, category chips and trusted-code access copy (#36100)
* Plugins settings: one list with an Installed badge, inline switch and install-state filter

* test(plugins): drive card enablement through the inline switch

* plugins: keep the installed-read error on Not installed; cover installed cards past the cap

* plugins: inline category filter chips with icons from one category-icon module

* plugins: single-select category chips, marketing icon table, Remote/VMs label, trusted-code access copy

* plugins: Not installed waits for the installed-plugin read

* ci: retrigger
2026-10-29 17:34:26 -07:00
Jinjing 76653fbd06 Add quick access to Plugins settings (#36153)
* Add quick access to Plugins settings

* Forward Plugins shortcut from guest pages and show keycap hint
2026-10-29 17:30:41 -07:00
OrcaWinandOrcaWin 6236fdd4d7 test: remove low-value copy and CI fixture checks (#36159)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:20:50 -07:00
OrcaWinandOrcaWin 9d2f744725 fix(editor): keep completion menus placed and keyboard results visible (#34992)
* fix(editor): keep keyboard completion results visible

* fix(editor): keep completion menus placed and keyboard results visible

* fix(editor): restore link bubble anchor and keep completion menus tied to their editor

Restore the link bubble's required anchorElement, keep editor clicks and
refocus from dismissing completion menus (selection sync still governs),
close them when the editor is hidden, and cover keyboard scrolling and
outside dismissal.

* fix(editor): share #34980's editor-visibility dismissal so completion menus close when their workspace is hidden but painted

* fix(editor): read latest dismiss callback via useEffectEvent instead of render-time ref write

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:19:34 -07:00
OrcaWinandOrcaWin b683573faa fix(editor): improve picker dismissal, theme and accessible names (#34980)
* fix(editor): give the emoji picker dismissal and app theme behavior

Move the slash-command emoji picker onto the shared Popover so Escape and
outside clicks dismiss it, follow the app theme instead of the OS theme,
name the dialog for assistive tools, and close it when its editor is hidden
so the portaled picker cannot float over another tab or workspace.

* fix(editor): dismiss emoji picker when its workspace is hidden but still painted

Extract the link bubble's ancestor visibility check (opacity-0, inert, aria-hidden,
hidden, display/visibility) into editor-anchor-visibility.ts and reuse it, with an
ancestor MutationObserver, for the portaled emoji picker.

* fix(editor): read latest dismiss callback via useEffectEvent instead of render-time ref write

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:18:52 -07:00
OrcaWinandOrcaWin 85884f8397 fix(editor): keep relative link targets when pasting between note folders (#35743)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:18:42 -07:00
Neil 553c0ccb28 perf(renderer): forget visible-tab-pick state when a worktree is removed (STA-12498) (#36165)
Removed paired workspaces kept their cached frame and reported pane until
environment teardown, and every workspace switch scanned those tombstones.
Clear them with the other per-worktree tracking and never cache removal frames.
2026-10-29 17:18:06 -07:00
Neil 52eeb14db3 perf(native-chat): memoize turn statuses so status-only renders keep transcript slots (STA-6288) (#36141)
useNativeChatTurnStatus returned a fresh object each render, busting the
slots memo and re-running buildNativeChatTranscriptSlots' transcript-length
passes on turnActivity/stopping/awaitingInput-only renders.
2026-10-29 17:18:00 -07:00
Neil bb5f08e02c perf(git): batch per-remote exact-ref probes into one for-each-ref call (#36156)
Hosted-review eligibility (baseRefExistsOnRemote) and PR remote-base probes
spawned one `show-ref --verify` per configured remote. Eligibility re-runs on
every source-control state change (commit, ahead/behind, dirty toggle, worktree
switch), so a repo with many remotes bursts dozens of git children each time.

Add probeExactRefsViaForEachRef: one stdin-free `for-each-ref -- <refs>` child,
keeping only exact matches (descendants do not count), with fallback to the
existing per-ref probes on any failure. On a 77-remote repo: 77 children /
~570ms -> 1 child / ~40ms, identical present/absent results.

Exact probes are now case-sensitive on every filesystem (for-each-ref matches
refnames byte-for-byte, unlike loose-ref show-ref on macOS/Windows), which
matches packed-ref and hosting-provider semantics.

Refs STA-8433, STA-6289
2026-10-29 17:17:55 -07:00
NeilandClaude d887405add fix(wsl): refuse a drive/UNC conversion that would split a nested duplicate project (#36155)
* fix(wsl): refuse a drive/UNC conversion that would split a nested duplicate project

A refused duplicate inside a converting folder had its path rewritten while its ids stayed,
so its terminal history and sessions no longer matched. Another spelling of the same folder
still converts with it.

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

* fix(wsl): refuse only duplicates inside a converting folder, as an overlap

Review: an enclosing duplicate never splits, the same-spelling exemption keys on the main folder,
the blocker reads as an overlap instead of naming the clicked row, and the scan is skipped when
nothing is a duplicate.

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

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-10-29 17:16:07 -07:00
OrcaWinandOrcaWin ab9d846d79 fix(editor): reveal collapsed sections before navigating to their content (#35075)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:15:35 -07:00
OrcaWinandOrcaWin 15023ab339 fix(editor): match Unicode heading anchors across rich and preview modes (#35077)
* fix(editor): match Unicode heading anchors across rich and preview modes

* test(editor): drop slugger tests that only re-test github-slugger

The preview-parity test in markdown-anchor-scroll.test.ts covers the behavior that matters.

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:14:52 -07:00
OrcaWinandOrcaWin 32060decbb fix(editor): open the link that received the modifier-click (#35071)
* fix(editor): open the link that received the modifier-click

* fix(editor): read clicked link href from its mark, not the sanitized DOM

Tiptap blanks rendered hrefs for file:, Windows drive paths and custom schemes; resolve the clicked anchor's document position and read the link mark instead.

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:14:35 -07:00
Jinjing 165f63a02d fix(terminal): retain only timings in typing diagnostics (#36088)
* fix(terminal): retain only timings in typing diagnostics

* Remove typed text from latency diagnostics and cover task overlap

* Preserve text metadata in diagnostic lifecycle test
2026-10-29 17:11:47 -07:00
OrcaWinandOrcaWin 12b589474c fix(editor): preserve file: links through rich Markdown copy and paste (#35789)
Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:07:59 -07:00
Brennan Benson a88581d8d5 perf(claude): look up retained prompts' turns in one journal pass during catch-up (#36127)
Catch-up scanned the whole chat journal once per retained prompt. Index prompt-to-turn matches once per reader, the same way the reader already indexes local prompts, keeping every match as a commit dependency in journal order.

Tracked in STA-12049.
2026-10-29 17:05:06 -07:00
OrcaWinandOrcaWin fdfe1e5a09 fix(editor): resolve TOC headings with folded whitespace, images and doc links (#34972)
* fix(editor): normalize heading whitespace when navigating the TOC

* fix(editor): resolve TOC headings containing images and document links

* fix(editor): read only text and image alt when matching TOC headings

Skip comment nodes in heading text, and trim test cases that overstated NBSP coverage or checked an inert negative path.

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 17:03:23 -07:00
Neil 400266a9ce fix(ui): toasts sit above the notification cards; the Codex ~/.codex notice is a card (#36167)
NotificationCardStack publishes its height so the toaster stacks above it instead of rendering
behind it (z-47 under z-50), and lines up with the cards at 1rem. The one-time Codex shared
settings notice moves from a sticky toast into the card stack.
2026-10-29 16:55:26 -07:00
OrcaWinandOrcaWin 008a1e8480 Release the last closed rich Markdown editor (#35227)
* Release the last closed rich Markdown editor

* test(editor): reduce retention test to one case and note configure() ordering

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:53:44 -07:00
OrcaWinandOrcaWin 1607c647cd fix(editor): preserve selected code when indenting (#34970)
* fix(editor): preserve selected code when indenting

* fix(editor): keep Shift-Tab list outdent for selections starting outside code

Gate code-block outdent on the selection starting in (or being fully covered by)
a code block so list items containing a nested indented code block still outdent.
Remove the dead empty-indent branch, restore the DOM-less test fixture, move the
DOM-dependent undo/caret tests to a scoped happy-dom file, and trim duplicate tests.

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:48:49 -07:00
Brennan Benson 14a2c4cefb Run the unit tests that force garbage collection on Node (#36131)
* test: run the AI Vault title-input GC check on Node

The test asserts superseded maps are garbage collected. Under Bun, whose GC
scans the stack conservatively, it can keep one alive, which failed CI on an
unrelated PR. Route it to Node with the other V8 retention checks.

* test: run the other forced-GC checks on Node too

HostRemoveDialog and the happy-dom observer retention check force a
collection like the AI Vault check; under Bun's conservative GC they can
fail or pass falsely.
2026-10-29 16:47:53 -07:00
Brennan Benson ddd4518d7d Stop the saved chat status writer from remembering every closed chat (#36105)
* fix(native-chat): stop the saved-status writer from remembering every closed chat

The writer deduped turn-edge writes with a per-chat memo that was never
cleared, so a long-running app kept one entry for every chat it had ever
shown. Dedupe against the saved record instead, holding only edges whose
write is still in flight; a reopened chat still skips an edge already saved.

* test: cover settled chat status writer retention

* test: simplify saved status retention contracts
2026-10-29 16:47:16 -07:00
Neil f11e71a3ff fix(bash): emit the shell-ready marker when ble.sh owns the prompt (#35784) (#36163)
* fix(bash): emit the shell-ready marker when ble.sh owns the prompt

ble.sh discards Bash's own readline prompt output and draws from its own
PS1 copy, so the daemon wrapper's PS1 ready marker never reached the PTY
and every startup command waited the 15s shell-ready timeout. Print the
marker directly from the prompt hook when BLE_ATTACHED is set.

Fixes #35784

* fix(bash): detect ble.sh 0.3 and ignore inherited ble.sh variables

ble.sh 0.3.x has no BLE_ATTACHED, so key the direct ready marker on
_ble_attached, and require ble.sh's functions in this shell so a stale
exported variable cannot select the cooked-mode path and double-echo
the startup command.

* fix(bash): wait for ble.sh's decoder and drop inherited ble.sh state

Nightly ble.sh renders its first prompt, which runs Orca's prompt hook,
before the key decoder attaches and can still fail back to cooked mode.
Print the direct marker only once _ble_decode_bind_state is set, and
unset inherited ble.sh attach state before profiles so exported
variables or functions cannot select the direct path.

* fix(bash): keep live ble.sh state from a system bashrc

Bash sources /etc/bash.bashrc before --rcfile, so ble.sh may already be
attached; the unconditional unset broke its decoder attach and hid the
ready marker. Drop only exported copies, which ble.sh never creates, and
make the wrapper tests require readiness before the first command.
2026-10-29 16:47:08 -07:00
OrcaWinandOrcaWin 15a02f7103 Bound preview selection deferral during continuous external edits (#35373)
* Bound preview selection deferral during continuous external edits

* test(editor): keep only the continuous-edit deadline regression test

---------

Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
2026-10-29 16:44:36 -07:00