Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
cf23557
test: cover plain terminal typing shortcut fast path
austinywang May 24, 2026
e61ca3d
fix: reduce terminal input and title hot-path work
austinywang May 24, 2026
8f4a9a5
test: avoid title dispatcher observer capture
austinywang May 24, 2026
6b02e56
fix: address notification hot-path review feedback
austinywang May 24, 2026
e09221d
fix: address terminal notification review followups
austinywang May 24, 2026
f8485f6
test: cover empty terminal interaction fast path
austinywang May 24, 2026
9482022
fix: repair notification fast-path CI failures
austinywang May 24, 2026
7ee4f38
fix: compile key timing path in release
austinywang May 24, 2026
da676a9
fix: avoid mutable notification route snapshots
austinywang May 24, 2026
4cacb69
Merge remote-tracking branch 'origin/main' into issue-4681-ssh-tmux-t…
austinywang May 25, 2026
9b405cb
fix: start automation socket before window construction
austinywang May 25, 2026
e2ee07a
fix: recheck app notification suppression before delivery
austinywang May 25, 2026
78c885a
Merge remote-tracking branch 'origin/main' into issue-4681-ssh-tmux-t…
austinywang May 26, 2026
3740827
fix: resolve app notification route at delivery
austinywang May 26, 2026
43da013
Merge remote-tracking branch 'origin/main' into issue-4681-ssh-tmux-t…
austinywang May 26, 2026
309570a
Merge remote-tracking branch 'origin/main' into issue-4681-ssh-tmux-t…
austinywang Jun 16, 2026
c27700f
fix: address merge fallout review findings
austinywang Jun 16, 2026
e509914
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
austinywang Jun 16, 2026
b71158f
fix: address ssh tmux review regressions
austinywang Jun 17, 2026
59b4c9f
Merge remote-tracking branch 'origin/main' into issue-4681-ssh-tmux-t…
austinywang Jun 17, 2026
4288ec3
Merge remote-tracking branch 'origin/main' into issue-4681-ssh-tmux-t…
austinywang Jun 17, 2026
a069879
fix: keep desktop notification route decisions coherent
austinywang Jun 17, 2026
6c25b1e
fix: repair notification suppression invalidation
austinywang Jun 17, 2026
1e8d4a0
fix: remove stale desktop notification route cache
austinywang Jun 17, 2026
914782c
fix: preserve desktop notification fallback routing
austinywang Jun 17, 2026
647fea2
merge: sync issue-4681 with main
austinywang Jun 17, 2026
340786e
merge: sync issue-4681 with main
austinywang Jul 3, 2026
abb4657
test: cover notification hook paths with trailing spaces
austinywang Jul 3, 2026
fead39e
fix: make terminal notification delivery synchronous
austinywang Jul 3, 2026
222c3cc
merge: sync issue-4681 with main
austinywang Jul 3, 2026
fc0a14b
fix: preserve dock terminal notifications
austinywang Jul 3, 2026
3f0c946
test: cover title dedupe after surface replacement
austinywang Jul 3, 2026
8e4fdbf
fix: scope title dedupe to surface lifetime
austinywang Jul 3, 2026
49d8502
fix: remove bogus copied localizations
austinywang Jul 3, 2026
7186e29
test: cover notification hook dot-dot lookup
austinywang Jul 3, 2026
14e1cff
fix: normalize notification hook lookup paths
austinywang Jul 3, 2026
6a959cc
fix: fall through unresolved surface notifications
austinywang Jul 3, 2026
1c59c03
fix: cache right-sidebar mode shortcuts
austinywang Jul 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 14 additions & 13 deletions .github/swift-file-length-budget.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
# Format: max_lines<TAB>relative path
# Reduce counts as files shrink. CI fails if tracked files exceed this budget.
34660 CLI/cmux.swift
17954 Sources/AppDelegate.swift
17966 Sources/AppDelegate.swift
16427 Sources/ContentView.swift
14270 Sources/TerminalController.swift
13172 Sources/Workspace.swift
13178 Sources/Workspace.swift
12448 Sources/GhosttyTerminalView.swift
12348 cmuxTests/AppDelegateShortcutRoutingTests.swift
12212 Sources/GhosttyTerminalView.swift
11669 Sources/Panels/BrowserPanel.swift
9497 cmuxTests/CLINotifyProcessIntegrationRegressionTests.swift
8032 Sources/Panels/BrowserPanelView.swift
Expand All @@ -17,7 +17,7 @@
7218 cmuxTests/WorkspaceRemoteConnectionTests.swift
6359 cmuxTests/SessionPersistenceTests.swift
6255 cmuxTests/GhosttyConfigTests.swift
6166 Sources/TabManager.swift
6169 Sources/TabManager.swift
5915 cmuxTests/TerminalAndGhosttyTests.swift
5809 Sources/TextBoxInput.swift
5573 cmuxTests/BrowserConfigTests.swift
Expand All @@ -26,25 +26,25 @@
4367 cmuxTests/BrowserPanelTests.swift
4239 Packages/iOS/CmuxMobileTerminal/Sources/CmuxMobileTerminal/GhosttySurfaceView.swift
4121 Sources/BrowserWindowPortal.swift
4064 cmuxTests/TabManagerUnitTests.swift
3934 Sources/Feed/FeedPanelView.swift
3926 cmuxTests/TabManagerUnitTests.swift
3896 cmuxTests/WindowAndDragTests.swift
3668 cmuxTests/CLIGenericHookPersistenceTests.swift
3397 Sources/CmuxConfig.swift
3492 Sources/CmuxConfig.swift
3364 cmuxTests/TabManagerSessionSnapshotTests.swift
3058 Sources/Update/UpdateTitlebarAccessory.swift
2876 cmuxTests/CMUXOpenCommandTests.swift
2875 Sources/SessionIndexView.swift
2607 Sources/KeyboardShortcutSettings.swift
2681 cmuxTests/WorkspaceManualUnreadTests.swift
2618 Sources/KeyboardShortcutSettings.swift
2563 Sources/Panels/CmuxWebView.swift
2546 cmuxTests/WorkspaceManualUnreadTests.swift
2524 cmuxTests/CommandPaletteSearchEngineTests.swift
2395 Sources/Mobile/MobileHostService.swift
2331 cmuxTests/CmuxConfigTests.swift
2328 cmuxTests/CJKIMEInputTests.swift
2242 Sources/TerminalNotificationStore.swift
2315 Sources/TerminalNotificationStore.swift
2229 Sources/TerminalWindowPortal.swift
2126 cmuxTests/CmuxConfigTests.swift
2085 cmuxTests/ShortcutAndCommandPaletteTests.swift
2196 cmuxTests/ShortcutAndCommandPaletteTests.swift
2078 Sources/SessionPersistence.swift
2011 Sources/KeyboardShortcutSettingsFileStore.swift
1944 Sources/RestorableAgentSession.swift
Expand Down Expand Up @@ -132,6 +132,7 @@
762 Packages/iOS/CmuxMobileTransport/Sources/CmuxMobileTransport/CmxNetworkByteTransport.swift
761 Sources/Mobile/AgentChat/AgentChatSessionRegistry.swift
756 Sources/Panels/AgentSessionWebRendererCoordinator.swift
755 cmuxTests/TerminalNotificationClearAllTests.swift
754 Sources/TerminalController+ControlWorkspaceContext.swift
752 cmuxUITests/CloseWorkspaceCmdDUITests.swift
739 cmuxTests/CLICodexHookTimeoutRegressionTests.swift
Expand All @@ -142,7 +143,6 @@
710 Sources/TerminalSSHSessionDetector.swift
709 Packages/macOS/CmuxFoundation/Sources/CmuxFoundation/SidebarDrop/SidebarWorkspaceReorderDropResolver.swift
706 CLI/CMUXCLI+Config.swift
699 cmuxTests/TerminalNotificationClearAllTests.swift
698 cmuxTests/RestorableAgentHookProviderResumeTests.swift
696 cmuxTests/KeyboardShortcutContextTests.swift
696 cmuxTests/UpdatePillReleaseVisibilityTests.swift
Expand Down Expand Up @@ -177,6 +177,7 @@
620 cmuxTests/TerminalNotificationQueueTests.swift
617 Packages/iOS/CmuxMobileShell/Tests/CmuxMobileShellTests/MobileShellRenderGridLivenessTests.swift
617 Sources/SettingsNavigation.swift
608 Sources/RightSidebarPanelView.swift
608 cmuxUITests/FeedSidebarUITests.swift
607 Packages/macOS/CmuxTerminal/Sources/CmuxTerminal/Surface/TerminalSurface.swift
607 Sources/SessionIndexModels.swift
Expand Down Expand Up @@ -209,7 +210,6 @@
561 cmuxTests/GhosttyConfigPathResolverTests.swift
560 cmuxTests/CLISSHPTYResizeInputTests.swift
558 Packages/macOS/CmuxGit/Sources/CmuxGit/Parsing/GitMetadataService+Config.swift
553 Sources/RightSidebarPanelView.swift
549 Sources/Panels/BrowserAutomation.swift
547 Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/BackingUpPairedMacStore.swift
546 Packages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/AutomationSection.swift
Expand Down Expand Up @@ -252,5 +252,6 @@
503 Sources/Settings/ConfigSource.swift
502 Sources/CmuxEventPublishing.swift
502 Sources/RemoteTmuxSessionMirror.swift
501 Sources/Workspace+PanelLifecycle.swift
500 Packages/macOS/CmuxControlSocket/Tests/CmuxControlSocketTests/ControlCommandContextTestStubs.swift
500 Sources/KeyboardShortcutRecorder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,3 @@ struct TerminalViewportInputs {
let toolbarPresentationFrame: CGRect?
}
#endif

Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,3 @@ struct TerminalViewportSnapshot {
}
}
#endif

Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ public protocol NotificationDismissalHosting: AnyObject {
/// Whether a visible notification indicator exists for the workspace
/// (or surface).
func storeHasVisibleNotificationIndicator(workspaceId: UUID, surfaceId: UUID?) -> Bool
/// Whether any notification/unread state could be dismissed for the
/// workspace.
func storeHasDismissibleActivity(workspaceId: UUID) -> Bool

// MARK: Mutations

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ public final class NotificationDismissalModel: NotificationDismissing {
}
}
guard host.hasNotificationStore else { return false }
guard host.storeHasDismissibleActivity(workspaceId: workspaceId) else { return false }
let targetPanelId = surfaceId.flatMap {
host.panelId(forSurfaceOrPanelId: $0, in: workspaceId)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,16 @@ private final class FakeHost: NotificationDismissalHosting {
return visibleIndicatorSurfaces.contains(surfaceId)
}

func storeHasDismissibleActivity(workspaceId: UUID) -> Bool {
workspaceWideUnread.contains(workspaceId) ||
!unreadNotificationSurfaces.isEmpty ||
!visibleIndicatorSurfaces.isEmpty ||
!manualPanelUnread.isEmpty ||
!restoredPanelUnread.isEmpty ||
manualWorkspaceUnread.contains(workspaceId) ||
restoredWorkspaceUnread.contains(workspaceId)
}

func storeMarkRead(workspaceId: UUID, surfaceId: UUID?) {
log.append("markRead:\(short(surfaceId))")
}
Expand Down
102 changes: 102 additions & 0 deletions Resources/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -218776,6 +218776,108 @@
}
}
}
},
"command.openHistoryPane.title": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Open History as Pane"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "履歴をペインで開く"
}
}
}
},
"menu.history.openFullHistory": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Open Full History…"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "すべての履歴を開く…"
}
}
}
},
"menu.history.recentlyClosed.showFull": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Show Full Recently Closed"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "最近閉じた項目をすべて表示"
}
}
}
},
"notification.fallback_title": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Terminal"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "ターミナル"
}
}
}
},
"rightSidebar.mode.history": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "History"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "履歴"
}
}
}
},
"shortcut.switchRightSidebarToHistory.label": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Show Sidebar History"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "サイドバーの履歴を表示"
}
}
}
}
},
"version": "1.0"
Expand Down
12 changes: 12 additions & 0 deletions Sources/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1280,6 +1280,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
AppIconLaunchState.markDidFinishLaunching()
AppearanceSettingsUserDefaultsObserver.shared.startObserving()
BrowserSystemProxyWatcher.shared.startObserving()
RightSidebarMode.preloadModeShortcutCache()
if isRunningUnderXCTest {
NSApp.setActivationPolicy(.regular)
} else {
Expand Down Expand Up @@ -8418,6 +8419,15 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
}
restoredSessionSnapshotHandler?(restoredPanelIdsByWorkspaceIndex, tabManager)
}
if mainWindowContexts.isEmpty {
// Bind the automation socket as soon as the initial model exists.
// Startup probes and CLI automation should not be gated on AppKit
// window construction or SwiftUI view materialization.
startSocketListenerIfEnabled(
tabManager: tabManager,
source: "createMainWindow.initialModelReady"
)
}

let sidebarWidth = sessionWindowSnapshot?.sidebar.width
.map { SessionPersistencePolicy.sanitizedSidebarWidth($0) }
Expand Down Expand Up @@ -15979,13 +15989,15 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
sidebarSelectionState = nil
fileExplorerState = nil
TerminalController.shared.setActiveTabManager(nil)
NotificationCenter.default.post(name: .cmuxSelectedWorkspaceDidChange, object: nil)
return
}
tabManager = context.tabManager
sidebarState = context.sidebarState
sidebarSelectionState = context.sidebarSelectionState
fileExplorerState = context.fileExplorerState
TerminalController.shared.setActiveTabManager(context.tabManager)
NotificationCenter.default.post(name: .cmuxSelectedWorkspaceDidChange, object: context.tabManager)
}

func setActiveMainWindow(_ window: NSWindow) {
Expand Down
Loading
Loading