Skip to content

feat(harness): Codex and Muse /resume pickers, pi's folder trust prompt and opencode's update prompt on the phone - #446

Merged
AltanS merged 3 commits into
AltanS:mainfrom
GGGODLIN:feat/session-pickers-trust-update-prompt
Oct 16, 2026
Merged

AltanS merged 3 commits into
AltanS:mainfrom
GGGODLIN:feat/session-pickers-trust-update-prompt

Conversation

@GGGODLIN

Copy link
Copy Markdown
Contributor

Codex's and Muse's /resume session picker and pi's folder trust prompt now lift as cards with their own keys, and opencode's Update Available prompt now refuses a reply. Before, the phone offered only Escape on the Codex picker, showed no card over the Muse picker or the pi prompt and kept the composer open, and read the composer under opencode's prompt as ready, where a reply's Enter confirms the update. One commit each.

Commit Agent What went wrong The fix
feat(harness) session pickers Codex 0.159.3, Muse 1.4.8 /resume paints a Resume a previous session picker that no reader recognised One reader for the shape both agents paint (title, the highlighted session behind › in Codex or ⟩ at column 0 in Muse, a footer of <key> <verb> hints) lifts a menu with Up, Down, Resume (Enter) and Exit (Escape). ctrl+a archive and ctrl+c exit stay keyboard-only
feat(harness) pi trust pi 1.2.0 In an untrusted folder with project resources, pi fills the screen with Trust project folder? and five unnumbered options under a → pointer; the question reader declines it for want of numbers The prompt's footer plan goes through parsePiFooter (ADR 0098): each option is a pointer walk then Enter (ADR 0080), Escape is Cancel, an unknown label refuses
fix(opencode) opencode 1.18.34 Update Available … esc with Skip Confirm, Confirm highlighted, has the pickers' title row but no Search field, so pickerOverlayUp missed it confirmDialogUp (a title row ending in esc, and within six rows a Confirm ending in the esc hint's column) is read beside pickerOverlayUp by hasComposer, composerPrompt and modalOnScreen, so the reply is refused and the unread-dialog card offers Escape

Change outline

Two new readers and the files that call them:

web/src/lib/harness/
  session-picker.ts     new: the shared /resume picker reader; each adapter passes its pointer and region signature
  codex/index.ts        lifts the picker through session-picker.ts
  muse/index.ts         lifts the picker through session-picker.ts
  pi/trust.ts           new: pi's trust prompt as a walked trust card
  pi/index.ts           lifts it; modalOnScreen counts the prompt
  walk-pairs.ts         registers the trust prompt's walk pair
  opencode/chrome.ts    confirmDialogUp beside pickerOverlayUp

Reviewer guide

  • Start: web/src/lib/harness/session-picker.ts.
  • Then: pi/trust.ts, then confirmDialogUp in opencode/chrome.ts.
  • Validate: codex.test.ts, muse.test.ts, pi.test.ts, opencode.test.ts and unread-dialog.test.ts, over the seven captures below.
  • Focus: a card offers only keys the screen prints (Enter, Escape, the arrows), and a screen that is not exactly one of these shapes keeps the composer refused.

Validation beyond the suites

These ran on the fork build that carries these commits along with the fork's other changes, not on this branch over main alone. Each was a throwaway Herdr session with throwaway config directories, each tap sent the way the phone sends it, on 2026-10-15:

  • Codex and Muse: the picker lifted, Down changed the signature, Exit returned a ready composer, Resume resumed a session.
  • pi: Trust (this session only) went on and wrote no trust.json; Cancel went on untrusted; Trust wrote trust.json and the next launch showed no prompt.
  • opencode: on relaunch the prompt read as an unread dialog with the composer refused, and Escape dismissed it to a ready composer. Enter was never pressed.

Captures. Seven new ones, each with its fixtures README row: codex--resume-picker.txt and -moved.txt, muse--resume-picker.txt and -moved.txt, pi--trust-prompt.txt and -moved.txt, oc--update-available.txt. The pi and opencode folder paths became invented sandbox paths of the same width, and in the opencode capture the model and provider labels were renamed mini demo host.

Before and after, from the playground's PaneRouter in a PhoneFrame at 390 px with its sample pane, main on the left and this branch on the right. No bridge is running there, so the cards' keys are inert and pi's card says "Reconnect to answer". For Codex and Muse the shot uses a copy of the capture with its run of blank rows folded to one, so the list and the keys fit on one screen.

Before: Codex /resume picker shows the cannot-read card with only Esc After: Codex /resume picker lifts as a Resume a previous session card with Up, Down, Resume and Exit

Before: Muse /resume picker with no card and the composer open under it After: Muse /resume picker lifts as the same card

Before: pi's trust prompt with the composer open under it and no card After: pi's trust prompt lifts as a trust card with its five options and Cancel

Before: opencode's Update Available prompt with the composer reading as ready After: opencode's Update Available prompt shows the cannot-read card offering Esc, and the reply is refused

Base branch — see CONTRIBUTING.md:

  • Opened against main — there is one line of development, and main is it

