Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e2ebfd9
Agent conversation protocol: canonical contract (TS source of truth, …
lawrencecchen Jun 9, 2026
a8b0f07
Agent chat surface: /agent-chat TanStack route, event reducer, timeli…
lawrencecchen Jun 9, 2026
3894dbe
Agent conversation layer in cmuxd-remote: filesystem normalizer + age…
lawrencecchen Jun 10, 2026
e240161
Agent chat host wiring: View Chat menu, daemon stdio client, /agent-c…
lawrencecchen Jun 10, 2026
b7eb759
Register cmux.agentChat in cmuxAuxiliaryWindowIdentifiers (Cmd-W clos…
lawrencecchen Jun 10, 2026
a971c96
Address review feedback: discovery cwd robustness, object-form exit c…
lawrencecchen Jun 10, 2026
61fef23
Hook ingest: live claude hook events merged into the canonical conver…
lawrencecchen Jun 10, 2026
86ae768
Agent chat as a workspace pane + palette command + socket-drivable pa…
lawrencecchen Jun 10, 2026
4305b3c
Fix blank agent chat pane: kick the entry module under file://; deter…
lawrencecchen Jun 10, 2026
eaec54b
Render noise/error/stopped/working states in the agent chat
lawrencecchen Jun 10, 2026
b6809ee
Drop the 'No response requested.' placeholder unconditionally (Claude…
lawrencecchen Jun 10, 2026
3a3ac90
Recover the agent chat pane from a jettisoned WebContent process
lawrencecchen Jun 11, 2026
e46f662
Merge remote-tracking branch 'origin/main' into feat-agent-normalized…
lawrencecchen Jun 12, 2026
4225328
Add failing test: Claude project-dir encoding must match Claude Code'…
lawrencecchen Jun 12, 2026
a3309b8
Encode Claude project dirs with Claude Code's real rule (all non-alph…
lawrencecchen Jun 12, 2026
c14e701
Agent chat: off-main daemon locate, capability gate, child cleanup, l…
lawrencecchen Jun 12, 2026
ea36eb8
Agent chat: fall back to the panel's persisted resume binding (port o…
lawrencecchen Jun 12, 2026
7445ec1
Agent chat webview: labels module, indexed upserts, unknown-event tol…
lawrencecchen Jun 12, 2026
0f7bb75
Add failing test: Codex session meta survives the snapshot cap
lawrencecchen Jun 12, 2026
f9a0570
Recover head session metadata when the snapshot cap skips the transcr…
lawrencecchen Jun 12, 2026
e29a0f2
parser_test: check scanner.Err on fixture scan
lawrencecchen Jun 12, 2026
f67c4a2
CI: rebuild committed webviews assets, refresh Swift file-length budget
lawrencecchen Jun 12, 2026
a5b00e9
Bound transcript tail reads; break the chat pane's WK handler retain …
lawrencecchen Jun 12, 2026
c1df1b8
Tolerate empty snapshots; focus the chat panel on webview clicks
lawrencecchen Jun 12, 2026
b0854c2
Sort cached daemon versions numerically in the fallback
lawrencecchen Jun 12, 2026
679a969
Bound live conversation retention; refuse symlinked hook socket dirs
lawrencecchen Jun 12, 2026
c95fe49
CI: retrigger (Blacksmith suite stuck queued on 679a96955)
lawrencecchen Jun 12, 2026
84b4d02
CI: retrigger after Actions outage window
lawrencecchen Jun 12, 2026
5ef315d
Tests: guard the app module import for Debug (cmux_DEV) builds
lawrencecchen Jun 12, 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
40 changes: 18 additions & 22 deletions .github/swift-file-length-budget.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,14 @@
# Format: max_lines<TAB>relative path
# Reduce counts as files shrink. CI fails if tracked files exceed this budget.
33266 CLI/cmux.swift
518 Packages/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlCommandCoordinator+Surface.swift
14774 Sources/TerminalController.swift
19985 Sources/Workspace.swift
19275 Sources/ContentView.swift
20085 Sources/Workspace.swift
19298 Sources/ContentView.swift
18116 Sources/AppDelegate.swift
16539 Sources/GhosttyTerminalView.swift
13608 Sources/Panels/BrowserPanel.swift
14776 Sources/TerminalController.swift
13606 Sources/Panels/BrowserPanel.swift
12044 cmuxTests/AppDelegateShortcutRoutingTests.swift
10020 Sources/TabManager.swift
10023 Sources/TabManager.swift
9345 cmuxTests/CLINotifyProcessIntegrationRegressionTests.swift
7737 Sources/Panels/BrowserPanelView.swift
7291 cmuxTests/WorkspaceUnitTests.swift
Expand All @@ -21,7 +20,7 @@
6153 CLI/cmux_open.swift
6071 Sources/TextBoxInput.swift
5482 cmuxTests/BrowserConfigTests.swift
5462 Sources/cmuxApp.swift
5465 Sources/cmuxApp.swift
4827 Packages/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift
4460 Sources/Panels/FilePreviewPanel.swift
4400 cmuxTests/BrowserPanelTests.swift
Expand All @@ -38,11 +37,11 @@
2871 cmuxTests/CMUXOpenCommandTests.swift
2565 Sources/Panels/CmuxWebView.swift
2545 cmuxTests/WorkspaceManualUnreadTests.swift
2527 Sources/TerminalNotificationStore.swift
2544 cmuxTests/CommandPaletteSearchEngineTests.swift
2527 Sources/TerminalNotificationStore.swift
2516 Sources/KeyboardShortcutSettings.swift
2327 cmuxTests/CJKIMEInputTests.swift
2340 Sources/Mobile/MobileHostService.swift
2327 cmuxTests/CJKIMEInputTests.swift
2290 Sources/FileExplorerView.swift
2260 Sources/TerminalWindowPortal.swift
2138 Sources/SessionPersistence.swift
Expand All @@ -53,8 +52,8 @@
1860 cmuxTests/NotificationAndMenuBarTests.swift
1793 Sources/SessionIndexStore.swift
1751 Sources/WindowDragHandleView.swift
1731 Sources/RestorableAgentSession.swift
1721 cmuxTests/TerminalControllerSocketSecurityTests.swift
1720 Sources/RestorableAgentSession.swift
1693 cmuxTests/WorkspacePullRequestSidebarTests.swift
1652 cmuxTests/CMUXCLIErrorOutputRegressionTests.swift
1643 cmuxUITests/BrowserPaneNavigationKeybindUITests.swift
Expand Down Expand Up @@ -85,12 +84,12 @@
1021 cmuxUITests/TerminalCmdClickUITests.swift
1006 cmuxTests/CmuxSSHURLRequestTests.swift
1000 cmuxTests/CmuxTopSnapshotScopeTests.swift
963 cmuxTests/RestorableAgentSessionIndexTests.swift
947 Sources/TerminalNotificationPolicy.swift
945 Sources/SessionIndexRegisteredAgents.swift
944 Sources/App/ShortcutRoutingSupport.swift
939 Sources/App/TerminalDirectoryOpenSupport.swift
937 Sources/TextBoxMentionIndexStore.swift
937 cmuxTests/RestorableAgentSessionIndexTests.swift
924 Sources/DockPanelView.swift
913 cmuxTests/WorkspaceGroupTests.swift
905 Sources/CmuxSSHURLRequest.swift
Expand All @@ -99,19 +98,21 @@
866 Sources/CommandPalette/CommandPaletteSettingsToggle.swift
864 Sources/Panels/TerminalPanel.swift
856 Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/AppSection.swift
852 Packages/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlCommandCoordinator+Workspace.swift
846 cmuxTests/AgentSessionAutoResumeSettingsTests.swift
845 cmuxTests/SSHStartupSignalLifecycleTests.swift
842 Sources/Panels/MarkdownWebRenderer.swift
830 Sources/TaskManagerTypes.swift
810 Packages/CmuxSwiftRender/Tests/CmuxSwiftRenderTests/SwiftViewInterpreterTests.swift
787 Sources/ClosedItemHistory.swift
789 Sources/ClosedItemHistory.swift
774 cmuxUITests/BrowserFixtureInteractionUITests.swift
768 Sources/MainWindowFocusController.swift
762 Packages/CmuxMobileTransport/Sources/CmuxMobileTransport/CmxNetworkByteTransport.swift
760 Packages/CMUXAgentLaunch/Tests/CMUXAgentLaunchTests/AgentLaunchSanitizerTests.swift
757 Packages/CmuxAuthRuntime/Sources/CmuxAuthRuntime/Coordinator/AuthCoordinator.swift
756 Sources/Panels/AgentSessionWebRendererCoordinator.swift
752 cmuxUITests/CloseWorkspaceCmdDUITests.swift
750 Sources/TerminalController+ControlWorkspaceContext.swift
739 Sources/App/MenuBarExtraController.swift
738 Packages/CMUXProjectModel/Sources/CMUXProjectModel/XcodeProjectAdapter.swift
716 Sources/TaskManagerSnapshot.swift
Expand All @@ -130,8 +131,8 @@
683 Sources/Panels/CodexAppServerSession.swift
681 Sources/Panels/AgentSessionProcessStore.swift
680 Sources/FileExplorerSearchController.swift
668 cmuxTests/FeedCoordinatorTests.swift
679 cmuxTests/KeyboardShortcutContextTests.swift
668 cmuxTests/FeedCoordinatorTests.swift
654 Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/KeyboardShortcutsSection.swift
650 Sources/Panels/MarkdownRemoteImageLoader.swift
649 Sources/CmuxTopSnapshot.swift
Expand All @@ -143,6 +144,7 @@
619 cmuxTests/FinderFileDropRegressionTests.swift
614 cmuxTests/SessionIndexViewTests.swift
613 Sources/PortScanner.swift
611 Sources/TerminalController+ControlPaneContext.swift
599 Packages/CMUXAgentLaunch/Sources/CMUXAgentLaunch/AgentLaunchSanitizerPrimaryPolicies.swift
599 Sources/SettingsNavigation.swift
596 cmuxTests/CmuxEventBusTests.swift
Expand All @@ -168,6 +170,7 @@
539 CLI/CodexTeamsApprovalBridge.swift
538 CLI/CMUXCLI+Themes.swift
536 cmuxTests/CmuxConfigContextMenuTests.swift
533 Packages/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Pane/ControlCommandCoordinator+Pane.swift
531 Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Scene/SettingsWindowScene.swift
530 Packages/CmuxMobileTerminal/Sources/CmuxMobileTerminal/GhosttyRuntime.swift
528 cmuxTests/CLINotifyProcessTestSupport.swift
Expand All @@ -176,23 +179,16 @@
520 CLI/CMUXCLI+AmpExtension.swift
520 cmuxTests/MainWindowVisibilityControllerTests.swift
519 Packages/CmuxSwiftRender/Tests/CmuxSwiftRenderTests/Corpus/stress-two-column-cockpit-sidebar.swift
518 Packages/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Surface/ControlCommandCoordinator+Surface.swift
518 Packages/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceDetailView.swift
518 Packages/CmuxSwiftRender/Tests/CmuxSwiftRenderTests/Corpus/stress-git-review-queue-command-deck.swift
516 Sources/CmuxConfigExecutor.swift
514 Packages/CmuxSwiftRender/Sources/CmuxSwiftRender/ExpressionEvaluator.swift
514 cmuxUITests/UpdatePillUITests.swift
518 Packages/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceDetailView.swift
509 Packages/CMUXAgentLaunch/Sources/CMUXAgentLaunch/AgentLaunchSanitizerAdditionalPolicies.swift
507 Sources/TerminalControllerTopSupport.swift
506 Sources/App/MainWindowVisibilityController.swift
505 cmuxUITests/DisplayResolutionRegressionUITests.swift
504 cmuxTests/TerminalNotificationSocketActionTests.swift
502 Sources/CmuxEventPublishing.swift
502 Sources/Settings/ConfigSource.swift
611 Sources/TerminalController+ControlPaneContext.swift
533 Packages/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Pane/ControlCommandCoordinator+Pane.swift
852 Packages/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Workspace/ControlCommandCoordinator+Workspace.swift
756 Sources/TerminalController+ControlWorkspaceContext.swift
645 Packages/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Browser/ControlCommandCoordinator+BrowserAutomationActions.swift
642 Packages/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Browser/ControlCommandCoordinator+Browser3.swift
595 Packages/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Browser/ControlCommandCoordinator+BrowserAutomation.swift
563 Packages/CmuxControlSocket/Sources/CmuxControlSocket/Coordinator/Browser/ControlCommandCoordinator+BrowserAutomationFind.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ extension ControlCommandCoordinator {
return debugActivateApp()
case "debug.command_palette.toggle":
return debugCommandPaletteEvent(.toggle, request.params)
case "debug.command_palette.execute":
return debugCommandPaletteExecute(request.params)
case "debug.command_palette.rename_tab.open":
return debugCommandPaletteEvent(.renameTabOpen, request.params)
case "debug.command_palette.visible":
Expand Down Expand Up @@ -310,6 +312,26 @@ extension ControlCommandCoordinator {
return .ok(.object([:]))
}

/// `debug.command_palette.execute` — execute one palette command by id
/// (posts `commandPaletteExecuteRequested` with the id in `userInfo`).
func debugCommandPaletteExecute(_ params: [String: JSONValue]) -> ControlCallResult {
guard let commandID = string(params, "command_id") else {
return .err(code: "invalid_params", message: "Missing command_id", data: nil)
}
let requestedWindowID = uuid(params, "window_id")
let posted = debugContext?.controlDebugPostCommandPaletteEvent(
.execute(commandID: commandID),
windowID: requestedWindowID
) ?? false
if let requestedWindowID, !posted {
return .err(code: "not_found", message: "Window not found", data: .object([
"window_id": .string(requestedWindowID.uuidString),
"window_ref": ref(.window, requestedWindowID),
]))
}
return .ok(.object(["command_id": .string(commandID)]))
}

// MARK: - debug.command_palette.* (reads)

/// `debug.command_palette.visible` — palette visibility in a window.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
public enum ControlDebugCommandPaletteEvent: Sendable, Equatable {
/// `debug.command_palette.toggle` (`commandPaletteToggleRequested`).
case toggle
/// `debug.command_palette.execute` (`commandPaletteExecuteRequested`,
/// carrying the command id in the notification's `userInfo`).
case execute(commandID: String)
/// `debug.command_palette.rename_tab.open`
/// (`commandPaletteRenameTabRequested`).
case renameTabOpen
Expand Down
204 changes: 204 additions & 0 deletions Resources/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -194626,6 +194626,210 @@
}
}
}
},
"menu.window.viewChat": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "View Chat..."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "チャットを表示..."
}
}
}
},
"agentChat.noSession.title": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "No agent conversation"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "エージェントの会話がありません"
}
}
}
},
"agentChat.noSession.message": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Focus a terminal running Claude Code or Codex, then try View Chat again."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "Claude Code または Codex を実行中のターミナルを選択してから、もう一度「チャットを表示」してください。"
}
}
}
},
"agentChat.noSession.ok": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "OK"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "OK"
}
}
}
},
"agentChat.error.noTranscript": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "No transcript file was found for this agent session."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "このエージェントセッションのトランスクリプトファイルが見つかりませんでした。"
}
}
}
},
"agentChat.panel.title": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Agent Chat"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "エージェントチャット"
}
}
}
},
"command.openAgentChat.title": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Open Agent Chat"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "エージェントチャットを開く"
}
}
}
},
"commandPalette.kind.agentChat": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Agent Chat"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "エージェントチャット"
}
}
}
},
"menu.history.recentlyClosed.panel.agentChat": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Agent Chat"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "エージェントチャット"
}
}
}
},
"agentChat.daemon.incompatible": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "The cached agent daemon is too old for chat. Connect to a remote host once to update it."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "キャッシュされたエージェントデーモンが古いためチャットを利用できません。リモートホストに一度接続して更新してください。"
}
}
}
},
"agentChat.daemon.overrideInvalid": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "The configured agent daemon binary is missing or can't be run."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "設定されたエージェントデーモンのバイナリが見つからないか、実行できません。"
}
}
}
},
"agentChat.daemon.notCached": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "The agent chat daemon isn't installed yet. Connect to a remote host once with cmux ssh to install it."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "エージェントチャットのデーモンがまだインストールされていません。cmux ssh でリモートホストに一度接続するとインストールされます。"
}
}
}
}
}
}
Loading