Repository navigation
cmux mobile: newlines in the chat composers; tap any file to preview it - #24572
Conversation
…y file kind Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Composer: the agent chat field is a growing UITextView (8 lines, then it scrolls). The keyboard's Return starts a new line and the send button sends; a hardware Return sends and Shift- or Option-Return starts a new line. Chief (CmuxConversation) keeps Return as a new line and gains the same hardware keys. The terminal composer keeps Return as send and gains Shift-Return and New Line in its edit menu. Previews: one FilePreviewGallery (ArtifactPreview pages) opens attachments before and after sending (swipe between a message's files, Share or Save), files agents name (links and code paths in answers, tool calls, diffs), and Files and Artifacts. Audio, Office/iWork and other types open in Quick Look; types nothing can show offer the share sheet. Mac files still go through the link's file service and its workspace-root checks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n actor (Swift 6 sending) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… once in its window Chief: ConversationViewController.onOpenLink lets the host take a tapped link; Chief opens file links in the file preview, read from Chief's Mac. Feed: a link tapped in an event's markdown no longer navigates the pooled web view (web links open in Safari, others open the event). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…f main, Quick Look of a message's documents) - FileLink: only scheme-less links, file:// (with #L line) and name.ext:12 read as files; maps:, shortcuts: and other app links open with the system. - Chat field: focus asked before the field has a window lands in didMoveToWindow; the scheduled change reads the binding again; a torn-down field drops its focus. - ArtifactPreview writes its share copy off the main actor; each gallery page keeps its own Preview/Source choice; an empty attachment names itself, not its reference. - CmuxConversation: a message's documents open with the tapped one first (abort if it fails), the rest fetched together; a queued attachment named .. stays in its folder. - Chief ignores a file-link tap while something is presented. Feed: sms/facetime open with the system, in-page anchors stay put. Inline code like console.log is not a file. 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. |
|
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)
red: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: |
Correctness review (fresh subagent), findings and resolutionThis was a read-only review of
After the fixes, the iOS kit tests on mini-cmux11s passed: AgentChat 126/126, Live 247/247, Chief 74/74, ComposerSubmit 5/5. |
|
Found 10 test failures on Blacksmith runners: Failures
|
…ext-ios-composer-files
|
Bead |
|
Non-green checks on head
|
…k: the sent bubble had none) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d from the Mac Live check over the real link (real Claude Code chat, 2026-10-23): a prompt sent with a photo and three files reached the agent, but the sent bubble showed no attachments. acpmux's user_message names a prompt's images only (no bytes, no files), and the reducer took that record's empty list. The store now keeps what this phone sent, by prompt id; a prompt from elsewhere (history, another device) shows the images its record names, read on demand with _acpmux/attachment (only an image the session's own log names), in the bubble and the preview. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…keep, two copies of one image) - AcpmuxSessionSource caches recorded prompt images it read (newest 24), shares a read in flight, and never caches a failed read: scrolling a bubble back no longer downloads again. - The store drops a prompt's kept attachments once its record arrives (the turn holds them), drops a returned draft's old id when it goes again under a new one, and keeps at most 8. - Two copies of one image in a prompt keep two identities (#n in the id). - A Mac-held image that can't be read says to connect to the Mac. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 2 (fresh subagent): sent attachments,
|
| # | Finding | Resolution (32251815e7b3) |
|---|---|---|
| 1 | Thumbnails downloaded again on every cell rebuild | AcpmuxSessionSource caches the 24 newest images it read, shares a read in flight, and never caches a failed read |
| 2 | sentAttachments was never pruned |
An entry is dropped when its record arrives or when a returned draft goes again under a new id; at most 8 are kept (test added) |
| nit | The same image twice in one prompt shared one id | The id carries #n, and recordedImageID strips it (test added) |
| nit | A failed Mac fetch said "isn't on this iPhone anymore" | It says "Connect to your Mac to see …" (test added) |
| left | A peer Mac's relay refuses _acpmux/attachment |
Not changed: a peer-Mac session shows a placeholder for history images. A relay pass-through is a trust-policy change, so it is left to its owner |
|
Merge note for head
|
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Summary
Two gaps in the cmux-next iPhone app, plus the shared preview they need.
1. Newlines in the composers
TextField, which decides Return by itself. It is nowChatComposerField, a UITextView over the sharedComposerReturnTextViewandComposerReturnPolicyin CmuxMobileDesign.ComposerSubmit, unchanged).2. Preview any file everywhere
FilePreviewGallery, built fromArtifactPreviewpages.QLPreviewController(new.audio/.documentkinds andArtifactContent.quickLook).path:lineinline code in answers open the preview, web links open as before;onOpenLink), queued composer attachments (Quick Look), and a message's documents (Quick Look, swipeable).fileservice (LinkFileArtifactSource), so the Mac's workspace-root and Chat Folders rules (cnx-ios: fix full-verify defects D1–D14 (Chief, teams, previews, Codex default, polish) #22354, D9) still decide. Chief resolves only absolute paths. Phone-held attachments use anattachment:reference that never goes to the Mac. Nothing widens access.CmuxConversation changes land upstream, byte-identical, in #24573 (feat-imsg-parity-gui).
Changelog
Tests
Failing tests first:
c4c894d397dc. On mini-cmux11s withverify/termqa/cmux_mobile_kit-test-ios.sh:CmuxMobileAgentChatTestsbuild fails (ArtifactContenthas no memberquickLook, noComposerReturnPolicy, and so on).32251815e7b3: CmuxMobileAgentChatTests 132/132, CmuxMobileLiveTests 262/262, CmuxMobileChiefTests 79/79. ComposerSubmitTests 5/5 and CmuxMobileShellTests passed on earlier heads.3475760ebbbc(norecordedImage/recordedImageID), green on the fix.ComposerFilesTests.swift:FileLink(web, app and anchor links refused;path:line,file://#L);MarkdownFilePath(console.logis not a file).Live check (real usage, real link, no shortcuts)
cmux-composer-files(iOS 26.5) on mini-cmux8s, Demo build of this branch, signed in with the dev credential.cmux-mobile-e2e-e196c421,open -g -j -n), workspacelive-filesin a real project folder.path=Direct, thenpath=Turn).simctl io recordVideo. Simulator.app was never opened, and nothing on the laptop took focus.…/.cmux/attachments/phone-…/clip.mp4.user_messagenames images only. Fixed in05f0ad0b0987/32251815e7b3(tests first in3475760ebbbc)._acpmux/attachment, shows in the bubble and opens full screen.report.pdfin Claude's answer opened the PDF read from the Mac over the link (Copy Path shown).forbidden, "no workspace roots are shared"), which is the trust rule holding.~/cmux-mobile-builds/20261023-composer-files/evidence/(videos01–10,shots/).Observed / Not run
Review
A fresh correctness review subagent reviewed both rounds. Round 1 found no blockers and 6 should-fix items, fixed in
0909d699c39b. Round 2, on the sent-attachment fix, found no blockers and 2 should-fix items, fixed in32251815e7b3. Both are in PR comments.🤖 Generated with Claude Code