Checks

  • On this branch (macOS): bun run typecheck at the root and in web/ exited 0; bun run lint exited 0; bun test ./bridge ./cli ./scripts 8539 pass, 70 skip, 0 fail; cd web && bun run test 416 of 416 files, 26321 tests pass. With each commit's fix taken out and only its tests left, on main 8629ecb: 9 failures for the session pickers, 7 for pi's trust prompt, 3 for opencode's update prompt. Not run: cd web && bun run e2e, the Windows suites, and a live agent run on this branch over main alone.
  • CHANGELOG: fork PR, so no entry. If lines help:
    • - **Codex's and Muse's `/resume` session picker gets phone buttons.** Up, Down, Resume and Exit, where the phone used to offer Escape only on Codex and nothing on Muse.
    • - **pi's folder trust prompt gets phone buttons.** Each option is walked to and confirmed, Escape cancels; before, the composer stayed open over the prompt.
    • - **opencode's Update Available prompt refuses a reply from the phone.** The composer under it read as ready, so a reply's Enter would have confirmed the update; the card now offers Escape.

GGGODLIN and others added 3 commits October 15, 2026 22:11
…enus

Both paint the same picker: a 'Resume a previous session' title, the highlighted session (› in Codex, ⟩ at column 0 in Muse) and a footer of '<key> <verb>' hints joined by runs of spaces. harness/session-picker.ts reads it, each adapter passing its pointer and region signature, and lifts a menu with Up/Down, Resume (Enter) and Exit (Escape); ctrl+a archive and ctrl+c exit stay keyboard-only. Four live captures (Codex 0.159.3, Muse 1.4.8). Live check 2026-10-15: on both agents the picker lifted, Down changed the signature, Exit returned a ready composer, and Resume resumed a session.

Co-Authored-By: Claude <noreply@anthropic.com>
pi 1.2.0 fills the screen before its editor with 'Trust project folder?' in an untrusted folder that holds project resources: the folder, an explanation, five unnumbered options with a → pointer (Trust, Trust parent folder with the parent wrapped under it, Trust (this session only), Do not trust, Do not trust (this session only)) and '↑↓ navigate  enter select  escape/ctrl+c cancel'. The question reader declines it for want of numbers. pi/trust.ts reads it and takes ask.ts's plan (a) from the footer through parsePiFooter (ADR 0098): each option is a pointer walk then Enter (ADR 0080), and Escape is Cancel. Unknown labels refuse. The card starts at the first option; the coreSignature blanks the pointer; the walk pair is registered; modalOnScreen counts the prompt, which has no status rows under its rule.

Live check 2026-10-15 with a throwaway PI_CODING_AGENT_DIR, each tap done as the phone does it (arrows, re-read, Enter only when the tapped row reads Enter and the core is unchanged): Trust (this session only) went on and wrote no trust.json, Cancel went on untrusted, Trust wrote trust.json and the next launch showed no prompt.

Co-Authored-By: Claude <noreply@anthropic.com>
opencode 1.18.34 opens 'Update Available … esc' at launch when a newer release is out, with a body and 'Skip  Confirm', Confirm highlighted, so Enter installs the update. It has the pickers' title row but no Search field, so pickerOverlayUp missed it and composerReady said the composer under it was ready. chrome.ts gains confirmDialogUp (a title row ending in esc, and within six rows a Confirm ending in the esc hint's column); hasComposer, composerPrompt and modalOnScreen read it beside pickerOverlayUp, so the reply is refused and the unread-dialog card offers Escape.

Live check 2026-10-15 in a throwaway Herdr session: on relaunch the prompt read as an unread dialog with the composer refused, and Escape dismissed it to a ready composer. Enter was never pressed.

Co-Authored-By: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added area: web Phone PWA — UI, mirror, composer, service worker area: harness Per-agent adapters and send guards (claude/codex/pi/omp) enhancement New feature or request labels Oct 15, 2026
@AltanS

AltanS commented Oct 16, 2026

Copy link
Copy Markdown
Owner

Thanks @GGGODLIN, this lands in 1.22.0. Your three commits are kept with their hashes, and the changelog credits you. On top I labelled your seven captures for the screen corpus, moved Codex's 0.162 resume-search capture into the picker's menu list because it now lifts, and widened the opencode update prompt's title-to-button window so a narrower pane that wraps its body still refuses a reply.

@AltanS
AltanS merged commit 30ee845 into AltanS:main Oct 16, 2026
6 of 7 checks passed
GGGODLIN added a commit to GGGODLIN/gaddi that referenced this pull request Oct 17, 2026
Merge AltanS/collie v1.22.0 (f2f4ef6) with the Send Protocol, Surface readers, hook holds, durable sessions and Themes v2. Keep fork 2.5.0 and the Gaddi brand, updater, descriptions and recap, retell, reply deliverables, local links, attention switchers, operator commands and skills, image editing, Taiwanese speech conversion, tablet layout, host clipboard and Island integration.

Take upstream's integrated AltanS#446, AltanS#447, AltanS#448 and AltanS#452 captures and readers, including the opencode wrapped-body allowance and agy inline confirmation guard. Preserve the pending AltanS#449/AltanS#453 bars, Grok and Muse marks, Muse catalog and bundled skills, OMP paste support, and the 9dde2b2 Tasks dock in Chat and Terminal. Compose quoting with growing durable replies and keep the cross-host switcher's address beside its new badge. Route account-switch keys through the upstream key gate.

Keep historical fork changelog sections unchanged; merge upstream 1.22.0 into Unreleased without duplicating already shipped fixes. Adopt upstream's Claude/opencode verification ledger as directed, without widening Send profile claims. Combine the existing Windows skip budgets by named tests. Root/web typechecks, lint, build and both unit suites pass; real-agent and dev-lane PWA acceptance remain with the coordinating session. No push, release or flake.lock change.

Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: harness Per-agent adapters and send guards (claude/codex/pi/omp) area: web Phone PWA — UI, mirror, composer, service worker enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants