Repository navigation
Agent pane: other agents' messages draw as cards from their sender, not your prompt - #22013
Conversation
…prompts Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A prompt acpmux delivered from another agent (agent_message provenance: send_to_session, cmux agent message) drew as the person's own bubble, and an adopted Claude session's <cross-session-message>, <task-notification> and <system-reminder> prompts drew as raw XML. They now draw as a message card from the sender (Open beside for a chat here; the raw envelope once opened), a quiet task line, or nothing, and stay out of the prompt history. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configuration
You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Bead |
The cmux-sessions MCP tool from #21858 drew as a raw MCP tool row; it now draws as the SendMessage card does, to the chat it names. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…w for bookkeeping Review fixes: a reminder before a typed prompt hid the prompt; it now draws without the reminder. Bookkeeping alone gets no row instead of an empty, focusable 34px one. Envelopes are read only from adopted Claude history (client: adopt), so a live prompt can't pass itself off as another agent's. Rows keep the sender's words as their text, so copy and the minimap don't show raw XML. Numeric entities decode. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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. |
- vp fmt webviews/src/agent-session/acpmux/replyHref.ts - vp fmt webviews/src/pages/markdown/README.md - vp fmt webviews/src/pages/markdown/links.ts - vp fmt webviews/test/markdown-cmux-app-links.test.ts Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39212708861
|
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)
Unclear: CI failed on
Failures:
Matched log linesNot re-run automatically: Written by red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on 2cd6ae1 to compare; do not merge until green; see lane-rules
Agents: |
…on-msgs # Conflicts: # webviews/src/agent-session/acpmux/replyHref.ts # webviews/src/pages/markdown/links.ts
…on-msgs # Conflicts: # webviews/src/agent-session/acpmux/App.tsx
[Medium impact] The changes affect how messages and prompt history appear in the cmux NEXT agent pane. Fix the sender’s Open action before merging. Findings
SummaryThis PR draws incoming agent messages as sender cards instead of user prompts.
Reviews (7) · Last reviewed commit: "Merge feat-cmux-next into next-xsession-..." · Reviewed by Greptile |
|
The |
…on-msgs # Conflicts: # webviews/src/agent-session/acpmux/model.ts
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. |
This comment has been minimized.
This comment has been minimized.
|
Webview tests at head 4b38b4a, run on big-red. CI skips these because the base's markdown-page eager JS budget step fails before them.
Observed / Not runObserved: the runs above. Not run: a native app dogfood. The change is webview-only. |
…ges and steer for incoming messages A Claude Code prompt that is only bookkeeping keeps an empty row that draws nothing, so the answer it brought stays its own turn instead of joining the previous prompt's. Retry on another agent's message sends the prompt as the agent got it, sender and envelope included. A task's result never comes back with the up arrow, whether suggested tasks show or not. Another agent's message card shows the images it sent and a steer's read state. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r prompt Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Found 35 test failures on Blacksmith runners: Failures
...and 25 more test failures. View all on Blacksmith: run 39457270393, run 39457270230
|
# Conflicts: # webviews/src/agent-session/acpmux/direct.ts
…ices Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
|
|
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. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
turns.ts keeps the hidden-bookkeeping skip and passes the base's sessionStatus; direct.ts imports both incomingPrompt and startedCardsShown; model.ts keeps the incoming/resend/untyped fields and the base's started field. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=c1a6da4a-9c34-4cea-864c-8b045b51ac46&host=huge-blue
…reply Hunk by hunk: incomingPrompt keeps #22013's acp: sender id and rendered body and adds this branch's msgId/threadId; the card takes both the sent images and Reply; App passes images, steer and onReply; direct.ts takes #22013's row (hidden bookkeeping kept, untyped); conversation.css keeps both the Reply and steer rules; the gallery entry is #22013's plus a reply variant; Localizable.xcstrings is #22013's file plus the four message.reply* keys. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=c1a6da4a-9c34-4cea-864c-8b045b51ac46&host=huge-blue
…ext-incoming-reply direct.ts keeps the reply's IncomingMessage import and prompt_accepted handler next to the base's startedCardsShown and harnesses_changed start mode refresh; Localizable.xcstrings is #22013's file plus the four message.reply* keys. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=c1a6da4a-9c34-4cea-864c-8b045b51ac46&host=huge-blue
The base's incoming message files are #22013's squash unchanged, so each conflict keeps this branch's Reply edit of those lines. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=c1a6da4a-9c34-4cea-864c-8b045b51ac46&host=huge-blue
…card fields #22013 opens and answers only a chat's cmux address (acp:<id>) and the card now carries the message's msgId and threadId, so the fixtures send from acp:child-3 and the incomingPrompt expectations include both ids. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=c1a6da4a-9c34-4cea-864c-8b045b51ac46&host=huge-blue
|
Shipped in:
|
* Agent pane: test that other agents' messages draw as theirs, not raw prompts Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Agent pane: other agents' messages draw as cards from their sender A prompt acpmux delivered from another agent (agent_message provenance: send_to_session, cmux agent message) drew as the person's own bubble, and an adopted Claude session's <cross-session-message>, <task-notification> and <system-reminder> prompts drew as raw XML. They now draw as a message card from the sender (Open beside for a chat here; the raw envelope once opened), a quiet task line, or nothing, and stay out of the prompt history. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Agent pane: test that send_to_session calls draw as message cards Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Agent pane: send_to_session calls draw as message cards The cmux-sessions MCP tool from #21858 drew as a raw MCP tool row; it now draws as the SendMessage card does, to the chat it names. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Agent pane: read Claude Code envelopes only in adopted history; no row for bookkeeping Review fixes: a reminder before a typed prompt hid the prompt; it now draws without the reminder. Bookkeeping alone gets no row instead of an empty, focusable 34px one. Envelopes are read only from adopted Claude history (client: adopt), so a live prompt can't pass itself off as another agent's. Rows keep the sender's words as their text, so copy and the minimap don't show raw XML. Numeric entities decode. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(next): PR autofix at 3d13829 - vp fmt webviews/src/agent-session/acpmux/replyHref.ts - vp fmt webviews/src/pages/markdown/README.md - vp fmt webviews/src/pages/markdown/links.ts - vp fmt webviews/test/markdown-cmux-app-links.test.ts Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39212708861 * Agent pane: Reply in place on another agent's message card An incoming agent message card (IncomingMessageCard, cx-eibkk) gets a Reply action (button, or R with the card focused). The answer goes to the sending chat as send_to_session sends a message: a session/prompt to that chat, attached hidden, with an agent_message provenance naming this chat, the message's threadId and replyTo the message, so it lands in the sender's chat as a threaded reply. acpmux took provenance only over the unix socket. The app pane (LocalApp) may now send one only as a reply: replyTo set, from another chat of this daemon, to the prompt's chat. Web and peers are still refused. The pane relay allows `provenance` in session/prompt's _meta.acpmux. Follow-up to cx-eibkk. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * acpmux: let the app pane's reply past the origin guard, only for a received message The remote guard refused any provenance from LocalApp before the reply rule ran. It now leaves LocalApp to prompt_provenance, and Hub::app_reply_fits requires the replying chat's log to hold the agent message (`replyTo`) the target chat sent it. The shared pane policy lists `provenance` as the Swift table does. A `cmux agent message` sender (`acp:<id>`) is answered by its id. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * acpmux: move the app reply check out of requests.rs (god-file budget); rustfmt Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Agent pane: a reminder-only prompt keeps its turn; Retry, recall, images and steer for incoming messages A Claude Code prompt that is only bookkeeping keeps an empty row that draws nothing, so the answer it brought stays its own turn instead of joining the previous prompt's. Retry on another agent's message sends the prompt as the agent got it, sender and envelope included. A task's result never comes back with the up arrow, whether suggested tasks show or not. Another agent's message card shows the images it sent and a steer's read state. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Agent pane: test that a reminder's turn offers no Retry of the earlier prompt Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Agent pane: gallery entry for the incoming message card and its Reply Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(next): PR autofix at c426d09 - webviews/src/agent-session/acpmux/conversation/IncomingMessageCard.tsx Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39359952105 * Agent pane: gallery entry for messages from other agents and task notices Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fix agent message cards: open by session id, show the sender words A message cmux delivers to an acpmux chat carries the sender address as provenance from: acp:<session id> for a chat, term_... for a terminal agent, cli for a person at a shell. The card used it verbatim as the chat to open, so Open asked the host for acp:<id>. Strip acp: for the session id, and give no Open for any other address. The prompt text is cmux rendered message (agent_message_prompt.rs render): a header, a delivery note, ---, the body, and a closing line naming the message id. The card now shows the body, read only when the whole render matches and the closing line names provenance msgId, and keeps the full render as raw. Any other text shows whole. A task notification turn no longer offers Retry, which resent the notification XML as the person prompt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(agent-pane): the reply tests follow #22013's sender address and card fields #22013 opens and answers only a chat's cmux address (acp:<id>) and the card now carries the message's msgId and threadId, so the fixtures send from acp:child-3 and the incomingPrompt expectations include both ids. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=c1a6da4a-9c34-4cea-864c-8b045b51ac46&host=huge-blue * test(acpmux): an app pane reply signs only as a chat the pane shows, in its thread, under its name (red) The app pane's reply in place (Origin::LocalApp) is refused unless its from chat is one this connection shows (attached and not held unseen), its threadId is the answered message's thread, and its fromName is that chat's title, name or id. Today app_reply_fits checks only that from got the message, so the pane could sign as any chat that did. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=c1a6da4a-9c34-4cea-864c-8b045b51ac46&host=huge-blue * fix(acpmux): an app pane reply signs only as a chat the pane shows, in its thread, under its name Hub::app_reply_fits is default deny for what the app pane signs: from must be a chat this connection shows (attached, not held unseen), the reply's threadId must be the answered message's thread (its threadId, else its msgId), and a fromName must be the chat's own title, name or id as the pane writes one. Before, any chat that got the message could be named as the sender under any name and thread. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=c1a6da4a-9c34-4cea-864c-8b045b51ac46&host=huge-blue * style(acpmux): rustfmt the app reply check Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=c1a6da4a-9c34-4cea-864c-8b045b51ac46&host=huge-blue * Agent pane: Reply on the received-message line uses the type tokens; the catalog keeps base key order Follows the adoption review: - The Reply key hint and its sent/failed note use --text-caption and --text-detail instead of literal font sizes (check-type-scale). - The App.tsx props are one per line (oxfmt). - Localizable.xcstrings is base plus the four message.repl* keys, in base order, instead of a reordered rewrite. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Agent pane: Reply's test opens it with its button, not the removed R key; the sent note wraps Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * agent pane: keep the strings catalog in base order; add only the four Reply strings Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * agent pane: tool output under a message keeps base margins; the reply editor lines up with the body The base merge swapped the two margins. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * acpmux, agent pane: a reply in place arrives as a cmux agent message, linked back and signed by acpmux The pane sends from and to as acp:<id> addresses, as cmux agent message does, so the sender chat links the reply and can answer it; acpmux refuses a bare id. The text is wrapped as cmux renders a message (sender, id, the message it answers, the not-your- operator note). acpmux signs fromName with the replying chat own name instead of matching the pane one, so a stale title is never refused. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * agent pane: closing a message closes its reply and keeps the draft; reply state survives scrolling Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: cmux-autofix[bot] <cmux-autofix[bot]@users.noreply.github.com>
When another agent messages a cmux NEXT chat, the pane drew the message as if the person had typed it. That covers acpmux's own deliveries (
send_to_sessionfrom #21858 andcmux agent message, which carry_meta.provenance.kind: "agent_message"), and an adopted Claude Code session (acpmux records its history withclient: "adopt") showed its history's<cross-session-message from=… from-name=…>,<task-notification>and<system-reminder>prompts as raw XML.Now:
MessageCard's look,cv-message), turned around: sender → This agent, two lines with Show more. With acpmux provenance the sender is a chat here, so the card has Open , which opens it beside this chat (chat.offer.open, the same path a started task's row uses).<cross-session-message>shows itsfrom-name(else its address) and the body only. Claude Code's trailing note to the agent is dropped from the card. Opening the card shows the whole prompt as the agent got it.<task-notification>draws as one quiet tool-row line with its summary. A prompt that's only reminders, local-command caveats or prompt-submit hook text gets no row. A typed prompt behind them draws without them.prompt_provenance.rs).offer_result) are excluded from it now too.No new strings: the card reuses
message.label,message.self,message.more/lessandsubagents.open. Nothing new is gated, since the session tools ship on by default.Parsing is in
conversation/incomingMessage.ts.direct.tssetsrow.incomingon auser_messagerow andApp.tsxdraws it.Verification
conversation/incomingMessage.test.ts(bun): red on 7ccd9e8 (the module didn't exist yet), green on the fix. It covers provenance with and withoutfromName, a person's prompt that quotes an envelope (stays the person's), an unclosed envelope, entity decoding, and the notification and hidden cases.test/agent-pane-suggested-tasks.test.tsgains a "messages from other agents" block in the real pane against the stand-in daemon, with the suggested-tasks toggle off: the provenance card with Open, the cross-session card with no raw XML and the envelope reachable when opened, and the notification and reminder cases. It's a browser-lane test, so it runs in CI only. I haven't run it locally.tsc --noEmitand the existingconversation/bun tests pass.verify-local.py --affectedfails only atlocalization, with 34k parity errors in catalogs this PR doesn't touch (same on base).send_to_sessioncalls from the cmux-sessions MCP server (acpmux: agents start, list, read and message other sessions (cmux-sessions MCP) #21858) draw as message cards, not raw MCP rows (agentMessages.test.ts, red on 7c2f0e9).Changelog
🤖 Generated with Claude Code