cli-jaw 2.17.62 → 2.17.63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +17 -17
- package/README.ko.md +17 -17
- package/README.md +17 -17
- package/README.zh-CN.md +17 -17
- package/dist/bin/commands/tui/input-handler.js +19 -0
- package/dist/bin/commands/tui/input-handler.js.map +1 -1
- package/dist/bin/commands/tui/overlays.js +8 -4
- package/dist/bin/commands/tui/overlays.js.map +1 -1
- package/dist/bin/star-prompt.js +1 -1
- package/dist/bin/star-prompt.js.map +1 -1
- package/dist/server.js +14 -1
- package/dist/server.js.map +1 -1
- package/dist/src/agent/claude-runtime-pool.js +2 -1
- package/dist/src/agent/claude-runtime-pool.js.map +1 -1
- package/dist/src/agent/claude-runtime-run.js +28 -7
- package/dist/src/agent/claude-runtime-run.js.map +1 -1
- package/dist/src/agent/lifecycle-handler.js +34 -6
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/runtime/claude-sdk-events.js +136 -9
- package/dist/src/agent/runtime/claude-sdk-events.js.map +1 -1
- package/dist/src/agent/runtime/claude-sdk-history-loader.js +24 -0
- package/dist/src/agent/runtime/claude-sdk-history-loader.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-hooks.js +10 -4
- package/dist/src/agent/runtime/claude-sdk-hooks.js.map +1 -1
- package/dist/src/agent/runtime/claude-sdk-messages.js +25 -2
- package/dist/src/agent/runtime/claude-sdk-messages.js.map +1 -1
- package/dist/src/agent/runtime/claude-sdk-options.js +36 -3
- package/dist/src/agent/runtime/claude-sdk-options.js.map +1 -1
- package/dist/src/agent/runtime/claude-sdk-permissions.js +32 -9
- package/dist/src/agent/runtime/claude-sdk-permissions.js.map +1 -1
- package/dist/src/agent/runtime/claude-sdk-session.js +165 -17
- package/dist/src/agent/runtime/claude-sdk-session.js.map +1 -1
- package/dist/src/agent/runtime/claude-sdk-version.js +8 -0
- package/dist/src/agent/runtime/claude-sdk-version.js.map +1 -0
- package/dist/src/agent/spawn/backend-codex-app.js +619 -0
- package/dist/src/agent/spawn/backend-codex-app.js.map +1 -0
- package/dist/src/agent/spawn/backend-context.js +2 -0
- package/dist/src/agent/spawn/backend-context.js.map +1 -0
- package/dist/src/agent/spawn/backend-copilot.js +385 -0
- package/dist/src/agent/spawn/backend-copilot.js.map +1 -0
- package/dist/src/agent/spawn/backend-native-acp.js +379 -0
- package/dist/src/agent/spawn/backend-native-acp.js.map +1 -0
- package/dist/src/agent/spawn/backend-pi.js +565 -0
- package/dist/src/agent/spawn/backend-pi.js.map +1 -0
- package/dist/src/agent/spawn/types.js +2 -0
- package/dist/src/agent/spawn/types.js.map +1 -0
- package/dist/src/agent/spawn.js +44 -1858
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/cli/claude-default-model-boot.js +36 -0
- package/dist/src/cli/claude-default-model-boot.js.map +1 -0
- package/dist/src/cli/claude-model-discovery.js +13 -1
- package/dist/src/cli/claude-model-discovery.js.map +1 -1
- package/dist/src/cli/claude-models.js +7 -1
- package/dist/src/cli/claude-models.js.map +1 -1
- package/dist/src/cli/commands.js +5 -15
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/tui/composer.js +3 -3
- package/dist/src/cli/tui/composer.js.map +1 -1
- package/dist/src/cli/tui/skill-mention.js +15 -0
- package/dist/src/cli/tui/skill-mention.js.map +1 -0
- package/dist/src/code-mode/manager.js +174 -9
- package/dist/src/code-mode/manager.js.map +1 -1
- package/dist/src/code-mode/providers/catalog.js +5 -3
- package/dist/src/code-mode/providers/catalog.js.map +1 -1
- package/dist/src/code-mode/providers/claude-history.js +132 -0
- package/dist/src/code-mode/providers/claude-history.js.map +1 -0
- package/dist/src/code-mode/providers/claude.js +74 -7
- package/dist/src/code-mode/providers/claude.js.map +1 -1
- package/dist/src/code-mode/providers/codex-app.js +7 -1
- package/dist/src/code-mode/providers/codex-app.js.map +1 -1
- package/dist/src/code-mode/session.js +158 -11
- package/dist/src/code-mode/session.js.map +1 -1
- package/dist/src/code-mode/store.js +416 -28
- package/dist/src/code-mode/store.js.map +1 -1
- package/dist/src/command-contract/catalog.js +3 -22
- package/dist/src/command-contract/catalog.js.map +1 -1
- package/dist/src/core/codex-config.js +3 -62
- package/dist/src/core/codex-config.js.map +1 -1
- package/dist/src/core/config.js +116 -14
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/runtime-settings.js +20 -10
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/core/settings-watch.js +1 -0
- package/dist/src/core/settings-watch.js.map +1 -1
- package/dist/src/core/skill-mentions.js +83 -0
- package/dist/src/core/skill-mentions.js.map +1 -0
- package/dist/src/manager/registry.js +5 -1
- package/dist/src/manager/registry.js.map +1 -1
- package/dist/src/manager/routes/desktop-status.js +1 -1
- package/dist/src/manager/routes/desktop-status.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +11 -1
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/prompt/builder.js +10 -4
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/templates/a1-system.md +1 -1
- package/dist/src/routes/code-native.js +51 -3
- package/dist/src/routes/code-native.js.map +1 -1
- package/dist/src/routes/settings.js +1 -4
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/routes/skills.js +7 -0
- package/dist/src/routes/skills.js.map +1 -1
- package/dist/src/shared/skill-mention.js +61 -0
- package/dist/src/shared/skill-mention.js.map +1 -0
- package/dist/src/shared/tool-input.js +137 -0
- package/dist/src/shared/tool-input.js.map +1 -0
- package/package.json +7 -5
- package/public/css/activity.css +83 -20
- package/public/css/layout.css +2 -2
- package/public/css/sidebar.css +18 -0
- package/public/css/variables.css +23 -2
- package/public/dist/.vite/manifest.json +302 -334
- package/public/dist/assets/Activity-DPLlOJ46.js +1 -0
- package/public/dist/assets/AdvancedExport-BgOgGvc5.js +1 -0
- package/public/dist/assets/Agent-O_U8ny90.js +1 -0
- package/public/dist/assets/Browser-m6VynQXV.js +1 -0
- package/public/dist/assets/BrowserPanel-Bb-Bge6B.js +3 -0
- package/public/dist/assets/ChannelEnablementControl-BSuKQhTW.js +85 -0
- package/public/dist/assets/ChannelSetupEntry-DHLoZEzJ.js +1 -0
- package/public/dist/assets/ChannelsDiscord-B-G8vsYy.js +1 -0
- package/public/dist/assets/ChannelsSlack-oPuh922z.js +1 -0
- package/public/dist/assets/ChannelsTelegram-PmTv43KQ.js +1 -0
- package/public/dist/assets/CodeCanvas-CVbdp0S-.js +3 -0
- package/public/dist/assets/DashboardMeta-BqEiJrvr.js +1 -0
- package/public/dist/assets/DesignPanel-BOb-HMbl.js +2 -0
- package/public/dist/assets/{Developer-BdKPcw8Z.js → Developer-CbySB7_Z.js} +1 -1
- package/public/dist/assets/{DiffPanel-DtJuvU5y.js → DiffPanel-D9Cch5FG.js} +1 -1
- package/public/dist/assets/Display-C0Zdamcb.js +1 -0
- package/public/dist/assets/Display-DU4_76cS.js +1 -0
- package/public/dist/assets/DocPanel-DvtFw8AP.js +1 -0
- package/public/dist/assets/{Embedding-DvdTj1BF.js → Embedding-CCFMOB_2.js} +1 -1
- package/public/dist/assets/Employees-BanvF58d.js +1 -0
- package/public/dist/assets/FolderPanel-CJvwRwIV.js +3 -0
- package/public/dist/assets/Heartbeat-uyi_MpUd.js +1 -0
- package/public/dist/assets/InlineWarn-Cq4z28F3.js +1 -0
- package/public/dist/assets/MarkdownRenderer-Cc3DeHvm.js +1 -0
- package/public/dist/assets/{MarkdownRenderer-DhonsAPC.js → MarkdownRenderer-DzN66XVb.js} +1 -1
- package/public/dist/assets/Mcp-rjPoL_Zo.js +4 -0
- package/public/dist/assets/Memory-C9I33pIi.js +1 -0
- package/public/dist/assets/{MilkdownWysiwygEditor-D6JaLDE4.js → MilkdownWysiwygEditor-xObhviw7.js} +1 -1
- package/public/dist/assets/ModelProvider-fiUktMaO.js +1 -0
- package/public/dist/assets/Network-CuqFrOvR.js +1 -0
- package/public/dist/assets/NotesGraphWorkspace-DO9LtVGF.js +1 -0
- package/public/dist/assets/PanelLayoutProvider-DRZ4QkBC.js +1 -0
- package/public/dist/assets/Permissions-BltXiZnz.js +1 -0
- package/public/dist/assets/{Permissions-BwiMEoTV.js → Permissions-DcCbFMIq.js} +1 -1
- package/public/dist/assets/Profile-DUL7-RE_.js +1 -0
- package/public/dist/assets/Prompts-C9vY8ivQ.js +1 -0
- package/public/dist/assets/SpeechKeys-BJ8V7U5E.js +1 -0
- package/public/dist/assets/TelegramHub-DtyjLGFR.js +1 -0
- package/public/dist/assets/{TerminalPanel-Bu9i-P2f.js → TerminalPanel-c1xhiy53.js} +1 -1
- package/public/dist/assets/app-BjKzqXCv.css +1 -0
- package/public/dist/assets/app-CZwx0V6K.js +59 -0
- package/public/dist/assets/bgtask-badge-CnVkcp3c.js +1 -0
- package/public/dist/assets/{bgtask-badge-DfiHuzxT.js → bgtask-badge-Cp26S8Uq.js} +1 -1
- package/public/dist/assets/client-platform-WO8m6kPQ.js +1 -0
- package/public/dist/assets/{employees-BQaJNp-u.js → employees-CsvI0_5V.js} +1 -1
- package/public/dist/assets/error-normalize-clOi-AAA.js +1 -0
- package/public/dist/assets/fields-CicOWY-X.js +1 -0
- package/public/dist/assets/iframe-renderer-DWx9v2Iz.js +1 -0
- package/public/dist/assets/iframe-renderer-DmHYOI1A.js +142 -0
- package/public/dist/assets/{react-C_pPTFsM.js → jsx-runtime-CkEUZM6i.js} +1 -1
- package/public/dist/assets/manager-CCXm5Yfe.js +5 -0
- package/public/dist/assets/manager-D9rhKFKc.css +1 -0
- package/public/dist/assets/manager-shortcuts-Cqmr0mEq.js +1 -0
- package/public/dist/assets/{memory-EG1B51up.js → memory-C6qtAMdJ.js} +1 -1
- package/public/dist/assets/memory-PPofQPeB.js +1 -0
- package/public/dist/assets/message-history-DcjBuubA.js +4 -0
- package/public/dist/assets/message-history-bw4qF01Z.js +1 -0
- package/public/dist/assets/page-shell-DfinU3mb.js +1 -0
- package/public/dist/assets/react-dom-URBLzV3w.js +1 -0
- package/public/dist/assets/{render-Dp07lZAJ.js → render-DfYro-fG.js} +1 -1
- package/public/dist/assets/{settings-jlI4X-zt.js → settings-CvsLWlJn.js} +38 -30
- package/public/dist/assets/settings-DMiQe469.js +1 -0
- package/public/dist/assets/settings-DgAlohx9.js +1 -0
- package/public/dist/assets/settings-core-BH7J_Rbm.js +1 -0
- package/public/dist/assets/{settings-core-B5Uf_lWY.js → settings-core-pnpw-eZv.js} +1 -1
- package/public/dist/assets/{settings-embedding-BfWzWKMM.js → settings-embedding-BRW0WZvh.js} +3 -3
- package/public/dist/assets/{settings-embedding-DhEdT86W.css → settings-embedding-CUQ8Is3y.css} +1 -1
- package/public/dist/assets/settings-types-CYKy0xz4.js +1 -0
- package/public/dist/assets/shared-D1begqvi.js +1 -0
- package/public/dist/assets/{sidebar-BUemG2ZN.js → sidebar-C_80w4iY.js} +3 -3
- package/public/dist/assets/{skills-CKUcEN9m.js → skills-D_2adqge.js} +1 -1
- package/public/dist/assets/skills-DeNVAVgt.js +1 -0
- package/public/dist/assets/{slash-commands-D34GgHFX.js → slash-commands-B_Hq5RkC.js} +2 -2
- package/public/dist/assets/slash-commands-Cj5qoRWc.js +1 -0
- package/public/dist/assets/tool-input-DI7uu8Ah.js +2 -0
- package/public/dist/assets/{trace-drawer-DBmK-5F_.js → trace-drawer-B6XuPodh.js} +1 -1
- package/public/dist/assets/ui-BbR_fFiK.js +1 -0
- package/public/dist/assets/{ui-vm2iuLcS.js → ui-D8xzm7DN.js} +1 -1
- package/public/dist/index.html +11 -3
- package/public/dist/manager/index.html +3 -3
- package/public/dist/settings/index.html +2 -2
- package/public/index.html +9 -1
- package/public/js/features/activity-history.ts +50 -21
- package/public/js/features/activity-rows.ts +158 -10
- package/public/js/features/activity-view.ts +5 -5
- package/public/js/features/chat.ts +2 -0
- package/public/js/features/employees.ts +1 -0
- package/public/js/features/resize-guard.ts +39 -0
- package/public/js/features/settings-cli-status.ts +49 -17
- package/public/js/features/settings-types.ts +39 -1
- package/public/js/features/skill-mentions.ts +143 -0
- package/public/js/main.ts +15 -0
- package/public/js/virtual-scroll.ts +67 -1
- package/public/locales/en.json +2 -0
- package/public/locales/ja.json +2 -0
- package/public/locales/ko.json +2 -0
- package/public/locales/zh.json +2 -0
- package/public/manager/src/AppChrome.tsx +2 -0
- package/public/manager/src/InstancePreview.tsx +1 -1
- package/public/manager/src/SidebarRailRouter.tsx +3 -1
- package/public/manager/src/browser-panel/BrowserPanel.tsx +47 -12
- package/public/manager/src/browser-panel/browser-address-state.ts +11 -0
- package/public/manager/src/client-platform.ts +18 -0
- package/public/manager/src/code/CodeCanvas.tsx +4 -2
- package/public/manager/src/code/CodeComposer.tsx +22 -10
- package/public/manager/src/code/CodeDraftEmptyState.tsx +64 -0
- package/public/manager/src/code/CodeSessionList.tsx +154 -40
- package/public/manager/src/code/CodeTranscript.tsx +104 -16
- package/public/manager/src/code/CodeWorkbench.tsx +21 -11
- package/public/manager/src/code/CodeWorkspaceHeader.tsx +5 -10
- package/public/manager/src/code/ComposerFooter.tsx +9 -1
- package/public/manager/src/code/code-composer.css +1 -1
- package/public/manager/src/code/code-controller-draft-storage.ts +16 -8
- package/public/manager/src/code/code-controller-drafts.ts +33 -6
- package/public/manager/src/code/code-controller-runtime.ts +189 -17
- package/public/manager/src/code/code-controller-types.ts +19 -1
- package/public/manager/src/code/code-recent-workspaces.ts +25 -0
- package/public/manager/src/code/code-session-client.ts +19 -1
- package/public/manager/src/code/code-session-sidebar.css +38 -0
- package/public/manager/src/code/code-session-state.ts +2 -0
- package/public/manager/src/code/code-types.ts +47 -0
- package/public/manager/src/code/code-workbench.css +36 -1
- package/public/manager/src/code/code.css +171 -7
- package/public/manager/src/code/session-order.ts +80 -0
- package/public/manager/src/code/tool-summary.ts +45 -11
- package/public/manager/src/folder-panel/folder-shortcuts.ts +5 -9
- package/public/manager/src/hooks/useCommandPalette.ts +3 -7
- package/public/manager/src/main.tsx +1 -0
- package/public/manager/src/manager-components.css +25 -23
- package/public/manager/src/manager-dashboard-reminders.css +2 -2
- package/public/manager/src/manager-layout.css +1 -1
- package/public/manager/src/manager-shortcut-runner.ts +9 -2
- package/public/manager/src/manager-shortcuts.ts +83 -21
- package/public/manager/src/panels/desktop-bridge.ts +4 -1
- package/public/manager/src/panels/panels.css +9 -0
- package/public/manager/src/preview.ts +19 -4
- package/public/manager/src/settings/pages/AdvancedExport.tsx +28 -30
- package/public/manager/src/settings/pages/Browser.tsx +45 -47
- package/public/manager/src/settings/pages/ChannelsDiscord.tsx +51 -26
- package/public/manager/src/settings/pages/ChannelsSlack.tsx +59 -17
- package/public/manager/src/settings/pages/ChannelsTelegram.tsx +51 -26
- package/public/manager/src/settings/pages/Display.tsx +2 -1
- package/public/manager/src/settings/pages/Employees.tsx +3 -3
- package/public/manager/src/settings/pages/Mcp.tsx +220 -200
- package/public/manager/src/settings/pages/Memory.tsx +35 -41
- package/public/manager/src/settings/pages/ModelProvider.tsx +23 -98
- package/public/manager/src/settings/pages/Network.tsx +5 -4
- package/public/manager/src/settings/pages/Permissions.tsx +38 -16
- package/public/manager/src/settings/pages/Prompts.tsx +12 -9
- package/public/manager/src/settings/pages/SpeechKeys.tsx +132 -139
- package/public/manager/src/settings/pages/TelegramHub.tsx +67 -20
- package/public/manager/src/settings/pages/components/AvatarCard.tsx +9 -8
- package/public/manager/src/settings/pages/components/ChannelSetupEntry.tsx +2 -2
- package/public/manager/src/settings/pages/components/EmployeeRow.tsx +6 -12
- package/public/manager/src/settings/pages/components/HealthBadge.tsx +11 -6
- package/public/manager/src/settings/pages/components/HeartbeatJobRow.tsx +35 -16
- package/public/manager/src/settings/pages/components/HeartbeatJobsSection.tsx +11 -11
- package/public/manager/src/settings/pages/components/HeartbeatMarkdownSection.tsx +7 -7
- package/public/manager/src/settings/pages/components/InlineWarn.tsx +4 -9
- package/public/manager/src/settings/pages/components/McpServerCard.tsx +39 -27
- package/public/manager/src/settings/pages/components/MemoryRow.tsx +21 -16
- package/public/manager/src/settings/pages/components/PerCliRow.tsx +122 -121
- package/public/manager/src/settings/pages/components/PiProfileDialog.tsx +9 -6
- package/public/manager/src/settings/pages/components/SlackSetup.tsx +8 -8
- package/public/manager/src/settings/pages/components/TransportStatusChips.tsx +14 -10
- package/public/manager/src/settings/pages/components/agent/AgentEmployeesSection.tsx +26 -26
- package/public/manager/src/settings/pages/components/agent/PermissionQuickSection.tsx +5 -5
- package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +14 -11
- package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +1 -3
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +0 -2
- package/public/manager/src/settings/pages/components/runtime-transport-field.tsx +2 -2
- package/public/manager/src/settings/pages/manager/Activity.tsx +6 -2
- package/public/manager/src/settings/pages/manager/Display.tsx +3 -8
- package/public/manager/src/settings/pages/manager/shared.tsx +44 -33
- package/public/manager/src/settings/pages/page-shell.tsx +66 -0
- package/public/manager/src/settings-agent.css +185 -36
- package/public/manager/src/settings-standalone.tsx +1 -0
- package/public/manager/src/settings-surface.css +96 -0
- package/public/manager/src/types.ts +1 -0
- package/scripts/ci/install-ripgrep.sh +35 -0
- package/scripts/collect-fresh-install-evidence.sh +2 -2
- package/scripts/install-risk-gate.mjs +2 -3
- package/scripts/install-wsl.sh +1 -1
- package/scripts/install.ps1 +1 -1
- package/scripts/install.sh +1 -1
- package/scripts/release-1.6.0.sh +1 -1
- package/scripts/release-gates.mjs +48 -13
- package/scripts/release-preview.sh +2 -2
- package/scripts/restack-pr.sh +88 -0
- package/scripts/verify-electron-update-metadata.mjs +1 -1
- package/scripts/windows-support-contract.json +1 -1
- package/public/dist/assets/Activity-BUrp73Re.js +0 -1
- package/public/dist/assets/AdvancedExport-B7h_ZvBu.js +0 -1
- package/public/dist/assets/Agent-DnbZJP7b.js +0 -1
- package/public/dist/assets/Browser-CiBoK5Qx.js +0 -1
- package/public/dist/assets/BrowserPanel-SZAUc9T2.js +0 -3
- package/public/dist/assets/ChannelEnablementControl-Dl0uYx38.js +0 -85
- package/public/dist/assets/ChannelSetupEntry-DxtOrN01.js +0 -1
- package/public/dist/assets/ChannelsDiscord-BEGGwd_3.js +0 -1
- package/public/dist/assets/ChannelsSlack-BryC2Ahr.js +0 -1
- package/public/dist/assets/ChannelsTelegram-CGSpaImJ.js +0 -1
- package/public/dist/assets/CodeCanvas-DpkFi5Au.js +0 -2
- package/public/dist/assets/DashboardMeta-Dh-tasbY.js +0 -1
- package/public/dist/assets/DesignPanel-NLNK9wCo.js +0 -2
- package/public/dist/assets/Display-BHGFX3O0.js +0 -1
- package/public/dist/assets/Display-BW-_pKRf.js +0 -1
- package/public/dist/assets/DocPanel-BM41cYpS.js +0 -1
- package/public/dist/assets/Employees-BuFw6-fT.js +0 -1
- package/public/dist/assets/FolderPanel-C-eQT3Yq.js +0 -3
- package/public/dist/assets/Heartbeat-CIVtKWNc.js +0 -1
- package/public/dist/assets/InlineWarn-DIMbcbzk.js +0 -1
- package/public/dist/assets/MarkdownRenderer-DyVx6DxM.js +0 -1
- package/public/dist/assets/Mcp-uKjor7vh.js +0 -4
- package/public/dist/assets/Memory-BSDIXT0B.js +0 -1
- package/public/dist/assets/ModelProvider-DMh2tXUx.js +0 -1
- package/public/dist/assets/Network-4Pa6JkhK.js +0 -1
- package/public/dist/assets/NotesGraphWorkspace-CgdC-fM6.js +0 -1
- package/public/dist/assets/PanelLayoutProvider-mn8sI0h-.js +0 -1
- package/public/dist/assets/Permissions-CodIW-Yd.js +0 -1
- package/public/dist/assets/Profile-DPqrYA44.js +0 -1
- package/public/dist/assets/Prompts-CvAx7QqR.js +0 -1
- package/public/dist/assets/SpeechKeys-CVBCqoBn.js +0 -1
- package/public/dist/assets/TelegramHub-4zKwpk0P.js +0 -1
- package/public/dist/assets/app-ByMfeXp-.js +0 -55
- package/public/dist/assets/app-DAJWqs33.css +0 -1
- package/public/dist/assets/bgtask-badge-Ch88fnhf.js +0 -1
- package/public/dist/assets/error-normalize-CL69Bl7z.js +0 -1
- package/public/dist/assets/fields-mlGpofqQ.js +0 -1
- package/public/dist/assets/iframe-renderer-Bj1JolO8.js +0 -142
- package/public/dist/assets/iframe-renderer-DWnvUSrx.js +0 -1
- package/public/dist/assets/jsx-runtime-NZYk81nU.js +0 -1
- package/public/dist/assets/manager-Bi_xw7TW.js +0 -5
- package/public/dist/assets/manager-BnQHAKk6.css +0 -1
- package/public/dist/assets/manager-shortcuts-BDOzd8zm.js +0 -1
- package/public/dist/assets/memory-Bk_cb3sw.js +0 -1
- package/public/dist/assets/message-history-D2vniu04.js +0 -4
- package/public/dist/assets/message-history-GAtF_wbZ.js +0 -1
- package/public/dist/assets/page-shell-BeGD0rRQ.js +0 -1
- package/public/dist/assets/react-dom-DyUOYpVL.js +0 -1
- package/public/dist/assets/settings-W4KG9ivu.js +0 -1
- package/public/dist/assets/settings-WVGhtneN.js +0 -1
- package/public/dist/assets/settings-client-CmwRsVd1.js +0 -1
- package/public/dist/assets/settings-core-CgKGnMA5.js +0 -1
- package/public/dist/assets/settings-types-D3cd6SWy.js +0 -1
- package/public/dist/assets/shared-CiNP20HB.js +0 -1
- package/public/dist/assets/skills-Co7Mr-qP.js +0 -1
- package/public/dist/assets/slash-commands-BEr-vmIr.js +0 -1
- package/public/dist/assets/ui-TUyJsMUf.js +0 -1
- package/public/manager/src/settings/pages/components/EngineSubsection.tsx +0 -25
|
@@ -145,7 +145,12 @@
|
|
|
145
145
|
.code-tool-summary:hover .code-tool-chevron,
|
|
146
146
|
.code-tool-summary:focus-visible .code-tool-chevron { opacity: 1; }
|
|
147
147
|
.code-tool-card[open] > .code-tool-summary .code-tool-chevron { transform: rotate(90deg); opacity: 1; }
|
|
148
|
+
.code-tool-summary-text { flex: 1; min-width: 0; display: flex; flex-direction: column; }
|
|
148
149
|
.code-tool-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 650; line-height: 1.15; }
|
|
150
|
+
.code-tool-desc {
|
|
151
|
+
min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
|
152
|
+
color: var(--text-dim); font-weight: 400; font-size: 11px;
|
|
153
|
+
}
|
|
149
154
|
/* A call in flight reads as in-flight. The verb already says so; this keeps the
|
|
150
155
|
row alive while it streams, and stopping is what marks completion -- no chip
|
|
151
156
|
that says "Done" on every successful row. */
|
|
@@ -200,11 +205,41 @@
|
|
|
200
205
|
border-radius: 4px;
|
|
201
206
|
padding: 6px 8px;
|
|
202
207
|
overflow-x: auto;
|
|
203
|
-
max-height:
|
|
208
|
+
max-height: min(18rem, 50dvh);
|
|
204
209
|
overflow-y: auto;
|
|
205
210
|
white-space: pre-wrap;
|
|
206
211
|
margin: 4px 0;
|
|
212
|
+
user-select: text;
|
|
213
|
+
}
|
|
214
|
+
.code-tool-body > .code-tool-text { margin: 4px 10px 0; }
|
|
215
|
+
.code-tool-body[data-expanded="true"] .code-tool-text,
|
|
216
|
+
.code-tool-body[data-expanded="true"] .code-tool-output,
|
|
217
|
+
.code-tool-body[data-expanded="true"] .code-tool-json,
|
|
218
|
+
.code-tool-body[data-expanded="true"] .code-tool-args,
|
|
219
|
+
.code-tool-body[data-expanded="true"] .code-tool-error { max-height: none; }
|
|
220
|
+
.code-tool-section-head { display: flex; align-items: center; gap: 6px; }
|
|
221
|
+
.code-tool-section-head .code-tool-section-label { flex: 1; min-width: 0; }
|
|
222
|
+
.code-tool-copy {
|
|
223
|
+
flex-shrink: 0; padding: 0 6px; border: 1px solid var(--border-subtle);
|
|
224
|
+
border-radius: var(--radius-sm); background: var(--bg-panel);
|
|
225
|
+
color: var(--text-secondary); font: inherit; font-size: 10px; line-height: 16px;
|
|
226
|
+
cursor: pointer;
|
|
227
|
+
}
|
|
228
|
+
.code-tool-copy:hover { background: var(--bg-raised); color: var(--text-primary); }
|
|
229
|
+
.code-tool-copy.copied {
|
|
230
|
+
color: var(--status-success);
|
|
231
|
+
border-color: color-mix(in srgb, var(--status-success) 40%, var(--border-subtle));
|
|
232
|
+
}
|
|
233
|
+
.code-tool-copy:focus-visible, .code-tool-toggle:focus-visible {
|
|
234
|
+
outline: 2px solid var(--ring); outline-offset: 2px;
|
|
235
|
+
}
|
|
236
|
+
.code-tool-waiting { margin: 4px 10px 0; color: var(--text-dim); font-size: 11px; }
|
|
237
|
+
.code-tool-toggle {
|
|
238
|
+
align-self: flex-start; margin: 2px 10px 0; padding: 0; border: 0;
|
|
239
|
+
background: none; color: var(--accent); font: inherit; font-size: 11px;
|
|
240
|
+
text-decoration: underline; text-underline-offset: 2px; cursor: pointer;
|
|
207
241
|
}
|
|
242
|
+
.code-tool-toggle:hover { background: none; }
|
|
208
243
|
.code-tool-section {
|
|
209
244
|
margin: 8px 10px 0;
|
|
210
245
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
@import './code-workbench.css';
|
|
2
2
|
@import './code-composer.css';
|
|
3
|
+
@import './code-session-sidebar.css';
|
|
3
4
|
|
|
4
5
|
/* Code mode — uses Manager token system (manager-tokens.css) for dark/light parity */
|
|
5
6
|
/* Boundary (slice 211): monitor panel CSS (goal-status/background-tasks/workers) is
|
|
@@ -66,15 +67,54 @@
|
|
|
66
67
|
text-transform: uppercase;
|
|
67
68
|
letter-spacing: 0.5px;
|
|
68
69
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
/* The new-session entry point is the one control every visit to this list
|
|
71
|
+
starts from, so it gets a full-width primary button rather than a row in
|
|
72
|
+
the list it creates. */
|
|
73
|
+
.code-session-new-primary {
|
|
74
|
+
display: flex;
|
|
75
|
+
align-items: center;
|
|
76
|
+
gap: 7px;
|
|
77
|
+
width: 100%;
|
|
78
|
+
margin: 0 0 8px;
|
|
79
|
+
padding: 7px 10px;
|
|
80
|
+
border: 1px solid var(--border-subtle);
|
|
81
|
+
border-radius: 6px;
|
|
72
82
|
background: var(--accent-soft);
|
|
73
83
|
color: var(--accent);
|
|
74
|
-
font
|
|
75
|
-
|
|
84
|
+
font: inherit;
|
|
85
|
+
font-size: 12px;
|
|
86
|
+
font-weight: 600;
|
|
87
|
+
cursor: pointer;
|
|
88
|
+
text-align: left;
|
|
76
89
|
min-height: auto;
|
|
77
90
|
}
|
|
91
|
+
.code-session-new-primary:hover { border-color: var(--accent); }
|
|
92
|
+
.code-session-new-primary.active { border-color: var(--accent); }
|
|
93
|
+
.code-session-new-label { flex: 0 0 auto; }
|
|
94
|
+
.code-session-new-hint {
|
|
95
|
+
margin-left: auto;
|
|
96
|
+
padding: 1px 5px;
|
|
97
|
+
border: 1px solid var(--border-subtle);
|
|
98
|
+
border-radius: 4px;
|
|
99
|
+
background: var(--bg-base);
|
|
100
|
+
color: var(--text-dim);
|
|
101
|
+
font-family: inherit;
|
|
102
|
+
font-size: 9px;
|
|
103
|
+
font-weight: 600;
|
|
104
|
+
line-height: 1.4;
|
|
105
|
+
white-space: nowrap;
|
|
106
|
+
}
|
|
107
|
+
.code-session-draft-badge {
|
|
108
|
+
flex: 0 0 auto;
|
|
109
|
+
padding: 1px 6px;
|
|
110
|
+
border-radius: 999px;
|
|
111
|
+
background: color-mix(in srgb, var(--status-warn) 16%, var(--bg-base));
|
|
112
|
+
color: var(--status-warn);
|
|
113
|
+
font-size: 9px;
|
|
114
|
+
font-weight: 700;
|
|
115
|
+
text-transform: uppercase;
|
|
116
|
+
letter-spacing: 0.4px;
|
|
117
|
+
}
|
|
78
118
|
.code-session-view-toggle {
|
|
79
119
|
display: grid;
|
|
80
120
|
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
@@ -171,9 +211,30 @@
|
|
|
171
211
|
white-space: nowrap;
|
|
172
212
|
}
|
|
173
213
|
.code-session-group-title span {
|
|
174
|
-
flex: 0
|
|
214
|
+
flex: 0 1 auto;
|
|
215
|
+
min-width: 0;
|
|
216
|
+
overflow: hidden;
|
|
217
|
+
text-overflow: ellipsis;
|
|
175
218
|
color: var(--text-secondary);
|
|
176
219
|
}
|
|
220
|
+
.code-session-group-new {
|
|
221
|
+
flex: 0 0 auto;
|
|
222
|
+
width: 24px;
|
|
223
|
+
height: 24px;
|
|
224
|
+
padding: 0;
|
|
225
|
+
border: none;
|
|
226
|
+
border-radius: 4px;
|
|
227
|
+
background: transparent;
|
|
228
|
+
color: var(--text-dim);
|
|
229
|
+
font-size: 13px;
|
|
230
|
+
line-height: 1;
|
|
231
|
+
cursor: pointer;
|
|
232
|
+
min-height: auto;
|
|
233
|
+
}
|
|
234
|
+
.code-session-group-new:hover {
|
|
235
|
+
background: var(--accent-soft);
|
|
236
|
+
color: var(--accent);
|
|
237
|
+
}
|
|
177
238
|
.code-session-list-empty, .code-session-list-loading {
|
|
178
239
|
font-size: 11px; color: var(--text-dim); padding: 12px 4px;
|
|
179
240
|
}
|
|
@@ -447,6 +508,102 @@
|
|
|
447
508
|
font-size: 13px; text-align: center;
|
|
448
509
|
}
|
|
449
510
|
.code-transcript-cwd { font-size: 11px; margin-top: 8px; font-family: monospace; color: var(--text-secondary); }
|
|
511
|
+
|
|
512
|
+
/* Draft empty state: the workspace is the one decision that gates a new
|
|
513
|
+
session, so it owns the prominent control; everything else is secondary. */
|
|
514
|
+
.code-draft-empty {
|
|
515
|
+
flex: 1 1 0;
|
|
516
|
+
min-height: 0;
|
|
517
|
+
overflow-y: auto;
|
|
518
|
+
display: flex;
|
|
519
|
+
flex-direction: column;
|
|
520
|
+
align-items: center;
|
|
521
|
+
/* `safe` keeps the first line reachable when the draft content is taller
|
|
522
|
+
than the pane; plain `center` clips it out of scroll range. */
|
|
523
|
+
justify-content: safe center;
|
|
524
|
+
gap: 14px;
|
|
525
|
+
padding: 32px 24px;
|
|
526
|
+
text-align: center;
|
|
527
|
+
}
|
|
528
|
+
.code-draft-empty-title {
|
|
529
|
+
margin: 0;
|
|
530
|
+
font-size: 22px;
|
|
531
|
+
font-weight: 650;
|
|
532
|
+
color: var(--text-primary);
|
|
533
|
+
}
|
|
534
|
+
.code-draft-empty-picker {
|
|
535
|
+
max-width: min(72vw, 520px);
|
|
536
|
+
height: 34px;
|
|
537
|
+
padding: 0 14px;
|
|
538
|
+
font-size: 14px;
|
|
539
|
+
}
|
|
540
|
+
.code-draft-empty-selection {
|
|
541
|
+
margin: 0;
|
|
542
|
+
font-size: 12px;
|
|
543
|
+
color: var(--text-secondary);
|
|
544
|
+
}
|
|
545
|
+
.code-draft-recents {
|
|
546
|
+
display: flex;
|
|
547
|
+
flex-direction: column;
|
|
548
|
+
align-items: center;
|
|
549
|
+
gap: 6px;
|
|
550
|
+
max-width: min(72vw, 520px);
|
|
551
|
+
}
|
|
552
|
+
.code-draft-recents-label {
|
|
553
|
+
font-size: 11px;
|
|
554
|
+
font-weight: 600;
|
|
555
|
+
color: var(--text-dim);
|
|
556
|
+
}
|
|
557
|
+
.code-draft-recent {
|
|
558
|
+
max-width: 100%;
|
|
559
|
+
overflow: hidden;
|
|
560
|
+
text-overflow: ellipsis;
|
|
561
|
+
white-space: nowrap;
|
|
562
|
+
padding: 5px 12px;
|
|
563
|
+
border: 1px solid var(--border-subtle);
|
|
564
|
+
border-radius: 6px;
|
|
565
|
+
background: var(--bg-panel);
|
|
566
|
+
color: var(--text-secondary);
|
|
567
|
+
font: inherit;
|
|
568
|
+
font-size: 12px;
|
|
569
|
+
font-family: monospace;
|
|
570
|
+
cursor: pointer;
|
|
571
|
+
}
|
|
572
|
+
.code-draft-recent:hover {
|
|
573
|
+
border-color: var(--accent);
|
|
574
|
+
color: var(--text-primary);
|
|
575
|
+
}
|
|
576
|
+
.code-draft-recent:focus-visible,
|
|
577
|
+
.code-draft-prompt:focus-visible {
|
|
578
|
+
outline: 2px solid var(--ring);
|
|
579
|
+
outline-offset: 1px;
|
|
580
|
+
}
|
|
581
|
+
.code-draft-recent:disabled,
|
|
582
|
+
.code-draft-prompt:disabled {
|
|
583
|
+
opacity: 0.6;
|
|
584
|
+
cursor: not-allowed;
|
|
585
|
+
}
|
|
586
|
+
.code-draft-prompts {
|
|
587
|
+
display: flex;
|
|
588
|
+
flex-wrap: wrap;
|
|
589
|
+
justify-content: center;
|
|
590
|
+
gap: 8px;
|
|
591
|
+
max-width: min(78vw, 560px);
|
|
592
|
+
}
|
|
593
|
+
.code-draft-prompt {
|
|
594
|
+
padding: 6px 12px;
|
|
595
|
+
border: 1px solid var(--border-subtle);
|
|
596
|
+
border-radius: 999px;
|
|
597
|
+
background: var(--bg-base);
|
|
598
|
+
color: var(--text-secondary);
|
|
599
|
+
font: inherit;
|
|
600
|
+
font-size: 12px;
|
|
601
|
+
cursor: pointer;
|
|
602
|
+
}
|
|
603
|
+
.code-draft-prompt:hover {
|
|
604
|
+
border-color: var(--accent);
|
|
605
|
+
color: var(--text-primary);
|
|
606
|
+
}
|
|
450
607
|
.code-message { margin-bottom: 16px; }
|
|
451
608
|
.code-message-tool { margin-bottom: 1px; }
|
|
452
609
|
.code-transcript-virtual-spacer {
|
|
@@ -485,6 +642,14 @@
|
|
|
485
642
|
border-radius: 12px 12px 4px 12px;
|
|
486
643
|
background: var(--bg-raised);
|
|
487
644
|
}
|
|
645
|
+
/* A quiet text action under the prompt it rolls back to; the confirm carries the weight. */
|
|
646
|
+
.code-message-rollback {
|
|
647
|
+
margin-top: 4px; padding: 0; border: 0; background: none;
|
|
648
|
+
color: var(--text-dim); font: inherit; font-size: 11px; cursor: pointer;
|
|
649
|
+
text-decoration: underline; text-underline-offset: 2px;
|
|
650
|
+
}
|
|
651
|
+
.code-message-rollback:hover { color: var(--text-primary); }
|
|
652
|
+
.code-message-rollback:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }
|
|
488
653
|
/* A prompt the server has not echoed yet is dimmed, never hidden. */
|
|
489
654
|
.code-message-user.is-unsent .code-message-text { opacity: 0.72; border-style: dashed; }
|
|
490
655
|
.code-message-text {
|
|
@@ -615,7 +780,6 @@
|
|
|
615
780
|
.code-session-actions > div, .code-session-rename { display: flex; flex-wrap: wrap; gap: 6px; padding: 4px 0; }
|
|
616
781
|
.code-session-rename input { min-width: 0; width: 100%; padding: 5px; border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); background: var(--bg-base); color: var(--text-primary); font: inherit; }
|
|
617
782
|
.code-session-archive-filter { display: flex; align-items: center; gap: 5px; margin: 4px 8px 8px; color: var(--text-secondary); font-size: 11px; }
|
|
618
|
-
.code-session-new-btn { min-width: 24px; min-height: 24px; }
|
|
619
783
|
.code-session-search { box-sizing: border-box; }
|
|
620
784
|
.code-session-status-failed { color: var(--status-error); }
|
|
621
785
|
.code-session-status-stopping { color: var(--status-warn); }
|
|
@@ -10,6 +10,8 @@ import type { CodeSessionInfo } from '../../../../src/code-mode/wire';
|
|
|
10
10
|
* actually changes about it, so the list moves when a session is created or
|
|
11
11
|
* archived and not merely because it is busy. Which session is running is
|
|
12
12
|
* carried by the row's own status, which is where a changing fact belongs.
|
|
13
|
+
* The one exception is the Activity view the reader switches to on purpose,
|
|
14
|
+
* which is ordered by last activity with unread sessions on top.
|
|
13
15
|
*/
|
|
14
16
|
export type CodeSessionSection = 'active' | 'archived';
|
|
15
17
|
|
|
@@ -67,3 +69,81 @@ export function codeSessionAttentionLabel(attention: CodeSessionAttention): stri
|
|
|
67
69
|
return `${attention.count} pending approval${attention.count === 1 ? '' : 's'}`;
|
|
68
70
|
}
|
|
69
71
|
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* t3code's hasUnseenCompletion: a finished turn the reader has not opened since.
|
|
75
|
+
* A session never opened, or one archived, is never unread — an update must not
|
|
76
|
+
* light up every historical row.
|
|
77
|
+
*/
|
|
78
|
+
export function codeSessionUnread(session: CodeSessionInfo): boolean {
|
|
79
|
+
if (session.archivedAt !== null) return false;
|
|
80
|
+
const completed = session.lastTurnCompletedAt;
|
|
81
|
+
const visited = session.lastVisitedAt;
|
|
82
|
+
if (completed === null || visited === null) return false;
|
|
83
|
+
return completed > visited;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export type CodeWorkspaceGroup = { cwd: string; sessions: CodeSessionInfo[] };
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Projects view. Rows keep creation order inside their workspace, and a workspace
|
|
90
|
+
* is placed by its newest session: creating a session brings its workspace up,
|
|
91
|
+
* a busy session moves nothing.
|
|
92
|
+
*/
|
|
93
|
+
export function groupCodeSessionsByWorkspace(sessions: readonly CodeSessionInfo[]): CodeWorkspaceGroup[] {
|
|
94
|
+
const map = new Map<string, CodeSessionInfo[]>();
|
|
95
|
+
for (const session of [...sessions].sort(compareCodeSessions)) {
|
|
96
|
+
const rows = map.get(session.cwd) ?? [];
|
|
97
|
+
rows.push(session);
|
|
98
|
+
map.set(session.cwd, rows);
|
|
99
|
+
}
|
|
100
|
+
return [...map].map(([cwd, rows]) => ({ cwd, sessions: rows }));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export type CodeActivityBucket = 'priority' | 'today' | 'yesterday' | 'earlier';
|
|
104
|
+
export type CodeActivityGroup = { bucket: CodeActivityBucket; sessions: CodeSessionInfo[] };
|
|
105
|
+
|
|
106
|
+
const ACTIVITY_BUCKET_ORDER: CodeActivityBucket[] = ['priority', 'today', 'yesterday', 'earlier'];
|
|
107
|
+
|
|
108
|
+
export const CODE_ACTIVITY_BUCKET_LABELS: Record<CodeActivityBucket, string> = {
|
|
109
|
+
priority: 'Priority', today: 'Today', yesterday: 'Yesterday', earlier: 'Earlier',
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
function startOfLocalDay(ms: number): number {
|
|
113
|
+
const day = new Date(ms);
|
|
114
|
+
day.setHours(0, 0, 0, 0);
|
|
115
|
+
return day.getTime();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Activity view, which the reader opts into: unread sessions first (newest
|
|
120
|
+
* completion first), then the rest by last activity in local-day buckets. The
|
|
121
|
+
* open session is never in Priority, even before its read receipt lands.
|
|
122
|
+
*/
|
|
123
|
+
export function groupCodeSessionsByActivity(sessions: readonly CodeSessionInfo[], now = Date.now(),
|
|
124
|
+
openSessionId: string | null = null): CodeActivityGroup[] {
|
|
125
|
+
const today = startOfLocalDay(now);
|
|
126
|
+
const yesterday = startOfLocalDay(today - 1);
|
|
127
|
+
const byBucket = new Map<CodeActivityBucket, CodeSessionInfo[]>();
|
|
128
|
+
for (const session of sessions) {
|
|
129
|
+
const bucket: CodeActivityBucket = session.sessionId !== openSessionId && codeSessionUnread(session) ? 'priority'
|
|
130
|
+
: session.lastUsedAt >= today ? 'today'
|
|
131
|
+
: session.lastUsedAt >= yesterday ? 'yesterday' : 'earlier';
|
|
132
|
+
const rows = byBucket.get(bucket) ?? [];
|
|
133
|
+
rows.push(session);
|
|
134
|
+
byBucket.set(bucket, rows);
|
|
135
|
+
}
|
|
136
|
+
const key = (bucket: CodeActivityBucket, session: CodeSessionInfo) =>
|
|
137
|
+
bucket === 'priority' ? (session.lastTurnCompletedAt ?? session.lastUsedAt) : session.lastUsedAt;
|
|
138
|
+
return ACTIVITY_BUCKET_ORDER.filter(bucket => byBucket.has(bucket)).map(bucket => ({
|
|
139
|
+
bucket,
|
|
140
|
+
sessions: byBucket.get(bucket)!.sort((left, right) =>
|
|
141
|
+
key(bucket, right) - key(bucket, left) || left.sessionId.localeCompare(right.sessionId)),
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Last path segment for labels; callers keep the full path in a title attribute. */
|
|
146
|
+
export function codeWorkspaceName(cwd: string): string {
|
|
147
|
+
const trimmed = cwd.replace(/[\\/]+$/, '');
|
|
148
|
+
return trimmed.split(/[\\/]/).pop() || cwd;
|
|
149
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CodeItem } from '../../../../src/code-mode/wire';
|
|
2
|
+
import { firstInputLine, firstToolField, parseToolArguments, parseToolInput, prettyToolInput, TOOL_DESCRIPTION_KEYS, TOOL_INPUT_KEY_ORDER, TOOL_INPUT_KEYS } from '../../../../src/shared/tool-input.js';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* One line that says what a tool call did, in the user's terms.
|
|
@@ -58,22 +59,55 @@ export function summariseToolInput(input: string | undefined, workingDir: string
|
|
|
58
59
|
if (!input) return '';
|
|
59
60
|
const raw = input.trim();
|
|
60
61
|
if (!raw) return '';
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
? shortenPath(value, workingDir) : firstLine(value);
|
|
69
|
-
}
|
|
62
|
+
const parsed = parseToolArguments(raw);
|
|
63
|
+
if (parsed) {
|
|
64
|
+
for (const key of TOOL_INPUT_KEY_ORDER) {
|
|
65
|
+
const value = firstToolField(parsed, [key]);
|
|
66
|
+
if (value !== null) {
|
|
67
|
+
return key === 'path' || key === 'file' || key === 'file_path'
|
|
68
|
+
? shortenPath(value, workingDir) : firstLine(value);
|
|
70
69
|
}
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
}
|
|
71
|
+
return '';
|
|
73
72
|
}
|
|
74
73
|
return raw.includes('/') && !raw.includes(' ') ? shortenPath(raw, workingDir) : firstLine(raw);
|
|
75
74
|
}
|
|
76
75
|
|
|
76
|
+
/**
|
|
77
|
+
* The call's own description, shown as muted secondary text under the row
|
|
78
|
+
* label. It is the runtime's reason for the call, not the label itself.
|
|
79
|
+
*/
|
|
80
|
+
export function toolInputDescription(input: string | undefined): string {
|
|
81
|
+
const description = parseToolInput(input).description;
|
|
82
|
+
return description === null ? '' : firstInputLine(description);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* What the expanded call shows. A shell call prints its decoded command with
|
|
87
|
+
* real newlines, never the {"command": ...} envelope; every other tool
|
|
88
|
+
* pretty-prints its arguments, and a non-JSON argument stays as sent (a
|
|
89
|
+
* retention-truncated envelope still decodes its recognised field).
|
|
90
|
+
*
|
|
91
|
+
* `parameters` keeps the rest of a command envelope (timeout, cwd…) visible so
|
|
92
|
+
* nothing the call sent is hidden; `description` is the call's own description
|
|
93
|
+
* in full — the summary row only ever borrows its first line.
|
|
94
|
+
*/
|
|
95
|
+
export function toolInputDisplay(input: string | undefined): { content: string; command: boolean; parameters: string | null; description: string | null } | null {
|
|
96
|
+
if (input === undefined) return null;
|
|
97
|
+
const parsed = parseToolInput(input);
|
|
98
|
+
let parameters: string | null = null;
|
|
99
|
+
if (parsed.object && parsed.field === 'command') {
|
|
100
|
+
const hidden = new Set([...TOOL_INPUT_KEYS.command, ...TOOL_DESCRIPTION_KEYS]);
|
|
101
|
+
const rest = Object.fromEntries(Object.entries(parsed.object).filter(([key]) => !hidden.has(key)));
|
|
102
|
+
if (Object.keys(rest).length) parameters = JSON.stringify(rest, null, 2);
|
|
103
|
+
}
|
|
104
|
+
const command = parsed.field === 'command' && parsed.value !== null;
|
|
105
|
+
const content = command ? parsed.value!
|
|
106
|
+
: parsed.object ? prettyToolInput(input)
|
|
107
|
+
: parsed.value ?? input;
|
|
108
|
+
return { content, command, parameters, description: parsed.description };
|
|
109
|
+
}
|
|
110
|
+
|
|
77
111
|
export function toolSummary(item: CodeItem, workingDir: string): string {
|
|
78
112
|
const active = isActive(item.status);
|
|
79
113
|
if (item.kind === 'file_change') {
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { currentClientPlatform, isMacLikePlatform } from '../client-platform';
|
|
2
|
+
|
|
1
3
|
export type FolderShortcutAction = 'copy-path' | 'copy-relative-path' | 'reveal-path' | 'start-chord' | 'cancel-chord';
|
|
2
4
|
|
|
3
5
|
type KeyboardLike = {
|
|
@@ -20,14 +22,8 @@ export type FolderClickModifierLike = {
|
|
|
20
22
|
ctrlKey: boolean;
|
|
21
23
|
};
|
|
22
24
|
|
|
23
|
-
function platformLooksMac(platform: string): boolean {
|
|
24
|
-
return /mac|iphone|ipad|ipod/i.test(platform);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
25
|
export function currentFolderShortcutPlatform(): string {
|
|
28
|
-
|
|
29
|
-
const nav = navigator as Navigator & { userAgentData?: { platform?: string } };
|
|
30
|
-
return nav.userAgentData?.platform || navigator.platform || navigator.userAgent || '';
|
|
26
|
+
return currentClientPlatform();
|
|
31
27
|
}
|
|
32
28
|
|
|
33
29
|
export function isEditableShortcutTarget(target: EventTarget | null): boolean {
|
|
@@ -40,14 +36,14 @@ export function isEditableShortcutTarget(target: EventTarget | null): boolean {
|
|
|
40
36
|
}
|
|
41
37
|
|
|
42
38
|
export function isPlatformToggleClick(event: FolderClickModifierLike, platform = currentFolderShortcutPlatform()): boolean {
|
|
43
|
-
return
|
|
39
|
+
return isMacLikePlatform(platform) ? event.metaKey : event.ctrlKey;
|
|
44
40
|
}
|
|
45
41
|
|
|
46
42
|
export function folderShortcutAction(event: KeyboardLike, options: FolderShortcutOptions): FolderShortcutAction | null {
|
|
47
43
|
if (isEditableShortcutTarget(event.target ?? null)) return null;
|
|
48
44
|
const key = event.key.toLowerCase();
|
|
49
45
|
const code = event.code ?? '';
|
|
50
|
-
const isMac =
|
|
46
|
+
const isMac = isMacLikePlatform(options.platform ?? currentFolderShortcutPlatform());
|
|
51
47
|
const primary = isMac ? event.metaKey : event.ctrlKey;
|
|
52
48
|
const quickModifier = primary && event.altKey && !event.shiftKey;
|
|
53
49
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
import { currentClientPlatform, isMacLikePlatform } from '../client-platform';
|
|
2
3
|
|
|
3
4
|
/* 10.6.10 — Cmd/Ctrl+K opens the command palette.
|
|
4
5
|
* Only one global key listener; coexists with InstanceDrawer's Esc handler
|
|
@@ -12,14 +13,9 @@ export type CommandPaletteApi = {
|
|
|
12
13
|
close: () => void;
|
|
13
14
|
};
|
|
14
15
|
|
|
15
|
-
function
|
|
16
|
-
if (typeof navigator === 'undefined') return false;
|
|
17
|
-
return /Mac|iPod|iPhone|iPad/.test(navigator.platform || '');
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function isPaletteShortcut(event: KeyboardEvent): boolean {
|
|
16
|
+
export function isPaletteShortcut(event: KeyboardEvent, platform: string = currentClientPlatform()): boolean {
|
|
21
17
|
if (event.key !== 'k' && event.key !== 'K') return false;
|
|
22
|
-
return
|
|
18
|
+
return isMacLikePlatform(platform) ? event.metaKey : event.ctrlKey;
|
|
23
19
|
}
|
|
24
20
|
|
|
25
21
|
export function useCommandPalette(): CommandPaletteApi {
|
|
@@ -31,6 +31,7 @@ import './workers/worker-runs.css';
|
|
|
31
31
|
import './settings-shell.css';
|
|
32
32
|
import './settings-controls.css';
|
|
33
33
|
import './settings-agent.css';
|
|
34
|
+
import './settings-surface.css';
|
|
34
35
|
import './settings-embedding.css';
|
|
35
36
|
import './jaw-ceo/jaw-ceo.css';
|
|
36
37
|
import './jaw-ceo/jaw-ceo-console.css';
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
.rail-button.is-active {
|
|
11
11
|
background: var(--sidebar-row-active, var(--bg-raised));
|
|
12
12
|
border-color: transparent;
|
|
13
|
-
color: var(--
|
|
14
|
-
box-shadow: inset
|
|
13
|
+
color: var(--accent);
|
|
14
|
+
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent);
|
|
15
15
|
}
|
|
16
16
|
.rail-collapse-button { margin-left: auto; }
|
|
17
17
|
.manager-shell.is-sidebar-collapsed .rail-collapse-button { margin-left: 0; }
|
|
@@ -340,6 +340,7 @@ button.instance-group-header[aria-expanded="false"] .instance-group-chevron {
|
|
|
340
340
|
border-radius: var(--radius-md);
|
|
341
341
|
background: transparent;
|
|
342
342
|
padding: 10px;
|
|
343
|
+
transition: background var(--motion-fast) ease, border-color var(--motion-fast) ease;
|
|
343
344
|
}
|
|
344
345
|
.instance-row.density-compact {
|
|
345
346
|
min-height: 36px;
|
|
@@ -429,16 +430,10 @@ button.instance-group-header[aria-expanded="false"] .instance-group-chevron {
|
|
|
429
430
|
outline: var(--focus-ring);
|
|
430
431
|
outline-offset: 2px;
|
|
431
432
|
}
|
|
432
|
-
.instance-row.priority-active.is-selected
|
|
433
|
+
.instance-row.priority-active.is-selected,
|
|
433
434
|
.instance-row:not(.priority-active).is-selected {
|
|
434
|
-
border-color: color-mix(in srgb, var(--accent)
|
|
435
|
-
background:
|
|
436
|
-
box-shadow: inset 3px 0 0 color-mix(in srgb, var(--accent) 62%, transparent);
|
|
437
|
-
}
|
|
438
|
-
.instance-row.priority-active.is-selected::before {
|
|
439
|
-
content: ""; position: absolute; left: 0; top: 7px; bottom: 7px;
|
|
440
|
-
z-index: 1; width: 3px; border-radius: 3px; background: var(--accent);
|
|
441
|
-
pointer-events: none;
|
|
435
|
+
border-color: color-mix(in srgb, var(--accent) 45%, transparent);
|
|
436
|
+
background: var(--accent-soft);
|
|
442
437
|
}
|
|
443
438
|
.instance-row-main {
|
|
444
439
|
width: 100%;
|
|
@@ -533,14 +528,6 @@ button.instance-group-header[aria-expanded="false"] .instance-group-chevron {
|
|
|
533
528
|
from { opacity: 0; transform: translateY(-2px); }
|
|
534
529
|
to { opacity: 1; transform: none; }
|
|
535
530
|
}
|
|
536
|
-
@media (prefers-reduced-motion: reduce) {
|
|
537
|
-
.instance-session-list { animation: none; }
|
|
538
|
-
.instance-group-chevron,
|
|
539
|
-
.instance-row .instance-row-quick .quick-btn,
|
|
540
|
-
.quick-btn {
|
|
541
|
-
transition: none;
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
531
|
.instance-session-row {
|
|
545
532
|
display: flex;
|
|
546
533
|
align-items: center;
|
|
@@ -558,14 +545,27 @@ button.instance-group-header[aria-expanded="false"] .instance-group-chevron {
|
|
|
558
545
|
line-height: 16px;
|
|
559
546
|
text-align: left;
|
|
560
547
|
cursor: pointer;
|
|
548
|
+
transition: background var(--motion-fast) ease, box-shadow var(--motion-fast) ease;
|
|
549
|
+
}
|
|
550
|
+
/* After the session-row rule: equal specificity, so source order decides. */
|
|
551
|
+
@media (prefers-reduced-motion: reduce) {
|
|
552
|
+
.instance-session-list { animation: none; }
|
|
553
|
+
.instance-row,
|
|
554
|
+
.instance-session-row,
|
|
555
|
+
.instance-group-chevron,
|
|
556
|
+
.instance-row .instance-row-quick .quick-btn,
|
|
557
|
+
.quick-btn {
|
|
558
|
+
transition: none;
|
|
559
|
+
}
|
|
561
560
|
}
|
|
562
561
|
.instance-session-row:hover:not(:disabled) { background: var(--row-bg-hover); color: var(--text-primary); }
|
|
563
562
|
.instance-session-row:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
|
|
564
563
|
.instance-session-row:disabled { cursor: default; opacity: 0.6; }
|
|
565
|
-
.instance-session-row.is-active
|
|
564
|
+
.instance-session-row.is-active,
|
|
565
|
+
.instance-session-row.is-active:hover:not(:disabled) {
|
|
566
566
|
color: var(--text-primary);
|
|
567
|
-
|
|
568
|
-
|
|
567
|
+
background: var(--accent-soft);
|
|
568
|
+
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent);
|
|
569
569
|
}
|
|
570
570
|
.instance-session-title {
|
|
571
571
|
min-width: 0;
|
|
@@ -755,8 +755,10 @@ button.instance-group-header[aria-expanded="false"] .instance-group-chevron {
|
|
|
755
755
|
grid-template-columns: minmax(0, 1fr) auto;
|
|
756
756
|
gap: 10px;
|
|
757
757
|
align-items: center;
|
|
758
|
+
box-sizing: border-box;
|
|
759
|
+
height: var(--workspace-topbar-height);
|
|
758
760
|
border-bottom: 1px solid var(--border-subtle);
|
|
759
|
-
padding:
|
|
761
|
+
padding: 0 12px;
|
|
760
762
|
}
|
|
761
763
|
.workbench-mode-tabs {
|
|
762
764
|
display: inline-flex; flex-wrap: nowrap; align-items: center;
|
|
@@ -85,9 +85,9 @@
|
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
.dashboard-reminders-sidebar-item.is-active {
|
|
88
|
-
background:
|
|
88
|
+
background: var(--accent-soft);
|
|
89
89
|
color: var(--ink-primary);
|
|
90
|
-
box-shadow: inset
|
|
90
|
+
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent);
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
.dashboard-reminders-sidebar-item span {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DashboardDetailTab, DashboardInstance, DashboardShortcutAction, DashboardShortcutKeymap, DashboardSidebarMode } from './types';
|
|
2
|
-
import { actionForShortcutEvent } from './manager-shortcuts';
|
|
2
|
+
import { actionForShortcutEvent, type ShortcutPlatformOptions } from './manager-shortcuts';
|
|
3
3
|
import { panelShortcutBus } from './panels/panel-shortcut-bus';
|
|
4
4
|
import { getDesktop } from './panels/desktop-bridge';
|
|
5
5
|
import { getInstanceJumpSelector, jumpInstanceIndexFromAction, readRenderedInstancePorts } from './components/sidebar-keyboard';
|
|
@@ -111,6 +111,12 @@ export function runManagerShortcut(action: DashboardShortcutAction, deps: Manage
|
|
|
111
111
|
document.dispatchEvent(new CustomEvent('jaw:shortcut-action', { detail: action }));
|
|
112
112
|
return;
|
|
113
113
|
}
|
|
114
|
+
if (action === 'newCodeSession') {
|
|
115
|
+
// The Code session list owns the draft; it listens for this and ignores
|
|
116
|
+
// the event while Code mode is not mounted.
|
|
117
|
+
document.dispatchEvent(new CustomEvent('jaw:shortcut-action', { detail: action }));
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
114
120
|
if (action === 'terminalNewTab') {
|
|
115
121
|
const el = document.activeElement;
|
|
116
122
|
if (el?.closest('.terminal-panel, .xterm')) {
|
|
@@ -140,12 +146,13 @@ const CAPTURE_TOGGLE_ACTIONS = new Set<DashboardShortcutAction>([
|
|
|
140
146
|
export function createManagerCaptureKeydownHandler(
|
|
141
147
|
getKeymap: () => DashboardShortcutKeymap,
|
|
142
148
|
onAction: (action: DashboardShortcutAction) => void,
|
|
149
|
+
options: ShortcutPlatformOptions = {},
|
|
143
150
|
): (event: KeyboardEvent) => void {
|
|
144
151
|
return (event: KeyboardEvent) => {
|
|
145
152
|
if (event.defaultPrevented) return;
|
|
146
153
|
const target = event.target;
|
|
147
154
|
if (target instanceof Element && target.closest('[data-keybinding-capture]')) return;
|
|
148
|
-
const action = actionForShortcutEvent(event, getKeymap());
|
|
155
|
+
const action = actionForShortcutEvent(event, getKeymap(), options);
|
|
149
156
|
if (!action || !CAPTURE_TOGGLE_ACTIONS.has(action)) return;
|
|
150
157
|
event.preventDefault();
|
|
151
158
|
event.stopPropagation();
|