Repository navigation
Rebuild iOS Agent GUI with Ghostty theme and compact turns - #7660
azooz2003-bit wants to merge 132 commits into
Conversation
Delete the v1 GUI mode end to end ahead of a from-scratch rebuild: - Packages/Shared/CmuxAgentChat and Packages/iOS/CmuxAgentChatUI (models, parsers, stores, wire, chat UI) and their top-level symlinks - iOS glue: MobileChatEventSource, WorkspaceDetailView chat mode, chat pane, accessory chat scope, demo screens, UI-test flags and chat XCUITests - macOS producer: Sources/Mobile/AgentChat (session registry, transcript tailer/service, prose streamer), TerminalController+MobileChat and the mobile.chat.* RPC surface, chat.message topic, chat.sessions.dump verb - chat-only localization keys, file-length-budget rows, workspace/pbxproj references, and mobile-chat docs Kept intact: the macOS browser agent-chat feature (CmuxAgentChatConfig, newAgentChat action), agent wrappers and cmux hooks CLI, feed/notification system, sidebar agent activity indicators, and all mobile terminal streaming/pairing infrastructure. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Important Review skippedToo many files! This PR contains 445 files, which is 145 over the limit of 300. To get a review, reduce the PR to 300 files or fewer by splitting it into smaller PRs or changing its base branch. Usage-priced reviews support at most 300 files. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (5)
📒 Files selected for processing (445)
You can disable this status message by setting the ✨ Finishing Touches🧪 Generate unit tests (beta)
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 Fable 5 <noreply@anthropic.com>
…ved policy SwiftPM's originHash covers only a root's own manifest, so removing a local .package(path:) dependency upstream cannot produce a diff in downstream Package.resolved files whose pins are unchanged. Require a downstream lockfile diff only when the manifest delta adds or removes a remote (url) dependency; the edited root's own lockfile requirement is unchanged. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Platform-neutral foundation package (slice 1 of the from-scratch GUI): typed identities (epoch, session, journal, seq, version), fail-open session/entry models, version-gated idempotent delta application, contiguous entry windows with explicit holes and honest unread state, send-ticket ledger tolerant of dropped/reordered lifecycle hints, a pure resync planner, and a JSONL replay format with fixtures. 27 behavior tests; no UI, no transport, no dependencies. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ders Slice 3 of the from-scratch agent GUI. Observation-first session detection folding process/wrapper/hook/transcript signals into versioned snapshots at one commit chokepoint, with provisional-id merging, detection tiers, and machine-readable capability reasons. Fail-open Claude/Codex transcript decoders (multi-block coalescing, sidechain/meta counting, JSON-object shell argument parsing) over synthetic shape-faithful fixtures, plus pure journal-identity minting with per-rotation freshness. Pure package on CmuxAgentReplica; OS adapters (libproc, exit watchers, file watching) come in a later slice. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…r-gap audit Slice of the entry-taxonomy mechanism: a dev CLI (internal CmuxAgentTranscriptHarvest target + executable, pure library untouched) that walks local Claude/Codex transcript trees, streams JSONL, extracts shape identifiers only (privacy-sanitized: never content, paths, or argv), and cross-references every observed kind against the real decoders to mark DECODER-GAP rows. First 400-file run produced the taxonomy triage driving the decoder backlog. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…oding Driven by the harvester's real-corpus audit: Codex event_msg phase signals (turn_aborted status + phase facts, task lifecycle facts, deduplicated context_compacted, duplicate user/agent message streams counted not dropped), custom_tool_call_output and tool_search pairing, turn_context model/sandbox facts (object-shaped sandbox_policy), Claude system-subtype status rows with an explicit telemetry no-row list, image-attachment folding, bookkeeping/title records as modeled skips with a sensitive title seam. Harvester residue on a 400-file corpus is now 4 genuinely unpaired tool_results and zero Codex unknowns. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Integrates 52 commits of main drift. Conflict resolutions preserve the GUI removal: kept main's persistent-terminal activeSurface architecture minus its chat arm (WorkspaceActiveSurface loses the .chat case, WorkspaceDetailView+Surfaces drops the chat branch), kept main's widened terminalEventListenerTask access, adopted main's AgentChatThemeSync pbxproj entry (browser agent-chat feature, KEEP list) alongside our deletions, bumped four budget rows to main's own file sizes, and took main's vendor/bonsplit pointer (iconAsset tab API). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
EntryContent now carries a fail-open typed payload per entry kind (user/prose/thought/toolRun/fileChange/question/permission/status/ attachment/unknown with bounded raw JSON), hashed with a deterministic cross-process FNV digest. TruthKit decoders emit payloads inline and the DecodedEntryPayload side table is gone. Judge round fixed an attachment tag/field key collision, a trapping Int(Double) conversion on garbage exit codes, sentinel re-wrap drift on unknown payloads, and name-based terminal classification for Codex tools. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The gui.v1 method/event/error contract as tolerant Codables over the replica models: hello caps handshake, sessions/entries paging, send tickets, interrupt/answer, capability reports, eight event frame kinds with fail-open unknowns, stream-tick truncation, and element-level page tolerance with an observable malformed count. Wire-carried replica models gain explicit snake_case CodingKeys (source-of-truth fix after the coder correctly hit the plan's stop condition), replay fixtures are regenerated and byte-pinned, and golden sortedKeys fixtures freeze every encoding against future model drift. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Serves gui.v1 hello/sessions/session/entries/capabilities over the pairing RPC and publishes session/journal event topics. AgentGUIService feeds the TruthKit reducer from real signals: off-main process observation with quantized activity stamps, per-pid exit watchers with ESRCH synthesis, and an ordered synchronous hook funnel off feed.push (FeedCoordinator untouched). Journal pipelines tail transcripts incrementally by byte offset off the main actor with serialized ingest, byte-level partial-line buffering, shrink/rotation guards with baseline recapture, per-seq version bumps, honest per-page has_more_before, and a 2000-entry window cap. Watchers and scans park after ten idle minutes with zero subscribers and wake on subscription changes. Three judge rounds. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
gui.v1.send/interrupt/answer over the pairing RPC. The send ledger is idempotent per ticket, queues while the agent works, drains FIFO one per idle transition, records exact injected bytes, and confirms delivery by matching journal userMessage appends (exact then whitespace-normalized, oldest first) with 120s/3-append expiry to a visible unconfirmed state; duplicated journal deltas are ignored via per-journal seq watermarks and ended sessions fail queued tickets with process_exited. Asks derive from question/permission entries independent of hook ordering, answer as digit keys, and supersede/expire honestly. Multiline Claude prompts submit with ctrl+enter, mirroring the proven terminal recipe. Two judge rounds. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Platform-neutral sync engine driving the replica stores over an abstract transport: hello-first resync with epoch drops, subscribe- before-pull ordering, tail-page merges, FIFO offline ticket flush that survives transport failures, needsTailPull debounce, stream-tick contiguity, malformed-frame counting with forced resync, and 0.5s-16s jittered backoff on an injected clock; 20 scripted-transport tests including the four canonical failure traces. iOS glue implements the transport over the pairing RPC with replace-per-stream subscription semantics matching the host (per-topic unsubscribe re-issues the remaining set), and the shell composite owns one engine per connection generation. Two judge rounds. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Transcript UI foundation: a platform-neutral projector (stable row identities, grouping, date/boundary/hole/pending/streaming rows, O(delta) diffs, defensive dedupe) and a UIKit flipped collection view with diffable row diffs only, a serial transaction queue over an off-main TextKit measurement cache (LRU, content-keyed, render-matched fonts), stationary inserts and synchronous prepend anchoring in flipped coordinates, keyboard co-animation on the notification curve with contentInset.top obstruction mapping that stacks guide-riding strips above the keyboard, a glass scroll-to-bottom pill with unread badge, and a DEBUG replay-driven demo screen registered in developer settings. Localized en+ja. Three judge rounds; the flipped-space keyboard and anchor math verified numerically. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Evidence-pass fixes from driving the demo on the simulator: a CMUX_UITEST_TRANSCRIPT_DEMO launch gate mounting the demo at root (mirrors the terminal-layout preview pattern; taps on the settings NavigationLink are unreliable under the collapsed header), a layoutSubviews reassert of the cell counter-flip (UIHostingConfiguration swaps the list cell's managed content view and dropped the init-time transform, rendering rows mirrored), and a demo fixture regenerated through ReplicaReplayLog's real encoder (the hand-written fixture used object-wrapped id encodings the codables never produce, so playback no-opped on zero records) with a test pinning that the bundled fixture always decodes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tokens Eight judged rounds against the interaction-quality rubric (frame-split video evidence, dual correctness+interaction judges). Keyboard transitions move a fixed-height viewport via keyboardLayoutGuide constraints, making show/hide rigid-body by construction with pixel-identical rest convergence; rendered self-sizing is authoritative (TextKit measurement machinery deleted); spacing derives from declared rhythm tokens with DEBUG gap assertions; the unread pill is a crisp glass chrome element above the composer band with a live viewport-derived count (numeric roll transitions), honest appearance and true-bottom disappearance; jumps flush pending projection before landing and slide a snapshot with upright continuity; screen-space nav and composer masks replace transformed native edge effects; touch passthrough chrome; bounce enabled; DEBUG chrome-tint and touch-dot instrumentation (CMUX_UITEST_CHROME_DEBUG). KNOWN OPEN DEFECT (demo-only surface): during keyboard show the demo composer's iOS 26 local glass rematerializes with a horizontal wipe that reprojects a stale backdrop sample over composer-adjacent rows (~12 frames). The demo composer is throwaway chrome replaced by the real composer slice; tracked in the program backlog. Deferred to the physics XCUITest slice: kb-up drag/interactive dismiss gestures, rubber-band overscroll, touch-dot positive control, Reduce Motion/Dynamic Type/VoiceOver passes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ios-gtheme-compact-turns # Conflicts: # .github/swift-file-length-budget.tsv # Sources/AppDelegate.swift # cmux.xcodeproj/project.pbxproj # ios/cmux/Resources/Localizable.xcstrings
…ct-turns # Conflicts: # Sources/TerminalController.swift
# Conflicts: # CLI/cmux.swift # Resources/Localizable.xcstrings # Sources/AppDelegate.swift # Sources/TerminalController.swift # cmux.xcodeproj/project.pbxproj # ios/cmux/Resources/Localizable.xcstrings
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
# Conflicts: # Sources/AppDelegate.swift
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
# Conflicts: # Packages/Shared/CmuxAgentChat/Sources/CmuxAgentChat/Artifacts/ChatArtifactGalleryBuilder.swift # Packages/iOS/CmuxMobileShell/Package.swift # Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite+SecondaryPromotion.swift # Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift # Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/TerminalPickerMenuValue.swift # Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceActiveSurface.swift # Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceDetailView+Surfaces.swift # Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceDetailView.swift # cmux.xcodeproj/project.pbxproj # ios/cmux.xcworkspace/xcshareddata/swiftpm/Package.resolved # ios/cmux/Resources/Localizable.xcstrings # ios/cmuxPackage/Package.resolved
The post-merge resolution floated sentry to 9.24.0, invalidating the fleet builder's shared warm module cache (Sentry .pcm precompiled against 9.23.0 headers) and failing iOS archive builds. Same-pin-as-main is a valid resolution and keeps the cache warm for every tag.
# Conflicts: # Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite+ConnectionRecovery.swift # Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/ChangesPreviewFixture.swift # Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/MobileDisplaySettings.swift # Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListLayoutPreviewView.swift # Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListTableCoordinator+ApplyRouteProbe.swift # Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/MobileHost/ControlCommandCoordinator+MobileHost.swift # Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/MobileHost/ControlMobileHostContext.swift # Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandContextTestStubs.swift # Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandCoordinatorMobileHostTests.swift # Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandExecutionPolicyTests.swift # Resources/Localizable.xcstrings # Sources/TerminalController+ControlMobileHostContext.swift # Sources/TerminalController+MobileWorkspaceList.swift # cmux.xcodeproj/project.pbxproj
Summary\n- replace the removed mobile chat pipeline with the Agent GUI truth, wire, replica, and sync architecture\n- derive the iOS conversation surface from the active Ghostty terminal theme\n- render compact prompt-led turns with folded activity, unboxed final answers, live streaming, and stable anchors\n- integrate localized, accessible GUI controls into the existing iOS workspace and composer paths\n\n## Verification\n- CmuxAgentGUIUI: 27 tests passed\n- CmuxMobileShellUI and related mobile suites: 417 tests passed\n- tagged macOS build: gcmp3\n- tagged iOS Simulator build: gcmp3 on cmux-p3-gthm-210225\n- full visual, transition, and profiling evidence is being recaptured from the final reviewed SHA
Note
High Risk
Large architectural removal of mobile transcript parsing, conversation state, and RPC-facing chat models; regressions would affect iOS agent chat, sync with Mac, and permission/question flows until the replacement stack is fully wired.
Overview
Removes the shared
CmuxAgentChatpackage — transcript models, Claude/Codex JSONL parsers, OSC 133 terminal segmentation, screen-based streaming prose extraction,ChatConversationStore, and theChatEventSourcewire seam — as the old mobile chat pipeline.That deletion is the structural half of rebuilding the iOS agent conversation surface on the Agent GUI stack (
CmuxAgentWire/CmuxAgentReplica/CmuxAgentSync/CmuxAgentGUIUI): Ghostty-derived theming, compact prompt-led turns, folded activity, live streaming, and workspace/composer integration described in the PR (most of that lives outside this diff).CI Swift file-length budget entries are adjusted for files that grew or shrank with the swap (e.g. mobile root/shell, settings, tests no longer tracking removed chat store sources).
Reviewed by Cursor Bugbot for commit 3a05659. Bugbot is set up for automated code reviews on this repo. Configure here.