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
@@ -1,6 +1,7 @@
1
1
  import { useEffect, useMemo, useRef, useState } from 'react';
2
2
  import type { KeyboardEvent } from 'react';
3
3
  import { SelectField, TextField } from '../../fields';
4
+ import { SettingsActions, SettingsNote } from '../page-shell';
4
5
  import type { SettingsClient } from '../../types';
5
6
  import type { PiProfileMode, PiSettingsView } from './pi-profile';
6
7
 
@@ -121,7 +122,7 @@ export function PiProfileDialog({ client, pi, provider, model, onClose, onRegist
121
122
  <h3 id="pi-profile-title">Pi Settings</h3>
122
123
  <button type="button" className="settings-action settings-action-discard" onClick={onClose}>Close</button>
123
124
  </header>
124
- <div className="settings-page-form">
125
+ <div className="settings-section-body">
125
126
  <SelectField
126
127
  id="pi-profile-mode"
127
128
  label="Mode"
@@ -133,11 +134,13 @@ export function PiProfileDialog({ client, pi, provider, model, onClose, onRegist
133
134
  <TextField id="pi-profile-endpoint" label="Endpoint" value={endpoint} onChange={setEndpoint} placeholder={defaultEndpoint(mode)} />
134
135
  <TextField id="pi-profile-model" label="Model" value={modelId} onChange={setModelId} placeholder="grok-composer-2.5-fast" />
135
136
  <TextField id="pi-profile-key" label="API Key" value={apiKey} onChange={setApiKey} placeholder={current?.apiKeySet ? `set (${current.apiKeyLast4 || '****'})` : 'empty for local proxy'} />
136
- <p className="settings-empty">Default: grok-composer-2.5-fast. Bare grok-composer-2.5 currently has no verified team access.</p>
137
- {error ? <p className="settings-field-error" role="alert">{error}</p> : null}
138
- <button type="button" className="settings-action settings-action-save" disabled={busy} onClick={() => void register()}>
139
- {busy ? 'Registering...' : 'Register'}
140
- </button>
137
+ <SettingsNote>Default: grok-composer-2.5-fast. Bare grok-composer-2.5 currently has no verified team access.</SettingsNote>
138
+ {error ? <SettingsNote tone="error" role="alert">{error}</SettingsNote> : null}
139
+ <SettingsActions>
140
+ <button type="button" className="settings-action settings-action-save" disabled={busy} onClick={() => void register()}>
141
+ {busy ? 'Registering...' : 'Register'}
142
+ </button>
143
+ </SettingsActions>
141
144
  </div>
142
145
  </div>
143
146
  </div>
@@ -93,15 +93,15 @@ export function ChannelSetupDialog({channel,client,t,initialDraft,returnFocus,on
93
93
  <label htmlFor="sl-setup-name">{t('onboarding.slackAppName')}</label>
94
94
  <input id="sl-setup-name" value={name} onChange={event=>{setName(event.target.value);setFlow(resetSlackSetup);setManifestStatus('');}}/>
95
95
  <p>{t('onboarding.guide.slack')}</p>
96
- <button type="button" onClick={()=>void manifest()}>{t('onboarding.slackGenerateManifest')}</button>
96
+ <button type="button" className="settings-action" onClick={()=>void manifest()}>{t('onboarding.slackGenerateManifest')}</button>
97
97
  <p role="status">{manifestStatus}</p>
98
- <button type="button" disabled={flow.slackSetupStage==='manifest'} onClick={()=>{
98
+ <button type="button" className="settings-action" disabled={flow.slackSetupStage==='manifest'} onClick={()=>{
99
99
  window.open(ISSUER_URLS.slack,'_blank','noopener');setFlow(markSlackIssuerOpened);
100
100
  }}>{t('onboarding.openIssuer')}</button>
101
101
  </>}
102
102
  {flow.step===1 && channel!=='slack' && <>
103
103
  <p>{t(`onboarding.guide.${channel}`)}</p>
104
- <button type="button" onClick={()=>window.open(ISSUER_URLS[channel],'_blank','noopener')}>{t('onboarding.openIssuer')}</button>
104
+ <button type="button" className="settings-action" onClick={()=>window.open(ISSUER_URLS[channel],'_blank','noopener')}>{t('onboarding.openIssuer')}</button>
105
105
  </>}
106
106
  {flow.step===2 && fieldsFor(channel).map(field=><label key={field.key}>
107
107
  {t(`onboarding.token.${field.key}`)}{field.optional ? ` (${t('onboarding.optional')})` : ''}
@@ -110,17 +110,17 @@ export function ChannelSetupDialog({channel,client,t,initialDraft,returnFocus,on
110
110
  <span>{t(`onboarding.hint.${channel}.${field.key}`)}</span>
111
111
  </label>)}
112
112
  {flow.step===3 && <>
113
- <button type="button" onClick={()=>void validate()}>{t('onboarding.validate')}</button>
113
+ <button type="button" className="settings-action" onClick={()=>void validate()}>{t('onboarding.validate')}</button>
114
114
  {flow.validatedIdentity && <p>{t('onboarding.valid',{identity:flow.validatedIdentity})}</p>}
115
115
  </>}
116
116
  {flow.step===4 && <p>{t(flow.saved?`onboarding.next.${channel}`:'onboarding.saveHint')}</p>}
117
- {flow.step>1 && <button type="button" onClick={()=>setFlow(goBack)}>{t('onboarding.back')}</button>}
118
- {flow.step<4 ? <button type="button" disabled={!canAdvance(flow)} onClick={()=>setFlow(advance)}>{t('onboarding.next')}</button>
119
- : <button type="button" disabled={!flow.validatedIdentity} onClick={()=>void save()}>{t('onboarding.save')}</button>}
117
+ {flow.step>1 && <button type="button" className="settings-action" onClick={()=>setFlow(goBack)}>{t('onboarding.back')}</button>}
118
+ {flow.step<4 ? <button type="button" className="settings-action settings-action-save" disabled={!canAdvance(flow)} onClick={()=>setFlow(advance)}>{t('onboarding.next')}</button>
119
+ : <button type="button" className="settings-action settings-action-save" disabled={!flow.validatedIdentity} onClick={()=>void save()}>{t('onboarding.save')}</button>}
120
120
  </fieldset>
121
121
  {(error || flow.error || (flow.step===2 && blockerForStep(flow))) && <p role="alert">{error ?? t(`onboarding.error.${flow.error ?? blockerForStep(flow)}`)}</p>}
122
122
  {!!flow.missingScopes.length && <p role="alert">{flow.missingScopes.join(', ')}</p>}
123
123
  {!!flow.missingCapabilities.length && <p role="status">{t('onboarding.warning.missingCapabilities',{capabilities:flow.missingCapabilities.join(', ')})}</p>}
124
- <button type="button" disabled={channel!=='slack' && busy} onClick={close}>{t('onboarding.close')}</button>
124
+ <button type="button" className="settings-action" disabled={channel!=='slack' && busy} onClick={close}>{t('onboarding.close')}</button>
125
125
  </dialog>;
126
126
  }
@@ -1,5 +1,6 @@
1
1
  import { useCallback, useEffect, useRef, useState } from 'react';
2
2
  import type { SettingsClient } from '../../types';
3
+ import { StatusBadge } from '../page-shell';
3
4
 
4
5
  export type MessengerChannel = 'telegram' | 'discord' | 'slack';
5
6
 
@@ -110,25 +111,28 @@ export function TransportStatusChips({ client, channel }: Props) {
110
111
  const showHint = Boolean(status?.configured && status.sendCapable && !status.activeInbound);
111
112
 
112
113
  return (
113
- <div className="settings-transport-status" role="status" aria-live="polite">
114
- {error ? <p className="settings-field-hint">{error}</p> : null}
114
+ <div className="settings-transport-status settings-card-toolbar" role="status" aria-live="polite">
115
+ {error ? <span className="settings-field-hint">{error}</span> : null}
115
116
  {status ? (
116
117
  <>
117
- <div className="settings-transport-chips">
118
- {transportChipLabels(status).map(label => (
119
- <span key={label} className="settings-health-pill is-ok">{label}</span>
120
- ))}
121
- </div>
118
+ {transportChipLabels(status).map(label => (
119
+ <StatusBadge
120
+ key={label}
121
+ tone={label === 'Not configured' ? 'neutral' : 'ok'}
122
+ >
123
+ {label}
124
+ </StatusBadge>
125
+ ))}
122
126
  {showHint ? (
123
- <p className="settings-field-hint">
127
+ <span className="settings-field-hint">
124
128
  This transport is not receiving inbound messages, but send-only delivery remains available.
125
- </p>
129
+ </span>
126
130
  ) : null}
127
131
  </>
128
132
  ) : null}
129
133
  <button
130
134
  type="button"
131
- className="settings-action settings-action-discard"
135
+ className="settings-action"
132
136
  onClick={() => void refresh()}
133
137
  >
134
138
  Refresh transport status
@@ -1,4 +1,4 @@
1
- import { SettingsSection } from '../../page-shell';
1
+ import { SettingsActions, SettingsNote, SettingsSection, SettingsToolbar, StatusBadge } from '../../page-shell';
2
2
  import { RuntimeEmployeeRow } from './RuntimeEmployeeRow';
3
3
  import type { CliMeta } from './agent-meta';
4
4
  import {
@@ -43,40 +43,40 @@ export function AgentEmployeesSection({
43
43
  title="Employees"
44
44
  hint="Runtime dispatch roster. Static employees keep their locked identity; database employees can be edited."
45
45
  >
46
- <div className="settings-runtime-employee-summary">
47
- <span>+{summary.added}</span>
48
- <span>~{summary.updated}</span>
49
- <span>-{summary.removed}</span>
50
- {hasErrors ? <strong>Fix invalid rows before saving.</strong> : null}
51
- </div>
52
- {loading ? <p className="settings-agent-note">Loading employees...</p> : null}
53
- {error ? <p className="settings-field-error" role="alert">{error}</p> : null}
46
+ <SettingsToolbar>
47
+ <span className="settings-runtime-employee-summary">
48
+ <span>+{summary.added}</span>
49
+ <span>~{summary.updated}</span>
50
+ <span>-{summary.removed}</span>
51
+ </span>
52
+ {hasErrors ? <StatusBadge tone="error">Fix invalid rows before saving.</StatusBadge> : null}
53
+ </SettingsToolbar>
54
+ {loading ? <SettingsNote>Loading employees...</SettingsNote> : null}
55
+ {error ? <SettingsNote tone="error" role="alert">{error}</SettingsNote> : null}
54
56
  {roster.length === 0 ? (
55
- <p className="settings-empty">No runtime employees configured.</p>
57
+ <SettingsNote>No runtime employees configured.</SettingsNote>
56
58
  ) : (
57
- <div className="settings-runtime-employee-list">
58
- {roster.map((employee, idx) => (
59
- <RuntimeEmployeeRow
60
- key={employee.id}
61
- employee={employee}
62
- index={idx}
63
- cliOptions={cliOptions}
64
- cliMeta={cliMeta ?? null}
65
- onChange={(patch) => updateRow(idx, patch)}
66
- onRemove={() => removeRow(idx)}
67
- />
68
- ))}
69
- </div>
59
+ roster.map((employee, idx) => (
60
+ <RuntimeEmployeeRow
61
+ key={employee.id}
62
+ employee={employee}
63
+ index={idx}
64
+ cliOptions={cliOptions}
65
+ cliMeta={cliMeta ?? null}
66
+ onChange={(patch) => updateRow(idx, patch)}
67
+ onRemove={() => removeRow(idx)}
68
+ />
69
+ ))
70
70
  )}
71
- <div className="settings-employee-footer-bar">
71
+ <SettingsActions>
72
72
  <button
73
73
  type="button"
74
- className="settings-action settings-action-discard"
74
+ className="settings-action"
75
75
  onClick={() => onRosterChange([...roster, makeDefaultRuntimeEmployee(cliOptions, cliMeta)])}
76
76
  >
77
77
  + Add employee
78
78
  </button>
79
- </div>
79
+ </SettingsActions>
80
80
  </SettingsSection>
81
81
  );
82
82
  }
@@ -1,5 +1,5 @@
1
1
  import { SelectField } from '../../../fields';
2
- import { SettingsSection } from '../../page-shell';
2
+ import { SettingsNote, SettingsSection } from '../../page-shell';
3
3
  import {
4
4
  configuredPolicyLabel,
5
5
  isAllowlistValid,
@@ -49,12 +49,12 @@ export function PermissionQuickSection({ value, configuredValue, onChange }: Per
49
49
  }}
50
50
  />
51
51
  {mode === 'invalid' ? (
52
- <p className="settings-agent-note" role="alert">
52
+ <SettingsNote tone="error" role="alert">
53
53
  The saved permissions value is not a recognized policy. Choose a policy to replace it.
54
- </p>
54
+ </SettingsNote>
55
55
  ) : null}
56
- {summary ? <p className="settings-agent-note">{summary}</p> : null}
57
- <p className="settings-agent-note" id="agent-configured-policy">Configured policy: {configuredPolicyLabel(configuredValue)}</p>
56
+ {summary ? <SettingsNote>{summary}</SettingsNote> : null}
57
+ <SettingsNote><span id="agent-configured-policy">Configured policy: {configuredPolicyLabel(configuredValue)}</span></SettingsNote>
58
58
  </SettingsSection>
59
59
  );
60
60
  }
@@ -1,4 +1,5 @@
1
1
  import { SelectField, TextField } from '../../../fields';
2
+ import { SettingsActions, StatusBadge } from '../../page-shell';
2
3
  import { metaFor, optionList, selectableRuntimeOptions, isRetiredCliSelection, retiredRuntimeLabel, type CliMeta } from './agent-meta';
3
4
  import {
4
5
  isStaticEmployee,
@@ -30,12 +31,13 @@ export function RuntimeEmployeeRow({
30
31
  const retired = isRetiredCliSelection(employee.cli);
31
32
  const cliChoices = selectableRuntimeOptions(Array.from(new Set([...cliOptions, employee.cli, 'claude'])).filter(Boolean));
32
33
 
34
+ const employeeName = employee.name || `Employee ${index + 1}`;
33
35
  return (
34
- <fieldset className="settings-runtime-employee-row">
35
- <legend>
36
- {employee.name || `Employee ${index + 1}`}
37
- {locked ? <span>static</span> : null}
38
- </legend>
36
+ <div className="settings-runtime-employee-row" role="group" aria-label={employeeName}>
37
+ <p className="settings-runtime-employee-head">
38
+ <span className="settings-runtime-employee-name">{employeeName}</span>
39
+ {locked ? <StatusBadge tone="neutral">static</StatusBadge> : null}
40
+ </p>
39
41
  <div className="settings-runtime-employee-grid">
40
42
  <TextField
41
43
  id={`runtime-employee-${employee.id}-name`}
@@ -74,18 +76,19 @@ export function RuntimeEmployeeRow({
74
76
  onChange={(next) => onChange({ role: next })}
75
77
  />
76
78
  </div>
77
- <div className="settings-runtime-employee-footer">
78
- <span>{employee.source}{employee.status ? ` / ${employee.status}` : ''}</span>
79
+ <SettingsActions
80
+ status={<span>{employee.source}{employee.status ? ` / ${employee.status}` : ''}</span>}
81
+ >
79
82
  <button
80
83
  type="button"
81
- className="settings-action settings-action-discard"
84
+ className="settings-action settings-action-danger"
82
85
  disabled={locked}
83
86
  onClick={onRemove}
84
- aria-label={`Remove employee ${employee.name || index + 1}`}
87
+ aria-label={`Remove employee ${employeeName}`}
85
88
  >
86
89
  Remove
87
90
  </button>
88
- </div>
89
- </fieldset>
91
+ </SettingsActions>
92
+ </div>
90
93
  );
91
94
  }
@@ -48,8 +48,7 @@ export function RuntimeHeader({
48
48
  title="Agent runtime"
49
49
  hint="Active CLI, model, effort, and workspace used by this instance."
50
50
  >
51
- <div className="settings-agent-runtime-grid">
52
- <SelectField
51
+ <SelectField
53
52
  id="agent-cli"
54
53
  label="Active CLI"
55
54
  value={cli}
@@ -95,7 +94,6 @@ export function RuntimeHeader({
95
94
  placeholder="/path/to/project"
96
95
  onChange={onWorkingDirChange}
97
96
  />
98
- </div>
99
97
  </SettingsSection>
100
98
  );
101
99
  }
@@ -36,8 +36,6 @@ export type PerCliEntry = {
36
36
  model?: string;
37
37
  effort?: string;
38
38
  fastMode?: boolean;
39
- contextWindowSize?: number;
40
- contextWindowCompactLimit?: number;
41
39
  [key: string]: unknown;
42
40
  };
43
41
 
@@ -41,7 +41,7 @@ export function RuntimeTransportField({ cli, original, dirty, disabled = false,
41
41
  if (key === null) return null;
42
42
 
43
43
  return (
44
- <div>
44
+ <>
45
45
  <SelectField
46
46
  id={`percli-${cli}-transport`}
47
47
  label="Runtime transport"
@@ -63,6 +63,6 @@ export function RuntimeTransportField({ cli, original, dirty, disabled = false,
63
63
  : 'Native requires Auto (YOLO) permissions; no native worker assignments.'}
64
64
  </p>
65
65
  ) : null}
66
- </div>
66
+ </>
67
67
  );
68
68
  }
@@ -1,8 +1,12 @@
1
1
  import type { SettingsPageProps } from '../../types';
2
+ import { SettingsSection } from '../page-shell';
2
3
  import { COPY, normalizeDashboardLocale, TitleSupportSummary } from './shared';
3
4
  export default function Activity({manager}: SettingsPageProps) {
4
5
  if (!manager) return null;
5
6
  const locale = normalizeDashboardLocale(manager.ui.locale), copy = COPY[locale];
6
- return <section className="dashboard-settings-section"><header><h3>{copy.activityTitle}</h3><p>{copy.activityDescription}</p></header>
7
- <TitleSupportSummary support={manager.titleSupport} locale={locale}/></section>;
7
+ return (
8
+ <SettingsSection title={copy.activityTitle} hint={copy.activityDescription}>
9
+ <TitleSupportSummary support={manager.titleSupport} locale={locale}/>
10
+ </SettingsSection>
11
+ );
8
12
  }
@@ -1,6 +1,7 @@
1
1
  import type { SettingsPageProps } from '../../types';
2
2
  import type { DashboardShortcutAction } from '../../../types';
3
3
  import { formatShortcut, MANAGER_SHORTCUT_ACTIONS } from '../../../manager-shortcuts';
4
+ import { SettingsSection } from '../page-shell';
4
5
  import { COPY, LOCALE_OPTIONS, normalizeDashboardLocale, DashboardSettingToggle, DashboardSettingSelect, DashboardShortcutInput, shortcutCopyKey } from './shared';
5
6
  export default function Display({manager}: SettingsPageProps) {
6
7
  if (!manager) return null;
@@ -17,12 +18,7 @@ export default function Display({manager}: SettingsPageProps) {
17
18
  }
18
19
 
19
20
  return (
20
- <section className="dashboard-settings-section">
21
- <header>
22
- <h3>{copy.displayTitle}</h3>
23
- <p>{copy.displayDescription}</p>
24
- </header>
25
- <div className="dashboard-settings-field-list">
21
+ <SettingsSection title={copy.displayTitle} hint={copy.displayDescription}>
26
22
  <DashboardSettingToggle
27
23
  id="dashboard-show-activity-title"
28
24
  label={copy.fields.activity.label}
@@ -86,7 +82,6 @@ export default function Display({manager}: SettingsPageProps) {
86
82
  />
87
83
  );
88
84
  })}
89
- </div>
90
- </section>
85
+ </SettingsSection>
91
86
  );
92
87
  }
@@ -1,5 +1,6 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import type { DashboardLocale, DashboardShortcutAction } from '../../../types';
3
+ import { SettingsKeyValue, StatusBadge, SettingsNote } from '../page-shell';
3
4
  import type { DashboardActivityTitleSupport } from '../../../dashboard-settings/activity-title-support';
4
5
  const LOCALE_OPTIONS = [
5
6
  { value: 'ko', label: '한국어 (ko)' },
@@ -53,7 +54,7 @@ const COPY = {
53
54
  shortcuts: {
54
55
  label: '전역 단축키',
55
56
  scope: 'Manager dashboard',
56
- description: '입력창과 에디터 바깥에서만 작동하는 Manager 이동 단축키를 켭니다.',
57
+ description: '입력창과 에디터 바깥에서만 작동하는 Manager 이동 단축키를 켭니다. Meta는 macOS에서 ⌘, Windows·Linux에서 Ctrl이고, Windows 키는 Win으로 적습니다.',
57
58
  },
58
59
  shortcutFocusInstances: {
59
60
  label: '인스턴스 목록',
@@ -120,6 +121,11 @@ const COPY = {
120
121
  scope: '단축키',
121
122
  description: '터미널 탭을 열고 새 셸 세션을 시작합니다.',
122
123
  },
124
+ shortcutNewCodeSession: {
125
+ label: '새 Code 세션',
126
+ scope: '단축키',
127
+ description: 'Code 모드 사이드바에서 새 세션 초안을 시작합니다.',
128
+ },
123
129
  shortcutTerminalNewTab: {
124
130
  label: '새 터미널 탭',
125
131
  scope: '단축키',
@@ -244,7 +250,7 @@ const COPY = {
244
250
  shortcuts: {
245
251
  label: 'Global shortcuts',
246
252
  scope: 'Manager dashboard',
247
- description: 'Enable Manager navigation shortcuts outside inputs and editors.',
253
+ description: 'Enable Manager navigation shortcuts outside inputs and editors. Meta means ⌘ on macOS and Ctrl on Windows/Linux; write Win for the Windows key.',
248
254
  },
249
255
  shortcutFocusInstances: {
250
256
  label: 'Instance list',
@@ -311,6 +317,11 @@ const COPY = {
311
317
  scope: 'Shortcut',
312
318
  description: 'Open the terminal tab and start a new shell session.',
313
319
  },
320
+ shortcutNewCodeSession: {
321
+ label: 'New Code session',
322
+ scope: 'Shortcut',
323
+ description: 'Start a new session draft in Code mode.',
324
+ },
314
325
  shortcutTerminalNewTab: {
315
326
  label: 'New terminal tab',
316
327
  scope: 'Shortcut',
@@ -435,7 +446,7 @@ const COPY = {
435
446
  shortcuts: {
436
447
  label: '全局快捷键',
437
448
  scope: 'Manager dashboard',
438
- description: '在输入框和编辑器外启用 Manager 导航快捷键。',
449
+ description: '在输入框和编辑器外启用 Manager 导航快捷键。Meta 在 macOS 上是 ⌘,在 Windows/Linux 上是 Ctrl;Windows 键请写作 Win。',
439
450
  },
440
451
  shortcutFocusInstances: {
441
452
  label: '实例列表',
@@ -502,6 +513,11 @@ const COPY = {
502
513
  scope: '快捷键',
503
514
  description: '打开终端标签并启动新的 Shell 会话。',
504
515
  },
516
+ shortcutNewCodeSession: {
517
+ label: '新 Code 会话',
518
+ scope: '快捷键',
519
+ description: '在 Code 模式侧边栏中开始新的会话草稿。',
520
+ },
505
521
  shortcutTerminalNewTab: {
506
522
  label: '新终端标签',
507
523
  scope: '快捷键',
@@ -626,7 +642,7 @@ const COPY = {
626
642
  shortcuts: {
627
643
  label: 'グローバルショートカット',
628
644
  scope: 'Manager dashboard',
629
- description: '入力欄とエディタ外で Manager ナビゲーションショートカットを有効にします。',
645
+ description: '入力欄とエディタ外で Manager ナビゲーションショートカットを有効にします。Meta は macOS では ⌘、Windows/Linux では Ctrl です。Windows キーは Win と書きます。',
630
646
  },
631
647
  shortcutFocusInstances: {
632
648
  label: 'インスタンス一覧',
@@ -693,6 +709,11 @@ const COPY = {
693
709
  scope: 'ショートカット',
694
710
  description: 'ターミナルタブを開き、新しいシェルセッションを開始します。',
695
711
  },
712
+ shortcutNewCodeSession: {
713
+ label: '新しい Code セッション',
714
+ scope: 'ショートカット',
715
+ description: 'Code モードのサイドバーで新しいセッションの下書きを開始します。',
716
+ },
696
717
  shortcutTerminalNewTab: {
697
718
  label: '新しいターミナルタブ',
698
719
  scope: 'ショートカット',
@@ -790,18 +811,14 @@ type DashboardSettingRowProps = {
790
811
 
791
812
  function DashboardSettingRow(props: DashboardSettingRowProps) {
792
813
  return (
793
- <div className="dashboard-settings-row">
794
- <div className="dashboard-settings-row-main">
795
- <label className="dashboard-settings-row-heading" htmlFor={props.id}>
796
- <span>{props.label}</span>
797
- <span className="dashboard-settings-row-scope">{props.scope}</span>
798
- </label>
799
- <p className="dashboard-settings-row-description">{props.description}</p>
800
- </div>
801
- <div className="dashboard-settings-row-control">
802
- {props.children}
803
- </div>
804
- </div>
814
+ <label className="settings-field" htmlFor={props.id}>
815
+ <span className="settings-field-label">{props.label}</span>
816
+ {props.children}
817
+ <span className="settings-field-description">
818
+ <span className="dashboard-settings-row-scope">{props.scope}</span>{' '}
819
+ {props.description}
820
+ </span>
821
+ </label>
805
822
  );
806
823
  }
807
824
 
@@ -819,7 +836,6 @@ function DashboardSettingToggle(props: DashboardSettingToggleProps) {
819
836
  <DashboardSettingRow id={props.id} label={props.label} scope={props.scope} description={props.description}>
820
837
  <input
821
838
  id={props.id}
822
- className="dashboard-settings-toggle"
823
839
  type="checkbox"
824
840
  checked={props.value}
825
841
  onChange={(event) => props.onChange(event.currentTarget.checked)}
@@ -852,7 +868,6 @@ function DashboardSettingSelect(props: DashboardSettingSelectProps) {
852
868
  <DashboardSettingRow id={props.id} label={props.label} scope={props.scope} description={props.description}>
853
869
  <select
854
870
  id={props.id}
855
- className="dashboard-settings-select"
856
871
  value={props.value}
857
872
  onChange={(event) => props.onChange(normalizeDashboardLocale(event.currentTarget.value))}
858
873
  >
@@ -869,8 +884,8 @@ function DashboardShortcutInput(props: DashboardShortcutInputProps) {
869
884
  <DashboardSettingRow id={`dashboard-shortcut-${props.action}`} label={props.label} scope={props.scope} description={props.description}>
870
885
  <input
871
886
  id={`dashboard-shortcut-${props.action}`}
872
- className="dashboard-settings-shortcut-input"
873
887
  type="text"
888
+ className="dashboard-settings-shortcut-input"
874
889
  value={props.value}
875
890
  aria-label={`${props.label} shortcut`}
876
891
  placeholder="Alt+I"
@@ -892,6 +907,7 @@ const SHORTCUT_COPY_KEYS: Record<DashboardShortcutAction, keyof typeof COPY.ko.f
892
907
  toggleLeftSidebar: 'shortcutToggleLeftSidebar',
893
908
  focusTerminal: 'shortcutFocusTerminal',
894
909
  newTerminalSession: 'shortcutNewTerminalSession',
910
+ newCodeSession: 'shortcutNewCodeSession',
895
911
  terminalNewTab: 'shortcutTerminalNewTab',
896
912
  terminalClear: 'shortcutTerminalClear',
897
913
  openDiff: 'shortcutOpenDiff',
@@ -927,20 +943,15 @@ function TitleSupportSummary({ support, locale }: { support: DashboardActivityTi
927
943
  const total = support.ready + support.legacy + support.offline;
928
944
  const copy = COPY[locale].support;
929
945
  return (
930
- <div className="dashboard-settings-status-grid" aria-label={copy.ariaLabel}>
931
- <div>
932
- <span>{copy.ready}</span>
933
- <strong>{support.ready}</strong>
934
- </div>
935
- <div>
936
- <span>{copy.legacy}</span>
937
- <strong>{support.legacy}</strong>
938
- </div>
939
- <div>
940
- <span>{copy.offline}</span>
941
- <strong>{support.offline}</strong>
942
- </div>
943
- <p>{total === 0 ? copy.empty : copy.restart}</p>
946
+ <div role="group" aria-label={copy.ariaLabel}>
947
+ <SettingsKeyValue
948
+ items={[
949
+ { label: copy.ready, value: <StatusBadge tone="ok">{support.ready}</StatusBadge> },
950
+ { label: copy.legacy, value: <StatusBadge tone="warn">{support.legacy}</StatusBadge> },
951
+ { label: copy.offline, value: <StatusBadge tone="neutral">{support.offline}</StatusBadge> },
952
+ ]}
953
+ />
954
+ <SettingsNote>{total === 0 ? copy.empty : copy.restart}</SettingsNote>
944
955
  </div>
945
956
  );
946
957
  }
@@ -155,3 +155,69 @@ export function SaveBar({ saving, isDirty, error, onDiscard }: SaveBarProps) {
155
155
  </div>
156
156
  );
157
157
  }
158
+
159
+ // ─── Card-body primitives ────────────────────────────────────────────
160
+ // Children of `SettingsSection` render as divided rows inside one card.
161
+ // These primitives share that row rhythm so pages never hand-roll grids,
162
+ // emoji status, or free-floating button strips.
163
+
164
+ export type StatusTone = 'ok' | 'warn' | 'error' | 'neutral';
165
+
166
+ export function StatusBadge({ tone, children }: { tone: StatusTone; children: ReactNode }) {
167
+ return (
168
+ <span className={`settings-status settings-status-${tone}`}>
169
+ <span className="settings-status-dot" aria-hidden="true" />
170
+ {children}
171
+ </span>
172
+ );
173
+ }
174
+
175
+ export type KeyValueItem = { label: string; value: ReactNode; mono?: boolean; className?: string };
176
+
177
+ export function SettingsKeyValue({ items }: { items: ReadonlyArray<KeyValueItem> }) {
178
+ return (
179
+ <dl className="settings-kv">
180
+ {items.map((item, index) => (
181
+ <div className={item.className ? `settings-kv-row ${item.className}` : 'settings-kv-row'} key={index}>
182
+ <dt>{item.label}</dt>
183
+ <dd className={item.mono ? 'settings-kv-mono' : undefined}>{item.value}</dd>
184
+ </div>
185
+ ))}
186
+ </dl>
187
+ );
188
+ }
189
+
190
+ export function SettingsActions({
191
+ children,
192
+ status,
193
+ }: {
194
+ children: ReactNode;
195
+ status?: ReactNode;
196
+ }) {
197
+ return (
198
+ <div className="settings-card-actions">
199
+ {status ? <div className="settings-card-actions-status">{status}</div> : null}
200
+ <div className="settings-card-actions-buttons">{children}</div>
201
+ </div>
202
+ );
203
+ }
204
+
205
+ export function SettingsToolbar({ children }: { children: ReactNode }) {
206
+ return <div className="settings-card-toolbar">{children}</div>;
207
+ }
208
+
209
+ export function SettingsNote({
210
+ children,
211
+ tone = 'muted',
212
+ role,
213
+ }: {
214
+ children: ReactNode;
215
+ tone?: 'muted' | 'warn' | 'error';
216
+ role?: 'status' | 'alert';
217
+ }) {
218
+ return (
219
+ <p className={`settings-card-note settings-card-note-${tone}`} role={role}>
220
+ {children}
221
+ </p>
222
+ );
223
+ }