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
@@ -5,9 +5,16 @@
5
5
  // array. Conditionally renders the schedule-body field based on
6
6
  // `schedule.kind` to avoid stale `cron` strings hanging around when
7
7
  // the user toggles to `every`, and vice versa.
8
+ //
9
+ // Layout follows the shared row language used by MCP servers and memory
10
+ // entries: a `settings-card-actions` header (name + enabled/kind badges +
11
+ // Remove) then the standard `.settings-field` rows. The component returns a
12
+ // fragment so the header lands as a direct child of
13
+ // `.settings-section-body` and picks up the standard item divider.
8
14
 
9
15
  import { useId } from 'react';
10
16
  import { TextField, ToggleField, SelectField } from '../../fields';
17
+ import { StatusBadge } from '../page-shell';
11
18
 
12
19
  export type HbScheduleEvery = {
13
20
  kind: 'every';
@@ -56,15 +63,37 @@ export function HeartbeatJobRow({
56
63
  const idBase = useId();
57
64
  const kind = job.schedule.kind;
58
65
  const tz = job.schedule.timeZone ?? '';
66
+ const title = job.name || `Job ${index + 1}`;
59
67
 
60
68
  return (
61
- <fieldset
62
- className="settings-heartbeat-job"
69
+ <div
70
+ className="settings-card-group"
71
+ role="group"
63
72
  aria-label={`Heartbeat job ${index + 1}${job.name ? ` (${job.name})` : ''}`}
64
73
  >
65
- <legend className="settings-heartbeat-job-legend">
66
- {job.name || `Job ${index + 1}`}
67
- </legend>
74
+ <div className="settings-card-actions">
75
+ <div className="settings-card-actions-status">
76
+ <strong>{title}</strong>{' '}
77
+ {job.enabled ? (
78
+ <StatusBadge tone="ok">Enabled</StatusBadge>
79
+ ) : (
80
+ <StatusBadge tone="neutral">Disabled</StatusBadge>
81
+ )}{' '}
82
+ <StatusBadge tone="neutral">
83
+ {kind === 'every' ? 'interval' : 'cron'}
84
+ </StatusBadge>
85
+ </div>
86
+ <div className="settings-card-actions-buttons">
87
+ <button
88
+ type="button"
89
+ className="settings-action settings-action-danger"
90
+ onClick={onRemove}
91
+ aria-label={`Remove heartbeat job ${title}`}
92
+ >
93
+ Remove job
94
+ </button>
95
+ </div>
96
+ </div>
68
97
 
69
98
  <ToggleField
70
99
  id={`${idBase}-enabled`}
@@ -184,16 +213,6 @@ export function HeartbeatJobRow({
184
213
  onChange={(event) => onChange({ prompt: event.target.value })}
185
214
  />
186
215
  </label>
187
-
188
- <div className="settings-heartbeat-job-footer">
189
- <button
190
- type="button"
191
- className="settings-action settings-action-discard"
192
- onClick={onRemove}
193
- >
194
- Remove job
195
- </button>
196
- </div>
197
- </fieldset>
216
+ </div>
198
217
  );
199
218
  }
@@ -8,7 +8,7 @@
8
8
 
9
9
  import { useCallback, useEffect, useState } from 'react';
10
10
  import type { DirtyStore, SettingsClient } from '../../types';
11
- import { PageError, PageOffline } from '../page-shell';
11
+ import { PageError, PageOffline, SettingsActions, SettingsNote } from '../page-shell';
12
12
  import { HeartbeatJobRow, type HbJob } from './HeartbeatJobRow';
13
13
  import {
14
14
  jobScheduleBodyError,
@@ -77,7 +77,7 @@ export function HeartbeatJobsSection({ port, client, dirty, snapshot }: Props) {
77
77
  }, [client, dirty, jobs]);
78
78
 
79
79
  if (snapshot.kind === 'loading') {
80
- return <p className="settings-section-hint">Loading jobs…</p>;
80
+ return <SettingsNote>Loading jobs…</SettingsNote>;
81
81
  }
82
82
  if (snapshot.kind === 'offline') return <PageOffline port={port} />;
83
83
  if (snapshot.kind === 'error') return <PageError message={snapshot.message} />;
@@ -98,11 +98,11 @@ export function HeartbeatJobsSection({ port, client, dirty, snapshot }: Props) {
98
98
  return (
99
99
  <>
100
100
  {jobs.length === 0 ? (
101
- <p className="settings-section-hint">
101
+ <SettingsNote>
102
102
  No jobs configured. Add one below.
103
- </p>
103
+ </SettingsNote>
104
104
  ) : (
105
- <div className="settings-heartbeat-jobs-list">
105
+ <>
106
106
  {jobs.map((job, idx) => (
107
107
  <HeartbeatJobRow
108
108
  key={job.id}
@@ -113,12 +113,12 @@ export function HeartbeatJobsSection({ port, client, dirty, snapshot }: Props) {
113
113
  onRemove={() => removeJob(idx)}
114
114
  />
115
115
  ))}
116
- </div>
116
+ </>
117
117
  )}
118
- <div className="settings-heartbeat-jobs-footer">
118
+ <SettingsActions>
119
119
  <button
120
120
  type="button"
121
- className="settings-action settings-action-discard"
121
+ className="settings-action"
122
122
  onClick={addJob}
123
123
  >
124
124
  + Add job
@@ -131,11 +131,11 @@ export function HeartbeatJobsSection({ port, client, dirty, snapshot }: Props) {
131
131
  >
132
132
  {saving ? 'Saving…' : 'Apply jobs'}
133
133
  </button>
134
- </div>
134
+ </SettingsActions>
135
135
  {error ? (
136
- <p className="settings-field-error" role="alert">
136
+ <SettingsNote tone="error" role="alert">
137
137
  {error}
138
- </p>
138
+ </SettingsNote>
139
139
  ) : null}
140
140
  </>
141
141
  );
@@ -6,7 +6,7 @@
6
6
 
7
7
  import { useCallback, useEffect, useState } from 'react';
8
8
  import type { DirtyStore, SettingsClient } from '../../types';
9
- import { PageError, PageOffline } from '../page-shell';
9
+ import { PageError, PageOffline, SettingsActions, SettingsNote } from '../page-shell';
10
10
  import type { SnapshotState } from '../page-shell';
11
11
 
12
12
  type Props = {
@@ -54,7 +54,7 @@ export function HeartbeatMarkdownSection({ port, client, dirty, snapshot }: Prop
54
54
  }, [client, dirty, content]);
55
55
 
56
56
  if (snapshot.kind === 'loading') {
57
- return <p className="settings-section-hint">Loading template…</p>;
57
+ return <SettingsNote>Loading template…</SettingsNote>;
58
58
  }
59
59
  if (snapshot.kind === 'offline') return <PageOffline port={port} />;
60
60
  if (snapshot.kind === 'error') return <PageError message={snapshot.message} />;
@@ -71,10 +71,10 @@ export function HeartbeatMarkdownSection({ port, client, dirty, snapshot }: Prop
71
71
  spellCheck={false}
72
72
  value={content}
73
73
  onChange={(event) => setContent(event.target.value)}
74
- style={{ fontFamily: 'ui-monospace, monospace' }}
74
+ style={{ fontFamily: 'var(--font-mono, ui-monospace, monospace)' }}
75
75
  />
76
76
  </label>
77
- <div className="settings-heartbeat-md-footer">
77
+ <SettingsActions>
78
78
  <button
79
79
  type="button"
80
80
  className="settings-action settings-action-save"
@@ -83,11 +83,11 @@ export function HeartbeatMarkdownSection({ port, client, dirty, snapshot }: Prop
83
83
  >
84
84
  {saving ? 'Saving…' : 'Save template'}
85
85
  </button>
86
- </div>
86
+ </SettingsActions>
87
87
  {error ? (
88
- <p className="settings-field-error" role="alert">
88
+ <SettingsNote tone="error" role="alert">
89
89
  {error}
90
- </p>
90
+ </SettingsNote>
91
91
  ) : null}
92
92
  </>
93
93
  );
@@ -10,16 +10,11 @@ type Props = {
10
10
  };
11
11
 
12
12
  export function InlineWarn({ children, tone = 'warn', role = 'note' }: Props) {
13
- const className = `settings-inline-warn settings-inline-warn-${tone}`;
14
- if (role === 'alert') {
15
- return (
16
- <p className={className} role="alert">
17
- {children}
18
- </p>
19
- );
20
- }
13
+ const className = tone === 'warn'
14
+ ? 'settings-card-note settings-card-note-warn'
15
+ : 'settings-card-note settings-card-note-muted';
21
16
  return (
22
- <p className={className} role="note">
17
+ <p className={className} role={role}>
23
18
  {children}
24
19
  </p>
25
20
  );
@@ -1,3 +1,8 @@
1
+ // Single MCP server editor. Renders as shared card-body rows — a
2
+ // `settings-card-actions` header (name + transport badge + remove) followed
3
+ // by the standard `.settings-field` divided rows — so server entries read
4
+ // like every other settings row instead of a bespoke card.
5
+
1
6
  import type { McpServer } from '../mcp-helpers';
2
7
  import {
3
8
  formatArgsText,
@@ -6,6 +11,7 @@ import {
6
11
  parseEnvText,
7
12
  getServerTag,
8
13
  } from '../mcp-helpers';
14
+ import { StatusBadge } from '../page-shell';
9
15
 
10
16
  type Props = {
11
17
  name: string;
@@ -32,39 +38,45 @@ export function McpServerCard({
32
38
  const isRemote = tag === 'remote';
33
39
 
34
40
  return (
35
- <article className="mcp-server-card" aria-label={`MCP server ${name || '(unnamed)'}`}>
36
- <header className="mcp-server-card-header">
37
- <label className="settings-field settings-field-text" htmlFor={`${id}-name`}>
38
- <span className="settings-field-label">Server name</span>
39
- <input
40
- id={`${id}-name`}
41
- type="text"
42
- value={name}
43
- spellCheck={false}
44
- placeholder="my-server"
45
- aria-invalid={Boolean(nameError)}
46
- onChange={(event) => onRename(event.target.value)}
47
- />
48
- {nameError ? (
49
- <span className="settings-field-error" role="alert">
50
- {nameError}
51
- </span>
52
- ) : null}
53
- </label>
54
- <div className="mcp-server-card-actions">
55
- {tag ? (
56
- <span className="mcp-server-tag" data-tag={tag}>[{tag}]</span>
57
- ) : null}
41
+ <>
42
+ <div
43
+ className="settings-card-actions"
44
+ role="group"
45
+ aria-label={`MCP server ${name || '(unnamed)'}`}
46
+ >
47
+ <div className="settings-card-actions-status">
48
+ <strong>{name || '(unnamed)'}</strong>
49
+ {tag ? <StatusBadge tone="neutral">{tag}</StatusBadge> : null}
50
+ </div>
51
+ <div className="settings-card-actions-buttons">
58
52
  <button
59
53
  type="button"
60
- className="settings-action settings-action-discard"
54
+ className="settings-action settings-action-danger"
61
55
  onClick={onRemove}
62
56
  aria-label={`Remove ${name || 'server'}`}
63
57
  >
64
58
  Remove
65
59
  </button>
66
60
  </div>
67
- </header>
61
+ </div>
62
+
63
+ <label className="settings-field settings-field-text" htmlFor={`${id}-name`}>
64
+ <span className="settings-field-label">Server name</span>
65
+ <input
66
+ id={`${id}-name`}
67
+ type="text"
68
+ value={name}
69
+ spellCheck={false}
70
+ placeholder="my-server"
71
+ aria-invalid={Boolean(nameError)}
72
+ onChange={(event) => onRename(event.target.value)}
73
+ />
74
+ {nameError ? (
75
+ <span className="settings-field-error" role="alert">
76
+ {nameError}
77
+ </span>
78
+ ) : null}
79
+ </label>
68
80
 
69
81
  {isRemote ? (
70
82
  <>
@@ -142,6 +154,7 @@ export function McpServerCard({
142
154
  )}
143
155
 
144
156
  <label className="settings-field settings-field-toggle" htmlFor={`${id}-autostart`}>
157
+ <span className="settings-field-label">Autostart</span>
145
158
  <input
146
159
  id={`${id}-autostart`}
147
160
  type="checkbox"
@@ -150,8 +163,7 @@ export function McpServerCard({
150
163
  onChange({ ...server, autostart: event.target.checked })
151
164
  }
152
165
  />
153
- <span className="settings-field-label">Autostart</span>
154
166
  </label>
155
- </article>
167
+ </>
156
168
  );
157
169
  }
@@ -1,12 +1,15 @@
1
- // Phase 6 — single row in the Memory browse table.
1
+ // Phase 6 — single row in the Memory browse list.
2
2
  //
3
- // Pure presentational. Clicking the row opens a read-only modal with
4
- // the full value. The modal is owned by the parent Memory page so
5
- // only one is mounted at a time and Esc/backdrop dismissal lives in
6
- // one place.
3
+ // Pure presentational, rendered on the shared `settings-card-actions` row so
4
+ // memory entries read like the other entity rows (MCP servers, heartbeat
5
+ // jobs): key + source badge + length + preview on the left, Open on the
6
+ // right. Clicking opens a read-only modal with the full value — the modal is
7
+ // owned by the parent Memory page so only one is mounted at a time and
8
+ // Esc/backdrop dismissal lives in one place.
7
9
 
8
10
  import type { MemoryEntry } from './memory-helpers';
9
11
  import { previewValue } from './memory-helpers';
12
+ import { StatusBadge } from '../page-shell';
10
13
 
11
14
  type Props = {
12
15
  row: MemoryEntry;
@@ -15,22 +18,24 @@ type Props = {
15
18
 
16
19
  export function MemoryRow({ row, onOpen }: Props) {
17
20
  return (
18
- <tr className="settings-memory-row">
19
- <td className="settings-memory-key">
21
+ <div className="settings-card-actions">
22
+ <div className="settings-card-actions-status">
23
+ <strong><code>{row.key}</code></strong>{' '}
24
+ <StatusBadge tone="neutral">{row.source}</StatusBadge>{' '}
25
+ <span className="settings-field-hint">
26
+ {row.value.length} chars · {previewValue(row.value)}
27
+ </span>
28
+ </div>
29
+ <div className="settings-card-actions-buttons">
20
30
  <button
21
31
  type="button"
22
- className="settings-memory-link"
32
+ className="settings-action"
23
33
  onClick={() => onOpen(row)}
24
34
  aria-label={`Open memory entry ${row.key}`}
25
35
  >
26
- {row.key}
36
+ Open
27
37
  </button>
28
- </td>
29
- <td className="settings-memory-source">{row.source}</td>
30
- <td className="settings-memory-length">{row.value.length}</td>
31
- <td className="settings-memory-preview" title={row.value}>
32
- {previewValue(row.value)}
33
- </td>
34
- </tr>
38
+ </div>
39
+ </div>
35
40
  );
36
41
  }
@@ -3,6 +3,7 @@
3
3
  import { useLayoutEffect, useRef, useState } from 'react';
4
4
  import type { ComponentProps } from 'react';
5
5
  import { TextField, SelectField, ToggleField } from '../../fields';
6
+ import { SettingsToolbar } from '../page-shell';
6
7
  import type { SettingsClient } from '../../types';
7
8
  import type { DirtyEntry, DirtyStore } from '../../types';
8
9
  import { coerceEffortForModel, effortChoicesForModel } from './agent/agent-meta';
@@ -57,137 +58,137 @@ export function PerCliRow({ cli, meta, original, value, setValue, setEntry, dirt
57
58
 
58
59
  return (
59
60
  <div className="settings-percli-row" data-cli={cli}>
60
- <h3 className="settings-percli-title">{meta.label}</h3>
61
+ <SettingsToolbar>
62
+ <strong className="settings-percli-title">{meta.label}</strong>
63
+ </SettingsToolbar>
61
64
  <div className={`settings-percli-grid${isPi ? ' settings-percli-grid--pi' : ''}`}>
62
- {isPi && piProfileOptions(pi, provider).length ? (
63
- <SelectField
64
- id={`percli-${cli}-provider`}
65
- label="Provider"
66
- disabled={disabled}
67
- value={provider}
68
- options={piProfileOptions(pi, provider).map((p) => ({ value: p, label: p }))}
69
- onChange={(next) => {
70
- if (blocked.current) return;
71
- const nextModels = piModelOptions(pi, next);
72
- const nextModel = nextModels.includes(value.model || '') ? (value.model || '') : (nextModels[0] || '');
73
- setValue({ ...value, provider: next, model: nextModel });
74
- setEntry(`perCli.${cli}.provider`, entryFor(next, original.provider ?? 'progrok'));
75
- setEntry(`perCli.${cli}.model`, entryFor(nextModel, original.model ?? ''));
76
- }}
77
- />
78
- ) : hasProviders ? (
65
+ {isPi && piProfileOptions(pi, provider).length ? (
66
+ <SelectField
67
+ id={`percli-${cli}-provider`}
68
+ label="Provider"
69
+ disabled={disabled}
70
+ value={provider}
71
+ options={piProfileOptions(pi, provider).map((p) => ({ value: p, label: p }))}
72
+ onChange={(next) => {
73
+ if (blocked.current) return;
74
+ const nextModels = piModelOptions(pi, next);
75
+ const nextModel = nextModels.includes(value.model || '') ? (value.model || '') : (nextModels[0] || '');
76
+ setValue({ ...value, provider: next, model: nextModel });
77
+ setEntry(`perCli.${cli}.provider`, entryFor(next, original.provider ?? 'progrok'));
78
+ setEntry(`perCli.${cli}.model`, entryFor(nextModel, original.model ?? ''));
79
+ }}
80
+ />
81
+ ) : hasProviders ? (
82
+ <SelectField
83
+ id={`percli-${cli}-provider`}
84
+ label="Provider"
85
+ disabled={disabled}
86
+ value={provider}
87
+ options={(meta.providers ?? []).map((p) => ({ value: p, label: p }))}
88
+ onChange={(next) => {
89
+ if (blocked.current) return;
90
+ const nextModels = meta.modelsByProvider?.[next] ?? [];
91
+ const nextEfforts = meta.effortsByProvider?.[next] ?? [];
92
+ const nextModel = nextModels.includes(value.model || '') ? (value.model || '') : (nextModels[0] || '');
93
+ // Resolve against the NEW provider+model pair: the same
94
+ // model id can allow different efforts per provider.
95
+ const nextEffort = coerceEffortForModel(meta, nextModel, value.effort ?? '', nextEfforts, next);
96
+ setValue({ ...value, provider: next, model: nextModel, effort: nextEffort });
97
+ setEntry(`perCli.${cli}.provider`, entryFor(next, original.provider ?? meta.defaultProvider ?? 'claude'));
98
+ setEntry(`perCli.${cli}.model`, entryFor(nextModel, original.model ?? ''));
99
+ setEntry(`perCli.${cli}.effort`, entryFor(nextEffort, original.effort ?? ''));
100
+ }}
101
+ />
102
+ ) : null}
103
+ {isPi && modelOptions.length > 0 ? (
104
+ <SelectField
105
+ id={`percli-${cli}-model`}
106
+ label="Model"
107
+ disabled={disabled}
108
+ value={value.model ?? modelOptions[0] ?? ''}
109
+ options={modelOptions.map((m) => ({ value: m, label: m }))}
110
+ onChange={(next) => {
111
+ if (blocked.current) return;
112
+ const nextEffort = coerceEffortForModel(meta, next, value.effort ?? '', providerEfforts, hasProviders ? provider : undefined);
113
+ setValue({ ...value, model: next, effort: nextEffort });
114
+ setEntry(`perCli.${cli}.model`, entryFor(next, original.model ?? ''));
115
+ if (nextEffort !== (value.effort ?? '')) {
116
+ setEntry(`perCli.${cli}.effort`, entryFor(nextEffort, original.effort ?? ''));
117
+ }
118
+ }}
119
+ />
120
+ ) : (
121
+ <TextField
122
+ id={`percli-${cli}-model`}
123
+ label="Model"
124
+ disabled={disabled}
125
+ value={value.model ?? ''}
126
+ onChange={(next) => {
127
+ if (blocked.current) return;
128
+ setValue({ ...value, model: next });
129
+ setEntry(`perCli.${cli}.model`, entryFor(next, original.model ?? ''));
130
+ }}
131
+ placeholder={modelOptions[0] ?? 'model id'}
132
+ />
133
+ )}
134
+ {meta.modelNote ? (
135
+ <p className="settings-percli-note">{meta.modelNote}</p>
136
+ ) : null}
137
+ {modelOptions.length > 0 ? (
138
+ <datalist id={modelDatalistId}>
139
+ {modelOptions.map((m) => (
140
+ <option key={m} value={m} />
141
+ ))}
142
+ </datalist>
143
+ ) : null}
144
+ {effortOptions.length > 0 ? (
145
+ <div className="settings-percli-effort">
79
146
  <SelectField
80
- id={`percli-${cli}-provider`}
81
- label="Provider"
147
+ id={`percli-${cli}-effort`}
148
+ label="Effort"
82
149
  disabled={disabled}
83
- value={provider}
84
- options={(meta.providers ?? []).map((p) => ({ value: p, label: p }))}
150
+ value={value.effort ?? ''}
151
+ options={[
152
+ { value: '', label: '(default)' },
153
+ ...effortOptions.map((e) => ({ value: e, label: e })),
154
+ ]}
85
155
  onChange={(next) => {
86
156
  if (blocked.current) return;
87
- const nextModels = meta.modelsByProvider?.[next] ?? [];
88
- const nextEfforts = meta.effortsByProvider?.[next] ?? [];
89
- const nextModel = nextModels.includes(value.model || '') ? (value.model || '') : (nextModels[0] || '');
90
- // Resolve against the NEW provider+model pair: the same
91
- // model id can allow different efforts per provider.
92
- const nextEffort = coerceEffortForModel(meta, nextModel, value.effort ?? '', nextEfforts, next);
93
- setValue({ ...value, provider: next, model: nextModel, effort: nextEffort });
94
- setEntry(`perCli.${cli}.provider`, entryFor(next, original.provider ?? meta.defaultProvider ?? 'claude'));
95
- setEntry(`perCli.${cli}.model`, entryFor(nextModel, original.model ?? ''));
96
- setEntry(`perCli.${cli}.effort`, entryFor(nextEffort, original.effort ?? ''));
157
+ setValue({ ...value, effort: next });
158
+ setEntry(`perCli.${cli}.effort`, entryFor(next, original.effort ?? ''));
97
159
  }}
98
160
  />
99
- ) : null}
100
- <div className="settings-percli-model">
101
- {isPi && modelOptions.length > 0 ? (
102
- <SelectField
103
- id={`percli-${cli}-model`}
104
- label="Model"
105
- disabled={disabled}
106
- value={value.model ?? modelOptions[0] ?? ''}
107
- options={modelOptions.map((m) => ({ value: m, label: m }))}
108
- onChange={(next) => {
109
- if (blocked.current) return;
110
- const nextEffort = coerceEffortForModel(meta, next, value.effort ?? '', providerEfforts, hasProviders ? provider : undefined);
111
- setValue({ ...value, model: next, effort: nextEffort });
112
- setEntry(`perCli.${cli}.model`, entryFor(next, original.model ?? ''));
113
- if (nextEffort !== (value.effort ?? '')) {
114
- setEntry(`perCli.${cli}.effort`, entryFor(nextEffort, original.effort ?? ''));
115
- }
116
- }}
117
- />
118
- ) : (
119
- <TextField
120
- id={`percli-${cli}-model`}
121
- label="Model"
122
- disabled={disabled}
123
- value={value.model ?? ''}
124
- onChange={(next) => {
125
- if (blocked.current) return;
126
- setValue({ ...value, model: next });
127
- setEntry(`perCli.${cli}.model`, entryFor(next, original.model ?? ''));
128
- }}
129
- placeholder={modelOptions[0] ?? 'model id'}
130
- />
131
- )}
132
- {meta.modelNote ? (
133
- <p className="settings-percli-note">{meta.modelNote}</p>
134
- ) : null}
135
- {modelOptions.length > 0 ? (
136
- <datalist id={modelDatalistId}>
137
- {modelOptions.map((m) => (
138
- <option key={m} value={m} />
139
- ))}
140
- </datalist>
161
+ {meta.effortNote ? (
162
+ <p className="settings-percli-note">{meta.effortNote}</p>
141
163
  ) : null}
142
164
  </div>
143
- {effortOptions.length > 0 ? (
144
- <div className="settings-percli-effort">
145
- <SelectField
146
- id={`percli-${cli}-effort`}
147
- label="Effort"
148
- disabled={disabled}
149
- value={value.effort ?? ''}
150
- options={[
151
- { value: '', label: '(default)' },
152
- ...effortOptions.map((e) => ({ value: e, label: e })),
153
- ]}
154
- onChange={(next) => {
155
- if (blocked.current) return;
156
- setValue({ ...value, effort: next });
157
- setEntry(`perCli.${cli}.effort`, entryFor(next, original.effort ?? ''));
158
- }}
159
- />
160
- {meta.effortNote ? (
161
- <p className="settings-percli-note">{meta.effortNote}</p>
162
- ) : null}
163
- </div>
164
- ) : meta.effortNote ? (
165
- <p className="settings-percli-note settings-percli-note--effort">{meta.effortNote}</p>
166
- ) : null}
167
- {hasRuntimeTransportChoice(cli) ? (
168
- <RuntimeTransportField cli={cli} original={original.transport} dirty={dirty} disabled={disabled} setEntry={setEntry} />
169
- ) : null}
170
- <ToggleField
171
- id={`percli-${cli}-fastmode`}
172
- label="Fast mode"
165
+ ) : meta.effortNote ? (
166
+ <p className="settings-percli-note settings-percli-note--effort">{meta.effortNote}</p>
167
+ ) : null}
168
+ {hasRuntimeTransportChoice(cli) ? (
169
+ <RuntimeTransportField cli={cli} original={original.transport} dirty={dirty} disabled={disabled} setEntry={setEntry} />
170
+ ) : null}
171
+ <ToggleField
172
+ id={`percli-${cli}-fastmode`}
173
+ label="Fast mode"
174
+ disabled={disabled}
175
+ value={Boolean(value.fastMode)}
176
+ onChange={(next) => {
177
+ if (blocked.current) return;
178
+ setValue({ ...value, fastMode: next });
179
+ setEntry(`perCli.${cli}.fastMode`, entryFor(next, Boolean(original.fastMode)));
180
+ }}
181
+ />
182
+ {isPi && client ? (
183
+ <button
184
+ type="button"
185
+ className="settings-action settings-percli-settings"
173
186
  disabled={disabled}
174
- value={Boolean(value.fastMode)}
175
- onChange={(next) => {
176
- if (blocked.current) return;
177
- setValue({ ...value, fastMode: next });
178
- setEntry(`perCli.${cli}.fastMode`, entryFor(next, Boolean(original.fastMode)));
179
- }}
180
- />
181
- {isPi && client ? (
182
- <button
183
- type="button"
184
- className="settings-action"
185
- disabled={disabled}
186
- onClick={() => { if (!blocked.current) setPiDialogOpen(true); }}
187
- >
188
- Settings
189
- </button>
190
- ) : null}
187
+ onClick={() => { if (!blocked.current) setPiDialogOpen(true); }}
188
+ >
189
+ Settings
190
+ </button>
191
+ ) : null}
191
192
  </div>
192
193
  {isPi && client && piDialogOpen ? (
193
194
  <div inert={disabled} aria-busy={disabled}>