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.
Files changed (360) hide show
  1. package/README.ja.md +17 -17
  2. package/README.ko.md +17 -17
  3. package/README.md +17 -17
  4. package/README.zh-CN.md +17 -17
  5. package/dist/bin/commands/tui/input-handler.js +19 -0
  6. package/dist/bin/commands/tui/input-handler.js.map +1 -1
  7. package/dist/bin/commands/tui/overlays.js +8 -4
  8. package/dist/bin/commands/tui/overlays.js.map +1 -1
  9. package/dist/bin/star-prompt.js +1 -1
  10. package/dist/bin/star-prompt.js.map +1 -1
  11. package/dist/server.js +14 -1
  12. package/dist/server.js.map +1 -1
  13. package/dist/src/agent/claude-runtime-pool.js +2 -1
  14. package/dist/src/agent/claude-runtime-pool.js.map +1 -1
  15. package/dist/src/agent/claude-runtime-run.js +28 -7
  16. package/dist/src/agent/claude-runtime-run.js.map +1 -1
  17. package/dist/src/agent/lifecycle-handler.js +34 -6
  18. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  19. package/dist/src/agent/runtime/claude-sdk-events.js +136 -9
  20. package/dist/src/agent/runtime/claude-sdk-events.js.map +1 -1
  21. package/dist/src/agent/runtime/claude-sdk-history-loader.js +24 -0
  22. package/dist/src/agent/runtime/claude-sdk-history-loader.js.map +1 -0
  23. package/dist/src/agent/runtime/claude-sdk-hooks.js +10 -4
  24. package/dist/src/agent/runtime/claude-sdk-hooks.js.map +1 -1
  25. package/dist/src/agent/runtime/claude-sdk-messages.js +25 -2
  26. package/dist/src/agent/runtime/claude-sdk-messages.js.map +1 -1
  27. package/dist/src/agent/runtime/claude-sdk-options.js +36 -3
  28. package/dist/src/agent/runtime/claude-sdk-options.js.map +1 -1
  29. package/dist/src/agent/runtime/claude-sdk-permissions.js +32 -9
  30. package/dist/src/agent/runtime/claude-sdk-permissions.js.map +1 -1
  31. package/dist/src/agent/runtime/claude-sdk-session.js +165 -17
  32. package/dist/src/agent/runtime/claude-sdk-session.js.map +1 -1
  33. package/dist/src/agent/runtime/claude-sdk-version.js +8 -0
  34. package/dist/src/agent/runtime/claude-sdk-version.js.map +1 -0
  35. package/dist/src/agent/spawn/backend-codex-app.js +619 -0
  36. package/dist/src/agent/spawn/backend-codex-app.js.map +1 -0
  37. package/dist/src/agent/spawn/backend-context.js +2 -0
  38. package/dist/src/agent/spawn/backend-context.js.map +1 -0
  39. package/dist/src/agent/spawn/backend-copilot.js +385 -0
  40. package/dist/src/agent/spawn/backend-copilot.js.map +1 -0
  41. package/dist/src/agent/spawn/backend-native-acp.js +379 -0
  42. package/dist/src/agent/spawn/backend-native-acp.js.map +1 -0
  43. package/dist/src/agent/spawn/backend-pi.js +565 -0
  44. package/dist/src/agent/spawn/backend-pi.js.map +1 -0
  45. package/dist/src/agent/spawn/types.js +2 -0
  46. package/dist/src/agent/spawn/types.js.map +1 -0
  47. package/dist/src/agent/spawn.js +44 -1858
  48. package/dist/src/agent/spawn.js.map +1 -1
  49. package/dist/src/cli/claude-default-model-boot.js +36 -0
  50. package/dist/src/cli/claude-default-model-boot.js.map +1 -0
  51. package/dist/src/cli/claude-model-discovery.js +13 -1
  52. package/dist/src/cli/claude-model-discovery.js.map +1 -1
  53. package/dist/src/cli/claude-models.js +7 -1
  54. package/dist/src/cli/claude-models.js.map +1 -1
  55. package/dist/src/cli/commands.js +5 -15
  56. package/dist/src/cli/commands.js.map +1 -1
  57. package/dist/src/cli/tui/composer.js +3 -3
  58. package/dist/src/cli/tui/composer.js.map +1 -1
  59. package/dist/src/cli/tui/skill-mention.js +15 -0
  60. package/dist/src/cli/tui/skill-mention.js.map +1 -0
  61. package/dist/src/code-mode/manager.js +174 -9
  62. package/dist/src/code-mode/manager.js.map +1 -1
  63. package/dist/src/code-mode/providers/catalog.js +5 -3
  64. package/dist/src/code-mode/providers/catalog.js.map +1 -1
  65. package/dist/src/code-mode/providers/claude-history.js +132 -0
  66. package/dist/src/code-mode/providers/claude-history.js.map +1 -0
  67. package/dist/src/code-mode/providers/claude.js +74 -7
  68. package/dist/src/code-mode/providers/claude.js.map +1 -1
  69. package/dist/src/code-mode/providers/codex-app.js +7 -1
  70. package/dist/src/code-mode/providers/codex-app.js.map +1 -1
  71. package/dist/src/code-mode/session.js +158 -11
  72. package/dist/src/code-mode/session.js.map +1 -1
  73. package/dist/src/code-mode/store.js +416 -28
  74. package/dist/src/code-mode/store.js.map +1 -1
  75. package/dist/src/command-contract/catalog.js +3 -22
  76. package/dist/src/command-contract/catalog.js.map +1 -1
  77. package/dist/src/core/codex-config.js +3 -62
  78. package/dist/src/core/codex-config.js.map +1 -1
  79. package/dist/src/core/config.js +116 -14
  80. package/dist/src/core/config.js.map +1 -1
  81. package/dist/src/core/runtime-settings.js +20 -10
  82. package/dist/src/core/runtime-settings.js.map +1 -1
  83. package/dist/src/core/settings-watch.js +1 -0
  84. package/dist/src/core/settings-watch.js.map +1 -1
  85. package/dist/src/core/skill-mentions.js +83 -0
  86. package/dist/src/core/skill-mentions.js.map +1 -0
  87. package/dist/src/manager/registry.js +5 -1
  88. package/dist/src/manager/registry.js.map +1 -1
  89. package/dist/src/manager/routes/desktop-status.js +1 -1
  90. package/dist/src/manager/routes/desktop-status.js.map +1 -1
  91. package/dist/src/orchestrator/pipeline.js +11 -1
  92. package/dist/src/orchestrator/pipeline.js.map +1 -1
  93. package/dist/src/prompt/builder.js +10 -4
  94. package/dist/src/prompt/builder.js.map +1 -1
  95. package/dist/src/prompt/templates/a1-system.md +1 -1
  96. package/dist/src/routes/code-native.js +51 -3
  97. package/dist/src/routes/code-native.js.map +1 -1
  98. package/dist/src/routes/settings.js +1 -4
  99. package/dist/src/routes/settings.js.map +1 -1
  100. package/dist/src/routes/skills.js +7 -0
  101. package/dist/src/routes/skills.js.map +1 -1
  102. package/dist/src/shared/skill-mention.js +61 -0
  103. package/dist/src/shared/skill-mention.js.map +1 -0
  104. package/dist/src/shared/tool-input.js +137 -0
  105. package/dist/src/shared/tool-input.js.map +1 -0
  106. package/package.json +7 -5
  107. package/public/css/activity.css +83 -20
  108. package/public/css/layout.css +2 -2
  109. package/public/css/sidebar.css +18 -0
  110. package/public/css/variables.css +23 -2
  111. package/public/dist/.vite/manifest.json +302 -334
  112. package/public/dist/assets/Activity-DPLlOJ46.js +1 -0
  113. package/public/dist/assets/AdvancedExport-BgOgGvc5.js +1 -0
  114. package/public/dist/assets/Agent-O_U8ny90.js +1 -0
  115. package/public/dist/assets/Browser-m6VynQXV.js +1 -0
  116. package/public/dist/assets/BrowserPanel-Bb-Bge6B.js +3 -0
  117. package/public/dist/assets/ChannelEnablementControl-BSuKQhTW.js +85 -0
  118. package/public/dist/assets/ChannelSetupEntry-DHLoZEzJ.js +1 -0
  119. package/public/dist/assets/ChannelsDiscord-B-G8vsYy.js +1 -0
  120. package/public/dist/assets/ChannelsSlack-oPuh922z.js +1 -0
  121. package/public/dist/assets/ChannelsTelegram-PmTv43KQ.js +1 -0
  122. package/public/dist/assets/CodeCanvas-CVbdp0S-.js +3 -0
  123. package/public/dist/assets/DashboardMeta-BqEiJrvr.js +1 -0
  124. package/public/dist/assets/DesignPanel-BOb-HMbl.js +2 -0
  125. package/public/dist/assets/{Developer-BdKPcw8Z.js → Developer-CbySB7_Z.js} +1 -1
  126. package/public/dist/assets/{DiffPanel-DtJuvU5y.js → DiffPanel-D9Cch5FG.js} +1 -1
  127. package/public/dist/assets/Display-C0Zdamcb.js +1 -0
  128. package/public/dist/assets/Display-DU4_76cS.js +1 -0
  129. package/public/dist/assets/DocPanel-DvtFw8AP.js +1 -0
  130. package/public/dist/assets/{Embedding-DvdTj1BF.js → Embedding-CCFMOB_2.js} +1 -1
  131. package/public/dist/assets/Employees-BanvF58d.js +1 -0
  132. package/public/dist/assets/FolderPanel-CJvwRwIV.js +3 -0
  133. package/public/dist/assets/Heartbeat-uyi_MpUd.js +1 -0
  134. package/public/dist/assets/InlineWarn-Cq4z28F3.js +1 -0
  135. package/public/dist/assets/MarkdownRenderer-Cc3DeHvm.js +1 -0
  136. package/public/dist/assets/{MarkdownRenderer-DhonsAPC.js → MarkdownRenderer-DzN66XVb.js} +1 -1
  137. package/public/dist/assets/Mcp-rjPoL_Zo.js +4 -0
  138. package/public/dist/assets/Memory-C9I33pIi.js +1 -0
  139. package/public/dist/assets/{MilkdownWysiwygEditor-D6JaLDE4.js → MilkdownWysiwygEditor-xObhviw7.js} +1 -1
  140. package/public/dist/assets/ModelProvider-fiUktMaO.js +1 -0
  141. package/public/dist/assets/Network-CuqFrOvR.js +1 -0
  142. package/public/dist/assets/NotesGraphWorkspace-DO9LtVGF.js +1 -0
  143. package/public/dist/assets/PanelLayoutProvider-DRZ4QkBC.js +1 -0
  144. package/public/dist/assets/Permissions-BltXiZnz.js +1 -0
  145. package/public/dist/assets/{Permissions-BwiMEoTV.js → Permissions-DcCbFMIq.js} +1 -1
  146. package/public/dist/assets/Profile-DUL7-RE_.js +1 -0
  147. package/public/dist/assets/Prompts-C9vY8ivQ.js +1 -0
  148. package/public/dist/assets/SpeechKeys-BJ8V7U5E.js +1 -0
  149. package/public/dist/assets/TelegramHub-DtyjLGFR.js +1 -0
  150. package/public/dist/assets/{TerminalPanel-Bu9i-P2f.js → TerminalPanel-c1xhiy53.js} +1 -1
  151. package/public/dist/assets/app-BjKzqXCv.css +1 -0
  152. package/public/dist/assets/app-CZwx0V6K.js +59 -0
  153. package/public/dist/assets/bgtask-badge-CnVkcp3c.js +1 -0
  154. package/public/dist/assets/{bgtask-badge-DfiHuzxT.js → bgtask-badge-Cp26S8Uq.js} +1 -1
  155. package/public/dist/assets/client-platform-WO8m6kPQ.js +1 -0
  156. package/public/dist/assets/{employees-BQaJNp-u.js → employees-CsvI0_5V.js} +1 -1
  157. package/public/dist/assets/error-normalize-clOi-AAA.js +1 -0
  158. package/public/dist/assets/fields-CicOWY-X.js +1 -0
  159. package/public/dist/assets/iframe-renderer-DWx9v2Iz.js +1 -0
  160. package/public/dist/assets/iframe-renderer-DmHYOI1A.js +142 -0
  161. package/public/dist/assets/{react-C_pPTFsM.js → jsx-runtime-CkEUZM6i.js} +1 -1
  162. package/public/dist/assets/manager-CCXm5Yfe.js +5 -0
  163. package/public/dist/assets/manager-D9rhKFKc.css +1 -0
  164. package/public/dist/assets/manager-shortcuts-Cqmr0mEq.js +1 -0
  165. package/public/dist/assets/{memory-EG1B51up.js → memory-C6qtAMdJ.js} +1 -1
  166. package/public/dist/assets/memory-PPofQPeB.js +1 -0
  167. package/public/dist/assets/message-history-DcjBuubA.js +4 -0
  168. package/public/dist/assets/message-history-bw4qF01Z.js +1 -0
  169. package/public/dist/assets/page-shell-DfinU3mb.js +1 -0
  170. package/public/dist/assets/react-dom-URBLzV3w.js +1 -0
  171. package/public/dist/assets/{render-Dp07lZAJ.js → render-DfYro-fG.js} +1 -1
  172. package/public/dist/assets/{settings-jlI4X-zt.js → settings-CvsLWlJn.js} +38 -30
  173. package/public/dist/assets/settings-DMiQe469.js +1 -0
  174. package/public/dist/assets/settings-DgAlohx9.js +1 -0
  175. package/public/dist/assets/settings-core-BH7J_Rbm.js +1 -0
  176. package/public/dist/assets/{settings-core-B5Uf_lWY.js → settings-core-pnpw-eZv.js} +1 -1
  177. package/public/dist/assets/{settings-embedding-BfWzWKMM.js → settings-embedding-BRW0WZvh.js} +3 -3
  178. package/public/dist/assets/{settings-embedding-DhEdT86W.css → settings-embedding-CUQ8Is3y.css} +1 -1
  179. package/public/dist/assets/settings-types-CYKy0xz4.js +1 -0
  180. package/public/dist/assets/shared-D1begqvi.js +1 -0
  181. package/public/dist/assets/{sidebar-BUemG2ZN.js → sidebar-C_80w4iY.js} +3 -3
  182. package/public/dist/assets/{skills-CKUcEN9m.js → skills-D_2adqge.js} +1 -1
  183. package/public/dist/assets/skills-DeNVAVgt.js +1 -0
  184. package/public/dist/assets/{slash-commands-D34GgHFX.js → slash-commands-B_Hq5RkC.js} +2 -2
  185. package/public/dist/assets/slash-commands-Cj5qoRWc.js +1 -0
  186. package/public/dist/assets/tool-input-DI7uu8Ah.js +2 -0
  187. package/public/dist/assets/{trace-drawer-DBmK-5F_.js → trace-drawer-B6XuPodh.js} +1 -1
  188. package/public/dist/assets/ui-BbR_fFiK.js +1 -0
  189. package/public/dist/assets/{ui-vm2iuLcS.js → ui-D8xzm7DN.js} +1 -1
  190. package/public/dist/index.html +11 -3
  191. package/public/dist/manager/index.html +3 -3
  192. package/public/dist/settings/index.html +2 -2
  193. package/public/index.html +9 -1
  194. package/public/js/features/activity-history.ts +50 -21
  195. package/public/js/features/activity-rows.ts +158 -10
  196. package/public/js/features/activity-view.ts +5 -5
  197. package/public/js/features/chat.ts +2 -0
  198. package/public/js/features/employees.ts +1 -0
  199. package/public/js/features/resize-guard.ts +39 -0
  200. package/public/js/features/settings-cli-status.ts +49 -17
  201. package/public/js/features/settings-types.ts +39 -1
  202. package/public/js/features/skill-mentions.ts +143 -0
  203. package/public/js/main.ts +15 -0
  204. package/public/js/virtual-scroll.ts +67 -1
  205. package/public/locales/en.json +2 -0
  206. package/public/locales/ja.json +2 -0
  207. package/public/locales/ko.json +2 -0
  208. package/public/locales/zh.json +2 -0
  209. package/public/manager/src/AppChrome.tsx +2 -0
  210. package/public/manager/src/InstancePreview.tsx +1 -1
  211. package/public/manager/src/SidebarRailRouter.tsx +3 -1
  212. package/public/manager/src/browser-panel/BrowserPanel.tsx +47 -12
  213. package/public/manager/src/browser-panel/browser-address-state.ts +11 -0
  214. package/public/manager/src/client-platform.ts +18 -0
  215. package/public/manager/src/code/CodeCanvas.tsx +4 -2
  216. package/public/manager/src/code/CodeComposer.tsx +22 -10
  217. package/public/manager/src/code/CodeDraftEmptyState.tsx +64 -0
  218. package/public/manager/src/code/CodeSessionList.tsx +154 -40
  219. package/public/manager/src/code/CodeTranscript.tsx +104 -16
  220. package/public/manager/src/code/CodeWorkbench.tsx +21 -11
  221. package/public/manager/src/code/CodeWorkspaceHeader.tsx +5 -10
  222. package/public/manager/src/code/ComposerFooter.tsx +9 -1
  223. package/public/manager/src/code/code-composer.css +1 -1
  224. package/public/manager/src/code/code-controller-draft-storage.ts +16 -8
  225. package/public/manager/src/code/code-controller-drafts.ts +33 -6
  226. package/public/manager/src/code/code-controller-runtime.ts +189 -17
  227. package/public/manager/src/code/code-controller-types.ts +19 -1
  228. package/public/manager/src/code/code-recent-workspaces.ts +25 -0
  229. package/public/manager/src/code/code-session-client.ts +19 -1
  230. package/public/manager/src/code/code-session-sidebar.css +38 -0
  231. package/public/manager/src/code/code-session-state.ts +2 -0
  232. package/public/manager/src/code/code-types.ts +47 -0
  233. package/public/manager/src/code/code-workbench.css +36 -1
  234. package/public/manager/src/code/code.css +171 -7
  235. package/public/manager/src/code/session-order.ts +80 -0
  236. package/public/manager/src/code/tool-summary.ts +45 -11
  237. package/public/manager/src/folder-panel/folder-shortcuts.ts +5 -9
  238. package/public/manager/src/hooks/useCommandPalette.ts +3 -7
  239. package/public/manager/src/main.tsx +1 -0
  240. package/public/manager/src/manager-components.css +25 -23
  241. package/public/manager/src/manager-dashboard-reminders.css +2 -2
  242. package/public/manager/src/manager-layout.css +1 -1
  243. package/public/manager/src/manager-shortcut-runner.ts +9 -2
  244. package/public/manager/src/manager-shortcuts.ts +83 -21
  245. package/public/manager/src/panels/desktop-bridge.ts +4 -1
  246. package/public/manager/src/panels/panels.css +9 -0
  247. package/public/manager/src/preview.ts +19 -4
  248. package/public/manager/src/settings/pages/AdvancedExport.tsx +28 -30
  249. package/public/manager/src/settings/pages/Browser.tsx +45 -47
  250. package/public/manager/src/settings/pages/ChannelsDiscord.tsx +51 -26
  251. package/public/manager/src/settings/pages/ChannelsSlack.tsx +59 -17
  252. package/public/manager/src/settings/pages/ChannelsTelegram.tsx +51 -26
  253. package/public/manager/src/settings/pages/Display.tsx +2 -1
  254. package/public/manager/src/settings/pages/Employees.tsx +3 -3
  255. package/public/manager/src/settings/pages/Mcp.tsx +220 -200
  256. package/public/manager/src/settings/pages/Memory.tsx +35 -41
  257. package/public/manager/src/settings/pages/ModelProvider.tsx +23 -98
  258. package/public/manager/src/settings/pages/Network.tsx +5 -4
  259. package/public/manager/src/settings/pages/Permissions.tsx +38 -16
  260. package/public/manager/src/settings/pages/Prompts.tsx +12 -9
  261. package/public/manager/src/settings/pages/SpeechKeys.tsx +132 -139
  262. package/public/manager/src/settings/pages/TelegramHub.tsx +67 -20
  263. package/public/manager/src/settings/pages/components/AvatarCard.tsx +9 -8
  264. package/public/manager/src/settings/pages/components/ChannelSetupEntry.tsx +2 -2
  265. package/public/manager/src/settings/pages/components/EmployeeRow.tsx +6 -12
  266. package/public/manager/src/settings/pages/components/HealthBadge.tsx +11 -6
  267. package/public/manager/src/settings/pages/components/HeartbeatJobRow.tsx +35 -16
  268. package/public/manager/src/settings/pages/components/HeartbeatJobsSection.tsx +11 -11
  269. package/public/manager/src/settings/pages/components/HeartbeatMarkdownSection.tsx +7 -7
  270. package/public/manager/src/settings/pages/components/InlineWarn.tsx +4 -9
  271. package/public/manager/src/settings/pages/components/McpServerCard.tsx +39 -27
  272. package/public/manager/src/settings/pages/components/MemoryRow.tsx +21 -16
  273. package/public/manager/src/settings/pages/components/PerCliRow.tsx +122 -121
  274. package/public/manager/src/settings/pages/components/PiProfileDialog.tsx +9 -6
  275. package/public/manager/src/settings/pages/components/SlackSetup.tsx +8 -8
  276. package/public/manager/src/settings/pages/components/TransportStatusChips.tsx +14 -10
  277. package/public/manager/src/settings/pages/components/agent/AgentEmployeesSection.tsx +26 -26
  278. package/public/manager/src/settings/pages/components/agent/PermissionQuickSection.tsx +5 -5
  279. package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +14 -11
  280. package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +1 -3
  281. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +0 -2
  282. package/public/manager/src/settings/pages/components/runtime-transport-field.tsx +2 -2
  283. package/public/manager/src/settings/pages/manager/Activity.tsx +6 -2
  284. package/public/manager/src/settings/pages/manager/Display.tsx +3 -8
  285. package/public/manager/src/settings/pages/manager/shared.tsx +44 -33
  286. package/public/manager/src/settings/pages/page-shell.tsx +66 -0
  287. package/public/manager/src/settings-agent.css +185 -36
  288. package/public/manager/src/settings-standalone.tsx +1 -0
  289. package/public/manager/src/settings-surface.css +96 -0
  290. package/public/manager/src/types.ts +1 -0
  291. package/scripts/ci/install-ripgrep.sh +35 -0
  292. package/scripts/collect-fresh-install-evidence.sh +2 -2
  293. package/scripts/install-risk-gate.mjs +2 -3
  294. package/scripts/install-wsl.sh +1 -1
  295. package/scripts/install.ps1 +1 -1
  296. package/scripts/install.sh +1 -1
  297. package/scripts/release-1.6.0.sh +1 -1
  298. package/scripts/release-gates.mjs +48 -13
  299. package/scripts/release-preview.sh +2 -2
  300. package/scripts/restack-pr.sh +88 -0
  301. package/scripts/verify-electron-update-metadata.mjs +1 -1
  302. package/scripts/windows-support-contract.json +1 -1
  303. package/public/dist/assets/Activity-BUrp73Re.js +0 -1
  304. package/public/dist/assets/AdvancedExport-B7h_ZvBu.js +0 -1
  305. package/public/dist/assets/Agent-DnbZJP7b.js +0 -1
  306. package/public/dist/assets/Browser-CiBoK5Qx.js +0 -1
  307. package/public/dist/assets/BrowserPanel-SZAUc9T2.js +0 -3
  308. package/public/dist/assets/ChannelEnablementControl-Dl0uYx38.js +0 -85
  309. package/public/dist/assets/ChannelSetupEntry-DxtOrN01.js +0 -1
  310. package/public/dist/assets/ChannelsDiscord-BEGGwd_3.js +0 -1
  311. package/public/dist/assets/ChannelsSlack-BryC2Ahr.js +0 -1
  312. package/public/dist/assets/ChannelsTelegram-CGSpaImJ.js +0 -1
  313. package/public/dist/assets/CodeCanvas-DpkFi5Au.js +0 -2
  314. package/public/dist/assets/DashboardMeta-Dh-tasbY.js +0 -1
  315. package/public/dist/assets/DesignPanel-NLNK9wCo.js +0 -2
  316. package/public/dist/assets/Display-BHGFX3O0.js +0 -1
  317. package/public/dist/assets/Display-BW-_pKRf.js +0 -1
  318. package/public/dist/assets/DocPanel-BM41cYpS.js +0 -1
  319. package/public/dist/assets/Employees-BuFw6-fT.js +0 -1
  320. package/public/dist/assets/FolderPanel-C-eQT3Yq.js +0 -3
  321. package/public/dist/assets/Heartbeat-CIVtKWNc.js +0 -1
  322. package/public/dist/assets/InlineWarn-DIMbcbzk.js +0 -1
  323. package/public/dist/assets/MarkdownRenderer-DyVx6DxM.js +0 -1
  324. package/public/dist/assets/Mcp-uKjor7vh.js +0 -4
  325. package/public/dist/assets/Memory-BSDIXT0B.js +0 -1
  326. package/public/dist/assets/ModelProvider-DMh2tXUx.js +0 -1
  327. package/public/dist/assets/Network-4Pa6JkhK.js +0 -1
  328. package/public/dist/assets/NotesGraphWorkspace-CgdC-fM6.js +0 -1
  329. package/public/dist/assets/PanelLayoutProvider-mn8sI0h-.js +0 -1
  330. package/public/dist/assets/Permissions-CodIW-Yd.js +0 -1
  331. package/public/dist/assets/Profile-DPqrYA44.js +0 -1
  332. package/public/dist/assets/Prompts-CvAx7QqR.js +0 -1
  333. package/public/dist/assets/SpeechKeys-CVBCqoBn.js +0 -1
  334. package/public/dist/assets/TelegramHub-4zKwpk0P.js +0 -1
  335. package/public/dist/assets/app-ByMfeXp-.js +0 -55
  336. package/public/dist/assets/app-DAJWqs33.css +0 -1
  337. package/public/dist/assets/bgtask-badge-Ch88fnhf.js +0 -1
  338. package/public/dist/assets/error-normalize-CL69Bl7z.js +0 -1
  339. package/public/dist/assets/fields-mlGpofqQ.js +0 -1
  340. package/public/dist/assets/iframe-renderer-Bj1JolO8.js +0 -142
  341. package/public/dist/assets/iframe-renderer-DWnvUSrx.js +0 -1
  342. package/public/dist/assets/jsx-runtime-NZYk81nU.js +0 -1
  343. package/public/dist/assets/manager-Bi_xw7TW.js +0 -5
  344. package/public/dist/assets/manager-BnQHAKk6.css +0 -1
  345. package/public/dist/assets/manager-shortcuts-BDOzd8zm.js +0 -1
  346. package/public/dist/assets/memory-Bk_cb3sw.js +0 -1
  347. package/public/dist/assets/message-history-D2vniu04.js +0 -4
  348. package/public/dist/assets/message-history-GAtF_wbZ.js +0 -1
  349. package/public/dist/assets/page-shell-BeGD0rRQ.js +0 -1
  350. package/public/dist/assets/react-dom-DyUOYpVL.js +0 -1
  351. package/public/dist/assets/settings-W4KG9ivu.js +0 -1
  352. package/public/dist/assets/settings-WVGhtneN.js +0 -1
  353. package/public/dist/assets/settings-client-CmwRsVd1.js +0 -1
  354. package/public/dist/assets/settings-core-CgKGnMA5.js +0 -1
  355. package/public/dist/assets/settings-types-D3cd6SWy.js +0 -1
  356. package/public/dist/assets/shared-CiNP20HB.js +0 -1
  357. package/public/dist/assets/skills-Co7Mr-qP.js +0 -1
  358. package/public/dist/assets/slash-commands-BEr-vmIr.js +0 -1
  359. package/public/dist/assets/ui-TUyJsMUf.js +0 -1
  360. 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: 200px;
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
- .code-session-new-btn {
70
- width: 20px; height: 20px;
71
- border: none; border-radius: 4px;
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-size: 14px; cursor: pointer;
75
- display: flex; align-items: center; justify-content: center;
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 0 auto;
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
- if (raw.startsWith('{')) {
62
- try {
63
- const parsed = JSON.parse(raw) as Record<string, unknown>;
64
- for (const key of ['command', 'cmd', 'path', 'file_path', 'file', 'url', 'query', 'pattern']) {
65
- const value = parsed[key];
66
- if (typeof value === 'string' && value.trim()) {
67
- return key === 'path' || key === 'file' || key === 'file_path'
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
- return '';
72
- } catch { /* not JSON after all; fall through to the raw text */ }
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
- if (typeof navigator === 'undefined') return '';
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 platformLooksMac(platform) ? event.metaKey : event.ctrlKey;
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 = platformLooksMac(options.platform ?? currentFolderShortcutPlatform());
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 isMacLike(): boolean {
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 isMacLike() ? event.metaKey : event.ctrlKey;
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(--text-primary);
14
- box-shadow: inset 2px 0 0 var(--accent);
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 { border-color: transparent; background: var(--sidebar-row-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) 42%, transparent);
435
- background: color-mix(in srgb, var(--accent) 6%, transparent);
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
- box-shadow: inset 3px 0 0 var(--accent);
568
- background: color-mix(in srgb, var(--accent) 5%, transparent);
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: 8px 12px;
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: color-mix(in srgb, var(--accent) 12%, transparent);
88
+ background: var(--accent-soft);
89
89
  color: var(--ink-primary);
90
- box-shadow: inset 3px 0 0 var(--accent);
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 {
@@ -128,7 +128,7 @@
128
128
  }
129
129
  .manager-mobile-nav { display: none; grid-area: mobile-nav; }
130
130
  .sidebar-rail {
131
- min-height: 54px;
131
+ min-height: var(--workspace-topbar-height);
132
132
  display: flex;
133
133
  align-items: center;
134
134
  gap: 10px;
@@ -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();