diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextActions/Catalog/AgentActionCatalog.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextActions/Catalog/AgentActionCatalog.swift index 2c961297498f..515a52b64544 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextActions/Catalog/AgentActionCatalog.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextActions/Catalog/AgentActionCatalog.swift @@ -6,21 +6,21 @@ nonisolated enum AgentActionCatalog: ActionCatalogGroup { ActionDescriptor( id: "agentPaneZoomIn", title: String(localized: "action.agentPaneZoomIn", defaultValue: "Agent Chat: Zoom In", bundle: .module), - keywords: ["agent", "chat", "zoom", "bigger"], defaultShortcut: Shortcut("=", modifiers: [.command]), + keywords: ["agent", "chat", "zoom", "bigger"], category: .agents, symbol: "plus.magnifyingglass", surfaces: [.palette, .keyboard, .menu, .contextMenu], requires: [.agentPaneFocused], targets: [.pane], cliName: "agent zoom-in", mainMenu: .view ), ActionDescriptor( id: "agentPaneZoomOut", title: String(localized: "action.agentPaneZoomOut", defaultValue: "Agent Chat: Zoom Out", bundle: .module), - keywords: ["agent", "chat", "zoom", "smaller"], defaultShortcut: Shortcut("-", modifiers: [.command]), + keywords: ["agent", "chat", "zoom", "smaller"], category: .agents, symbol: "minus.magnifyingglass", surfaces: [.palette, .keyboard, .menu, .contextMenu], requires: [.agentPaneFocused], targets: [.pane], cliName: "agent zoom-out", mainMenu: .view ), ActionDescriptor( id: "agentPaneZoomReset", title: String(localized: "action.agentPaneZoomReset", defaultValue: "Agent Chat: Actual Size", bundle: .module), - keywords: ["agent", "chat", "zoom", "reset"], defaultShortcut: Shortcut("0", modifiers: [.command]), + keywords: ["agent", "chat", "zoom", "reset"], category: .agents, symbol: "1.magnifyingglass", surfaces: [.palette, .keyboard, .menu, .contextMenu], requires: [.agentPaneFocused], targets: [.pane], cliName: "agent actual-size", mainMenu: .view ), diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextApp/AppServices.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextApp/AppServices.swift index 2715ed1dda2f..daca04f23561 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextApp/AppServices.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextApp/AppServices.swift @@ -177,6 +177,12 @@ final class AppServices { let actionBudget: ActionBudgetMonitor /// Every action; timed by the always-on `action.*` signposts and `actionBudget`, in Debug and Release. let registry: ActionRegistry + /// Serializes Cmd +/− chat font writes so key repeats cannot lose a step. + @MainActor final class ChatFontSizeWriteQueue { + var latest: Task? + var generation = 0 + } + let agentChatFontSizeWrites = ChatFontSizeWriteQueue() /// The main-thread blocking detector's handle (threading-model.md): the Debug menu, `debug.blocking`, and its log sink (``BlockingLogSink``). let blocking = BlockingDetector.forProcess() /// Sparkle updates (release builds) or read-only feed probes (DEV). diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextApp/Handlers/PaneHandlers+Verbs.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextApp/Handlers/PaneHandlers+Verbs.swift index 0e7b3dc9e766..1bc49e131ec4 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextApp/Handlers/PaneHandlers+Verbs.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextApp/Handlers/PaneHandlers+Verbs.swift @@ -5,6 +5,7 @@ import CmuxNextDaemon import CmuxNextDaemonService import CmuxNextDesign import CmuxNextLayout +import CmuxNextSettings // Swap, close, rename, flash and workspace font size. extension PaneHandlers { @@ -139,6 +140,21 @@ extension PaneHandlers { ] for (id, binding) in bindings { registry.bind(id, invoke: { invocation in + // The same keys change the chat's text size when its composer or transcript + // owns focus. The page-zoom actions remain available from the View menu/palette. + // A selected chat is not enough to claim a keyboard shortcut: the key router + // records the window's actual focused surface on the invocation. Keep direct + // palette/menu runs (which have no key context) target-scoped, but let a sidebar + // or native control retain the workspace-terminal action while a chat remains + // selected. + let inAppUser = invocation.origin == .user && !invocation.viaControlSocket + let chatOwnsKeyboard = inAppUser && invocation.keyContext?.contains(.agentPaneFocused) == true + let targetIsChat = inAppUser && invocation.keyContext == nil + && ctx.scope(invocation).pane.map { if case .agent = $0.currentContent { true } else { false } } == true + if chatOwnsKeyboard || targetIsChat { + changeChatFontSize(id, ctx) + return + } guard let content = ctx.content(invocation) else { return } var applied = 0 for pane in content.panes.values { @@ -150,4 +166,49 @@ extension PaneHandlers { }) } } + + // Key repeats read after the preceding write, or two quick Cmd-Plus presses + // both read 14 and save 15. Keep the chain only until its last write settles. + + /// One point per key press, within the Settings row's range. An absent value is its 14 pt + /// default; reset removes the override so later default changes still apply. + private static func changeChatFontSize(_ id: ActionID, _ ctx: AppActionContext) { + guard let settings = ctx.services.settings else { return ctx.refuse(RefusalStrings.settingsNotLoaded) } + let path = AgentPaneDisplaySetting.fontSizePath + if let managed = settings.managedKey(forPath: path) { + return ctx.refuse(RefusalStrings.settingManaged(managed.key)) + } + let writer = SettingWriter.currentRun() + let queue = ctx.services.agentChatFontSizeWrites + let previous = queue.latest + queue.generation += 1 + let generation = queue.generation + let task: Task = Task { @MainActor in + _ = await previous?.value + defer { + if queue.generation == generation { queue.latest = nil } + } + let value: CmuxNextSettings.JSONValue? + if id == "resetWorkspaceTerminalFontSize" { + value = nil + } else { + let current = AgentPaneDisplaySetting(fileRoot: settings.fileRoot) + .values[path.joined(separator: ".")]?.doubleValue ?? AgentPaneDisplaySetting.fontSizeFallback + let delta = id == "increaseWorkspaceTerminalFontSize" ? 1.0 : -1.0 + let range = AgentPaneDisplaySetting.fontSizeRange + let next = min(max(current + delta, range.lowerBound), range.upperBound) + guard next != current else { return nil } + value = .number(next) + } + do { + try await settings.setSetting(at: path, to: value, by: writer) + return nil + } catch { + await settings.reload() + return ActionWorkFailure(String(describing: error)) + } + } + queue.latest = task + ctx.report { await task.value } + } } diff --git a/Packages/macOS/CmuxNext/Sources/CmuxNextSettings/AgentPaneDisplaySetting.swift b/Packages/macOS/CmuxNext/Sources/CmuxNextSettings/AgentPaneDisplaySetting.swift index 15d1c31edc73..0b2a221c02c7 100644 --- a/Packages/macOS/CmuxNext/Sources/CmuxNextSettings/AgentPaneDisplaySetting.swift +++ b/Packages/macOS/CmuxNext/Sources/CmuxNextSettings/AgentPaneDisplaySetting.swift @@ -18,6 +18,13 @@ public nonisolated struct AgentPaneDisplaySetting: Sendable, Hashable { /// Show Feature Tips (``UpdatesSettings/showFeatureTipsPath``; webviews featureTips.tsx). public static let followedAppPaths: [[String]] = [SidebarSectionsSetting.minimalPath, UpdatesSettings.showFeatureTipsPath] + /// The Chat Font Size setting read by both the page and the app's Cmd +/− actions. + public static let fontSizePath = ["agentPane", "display", "font", "size"] + public static var fontSizeRange: ClosedRange { + Double(AgentPaneDisplaySettingsSchema.fontSizeRange.lowerBound)...Double(AgentPaneDisplaySettingsSchema.fontSizeRange.upperBound) + } + public static var fontSizeFallback: Double { AgentPaneDisplaySettingsSchema.fontSizeFallback } + /// The accepted values by dotted key. public var values: [String: JSONValue] diff --git a/Packages/macOS/CmuxNext/Tests/CmuxNextActionsTests/HomeZoomKeyTests.swift b/Packages/macOS/CmuxNext/Tests/CmuxNextActionsTests/HomeZoomKeyTests.swift index c92dbcf1ef04..8836e34b4836 100644 --- a/Packages/macOS/CmuxNext/Tests/CmuxNextActionsTests/HomeZoomKeyTests.swift +++ b/Packages/macOS/CmuxNext/Tests/CmuxNextActionsTests/HomeZoomKeyTests.swift @@ -3,7 +3,7 @@ import CmuxNextActions import Testing /// Cmd-= (and Cmd-+), Cmd-- and Cmd-0 on Home zoom the Chief chat (`home.zoomIn`, `home.zoomOut`, -/// `home.zoomReset`); elsewhere the keys keep their owner (an agent chat's zoom, a terminal's font +/// `home.zoomReset`); elsewhere the keys keep their owner (an agent chat's text size, a terminal's font /// size). The binding table resolves each key in the contexts the key router builds. @MainActor @Suite struct HomeZoomKeyTests { static let keys: [(Shortcut, String)] = [ @@ -38,9 +38,9 @@ import Testing @Test func zoomKeysStayWithTheAgentChatAndTheTerminal() { var agent = KeyContext(bits: [.agentPaneFocused]) agent[KeyContext.surfaceKind] = .string("agent") - #expect(Self.winner(Shortcut("=", modifiers: [.command]), in: agent) == "agentPaneZoomIn") - #expect(Self.winner(Shortcut("-", modifiers: [.command]), in: agent) == "agentPaneZoomOut") - #expect(Self.winner(Shortcut("0", modifiers: [.command]), in: agent) == "agentPaneZoomReset") + #expect(Self.winner(Shortcut("=", modifiers: [.command]), in: agent) == "increaseWorkspaceTerminalFontSize") + #expect(Self.winner(Shortcut("-", modifiers: [.command]), in: agent) == "decreaseWorkspaceTerminalFontSize") + #expect(Self.winner(Shortcut("0", modifiers: [.command]), in: agent) == "resetWorkspaceTerminalFontSize") var terminal = KeyContext(bits: [.terminalFocused]) terminal[KeyContext.surfaceKind] = .string("terminal") for (key, _) in Self.keys { diff --git a/Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/AgentChatFontSizeShortcutTests.swift b/Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/AgentChatFontSizeShortcutTests.swift new file mode 100644 index 000000000000..5131840d6895 --- /dev/null +++ b/Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/AgentChatFontSizeShortcutTests.swift @@ -0,0 +1,169 @@ +import AppKit +import CmuxNextActions +@testable import CmuxNextApp +import CmuxNextAgentPane +import CmuxNextDaemon +import CmuxNextDesign +@testable import CmuxNextSettings +import Foundation +import Testing + +/// Lawrence via Leo: "make sure font size everywhere (like text input area) is customizable". +/// The same action bound to Cmd +/− scales chat text when a chat owns focus, and keeps the +/// workspace terminal path when it does not. +@MainActor @Suite(.serialized, .timeLimit(.minutes(3)), .enabled(if: SameTreeDaemonBinary.url != nil, "needs the same-tree cmux-tui")) +struct AgentChatFontSizeShortcutTests { + @Test func fontActionsWriteTheChatSettingOnlyInAChat() async throws { + try await withSettings { services, settings, _ in + let key = AgentPaneDisplaySetting.fontSizePath + + // Startup may land on a chat. Select a real terminal before testing its shortcut, + // or an asynchronous chat-font write can leak into the two-press assertion below. + let pane = try #require(services.windows.active?.focusedPane) + pane.newTerminalTab() + try await PasswordManagerRouteTests.until({ + guard let focused = services.windows.active?.focusedPane, + case .terminal = focused.currentContent else { return false } + return true + }) + #expect(services.registry.perform("increaseWorkspaceTerminalFontSize", invocation: ActionInvocation(origin: .user))) + #expect(services.agentChatFontSizeWrites.latest == nil) + #expect(settings.fileRoot.value(at: key) == nil) + + try await openChat(services) + + #expect(services.registry.perform("increaseWorkspaceTerminalFontSize", invocation: ActionInvocation(origin: .user))) + #expect(services.registry.perform("increaseWorkspaceTerminalFontSize", invocation: ActionInvocation(origin: .user))) + try await PasswordManagerRouteTests.until({ settings.fileRoot.value(at: key) == .number(16) }, + report: { "two quick increases saved \(String(describing: settings.fileRoot.value(at: key)))" }) + #expect(services.registry.perform("decreaseWorkspaceTerminalFontSize", invocation: ActionInvocation(origin: .user))) + try await PasswordManagerRouteTests.until({ settings.fileRoot.value(at: key) == .number(15) }) + + try await settings.set(.number(28), at: key) + #expect(services.registry.perform("increaseWorkspaceTerminalFontSize", invocation: ActionInvocation(origin: .user))) + #expect(await services.agentChatFontSizeWrites.latest?.value == nil) + #expect(settings.fileRoot.value(at: key) == .number(28), "the upper Settings limit is kept") + #expect(services.registry.perform("resetWorkspaceTerminalFontSize", invocation: ActionInvocation(origin: .user))) + try await PasswordManagerRouteTests.until({ settings.fileRoot.value(at: key) == nil }) + } + } + + @Test func managedFontActionsRefuseWithoutWriting() async throws { + let key = AgentPaneDisplaySetting.fontSizePath + let dotted = key.joined(separator: ".") + try await withSettings(managed: ManagedPreferences(forced: [dotted: .number(22)])) { services, settings, url in + try await openChat(services) + #expect(settings.managedKey(forPath: key) != nil) + var notices: [(String, Bool)] = [] + let previous = services.registry.refusalObserver + services.registry.refusalObserver = { notices.append(($0, $1)) } + defer { services.registry.refusalObserver = previous } + for id: ActionID in ["increaseWorkspaceTerminalFontSize", "decreaseWorkspaceTerminalFontSize", "resetWorkspaceTerminalFontSize"] { + #expect(services.registry.perform(id, invocation: ActionInvocation(origin: .user))) + } + #expect(notices.count == 3) + #expect(notices.allSatisfy { $0.0.contains(dotted) && !$0.1 }) + #expect(services.agentChatFontSizeWrites.latest == nil) + #expect(settings.fileRoot.value(at: key) == nil) + #expect(try String(contentsOf: url, encoding: .utf8) == "{}") + } + } + + @Test func aNonChatKeySurfaceDoesNotBorrowTheSelectedChat() async throws { + try await withSettings { services, settings, _ in + try await openChat(services) + + // The pane is still selected, but a sidebar/native control owns the key event. + // The workspace-font action must stay on its terminal path instead of changing the + // selected chat's setting. + var invocation = ActionInvocation(origin: .user) + invocation.keyContext = [.rightSidebarFocused] + #expect(services.registry.perform("increaseWorkspaceTerminalFontSize", invocation: invocation)) + try await Task.sleep(for: .milliseconds(50)) + #expect(settings.fileRoot.value(at: AgentPaneDisplaySetting.fontSizePath) == nil) + + invocation.keyContext = [.agentPaneFocused] + #expect(services.registry.perform("increaseWorkspaceTerminalFontSize", invocation: invocation)) + try await PasswordManagerRouteTests.until({ + settings.fileRoot.value(at: AgentPaneDisplaySetting.fontSizePath) == .number(15) + }) + } + } + + @Test func automationKeepsTheWorkspaceFontActionWhileAChatIsSelected() async throws { + try await withSettings { services, settings, _ in + try await openChat(services) + let key = AgentPaneDisplaySetting.fontSizePath + try await settings.set(.number(20), at: key) + for origin in ActionOrigin.allCases { + var invocation = ActionInvocation(origin: origin) + // A socket caller can claim user origin; it still is not an in-app gesture. + invocation.viaControlSocket = origin == .user || origin == .cli || origin == .mcp + for id: ActionID in ["increaseWorkspaceTerminalFontSize", "decreaseWorkspaceTerminalFontSize", "resetWorkspaceTerminalFontSize"] { + #expect(services.registry.perform(id, invocation: invocation)) + #expect(services.agentChatFontSizeWrites.latest == nil, + "\(origin) must retain the workspace-terminal action") + #expect(settings.fileRoot.value(at: key) == .number(20)) + } + } + } + } + + @Test(arguments: [false, true]) func failedFontWritesReachTheKeyboardOrWaitingCaller(captured: Bool) async throws { + try await withSettings { services, settings, url in + try await openChat(services) + // A broken user file must remain untouched, and the failed write must not be silent. + try Data("{".utf8).write(to: url) + var notices: [(String, Bool)] = [] + let previous = services.registry.refusalObserver + services.registry.refusalObserver = { notices.append(($0, $1)) } + defer { services.registry.refusalObserver = previous } + if captured { + let work = services.registry.capturingWork { + #expect(services.registry.perform("increaseWorkspaceTerminalFontSize", invocation: ActionInvocation(origin: .user))) + } + #expect(work.count == 1) + let task = try #require(work.first) + let failure = try #require(await task.value) + #expect(!failure.message.isEmpty) + #expect(notices.isEmpty, "the waiting caller receives the failure without a duplicate notice") + } else { + #expect(services.registry.perform("increaseWorkspaceTerminalFontSize", invocation: ActionInvocation(origin: .user))) + let task = try #require(services.agentChatFontSizeWrites.latest) + #expect(await task.value != nil) + try await PasswordManagerRouteTests.until({ notices.count == 1 }, report: { "a failed keyboard write showed \(notices.count) refusals" }) + #expect(notices.first?.0.isEmpty == false && notices.first?.1 == false) + } + #expect(settings.fileRoot.value(at: AgentPaneDisplaySetting.fontSizePath) == nil) + #expect(try String(contentsOf: url, encoding: .utf8) == "{") + } + } + + private func withSettings(managed: ManagedPreferences = ManagedPreferences(), + _ body: (AppServices, SettingsController, URL) async throws -> Void) async throws { + try await PasswordManagerRouteTests.withApp { services, _ in + services.agentTabs.localHost = AgentSessionRef.host(installID: "cn-chat-font-key") + try #require(services.agentTabs.canHostChat, "this build has no agent page") + let root = FileManager.default.temporaryDirectory.appending(path: "cn-chat-font-key-\(UUID().uuidString)") + try FileManager.default.createDirectory(at: root, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(at: root) } + let url = root.appending(path: "cmux.json") + try Data("{}".utf8).write(to: url) + let settings = SettingsController(registry: services.registry, design: DesignSettings(), fileURL: url, + managedReader: FixedManagedPreferenceReader(managed), managedWatchFiles: []) + await settings.reload() + services.settings = settings + try await body(services, settings, url) + } + } + + private func openChat(_ services: AppServices) async throws { + let pane = try #require(services.windows.active?.focusedPane) + pane.newAgentTab() + try await PasswordManagerRouteTests.until({ + guard let focused = services.windows.active?.focusedPane, + case .agent = focused.currentContent else { return false } + return true + }, report: { "focused content: \(String(describing: services.windows.active?.focusedPane?.currentContent))" }) + } +} diff --git a/Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/KeybindingsFocusConflictTests.swift b/Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/KeybindingsFocusConflictTests.swift index 0b6470511c62..a40cd9c10b81 100644 --- a/Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/KeybindingsFocusConflictTests.swift +++ b/Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/KeybindingsFocusConflictTests.swift @@ -37,7 +37,7 @@ import Testing }) } - static let actualSizes = ["browserZoomReset", "agentPaneZoomReset", "markdownZoomReset", "fileEditorZoomReset", + static let actualSizes = ["browserZoomReset", "markdownZoomReset", "fileEditorZoomReset", "canvasZoomReset", "terminal.resetFontSize", "resetWorkspaceTerminalFontSize"] /// Shipped defaults share keys by design (the Chrome tab keys and Cmd-1…9, Home's chat keys, diff --git a/plans/cmux-next/action-surfaces.json b/plans/cmux-next/action-surfaces.json index f35d85eeef3f..ecc4289c6ffa 100644 --- a/plans/cmux-next/action-surfaces.json +++ b/plans/cmux-next/action-surfaces.json @@ -22389,12 +22389,7 @@ ], "default_chord" : null, - "default_shortcut" : { - "key" : "=", - "modifiers" : [ - "cmd" - ] - }, + "default_shortcut" : null, "id" : "agentPaneZoomIn", "main_menu" : "view", "mcp" : "systemChange", @@ -22423,12 +22418,7 @@ ], "default_chord" : null, - "default_shortcut" : { - "key" : "-", - "modifiers" : [ - "cmd" - ] - }, + "default_shortcut" : null, "id" : "agentPaneZoomOut", "main_menu" : "view", "mcp" : "systemChange", @@ -22457,12 +22447,7 @@ ], "default_chord" : null, - "default_shortcut" : { - "key" : "0", - "modifiers" : [ - "cmd" - ] - }, + "default_shortcut" : null, "id" : "agentPaneZoomReset", "main_menu" : "view", "mcp" : "systemChange", diff --git a/plans/cmux-next/palette-audit.md b/plans/cmux-next/palette-audit.md index ab7d19088289..30593f2df40e 100644 --- a/plans/cmux-next/palette-audit.md +++ b/plans/cmux-next/palette-audit.md @@ -944,9 +944,9 @@ Niche: Allow Site Request, Always Center Focused Column, Attempt Update, Base Ke | Agents | `agentPane.searchFiles` | Search Files… | | b. standard | its section, catalog order | | Agents | `agentPane.switchModel` | Switch Model… | ⌃⌘M | b. standard | its section, catalog order | | Agents | `agentPane.toggleInspector` | Show ACP Inspector | | b. standard | its section, catalog order | -| Agents | `agentPaneZoomIn` | Agent Chat: Zoom In | ⌘= | b. standard | its section, catalog order | -| Agents | `agentPaneZoomOut` | Agent Chat: Zoom Out | ⌘- | b. standard | its section, catalog order | -| Agents | `agentPaneZoomReset` | Agent Chat: Actual Size | ⌘0 | b. standard | its section, catalog order | +| Agents | `agentPaneZoomIn` | Agent Chat: Zoom In | — | b. standard | its section, catalog order | +| Agents | `agentPaneZoomOut` | Agent Chat: Zoom Out | — | b. standard | its section, catalog order | +| Agents | `agentPaneZoomReset` | Agent Chat: Actual Size | — | b. standard | its section, catalog order | | Agents | `chief.moveTo` | Move Chief To… | | b. standard | its section, catalog order | | Agents | `chief.openMemoryInspector` | Chief: Open Memory Inspector | | b. standard | its section, catalog order | | Agents | `chief.openUsage` | Chief Usage | | b. standard | its section, catalog order | diff --git a/schemas/defaults/cmux-next.json b/schemas/defaults/cmux-next.json index 1a6fb01af085..7627e34b0313 100644 --- a/schemas/defaults/cmux-next.json +++ b/schemas/defaults/cmux-next.json @@ -20,9 +20,6 @@ "key.agentPane.previousTurn": ["ctrl+opt+up"], "key.agentPane.searchChats": ["cmd+k when surfaceKind != terminal && !codeEditorFocused"], "key.agentPane.switchModel": ["ctrl+cmd+m"], - "key.agentPaneZoomIn": ["cmd+="], - "key.agentPaneZoomOut": ["cmd+-"], - "key.agentPaneZoomReset": ["cmd+0"], "key.appearance.uiScale.decrease": ["ctrl+shift+cmd+-"], "key.appearance.uiScale.increase": ["ctrl+shift+cmd+="], "key.appearance.uiScale.reset": ["ctrl+shift+cmd+0"], diff --git a/web/data/cmux-shortcuts.generated.json b/web/data/cmux-shortcuts.generated.json index 4f8b42b8069f..eb296be20581 100644 --- a/web/data/cmux-shortcuts.generated.json +++ b/web/data/cmux-shortcuts.generated.json @@ -7785,108 +7785,6 @@ "zh-TW": "代理程式" }, "shortcuts": [ - { - "id": "agentPaneZoomIn", - "title": { - "en": "Agent Chat: Zoom In", - "ar": "دردشة الوكيل: تكبير", - "bs": "Chat s agentom: uvećaj", - "da": "Agentchat: Zoom ind", - "de": "Agent-Chat: Vergrößern", - "es": "Chat del agente: acercar", - "fr": "Chat de l’agent : zoom avant", - "it": "Chat dell’agente: ingrandisci", - "ja": "エージェントチャット: 拡大", - "km": "ការជជែកជាមួយភ្នាក់ងារ៖ ពង្រីក", - "ko": "에이전트 채팅: 확대", - "no": "Agentchat: Zoom inn", - "pl": "Czat z agentem: Powiększ", - "pt-BR": "Chat do agente: Ampliar", - "ru": "Чат с агентом: увеличить", - "th": "แชตเอเจนต์: ซูมเข้า", - "tr": "Ajan sohbeti: Yakınlaştır", - "uk": "Чат з агентом: збільшити", - "vi": "Trò chuyện với tác tử: Phóng to", - "zh-CN": "智能体聊天:放大", - "zh-TW": "代理聊天:放大" - }, - "shortcut": { - "key": "=", - "modifiers": [ - "cmd" - ] - }, - "chord": null, - "aliases": [] - }, - { - "id": "agentPaneZoomOut", - "title": { - "en": "Agent Chat: Zoom Out", - "ar": "دردشة الوكيل: تصغير", - "bs": "Chat s agentom: umanji", - "da": "Agentchat: Zoom ud", - "de": "Agent-Chat: Verkleinern", - "es": "Chat del agente: alejar", - "fr": "Chat de l’agent : zoom arrière", - "it": "Chat dell’agente: riduci", - "ja": "エージェントチャット: 縮小", - "km": "ការជជែកជាមួយភ្នាក់ងារ៖ បង្រួម", - "ko": "에이전트 채팅: 축소", - "no": "Agentchat: Zoom ut", - "pl": "Czat z agentem: Pomniejsz", - "pt-BR": "Chat do agente: Reduzir", - "ru": "Чат с агентом: уменьшить", - "th": "แชตเอเจนต์: ซูมออก", - "tr": "Ajan sohbeti: Uzaklaştır", - "uk": "Чат з агентом: зменшити", - "vi": "Trò chuyện với tác tử: Thu nhỏ", - "zh-CN": "智能体聊天:缩小", - "zh-TW": "代理聊天:縮小" - }, - "shortcut": { - "key": "-", - "modifiers": [ - "cmd" - ] - }, - "chord": null, - "aliases": [] - }, - { - "id": "agentPaneZoomReset", - "title": { - "en": "Agent Chat: Actual Size", - "ar": "دردشة الوكيل: الحجم الفعلي", - "bs": "Chat s agentom: stvarna veličina", - "da": "Agentchat: Faktisk størrelse", - "de": "Agent-Chat: Originalgröße", - "es": "Chat del agente: tamaño real", - "fr": "Chat de l’agent : taille réelle", - "it": "Chat dell’agente: dimensioni reali", - "ja": "エージェントチャット: 実寸表示", - "km": "ការជជែកជាមួយភ្នាក់ងារ៖ ទំហំពិត", - "ko": "에이전트 채팅: 실제 크기", - "no": "Agentchat: Faktisk størrelse", - "pl": "Czat z agentem: Rzeczywisty rozmiar", - "pt-BR": "Chat do agente: Tamanho Real", - "ru": "Чат с агентом: фактический размер", - "th": "แชตเอเจนต์: ขนาดจริง", - "tr": "Ajan sohbeti: Gerçek Boyut", - "uk": "Чат з агентом: реальний розмір", - "vi": "Trò chuyện với tác tử: Kích thước thực", - "zh-CN": "智能体聊天:实际大小", - "zh-TW": "代理聊天:實際大小" - }, - "shortcut": { - "key": "0", - "modifiers": [ - "cmd" - ] - }, - "chord": null, - "aliases": [] - }, { "id": "palette.newAgentChat", "title": { diff --git a/web/data/next-docs/palette-reference.generated.json b/web/data/next-docs/palette-reference.generated.json index 6f57c16be067..210995cf6c5a 100644 --- a/web/data/next-docs/palette-reference.generated.json +++ b/web/data/next-docs/palette-reference.generated.json @@ -2,7 +2,7 @@ "version": 1, "counts": { "entries": 1258, - "shortcuts": 189 + "shortcuts": 186 }, "sections": [ { @@ -5634,19 +5634,19 @@ { "id": "agentPaneZoomReset", "title": "Agent Chat: Actual Size", - "shortcut": "⌘0", + "shortcut": null, "command": "cmux agent actual-size" }, { "id": "agentPaneZoomIn", "title": "Agent Chat: Zoom In", - "shortcut": "⌘=", + "shortcut": null, "command": "cmux agent zoom-in" }, { "id": "agentPaneZoomOut", "title": "Agent Chat: Zoom Out", - "shortcut": "⌘-", + "shortcut": null, "command": "cmux agent zoom-out" }, {