Repository navigation
Agent pane: a guest's message waits for the owner (Approve / Decline) (carries #26742) - #31144
Conversation
A queued prompt acpmux holds for the owner (awaitingOwner, from a link guest)
is tracked by its authoritative record. THE RULE (direct.ts Hold): it is
approvable only when the pane holds that record (a queued / queue_updated
record, or _acpmux/queue_get) for its current revision; a listing never makes
it so. Text, images, parts and revision always come from one record.
- answerHeld sends _acpmux/queue_approve {sessionId, promptId, revision} with
the revision the card drew, or _acpmux/queue_decline {sessionId, promptId}.
- A held prompt whose record the pane lacks (an attach page that starts after
it) is read with one queue_get, keyed by selection generation and prompt,
only where acpmux names queueGet; without it the prompt stays updating.
- queueApproval and queueGet come from initialize's features.
- An owner's own queued prompt still settles its bubble on its queued record.
- Needs you lists each held prompt (where queueApproval is served) with one
action, Review, which scrolls to and focuses its card; it never approves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-c3300437b0af7f1bba36
(cherry picked from commit 9241815)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-c3300437b0af7f1bba36 (cherry picked from commit ee2f0a1)
…; a failed held-text read is not retried every update The review at 63d8d08 found: initialize declared `features` twice (a compile error after the merge); `_acpmux/queue_approve` requires `turnId` (the queued incarnation the owner saw) and the model dropped it; a failing `queue_get` was retried on every queue-bearing update. Held entries now carry the record's or listing's turnId, Approve sends it (and sends nothing without one), and a held-text read is keyed by listed revision and kept once settled. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-049fca947e3297e5ccd3
…d-model-carry # Conflicts: # webviews/src/agent-session/acpmux/Localizable.xcstrings
The held message's card on the pane model (lane/mp-held-model): a guest's held prompt draws in the transcript as that person's message, its record whole (text as sent, images, documents, audio and links), with Approve (primary) and Decline (quiet) and the quiet label "Waiting for you"; Return approves when the card has focus. Approve names the revision the card drew; "Updating…" (no answers) while the pane lacks the record at its current revision; "Edited since you looked" and "Already answered" for acpmux's queue.stale and queue.not_found. Approved, it waits as a queued message; declined, one quiet line "Declined: <first line>" that opens on a click. The relay allows queue_approve (sessionId, promptId, revision; a gesture), queue_decline and queue_get. Gallery agent-pane.guest-approval with three looks (inline, the pick; bar; menu). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-c3300437b0af7f1bba36 (cherry picked from commit f21a9cc)
Base's direct.ts answerHeld names the held prompt's turnId with its revision, so the native relay's queue_approve allowlist takes turnId (relay test and the pane's allowlist test send it). The held card's Approve and Decline stay shown in the DisclosureRow action slot, with its quiet note in caption type, as the line draws on this base. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-049fca947e3297e5ccd3
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Gallery before/after for
States
Pick other states with a Passes: CI passes on CI passes on Written by web and size checks: green Shipped in:
|
|
Found 1 test failure on Blacksmith runners: Failure
|
…card tests fit the card Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-049fca947e3297e5ccd3
…d-carry-2 # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/AcpmuxPaneMethods.swift # webviews/src/agent-session/acpmux/Localizable.xcstrings # webviews/src/agent-session/acpmux/direct.ts
…ompt whole Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-049fca947e3297e5ccd3
…never as a lane notice The review at 75448eb found the read-only row (guest page, read-only transcript) still read a guest's prompt as a lane notice, so one that starts like a lane report lost its lead text there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-049fca947e3297e5ccd3
Round 3 of the review at c36794f found two more paths that read a guest's prompt as a lane notice: a held row whose listing names no author, and a declined guest row that lane-notice batching could regroup. Instead of one check per caller, a held or declined guest prompt's message is marked `fromPerson`, and laneNotice (which every card, line and batch reads) returns nothing for it. The read-only row also draws held and declined rows whole. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-049fca947e3297e5ccd3
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
Sweeps every person row (held with and without an author, a guest's queued prompt, declined, and a row marked only by its queue marks) through laneNotice, noticeOf, batchLaneNotices, appendLaneNotice and the read-only transcript row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-049fca947e3297e5ccd3
A row marked person, held or declined is no notice whatever its message object says, so lane-notice batching, inbox projection and every card agree with laneNotice's own fromPerson rule. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-049fca947e3297e5ccd3
|
Review (codex gpt-6-astra high, next-review): BLOCK at dc8b008 BLOCK at dc8b008 Visual verdict: Inspected all 16 after images; each is byte-identical to its baseline. None shows guest approval states.
An isolated check of the actual approval method reproduced finding 1. Full tests could not run: Bun and dependencies are absent. |
…ed line Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-049fca947e3297e5ccd3
all: unset drops the cursor desktop.css gives clickables, so Approve, Decline and the declined line set cursor: default themselves (clickable-cursor.test.ts). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-049fca947e3297e5ccd3
…eb lint) (#31281) #31144 put one oxlint-disable-next-line above <div for both rules, but jsx-a11y/no-noninteractive-tabindex reports on the tabIndex attribute four lines down, so vp lint warned and web lint (fast) failed on every webviews push. Split the disable so each rule sits above the line it reports. Agent-Session: https://cmux.com/deeplink/agent?id=aid-2f629b93d5a20c58e6f8 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
This PR added |
…t allows (#31144) (#31794) #31144 (f2f8444) let the agent page send _acpmux/queue_approve, _acpmux/queue_decline and _acpmux/queue_get, and added them to the Swift host's tables (AcpmuxPaneMethods.swift requests, sessionScoped, gestureRules; +Params.swift knownParams), but not to the crate's policy.json. So three crate tests are red on feat-cmux-next: tests/swift.rs the_requests_are_the_macos_hosts and the_known_params_are_the_macos_hosts, and tests/typescript.rs the_allowlist_is_what_the_page_sends. policy.json now has the Swift host's exact rule: the three methods are requests and session-scoped (only a chat in the pane's scope), queue_approve needs the person's gesture, and the params are Swift's (queue_approve: sessionId, promptId, turnId, revision; the other two: sessionId, promptId). No method is allowed that the app does not allow today; the app does not read policy.json yet. Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: cmux-bot[bot] <348531757+cmux-bot[bot]@users.noreply.github.com>
…is turn" (#31711) #31144 brought the label back for a guest's prompt once the owner approves it; queued messages carry no "Read after this turn" (Leo, 2026-10-29). Leo-ask: ask-d98e1527c4 Agent-Session: https://cmux.com/deeplink/agent?id=aid-5413c7e35e98c5ceffa7 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: cmux-bot[bot] <348531757+cmux-bot[bot]@users.noreply.github.com>
…2371) A held card's Approve / Decline / "Waiting for you" slot is always shown (#31144), but it reused the shared hover slot's fade, which ends in the hover plate's 6% tint. On a line nobody points at, that drew a gray box over the preview's tail (share walk on DEV, 2026-11-01). At rest the fade now ends in the bare page; the tint comes back with the plate on hover, focus or an open menu. Agent-Session: https://cmux.com/deeplink/agent?id=aid-e79e3dd73fdc44b36878 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Leo: "also what about the group chats for inviting people to see my sessions?" and "just get the initial end to end flows working and working well adn looking good and feeling good".
Carries #26742 (its owner is not live), rebuilt on #31066 with Leo's commit cherry-picked and its authorship kept.
What
A link guest's message that waits for the owner draws in the transcript as the guest's own card ("Waiting for you"), with Approve and Decline. Approve names the revision the card shows (and acpmux's queued incarnation,
turnId, which the pane reads itself); a guest's edit since makes Approve wait for the new text. Decline leaves a "Declined" line. The native pane relays_acpmux/queue_approve,queue_declineandqueue_getfor the page (session-scoped, withturnIdallowed on approve).Merge resolutions (base moved a lot since #26742)
IncomingMessageCard.tsxkeeps base's DisclosureRow, lane notice, read-only and Chief face, and adds the person sender (PersonName, guest label), the whole text as sent, and file chips.QueuedMessageCard.tsxkeeps base'sWaitingMessageMenuand footer row and addsPersonMessageCard,HeldAnswerandDeclinedLine.App.tsxdraws a person's queued rows on their own between the turn rows and the pending group.AcpmuxPaneMethods.swiftkeeps base's session-scoped list plus the three queue methods;turnIdis allowed onqueue_approve(base'sanswerHeldsends it; without it the relay would refuse every approve), with its relay test.multiplayer.csskeeps Approve and Decline visible (base's received-line action slot shows only on hover).Tests
bun test src/agent-session/acpmux/conversation/heldMessage.test.tsx src/agent-session/acpmux/heldPrompts.test.tsxon cmux-ci at dc8b008: 30 pass, 0 fail. The same tests against the code before the root fix (c36794f): 3 fail ("a held prompt with no author is drawn whole in the read-only transcript too", "a person's words are never a lane notice, so a declined guest prompt is never batched as one", "no notice entry point turns a person's prompt into a notice (every person row, every path)").A person's prompt (a guest's held, queued or declined one) is never read as a lane notice: its message carries
fromPerson,laneNoticereturns nothing for it andnoticeOfreturns nothing for any row marked person, held or declined, so no card, line or batch can show part of what Approve runs (found over three review rounds; fixed at the root in round 4).Observed / Not run
Observed: the tests above;
prepush-gate.pyno new violations; Swift compile of CmuxNext fails only inCloudStartChatMachineTests.swift(not in this PR);tscfails only intest/latency/probe.ts(base). Not run: a capture of the card.Captures
None yet: gallery entry
multiplayer.guest-approval(GuestApproval.gallery.ts) renders the card states with fixture data.Risk
Normal. Agent pane transcript rows for a guest's held prompt only; nothing changes for chats with no guest.
Changelog
Added: the chat owner approves or declines a guest's message from the transcript.
Agent session: agent session
🤖 Generated with Claude Code