Release v1.14.0 - #4
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
5 tasks done
bn-l
pushed a commit
to bn-l/cmux
that referenced
this pull request
Apr 3, 2026
5 of 6 tasks
This was referenced Apr 30, 2026
[Feature] Snapshot worktree to cmux/abandoned/<ts> branch before any kill (recovery for #2745)
#3321
Open
This was referenced May 5, 2026
5 tasks done
lawrencecchen
added a commit
that referenced
this pull request
May 14, 2026
Patch 0004 file-scopes -Wunguarded-availability-new suppression in ax_platform_node_cocoa.mm: ~6 spread-out usages of macOS 26-introduced NSAccessibility constants. File-level pragma cheaper than per-function. Patches 0002-0004 are all macOS-26-SDK forward-compat noise. Root cause: checkout is on Chromium main HEAD (ChromeOS LKGM from 2026-04-16), not M148 stable that scripts/chromium-build-host.sh declares as target. Handoff ledger now flags the recommendation for session 3: switch to refs/branch-heads/7204 before chasing more patches. M148 was tested against earlier SDKs and likely needs only patch 0001 (the cryptex Metal-toolchain issue is OS-level, not chromium-version-specific). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2 of 4 tasks
hhsw2015
pushed a commit
to hhsw2015/cmux
that referenced
this pull request
May 22, 2026
Reland the auto-reconnect supervisor that was reverted in a5abbc8, this time with the five concurrency issues from the review fixed and pinned down by tests: 1. spawn closure injectable (HerdrDisplayClient.SpawnFunc) so tests replace the production Process+SSH path with real Pipes wired to /bin/sleep. Production behavior unchanged — the default spawn closure is the same Process construction the original code did. 2. supervisor runs on Task.detached, not @mainactor. Process.run() on a cold SSH handshake takes seconds; the previous version blocked the UI for that whole window. State writes hop back via MainActor.run, surgically. 3. send() nils out stdinHandle when the pipe write throws (EPIPE on a dead subprocess). Subsequent send() exits early instead of repeatedly logging into a corpse, and the supervisor cleanup hop also nils handles before sleeping. 4. disconnectStream uses .bufferingNewest(1) so the reader's EOF yield and the terminationHandler's yield coalesce into one supervisor wake-up — no spurious second reconnect-with-takeover racing the first one's attach. 5. supervisor checks `stopped` at every awaitable boundary, both before and after each spawn. A stop() racing a mid-flight spawn terminates the just-born subprocess instead of leaking it. The 20-attempt cap stays; on exhaustion the output stream finishes and the panel goes inert. Reviewer's panel-dealloc audit (manaflow-ai#4) is a separate task — current behavior with cap is bounded ssh churn, not a permanent leak. Tests (cmuxTests/HerdrDisplayClientTests.swift): - testFirstStartReachesConnectedAndForwardsBytes — happy-path PTY byte flow through the AsyncStream. - testEofTriggersReconnectWithTakeover — closes the test-side stdoutWriter, asserts a second spawn fires with takeover=true. - testStopBeforeReconnectPreventsFurtherSpawns — locks the race window: EOF + stop() arriving back-to-back must not spawn again. - testInjectedSpawnFailureCountsAgainstAttemptCap — error from spawn triggers retry instead of give-up. - testBackoffDelayCapsAtEightSeconds — pure unit test of the schedule. Wires the new test file into cmux.xcodeproj/project.pbxproj.
li0near
added a commit
to li0near/cmux
that referenced
this pull request
May 26, 2026
Auto-scroll-to-bottom now targets the last visible chunk's id with anchor:.bottom instead of the LazyVStack container's .id() sentinel. Sidesteps the documented "lazy stacks trade some degree of layout correctness for performance" trade-off by asking ScrollViewReader to position a specific row, not to compute the container bottom from total contentSize. Empirically reduces blank-screen-on-collapse substantially; the residual on `-> .topLevelExpanded` after accumulated off-screen drift is accepted until user-impact escalates. AppKit migration ruled out per DECISIONS.md Don't-re-walk manaflow-ai#4 (List(.plain) had unacceptable initial-render lag; a hand-rolled representable would inherit the same NSHostingView.intrinsicContentSize per-row cost). Handover docs catch up: - DECISIONS.md / FORK_NOTES.md rewritten as canonical handover; new Mitigations-currently-shipped section documents the partial fix and its residual. - AGENT_WORKFLOW.md adds Xcode 26.5 reality: no downloadable DocC archives for system frameworks; canonical fetch is the JSON DocC endpoint at developer.apple.com/tutorials/data/documentation/<path>.json via curl + SOCKS5. - docs/apple-swiftui-scroll/README.md drops the stale ".defaultScrollAnchor(.bottom) is the systematic fix" claim that contradicted DECISIONS.md Don't-re-walk manaflow-ai#5; flags the cached snapshots as starting reference only. 141-test inspector subset green.
li0near
added a commit
to li0near/cmux
that referenced
this pull request
May 26, 2026
User dogfood post-mitigation no longer reproduces the bug. Reframed DECISIONS.md "Blank-screen-on-shrink class" from "partially mitigated, residual accepted" to "mitigation shipped, bug not currently observable." Don't-re-walk manaflow-ai#4 (AppKit ruled out) and the mitigation itself stay on file in case the bug returns. Companion plan changes (in ~/.claude/plans/, outside this repo): - §5.A / §5.B / §5.C / §7.6 marked non-observable. - §7 trimmed: dropped speculative makeExpandable-tightening item (premise never observed), subsumed snapshot-caching idea into a reframed §7.2 "lazy-on-viewport-entry compute-and-cache for complementary chunk info."
hhsw2015
pushed a commit
to hhsw2015/cmux
that referenced
this pull request
May 27, 2026
- mirror() failure paths past tab.create now fire tab.close to roll back the orphan daemon Tab. Covers panes.list / wirePanel / missing binary / workspace-deallocated branches. (CRITICAL manaflow-ai#1) - closeMirroredLayoutTab populates HerdrCloseHandler.suppressNextCloseFor for every herdr pane in the binding before firing tab.close, so the surrounding synchronous removeTopLevelLayoutTab pane closes don't echo pane.close RPCs against an already-killed window. (CRITICAL manaflow-ai#2) - mirror() captures workspace weakly across Task.detached + MainActor hops; bails with workspaceDeallocated if the workspace died mid-RPC. workspaceUUID kept by-value for log lines. (HIGH manaflow-ai#3) - closeMirroredLayoutTab clears lastSentTabRenames for the binding key so the rename throttle cache can't grow unbounded across long sessions. (HIGH manaflow-ai#4) - mirror() retries panes.list up to 5 times with backoff so we don't race tmux's async pane materialization right after new-window. (MEDIUM manaflow-ai#7) - translate_tab_create switches -d insertion from positional insert(1) to push() — tmux accepts flags in any order, and push() is robust against future argv-prefix reordering. (MEDIUM manaflow-ai#6) - New Rust unit tests cover tab.create default focus, focus=false, name/cwd args, tab.close kill-window, tab.rename. (MEDIUM manaflow-ai#8) Build OK, ForkRegressionTests 9/9 pass, Rust tab_translator_tests 5/5 pass.
azooz2003-bit
added a commit
that referenced
this pull request
Jun 13, 2026
#4 Header title: the header showed the session's generated title (the first prompt). It now shows the workspace name as the headline and the tab/terminal name as the status-line subtitle (host passes titleOverride + subtitle into ChatSessionHeaderView). Standalone chrome is unchanged (params default to nil). #6 Per-tab binding: the chat toggle and the opened conversation now bind to the session on the CURRENTLY VISIBLE tab (match descriptor.terminalID to the selected terminal's id) instead of a workspace-level openable pick. This makes the toggle-visibility criterion explicit (shown iff the visible tab has a session) and guarantees a tab's chat can never show another tab's history. descriptor.terminalID and MobileTerminalPreview.id share the surface-id space (see WorkspaceChatPane.openTerminal, which already round-trips between them). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
azooz2003-bit
added a commit
that referenced
this pull request
Jun 14, 2026
… polish - #4 (toggle for agents launched mid-session): the Mac now adopts a detected agent the instant its terminal title becomes the agent's (AgentChatTranscriptService observes .ghosttyDidSetTitle and calls TerminalController.adoptDetectedAgentSessions), so the session registers and pushes to the phone live, not only on next open. - #1 (scroll-to-bottom no longer dismisses keyboard): the dismiss tap excludes the button's frame (ChatScrollButtonFramePreferenceKey + excludedRegion). - #3 (smooth scroll): the button does a single animated proxy.scrollTo to the bottom anchor instead of stacked non-animated jumps. - #5 (toggle eases in): the session-list update is wrapped in withAnimation. - #2 (cramped grouping): intraGroupSpacing 2 -> 5 so a code block isn't flush against the next message bubble. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ejc3
added a commit
to ejc3/cmux
that referenced
this pull request
Jul 15, 2026
…low-ai#1, manaflow-ai#4, manaflow-ai#8, manaflow-ai#9, manaflow-ai#10, manaflow-ai#12, manaflow-ai#14) Several linked defects in the mirror sizing transaction: - manaflow-ai#1: applyAssignedGrids re-pinned a stale grid during a WINDOW live-resize (or interactive geometry drag), painting past the shrinking pane. The divider-drag early return does not cover a window resize, so gate the stale re-pin on the same suppression the view path uses. - manaflow-ai#8: under zoom the visible tree is the single zoomed leaf, so hidden but live base panes were unpinned and rendered on a stale grid. Pin each pane from the visible tree or the base tree; clear only panes in neither. - manaflow-ai#9: the pin-grow repaint went through the attach-only redraw kick (armed only at .enter), so late-granted cells stayed blank mid-session. Extract the shrink/restore SIGWINCH body into forceRedrawKick(windowIds:) and call it directly on a pin grow. - manaflow-ai#10: the stale-repin else-if and gridParityMismatch tested only the under direction, so an over-render (rendered > assigned) was an invisible no-op. Compare with != on both axes; reapplyAssignedGrid clamps either way. - manaflow-ai#12: gridParityMismatch read only the ledger, which goes stale because a same-size re-apply returns early before reporting. Read the surface's live grid first, falling back to the ledger. - manaflow-ai#4: the parked-container consumer clamped an oversized parked reading to the bound and banked it, overwriting a correct size. Reject it (as the sibling oversized consumer does) and keep the last good container. - manaflow-ai#14: rearmIfOutputMissedPlan gated on the plain isVisibleForSizing, which goes stale-true when a hidden tab's view is dismantled; gate on isEffectivelyVisibleForSizing so an offscreen mirror cannot spin re-arms. Tests: parkedHiddenReadingOverTheBoundIsRejectedNotClamped (manaflow-ai#4), gridParityFlagsAnOverRenderedPane (manaflow-ai#10, manaflow-ai#12), and the reworked grid-lag test now pins that an offscreen mirror does not re-arm (manaflow-ai#14).
azooz2003-bit
added a commit
that referenced
this pull request
Jul 18, 2026
* Round 3 colleague dogfood fixes: PR status truncation, nesting indent, multi-select flush, reorder moves, override-release notes, selected-row status color - PR rows rendered 'PR #4 o…' with ample space: intrinsicContentSize on a truncating single-line NSTextField caps at the CURRENT frame width, so a pooled label laid out narrow once reports the truncated width forever. New sidebarNaturalCellSize measures through the cell unconstrained; applied to PR status/title, remote status, group badge pill, and progress label. - Nesting was invisible: legacy applies the group-member indent outside the row so the selection/hover background shifts with the content; the AppKit cell now indents its background the same way. - 'Click A, cmd-click B' extended the pre-A selection: the modifier branch dropped a plain click still inside the coalescing window. SidebarSelectionCoalescer.flushNow() applies it first (tests added). - Drag-reorder janked: a pure reorder went through reloadData, tearing down every visible cell and snapping scroll. Same-id-set order changes now apply as in-place moveRow updates. - Row clipping class: releasing pumpHeightOverrides never re-noted the rows, leaving the table on the override height while the cache served the measured one; both clear sites now note released rows. Height- drift DEBUG probe added (rect(ofRow:) minus intercellSpacing). - Agent-status line was blue-on-blue when selected: explicit entry colors now yield to the selected foreground (legacy parity). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Reconcile stranded selection previews; dim cmd-click preview; regenerate webviews bundle Two interaction bugs from Aziz's videos: - Reorder/selection interference: optimistic previews are only reconciled by an authoritative apply, and some presses never produce one (a drag dropped where it started, a press swallowed by the drag threshold, an unchanged selection). The stranded peel left the sidebar with NO visible selection. previewSelection now arms a 400ms clock-injected bailout that restores stored-model paint unless an apply lands first; apply() and drag-begin cancel it. - cmd-click flash: the modifier preview painted the full bright active treatment and settled to the dim multi-select tint. It now previews the dim tint directly (showOptimisticMultiSelection). Heal main: #8393 changed webviews/ sources without regenerating the checked-in bundle, failing react-apps-check on every gate. Regenerated with ./scripts/build-webviews-app.sh. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Address review: bound the reorder move planner, multiset id equality CodeRabbit: the move loop's firstIndex/remove/insert rescans trend quadratic on bulk permutations; a positional-mismatch threshold (32) keeps user drags on the animated move path (one contiguous span, O(n)) and routes bulk permutations to reloadData, which they gained nothing from animating anyway. Greptile: Set equality collapsed duplicate ids, so corrupt state with two rows sharing an id could misclassify as a pure reorder; replaced with counting multiset equality. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: cmux reload-cloud <cmux-reload-cloud@users.noreply.github.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
azooz2003-bit
added a commit
that referenced
this pull request
Jul 20, 2026
… diagnosis probes (#8461) * Round 3 colleague dogfood fixes: PR status truncation, nesting indent, multi-select flush, reorder moves, override-release notes, selected-row status color - PR rows rendered 'PR #4 o…' with ample space: intrinsicContentSize on a truncating single-line NSTextField caps at the CURRENT frame width, so a pooled label laid out narrow once reports the truncated width forever. New sidebarNaturalCellSize measures through the cell unconstrained; applied to PR status/title, remote status, group badge pill, and progress label. - Nesting was invisible: legacy applies the group-member indent outside the row so the selection/hover background shifts with the content; the AppKit cell now indents its background the same way. - 'Click A, cmd-click B' extended the pre-A selection: the modifier branch dropped a plain click still inside the coalescing window. SidebarSelectionCoalescer.flushNow() applies it first (tests added). - Drag-reorder janked: a pure reorder went through reloadData, tearing down every visible cell and snapping scroll. Same-id-set order changes now apply as in-place moveRow updates. - Row clipping class: releasing pumpHeightOverrides never re-noted the rows, leaving the table on the override height while the cache served the measured one; both clear sites now note released rows. Height- drift DEBUG probe added (rect(ofRow:) minus intercellSpacing). - Agent-status line was blue-on-blue when selected: explicit entry colors now yield to the selected foreground (legacy parity). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Reconcile stranded selection previews; dim cmd-click preview; regenerate webviews bundle Two interaction bugs from Aziz's videos: - Reorder/selection interference: optimistic previews are only reconciled by an authoritative apply, and some presses never produce one (a drag dropped where it started, a press swallowed by the drag threshold, an unchanged selection). The stranded peel left the sidebar with NO visible selection. previewSelection now arms a 400ms clock-injected bailout that restores stored-model paint unless an apply lands first; apply() and drag-begin cancel it. - cmd-click flash: the modifier preview painted the full bright active treatment and settled to the dim multi-select tint. It now previews the dim tint directly (showOptimisticMultiSelection). Heal main: #8393 changed webviews/ sources without regenerating the checked-in bundle, failing react-apps-check on every gate. Regenerated with ./scripts/build-webviews-app.sh. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Address review: bound the reorder move planner, multiset id equality CodeRabbit: the move loop's firstIndex/remove/insert rescans trend quadratic on bulk permutations; a positional-mismatch threshold (32) keeps user drags on the animated move path (one contiguous span, O(n)) and routes bulk permutations to reloadData, which they gained nothing from animating anyway. Greptile: Set equality collapsed duplicate ids, so corrupt state with two rows sharing an id could misclassify as a pure reorder; replaced with counting multiset equality. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Reconcile optimistic paint on every apply; read modifiers from the clicking event Found while adversarially driving the sidebar for the verification video: synthetic cmd-clicks carry the command flag on the EVENT while the hardware state stays plain, and the resulting preview/authoritative divergence exposed a class hole — apply() cancels the preview bailout on arrival but only reconfigures rows whose model changed, so a preview painted on a row whose authoritative state ends up unchanged kept its speculative paint forever (dim multi-select tints lingering through any number of plain clicks). apply() now force-reconciles every optimistically painted row id. Also didClickTableRow read the global NSEvent.modifierFlags (hardware state) instead of the clicking event's flags; NSApp.currentEvent is the action's triggering event, matching what previewSelection already saw. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Down-then-up selection highlight; reflow + drop-resolution probes Owner ruling: the row highlight applies on down-then-up, not on press. The optimistic paint moves from mouseDown to the table action (which fires on mouse-up), so a press that becomes a drag or a cancelled click never shows a speculative highlight — removing the last source of preview/authoritative divergence at the gesture level. DEBUG probes for the two open dogfood reports: sidebar.viewport + sidebar.liveReflow trace every width tick through the live re-measure (continuous-reflow regression), and sidebar.drop.perform records where each drop landed, target count, and the planner verdict (silent reorder no-ops). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Respect the inline-rename field editor in tab-selection focus reassert Double-click rename died on every attempt: click 1's async workspace selection completes ~240ms later and converges AppKit focus through moveFocus, which gates only on the right-sidebar coordinator and then calls makeFirstResponder directly — stealing the field editor the rename took at doubleAction time (probes: beginInlineRename tookFocus=1 followed by ensureFocus intent=terminal from ws.select.asyncDone, typed text landing in the terminal). moveFocus gains an opt-in respectForeignFirstResponder that applies the same policy check ensureFocus and applyFirstResponderIfNeeded already use; the tab-selection reassert opts in. Explicit focus-the-terminal callers (find escape, tmux mirror) keep stealing deliberately. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Heal main Sendable warning; make reorder helpers private Sources/Mobile/MobileHostIrohApplicationLaneRouter.swift landed on main with 'Date.init' defaulting a @sendable () -> Date parameter — the initializer reference resolves as a non-Sendable function value and trips the Swift 6 data-race warning, failing the zero-bucket warning budget on every gate. A closure literal is Sendable. Also Greptile P2 on #8461: multisetEqual/maxAnimatedReorderMoves have no external callers, now private. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: cmux reload-cloud <cmux-reload-cloud@users.noreply.github.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
MarvinZeising
referenced
this pull request
in MarvinZeising/cmux
Aug 2, 2026
MarvinZeising
referenced
this pull request
in MarvinZeising/cmux
Aug 3, 2026
thingnoy
added a commit
to thingnoy/cmux
that referenced
this pull request
Aug 24, 2026
The mounted output consumer pumps every terminal chunk on the main actor.
Its only shutdown path is the SwiftUI `scenePhase` prop arriving through
`updateUIView` -- which is itself a scene update. Backgrounding a chatty
terminal therefore has to win a race against the main actor the consumer
is saturating, and losing it is a 0x8BADF00D scene-update watchdog kill.
Observed on a device running iOS 27.0 (24A5408d) with app version 1.0.4: nine
crash reports on device, four of them within six minutes:
exception : EXC_CRASH / SIGKILL
termination : FRONTBOARD 0x8BADF00D
scene-update watchdog transgression: exhausted real
(wall clock) time allowance of 10.00 seconds
WatchdogEvent : scene-update
ProcessVisibility : Background
CPU : 25.010s total (user 19.290)
Symbolicated faulting thread 0 lands inside the consumer:
swift::AsyncTask::getPreferredTaskExecutor(bool)
swift_task_switch(..., swift::SerialExecutorRef)
await resume partial function for closure manaflow-ai#4 () async -> () in
GhosttySurfaceRepresentable.Coordinator.startMountedTasks(surfaceView:)
The new suite posts the UIApplication lifecycle notifications without any
`setTerminalPresentationActive` call, so it fails until the consumer stops
depending on a scene update. It is red at this commit by design.
`VerifiedReplayPresentationTests` needs an explicit QuartzCore import to
compile; without it the iOS test bundle cannot build at all.
thingnoy
added a commit
to thingnoy/cmux
that referenced
this pull request
Aug 25, 2026
The mounted output consumer pumps every terminal chunk on the main actor.
Its only shutdown path is the SwiftUI `scenePhase` prop arriving through
`updateUIView` -- which is itself a scene update. Backgrounding a chatty
terminal therefore has to win a race against the main actor the consumer
is saturating, and losing it is a 0x8BADF00D scene-update watchdog kill.
Observed on a device running iOS 27.0 (24A5408d) with app version 1.0.4: nine
crash reports on device, four of them within six minutes:
exception : EXC_CRASH / SIGKILL
termination : FRONTBOARD 0x8BADF00D
scene-update watchdog transgression: exhausted real
(wall clock) time allowance of 10.00 seconds
WatchdogEvent : scene-update
ProcessVisibility : Background
CPU : 25.010s total (user 19.290)
Symbolicated faulting thread 0 lands inside the consumer:
swift::AsyncTask::getPreferredTaskExecutor(bool)
swift_task_switch(..., swift::SerialExecutorRef)
await resume partial function for closure manaflow-ai#4 () async -> () in
GhosttySurfaceRepresentable.Coordinator.startMountedTasks(surfaceView:)
The new suite posts the UIApplication lifecycle notifications without any
`setTerminalPresentationActive` call, so it fails until the consumer stops
depending on a scene update. It is red at this commit by design.
`VerifiedReplayPresentationTests` needs an explicit QuartzCore import to
compile; without it the iOS test bundle cannot build at all.
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Release v1.14.0 with developer experience improvements and bug fixes.
Changelog
Added
Fixed
Changed