cli-jaw 2.1.0 → 2.1.2

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 (356) hide show
  1. package/README.ja.md +8 -6
  2. package/README.ko.md +8 -6
  3. package/README.md +12 -6
  4. package/README.zh-CN.md +8 -6
  5. package/dist/bin/cli-jaw.js +5 -1
  6. package/dist/bin/cli-jaw.js.map +1 -1
  7. package/dist/bin/commands/browser.js +1 -1
  8. package/dist/bin/commands/browser.js.map +1 -1
  9. package/dist/bin/commands/chat.js +98 -58
  10. package/dist/bin/commands/chat.js.map +1 -1
  11. package/dist/bin/commands/dispatch.js +130 -5
  12. package/dist/bin/commands/dispatch.js.map +1 -1
  13. package/dist/bin/commands/goal.js +18 -6
  14. package/dist/bin/commands/goal.js.map +1 -1
  15. package/dist/bin/commands/orchestrate.js.map +1 -1
  16. package/dist/bin/commands/tui/fullscreen-mode.js +237 -0
  17. package/dist/bin/commands/tui/fullscreen-mode.js.map +1 -0
  18. package/dist/bin/commands/tui/input-handler.js +139 -52
  19. package/dist/bin/commands/tui/input-handler.js.map +1 -1
  20. package/dist/bin/commands/tui/overlays.js +177 -70
  21. package/dist/bin/commands/tui/overlays.js.map +1 -1
  22. package/dist/bin/commands/tui/renderer.js +70 -20
  23. package/dist/bin/commands/tui/renderer.js.map +1 -1
  24. package/dist/bin/commands/tui/simple-mode.js +1 -1
  25. package/dist/bin/commands/tui/simple-mode.js.map +1 -1
  26. package/dist/bin/commands/tui/tui-io.js +8 -0
  27. package/dist/bin/commands/tui/tui-io.js.map +1 -0
  28. package/dist/bin/commands/tui/types.js +9 -0
  29. package/dist/bin/commands/tui/types.js.map +1 -1
  30. package/dist/bin/commands/tui/ws-handler.js +115 -23
  31. package/dist/bin/commands/tui/ws-handler.js.map +1 -1
  32. package/dist/bin/commands/worker.js +159 -0
  33. package/dist/bin/commands/worker.js.map +1 -0
  34. package/dist/bin/postinstall.js +0 -76
  35. package/dist/bin/postinstall.js.map +1 -1
  36. package/dist/lib/mcp/format-converters.js +21 -2
  37. package/dist/lib/mcp/format-converters.js.map +1 -1
  38. package/dist/lib/mcp/mcp-registry.js +75 -0
  39. package/dist/lib/mcp/mcp-registry.js.map +1 -0
  40. package/dist/lib/stt.js +1 -1
  41. package/dist/lib/stt.js.map +1 -1
  42. package/dist/scripts/fresh-install-smoke.js +1 -1
  43. package/dist/scripts/fresh-install-smoke.js.map +1 -1
  44. package/dist/server.js +27 -6
  45. package/dist/server.js.map +1 -1
  46. package/dist/src/agent/args.js +33 -1
  47. package/dist/src/agent/args.js.map +1 -1
  48. package/dist/src/agent/claude-e-runtime.js +1 -1
  49. package/dist/src/agent/claude-e-runtime.js.map +1 -1
  50. package/dist/src/agent/codex-app-client.js +1 -1
  51. package/dist/src/agent/error-classifier.js +6 -1
  52. package/dist/src/agent/error-classifier.js.map +1 -1
  53. package/dist/src/agent/events/claude.js +1 -0
  54. package/dist/src/agent/events/claude.js.map +1 -1
  55. package/dist/src/agent/events/codex.js +0 -44
  56. package/dist/src/agent/events/codex.js.map +1 -1
  57. package/dist/src/agent/events/helpers.js +52 -5
  58. package/dist/src/agent/events/helpers.js.map +1 -1
  59. package/dist/src/agent/events/opencode.js +6 -2
  60. package/dist/src/agent/events/opencode.js.map +1 -1
  61. package/dist/src/agent/events/summary.js +3 -2
  62. package/dist/src/agent/events/summary.js.map +1 -1
  63. package/dist/src/agent/events/tool-labels.js +8 -5
  64. package/dist/src/agent/events/tool-labels.js.map +1 -1
  65. package/dist/src/agent/kiro-auth.js +213 -0
  66. package/dist/src/agent/kiro-auth.js.map +1 -0
  67. package/dist/src/agent/kiro-models.js +79 -0
  68. package/dist/src/agent/kiro-models.js.map +1 -0
  69. package/dist/src/agent/kiro-runtime.js +306 -0
  70. package/dist/src/agent/kiro-runtime.js.map +1 -0
  71. package/dist/src/agent/lifecycle-handler.js +190 -12
  72. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  73. package/dist/src/agent/memory-flush-controller.js +1 -3
  74. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  75. package/dist/src/agent/resume-classifier.js +18 -1
  76. package/dist/src/agent/resume-classifier.js.map +1 -1
  77. package/dist/src/agent/session-persistence.js +1 -1
  78. package/dist/src/agent/session-persistence.js.map +1 -1
  79. package/dist/src/agent/smoke-detector.js +3 -0
  80. package/dist/src/agent/smoke-detector.js.map +1 -1
  81. package/dist/src/agent/spawn/queue.js +10 -4
  82. package/dist/src/agent/spawn/queue.js.map +1 -1
  83. package/dist/src/agent/spawn/resume.js +6 -1
  84. package/dist/src/agent/spawn/resume.js.map +1 -1
  85. package/dist/src/agent/spawn-env.js +1 -1
  86. package/dist/src/agent/spawn-env.js.map +1 -1
  87. package/dist/src/agent/spawn.js +188 -28
  88. package/dist/src/agent/spawn.js.map +1 -1
  89. package/dist/src/browser/web-ai/grok-live.js +2 -0
  90. package/dist/src/browser/web-ai/grok-live.js.map +1 -1
  91. package/dist/src/cli/claude-models.js +2 -2
  92. package/dist/src/cli/claude-models.js.map +1 -1
  93. package/dist/src/cli/commands.js +3 -2
  94. package/dist/src/cli/commands.js.map +1 -1
  95. package/dist/src/cli/handlers-runtime.js +2 -0
  96. package/dist/src/cli/handlers-runtime.js.map +1 -1
  97. package/dist/src/cli/handlers-workflows.js +9 -4
  98. package/dist/src/cli/handlers-workflows.js.map +1 -1
  99. package/dist/src/cli/handlers.js +47 -7
  100. package/dist/src/cli/handlers.js.map +1 -1
  101. package/dist/src/cli/readiness.js +17 -1
  102. package/dist/src/cli/readiness.js.map +1 -1
  103. package/dist/src/cli/registry-live.js +17 -0
  104. package/dist/src/cli/registry-live.js.map +1 -0
  105. package/dist/src/cli/registry.js +44 -3
  106. package/dist/src/cli/registry.js.map +1 -1
  107. package/dist/src/cli/tui/composer.js +135 -5
  108. package/dist/src/cli/tui/composer.js.map +1 -1
  109. package/dist/src/cli/tui/diffview.js +41 -0
  110. package/dist/src/cli/tui/diffview.js.map +1 -0
  111. package/dist/src/cli/tui/editor.js +45 -0
  112. package/dist/src/cli/tui/editor.js.map +1 -0
  113. package/dist/src/cli/tui/file-mention.js +78 -0
  114. package/dist/src/cli/tui/file-mention.js.map +1 -0
  115. package/dist/src/cli/tui/highlight.js +82 -0
  116. package/dist/src/cli/tui/highlight.js.map +1 -0
  117. package/dist/src/cli/tui/keymap.js +21 -0
  118. package/dist/src/cli/tui/keymap.js.map +1 -1
  119. package/dist/src/cli/tui/markdown.js +124 -0
  120. package/dist/src/cli/tui/markdown.js.map +1 -0
  121. package/dist/src/cli/tui/mode.js +26 -0
  122. package/dist/src/cli/tui/mode.js.map +1 -0
  123. package/dist/src/cli/tui/overlay.js +121 -98
  124. package/dist/src/cli/tui/overlay.js.map +1 -1
  125. package/dist/src/cli/tui/render/frame.js +72 -0
  126. package/dist/src/cli/tui/render/frame.js.map +1 -0
  127. package/dist/src/cli/tui/render/layout.js +22 -0
  128. package/dist/src/cli/tui/render/layout.js.map +1 -0
  129. package/dist/src/cli/tui/render/mouse.js +25 -0
  130. package/dist/src/cli/tui/render/mouse.js.map +1 -0
  131. package/dist/src/cli/tui/render/scheduler.js +37 -0
  132. package/dist/src/cli/tui/render/scheduler.js.map +1 -0
  133. package/dist/src/cli/tui/render/viewport.js +82 -0
  134. package/dist/src/cli/tui/render/viewport.js.map +1 -0
  135. package/dist/src/cli/tui/renderers.js +37 -0
  136. package/dist/src/cli/tui/renderers.js.map +1 -1
  137. package/dist/src/cli/tui/stream.js +48 -0
  138. package/dist/src/cli/tui/stream.js.map +1 -0
  139. package/dist/src/cli/tui/text-buffer.js +143 -0
  140. package/dist/src/cli/tui/text-buffer.js.map +1 -0
  141. package/dist/src/cli/tui/theme.js +128 -0
  142. package/dist/src/cli/tui/theme.js.map +1 -0
  143. package/dist/src/cli/tui/transcript.js +4 -0
  144. package/dist/src/cli/tui/transcript.js.map +1 -1
  145. package/dist/src/command-contract/help-renderer.js +1 -1
  146. package/dist/src/command-contract/help-renderer.js.map +1 -1
  147. package/dist/src/core/cli-detection.js +14 -0
  148. package/dist/src/core/cli-detection.js.map +1 -1
  149. package/dist/src/core/config.js +5 -0
  150. package/dist/src/core/config.js.map +1 -1
  151. package/dist/src/core/db.js +7 -0
  152. package/dist/src/core/db.js.map +1 -1
  153. package/dist/src/core/employees.js +2 -2
  154. package/dist/src/core/employees.js.map +1 -1
  155. package/dist/src/discord/bot.js.map +1 -1
  156. package/dist/src/discord/discord-file.js +1 -1
  157. package/dist/src/discord/discord-file.js.map +1 -1
  158. package/dist/src/discord/send-only-client.js +1 -3
  159. package/dist/src/discord/send-only-client.js.map +1 -1
  160. package/dist/src/goal/heartbeat.js +30 -7
  161. package/dist/src/goal/heartbeat.js.map +1 -1
  162. package/dist/src/goal/store.js +6 -2
  163. package/dist/src/goal/store.js.map +1 -1
  164. package/dist/src/ide/diff.js +37 -0
  165. package/dist/src/ide/diff.js.map +1 -1
  166. package/dist/src/manager/launchd-service.js +1 -1
  167. package/dist/src/manager/launchd-service.js.map +1 -1
  168. package/dist/src/manager/lifecycle-helpers.js +14 -0
  169. package/dist/src/manager/lifecycle-helpers.js.map +1 -1
  170. package/dist/src/manager/lifecycle.js +49 -4
  171. package/dist/src/manager/lifecycle.js.map +1 -1
  172. package/dist/src/manager/notes/routes.js +0 -31
  173. package/dist/src/manager/notes/routes.js.map +1 -1
  174. package/dist/src/manager/notes/ws.js.map +1 -1
  175. package/dist/src/manager/registry.js.map +1 -1
  176. package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
  177. package/dist/src/manager/scan.js +36 -1
  178. package/dist/src/manager/scan.js.map +1 -1
  179. package/dist/src/manager/server.js +21 -2
  180. package/dist/src/manager/server.js.map +1 -1
  181. package/dist/src/manager/systemd-service.js +1 -1
  182. package/dist/src/manager/systemd-service.js.map +1 -1
  183. package/dist/src/memory/keyword-expand.js +0 -187
  184. package/dist/src/memory/keyword-expand.js.map +1 -1
  185. package/dist/src/memory/runtime.js +2 -2
  186. package/dist/src/memory/runtime.js.map +1 -1
  187. package/dist/src/memory/shared.js.map +1 -1
  188. package/dist/src/orchestrator/collect.js +3 -2
  189. package/dist/src/orchestrator/collect.js.map +1 -1
  190. package/dist/src/orchestrator/distribute.js +7 -1
  191. package/dist/src/orchestrator/distribute.js.map +1 -1
  192. package/dist/src/orchestrator/friction.js +59 -0
  193. package/dist/src/orchestrator/friction.js.map +1 -0
  194. package/dist/src/orchestrator/pipeline.js +88 -45
  195. package/dist/src/orchestrator/pipeline.js.map +1 -1
  196. package/dist/src/orchestrator/sanitize.js +19 -0
  197. package/dist/src/orchestrator/sanitize.js.map +1 -0
  198. package/dist/src/orchestrator/seed.js +50 -0
  199. package/dist/src/orchestrator/seed.js.map +1 -0
  200. package/dist/src/orchestrator/state-machine.js +206 -74
  201. package/dist/src/orchestrator/state-machine.js.map +1 -1
  202. package/dist/src/orchestrator/worker-monitor.js +1 -1
  203. package/dist/src/orchestrator/worker-monitor.js.map +1 -1
  204. package/dist/src/orchestrator/worker-progress.js +29 -0
  205. package/dist/src/orchestrator/worker-progress.js.map +1 -0
  206. package/dist/src/orchestrator/worker-registry.js +63 -2
  207. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  208. package/dist/src/prompt/builder.js +19 -29
  209. package/dist/src/prompt/builder.js.map +1 -1
  210. package/dist/src/prompt/templates/a1-system.md +40 -5
  211. package/dist/src/prompt/templates/control-system.md +2 -2
  212. package/dist/src/prompt/templates/employee.md +4 -1
  213. package/dist/src/prompt/templates/orchestration.md +23 -8
  214. package/dist/src/routes/employees.js +4 -4
  215. package/dist/src/routes/employees.js.map +1 -1
  216. package/dist/src/routes/goal.js +11 -3
  217. package/dist/src/routes/goal.js.map +1 -1
  218. package/dist/src/routes/heartbeat.js +1 -1
  219. package/dist/src/routes/heartbeat.js.map +1 -1
  220. package/dist/src/routes/i18n.js +1 -1
  221. package/dist/src/routes/i18n.js.map +1 -1
  222. package/dist/src/routes/jaw-memory.js +1 -1
  223. package/dist/src/routes/jaw-memory.js.map +1 -1
  224. package/dist/src/routes/memory.js.map +1 -1
  225. package/dist/src/routes/messaging.js.map +1 -1
  226. package/dist/src/routes/orchestrate.js +265 -116
  227. package/dist/src/routes/orchestrate.js.map +1 -1
  228. package/dist/src/routes/quota-agy-reverse.js +0 -5
  229. package/dist/src/routes/quota-agy-reverse.js.map +1 -1
  230. package/dist/src/routes/quota-kiro-reverse.js +187 -0
  231. package/dist/src/routes/quota-kiro-reverse.js.map +1 -0
  232. package/dist/src/routes/settings.js +31 -2
  233. package/dist/src/routes/settings.js.map +1 -1
  234. package/dist/src/routes/skills.js.map +1 -1
  235. package/dist/src/security/security-audit-log.js.map +1 -1
  236. package/dist/src/shared/shell-command-display.js +51 -0
  237. package/dist/src/shared/shell-command-display.js.map +1 -0
  238. package/dist/src/telegram/bot.js.map +1 -1
  239. package/dist/src/trace/store.js +32 -0
  240. package/dist/src/trace/store.js.map +1 -1
  241. package/dist/src/types/cli-engine.js +1 -0
  242. package/dist/src/types/cli-engine.js.map +1 -1
  243. package/dist/src/workflows/employee-boundary.js +7 -7
  244. package/dist/src/workflows/employee-boundary.js.map +1 -1
  245. package/dist/src/workflows/handoff.js +16 -16
  246. package/dist/src/workflows/handoff.js.map +1 -1
  247. package/dist/src/workflows/scope-sandbox.js +46 -0
  248. package/dist/src/workflows/scope-sandbox.js.map +1 -0
  249. package/package.json +1 -1
  250. package/public/assets/providers/kiro-color.svg +15 -0
  251. package/public/assets/providers/kiro.svg +14 -0
  252. package/public/css/modals.css +79 -0
  253. package/public/css/orc-state.css +21 -2
  254. package/public/css/sidebar.css +85 -0
  255. package/public/css/variables.css +2 -2
  256. package/public/dist/assets/{Agent-CIUGaUVn.js → Agent-DkH7eoHd.js} +1 -1
  257. package/public/dist/assets/{DocPanel-C1pGgE-S.js → DocPanel-BU16GUlB.js} +1 -1
  258. package/public/dist/assets/DocPanel-gU-WkgyA.css +1 -0
  259. package/public/dist/assets/Employees-F0ssNuO-.js +1 -0
  260. package/public/dist/assets/Heartbeat-C3JS6gkF.js +1 -0
  261. package/public/dist/assets/Mcp-_Yq4N3Sk.js +4 -0
  262. package/public/dist/assets/{Memory-BgN8djV4.js → Memory-C-EQubN2.js} +1 -1
  263. package/public/dist/assets/{ModelProvider-DHQ1Zvw0.js → ModelProvider-BD2KrypI.js} +1 -1
  264. package/public/dist/assets/agent-meta-B1098B_a.js +1 -0
  265. package/public/dist/assets/app-ByHYOMZE.js +48 -0
  266. package/public/dist/assets/app-CYdhP6Vh.css +1 -0
  267. package/public/dist/assets/constants-s2UJodER.js +1 -0
  268. package/public/dist/assets/{employees-DZSPGlaH.js → employees-_A-p_bZg.js} +7 -7
  269. package/public/dist/assets/idb-cache-0LNMskFB.js +1 -0
  270. package/public/dist/assets/idb-cache-5H89a4l8.js +1 -0
  271. package/public/dist/assets/{manager-DyrwJLZr.css → manager-B2qEQRxN.css} +1 -1
  272. package/public/dist/assets/manager-CR9BA-wO.js +12 -0
  273. package/public/dist/assets/memory-D1RKYvyu.js +1 -0
  274. package/public/dist/assets/{memory-B4RpXXJ7.js → memory-D9AUn8fG.js} +9 -9
  275. package/public/dist/assets/{provider-icons-XEfJPGTe.js → provider-icons-CVVK5xUP.js} +35 -6
  276. package/public/dist/assets/{render-DnylWKO1.js → render-DFBujF8n.js} +4 -4
  277. package/public/dist/assets/settings-B4ZkeaU-.js +1 -0
  278. package/public/dist/assets/settings-D9jTceN0.js +151 -0
  279. package/public/dist/assets/sidebar-DPPRNiTc.js +48 -0
  280. package/public/dist/assets/skills-8nHJkv-r.js +1 -0
  281. package/public/dist/assets/{skills-CW7NEhew.js → skills-BDVLIrVT.js} +6 -6
  282. package/public/dist/assets/{slash-commands-CAydTUgf.js → slash-commands-C5da3q1p.js} +1 -1
  283. package/public/dist/assets/slash-commands-RJWO8wJZ.js +1 -0
  284. package/public/dist/assets/{trace-drawer-G-KP3IbQ.js → trace-drawer-5kqBzFMk.js} +1 -1
  285. package/public/dist/assets/ui-Crnp79bG.js +142 -0
  286. package/public/dist/assets/ui-HtSKByR3.js +1 -0
  287. package/public/dist/index.html +113 -86
  288. package/public/dist/manager/index.html +2 -2
  289. package/public/index.html +111 -84
  290. package/public/js/constants.ts +30 -7
  291. package/public/js/features/chat-search.ts +5 -1
  292. package/public/js/features/employees.ts +7 -2
  293. package/public/js/features/idb-cache.ts +4 -0
  294. package/public/js/features/message-history.ts +55 -7
  295. package/public/js/features/pending-queue.ts +8 -2
  296. package/public/js/features/process-block.ts +32 -17
  297. package/public/js/features/process-log-adapter.ts +11 -2
  298. package/public/js/features/settings-cli-status-render.ts +163 -0
  299. package/public/js/features/settings-cli-status.ts +130 -185
  300. package/public/js/features/settings-core.ts +5 -1
  301. package/public/js/features/settings-mcp.ts +513 -7
  302. package/public/js/features/settings.ts +1 -1
  303. package/public/js/features/tool-ui.ts +18 -4
  304. package/public/js/features/transport-status-row.ts +3 -0
  305. package/public/js/main.ts +3 -0
  306. package/public/js/preview-parent-origin.ts +14 -0
  307. package/public/js/provider-icons.ts +6 -1
  308. package/public/js/render/file-links.ts +10 -2
  309. package/public/js/ui.ts +5 -2
  310. package/public/js/virtual-scroll.ts +19 -0
  311. package/public/js/ws.ts +163 -10
  312. package/public/locales/en.json +8 -2
  313. package/public/locales/ja.json +8 -2
  314. package/public/locales/ko.json +8 -2
  315. package/public/locales/zh.json +8 -2
  316. package/public/manager/src/App.tsx +13 -70
  317. package/public/manager/src/InstancePreview.tsx +36 -11
  318. package/public/manager/src/SidebarRailRouter.tsx +1 -1
  319. package/public/manager/src/doc-panel/DocPanel.tsx +14 -1
  320. package/public/manager/src/doc-panel/doc-panel.css +16 -0
  321. package/public/manager/src/hooks/useInstanceMessageEvents.ts +4 -15
  322. package/public/manager/src/manager-components.css +1 -1
  323. package/public/manager/src/manager-polish.css +1 -1
  324. package/public/manager/src/manager-shortcut-runner.ts +107 -0
  325. package/public/manager/src/manager-shortcuts.ts +15 -0
  326. package/public/manager/src/panels/desktop-bridge.ts +2 -0
  327. package/public/manager/src/settings/SettingsSidebar.tsx +1 -1
  328. package/public/manager/src/settings/components/sidebar-filter.ts +2 -0
  329. package/public/manager/src/settings/pages/Mcp.tsx +311 -43
  330. package/public/manager/src/settings/pages/components/McpServerCard.tsx +89 -55
  331. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +29 -6
  332. package/public/manager/src/settings/pages/components/employees-helpers.ts +1 -0
  333. package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +1 -0
  334. package/public/manager/src/settings/pages/mcp-helpers.ts +54 -12
  335. package/public/manager/src/settings/types.ts +1 -0
  336. package/public/manager/src/types.ts +2 -1
  337. package/scripts/fresh-install-smoke.ts +1 -1
  338. package/public/dist/assets/DocPanel-CL1scIfq.css +0 -1
  339. package/public/dist/assets/Employees-BL9MAzzx.js +0 -1
  340. package/public/dist/assets/Heartbeat-D64JCg4t.js +0 -1
  341. package/public/dist/assets/Mcp-wYwJA_61.js +0 -3
  342. package/public/dist/assets/agent-meta-BhEbjy4P.js +0 -1
  343. package/public/dist/assets/app-DLDdZ41k.js +0 -48
  344. package/public/dist/assets/app-RpnKs-sT.css +0 -1
  345. package/public/dist/assets/constants-ahKI_aEG.js +0 -1
  346. package/public/dist/assets/idb-cache-BnZfG5FD.js +0 -1
  347. package/public/dist/assets/idb-cache-CZ3JdK8r.js +0 -1
  348. package/public/dist/assets/manager-CfyZloIP.js +0 -12
  349. package/public/dist/assets/memory-C9EVOb_D.js +0 -1
  350. package/public/dist/assets/settings-DIG_i79X.js +0 -1
  351. package/public/dist/assets/settings-VCXKhhhz.js +0 -66
  352. package/public/dist/assets/sidebar-Bi_ktFVw.js +0 -18
  353. package/public/dist/assets/skills-RjRqvykb.js +0 -1
  354. package/public/dist/assets/slash-commands-DdXu96Zd.js +0 -1
  355. package/public/dist/assets/ui-CIQjTLzc.js +0 -1
  356. package/public/dist/assets/ui-CkHB9Jmo.js +0 -140
@@ -40,6 +40,11 @@ const interruptStaleStmt = db.prepare(`
40
40
  UPDATE trace_runs SET status = 'interrupted', finished_at = ?, error = COALESCE(error, 'process exited before finalization')
41
41
  WHERE status = 'running'
42
42
  `);
43
+ const pruneEventsStmt = db.prepare('DELETE FROM trace_events WHERE created_at < ?');
44
+ const pruneRunsStmt = db.prepare('DELETE FROM trace_runs WHERE started_at < ?');
45
+ const countAllEventsStmt = db.prepare('SELECT COUNT(*) AS c FROM trace_events');
46
+ const trimEventsStmt = db.prepare('DELETE FROM trace_events WHERE rowid IN (SELECT rowid FROM trace_events ORDER BY created_at ASC LIMIT ?)');
47
+ const liveRunIdsStmt = db.prepare('SELECT id FROM trace_runs');
43
48
  const seqCache = new Map();
44
49
  function createTraceId() { return `tr_${crypto.randomUUID().replace(/-/g, '')}`; }
45
50
  function ensureTraceDir(runId) {
@@ -131,6 +136,33 @@ export function linkTraceRunToMessage(runId, messageId) {
131
136
  linkRunStmt.run(messageId, runId);
132
137
  }
133
138
  export function markStaleTraceRunsInterrupted() { interruptStaleStmt.run(Date.now()); }
139
+ // Remove on-disk spill dirs whose run no longer exists in trace_runs.
140
+ function pruneOrphanTraceDirs() {
141
+ if (!fs.existsSync(TRACE_DIR))
142
+ return;
143
+ const live = new Set(liveRunIdsStmt.all().map((r) => r.id));
144
+ for (const name of fs.readdirSync(TRACE_DIR)) {
145
+ if (TRACE_ID_RE.test(name) && !live.has(name))
146
+ fs.rmSync(join(TRACE_DIR, name), { recursive: true, force: true });
147
+ }
148
+ }
149
+ // Delete trace data older than retentionDays, then trim to maxRows, then sweep orphan spill dirs.
150
+ export function pruneTraceEvents(retentionDays = 7, maxRows = 50_000) {
151
+ try {
152
+ const cutoff = Date.now() - retentionDays * 86_400_000;
153
+ let deletedEvents = pruneEventsStmt.run(cutoff).changes;
154
+ const deletedRuns = pruneRunsStmt.run(cutoff).changes;
155
+ const total = Number(countAllEventsStmt.get().c);
156
+ if (total > maxRows)
157
+ deletedEvents += trimEventsStmt.run(total - maxRows).changes;
158
+ pruneOrphanTraceDirs();
159
+ return { deletedEvents, deletedRuns };
160
+ }
161
+ catch (error) {
162
+ console.error('[trace] prune failed:', error instanceof Error ? error.message : String(error));
163
+ return { deletedEvents: 0, deletedRuns: 0 };
164
+ }
165
+ }
134
166
  export function getTraceRun(runId) {
135
167
  if (!TRACE_ID_RE.test(runId))
136
168
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/trace/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/trace/store.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,7 @@ export const CLI_ENGINES = [
32
32
  'cursor',
33
33
  'gemini',
34
34
  'grok',
35
+ 'kiro-code',
35
36
  'opencode',
36
37
  ];
37
38
  export function isCliEngine(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"cli-engine.js","sourceRoot":"","sources":["../../../src/types/cli-engine.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,+DAA+D;AAC/D,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,wEAAwE;AACxE,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,kCAAkC;AAClC,EAAE;AACF,uBAAuB;AACvB,6BAA6B;AAC7B,uEAAuE;AACvE,yDAAyD;AACzD,+DAA+D;AAe/D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,KAAK;IACL,MAAM;IACN,QAAQ;IACR,UAAU;IACV,OAAO;IACP,WAAW;IACX,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,UAAU;CAC2B,CAAC;AAE1C,MAAM,UAAU,WAAW,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,WAAiC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3F,CAAC"}
1
+ {"version":3,"file":"cli-engine.js","sourceRoot":"","sources":["../../../src/types/cli-engine.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,+DAA+D;AAC/D,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,wEAAwE;AACxE,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,kCAAkC;AAClC,EAAE;AACF,uBAAuB;AACvB,6BAA6B;AAC7B,uEAAuE;AACvE,yDAAyD;AACzD,+DAA+D;AAgB/D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,KAAK;IACL,MAAM;IACN,QAAQ;IACR,UAAU;IACV,OAAO;IACP,WAAW;IACX,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,WAAW;IACX,UAAU;CAC2B,CAAC;AAE1C,MAAM,UAAU,WAAW,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,WAAiC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3F,CAAC"}
@@ -6,13 +6,13 @@ export function assertBossOnlyDispatch(isBoss) {
6
6
  throw new Error('Only the Boss agent can dispatch jaw employees');
7
7
  }
8
8
  }
9
- export function assertNoImplementationDelegation(phase, taskBody) {
10
- if (phase === 'B' && hasImplementationDelegation(taskBody)) {
11
- throw new Error('B-phase employees are read-only verifiers; implementation delegation is forbidden');
9
+ export function assertNoImplementationDelegation(phase, taskBody, allowWrite = false) {
10
+ if (phase === 'B' && !allowWrite && hasImplementationDelegation(taskBody)) {
11
+ throw new Error('B-phase employees are read-only verifiers; implementation delegation is forbidden. Use --mutable to allow writes.');
12
12
  }
13
13
  }
14
- export function assertReadOnlyAudit(phase, taskBody) {
15
- if (phase === 'A') {
14
+ export function assertReadOnlyAudit(phase, taskBody, allowWrite = false) {
15
+ if (phase === 'A' && !allowWrite) {
16
16
  const lc = taskBody.toLowerCase();
17
17
  if (lc.includes('write file') || lc.includes('create file') || lc.includes('modify code')) {
18
18
  throw new Error('A-phase audit must be read-only');
@@ -22,8 +22,8 @@ export function assertReadOnlyAudit(phase, taskBody) {
22
22
  export function validateDispatchTask(opts) {
23
23
  try {
24
24
  assertBossOnlyDispatch(opts.isBoss);
25
- assertNoImplementationDelegation(opts.phase, opts.taskBody);
26
- assertReadOnlyAudit(opts.phase, opts.taskBody);
25
+ assertNoImplementationDelegation(opts.phase, opts.taskBody, opts.allowWrite);
26
+ assertReadOnlyAudit(opts.phase, opts.taskBody, opts.allowWrite);
27
27
  return { ok: true };
28
28
  }
29
29
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"employee-boundary.js","sourceRoot":"","sources":["../../../src/workflows/employee-boundary.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,iCAAiC;AAGjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,sBAAsB,CAAC,MAAe;IAClD,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACtE,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAAmB,EAAE,QAAgB;IAClF,IAAI,KAAK,KAAK,GAAG,IAAI,2BAA2B,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;IACzG,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAmB,EAAE,QAAgB;IACrE,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAChB,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACxF,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACvD,CAAC;IACL,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAIpC;IACG,IAAI,CAAC;QACD,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,gCAAgC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5D,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;IACxD,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"employee-boundary.js","sourceRoot":"","sources":["../../../src/workflows/employee-boundary.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,iCAAiC;AAGjC,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,sBAAsB,CAAC,MAAe;IAClD,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACtE,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAAmB,EAAE,QAAgB,EAAE,UAAU,GAAG,KAAK;IACtG,IAAI,KAAK,KAAK,GAAG,IAAI,CAAC,UAAU,IAAI,2BAA2B,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,mHAAmH,CAAC,CAAC;IACzI,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAmB,EAAE,QAAgB,EAAE,UAAU,GAAG,KAAK;IACzF,IAAI,KAAK,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACxF,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACvD,CAAC;IACL,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAKpC;IACG,IAAI,CAAC;QACD,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,gCAAgC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7E,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAChE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;IACxD,CAAC;AACL,CAAC"}
@@ -10,11 +10,20 @@ export function buildHandoff(opts) {
10
10
  ? 'advisory'
11
11
  : (opts.phase === 'A' || opts.phase === 'B') ? opts.phase : 'advisory';
12
12
  const verdictTokens = VERDICT_TOKENS[verdictKey] ?? ['PASS', 'FAIL'];
13
- const modeHeader = opts.mode === 'read-only'
14
- ? 'READ-ONLY verification. Do not modify files.'
15
- : opts.mode === 'verification'
16
- ? 'VERIFICATION only. Do not implement new code.'
17
- : 'Advisory review. Results are non-binding.';
13
+ let modeHeader;
14
+ if (opts.mutable) {
15
+ const scopeNote = opts.scope
16
+ ? `Files inside \`${opts.scope}\` may be created or modified.`
17
+ : 'Files in the project may be created or modified.';
18
+ modeHeader = `WRITE-ENABLED session. ${scopeNote} Protected files (.git, .env, settings.json) are still blocked.`;
19
+ }
20
+ else {
21
+ modeHeader = opts.mode === 'read-only'
22
+ ? 'READ-ONLY verification. Do not modify files.'
23
+ : opts.mode === 'verification'
24
+ ? 'VERIFICATION only. Do not implement new code.'
25
+ : 'Advisory review. Results are non-binding.';
26
+ }
18
27
  const taskBody = [
19
28
  `Project root: ${opts.projectRoot}`,
20
29
  '',
@@ -32,17 +41,8 @@ export function buildHandoff(opts) {
32
41
  verdictTokens,
33
42
  };
34
43
  }
44
+ const IMPL_DELEGATION_PATTERN = /\b(implement(?:\s+the\s+feature|\s+this|\s+code)?|write\s+(?:the\s+)?(?:code|function)|create\s+(?:the\s+)?file|build\s+(?:the\s+)?(?:feature|module)|add\s+(?:the\s+)?(?:method|function|class))\b/i;
35
45
  export function hasImplementationDelegation(taskBody) {
36
- const lc = taskBody.toLowerCase();
37
- const delegationPatterns = [
38
- 'implement the feature',
39
- 'implement this',
40
- 'write the code',
41
- 'create the file',
42
- 'write the function',
43
- 'implement code',
44
- 'build the module',
45
- ];
46
- return delegationPatterns.some(p => lc.includes(p));
46
+ return IMPL_DELEGATION_PATTERN.test(taskBody);
47
47
  }
48
48
  //# sourceMappingURL=handoff.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../../src/workflows/handoff.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,iCAAiC;AAKjC,MAAM,cAAc,GAA6B;IAC7C,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IACnB,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;IACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;CAClC,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,IAK5B;IACG,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,UAAU;QACvC,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;IAE3E,MAAM,aAAa,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,WAAW;QACxC,CAAC,CAAC,8CAA8C;QAChD,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc;YAC1B,CAAC,CAAC,+CAA+C;YACjD,CAAC,CAAC,2CAA2C,CAAC;IAEtD,MAAM,QAAQ,GAAG;QACb,iBAAiB,IAAI,CAAC,WAAW,EAAE;QACnC,EAAE;QACF,UAAU;QACV,qFAAqF;QACrF,6BAA6B,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QACxD,EAAE;QACF,IAAI,CAAC,eAAe;KACvB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;QACH,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ;QACR,aAAa;KAChB,CAAC;AACN,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IACxD,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,kBAAkB,GAAG;QACvB,uBAAuB;QACvB,gBAAgB;QAChB,gBAAgB;QAChB,iBAAiB;QACjB,oBAAoB;QACpB,gBAAgB;QAChB,kBAAkB;KACrB,CAAC;IACF,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../../src/workflows/handoff.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,iCAAiC;AAKjC,MAAM,cAAc,GAA6B;IAC7C,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IACnB,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;IACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;CAClC,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,IAO5B;IACG,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,UAAU;QACvC,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;IAE3E,MAAM,aAAa,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAErE,IAAI,UAAkB,CAAC;IACvB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK;YACxB,CAAC,CAAC,kBAAkB,IAAI,CAAC,KAAK,gCAAgC;YAC9D,CAAC,CAAC,kDAAkD,CAAC;QACzD,UAAU,GAAG,0BAA0B,SAAS,iEAAiE,CAAC;IACtH,CAAC;SAAM,CAAC;QACJ,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,WAAW;YAClC,CAAC,CAAC,8CAA8C;YAChD,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc;gBAC1B,CAAC,CAAC,+CAA+C;gBACjD,CAAC,CAAC,2CAA2C,CAAC;IAC1D,CAAC;IAED,MAAM,QAAQ,GAAG;QACb,iBAAiB,IAAI,CAAC,WAAW,EAAE;QACnC,EAAE;QACF,UAAU;QACV,qFAAqF;QACrF,6BAA6B,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QACxD,EAAE;QACF,IAAI,CAAC,eAAe;KACvB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;QACH,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ;QACR,aAAa;KAChB,CAAC;AACN,CAAC;AAED,MAAM,uBAAuB,GAAG,sMAAsM,CAAC;AAEvO,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IACxD,OAAO,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,46 @@
1
+ // Physical directory sandboxing and post-dispatch scope verification.
2
+ // Uses only Node.js built-ins — no new dependencies.
3
+ import path from 'path';
4
+ import fs from 'fs';
5
+ import { execSync } from 'child_process';
6
+ const PROTECTED_PATTERNS = [
7
+ /\.git\//,
8
+ /\.env$/,
9
+ /settings\.json$/,
10
+ /package-lock\.json$/,
11
+ /yarn\.lock$/,
12
+ /pnpm-lock\.yaml$/,
13
+ ];
14
+ export function normalizeScope(projectRoot, scopePath) {
15
+ const resolvedRoot = path.resolve(projectRoot);
16
+ const resolvedScope = path.resolve(projectRoot, scopePath);
17
+ if (!resolvedScope.startsWith(resolvedRoot)) {
18
+ throw new Error(`Security Error: Scope [${scopePath}] escapes project root.`);
19
+ }
20
+ if (fs.existsSync(resolvedScope)) {
21
+ const realScope = fs.realpathSync(resolvedScope);
22
+ if (!realScope.startsWith(resolvedRoot)) {
23
+ throw new Error(`Security Error: Realpath of scope is outside project root.`);
24
+ }
25
+ }
26
+ return resolvedScope;
27
+ }
28
+ export function isProtectedPath(filePath) {
29
+ return PROTECTED_PATTERNS.some(regex => regex.test(filePath));
30
+ }
31
+ export function postDispatchDiffCheck(projectRoot, allowedScope) {
32
+ if (!allowedScope)
33
+ return { ok: true, modifiedOutside: [] };
34
+ const diffOutput = execSync('git diff --name-only', { cwd: projectRoot }).toString();
35
+ const modifiedFiles = diffOutput.split('\n').filter(Boolean);
36
+ const absoluteAllowedScope = path.resolve(projectRoot, allowedScope);
37
+ const outsideFiles = modifiedFiles.filter(file => {
38
+ const absFile = path.resolve(projectRoot, file);
39
+ return !absFile.startsWith(absoluteAllowedScope) || isProtectedPath(file);
40
+ });
41
+ return {
42
+ ok: outsideFiles.length === 0,
43
+ modifiedOutside: outsideFiles,
44
+ };
45
+ }
46
+ //# sourceMappingURL=scope-sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-sandbox.js","sourceRoot":"","sources":["../../../src/workflows/scope-sandbox.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,qDAAqD;AAErD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,kBAAkB,GAAG;IACvB,SAAS;IACT,QAAQ;IACR,iBAAiB;IACjB,qBAAqB;IACrB,aAAa;IACb,kBAAkB;CACrB,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,SAAiB;IACjE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAE3D,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,yBAAyB,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAClF,CAAC;IACL,CAAC;IAED,OAAO,aAAa,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC5C,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,qBAAqB,CACjC,WAAmB,EAAE,YAAqB;IAE1C,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;IAE5D,MAAM,UAAU,GAAG,QAAQ,CAAC,sBAAsB,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrF,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE7D,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAChD,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,OAAO;QACH,EAAE,EAAE,YAAY,CAAC,MAAM,KAAK,CAAC;QAC7B,eAAe,EAAE,YAAY;KAChC,CAAC;AACN,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cli-jaw",
3
- "version": "2.1.0",
3
+ "version": "2.1.2",
4
4
  "description": "Personal AI assistant powered by Antigravity, AI-E, Claude, Claude E, Codex, Codex App, Cursor, Gemini, Grok, OpenCode, and Copilot — Web, Terminal, Telegram, and Discord interfaces with 107 built-in skills",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -0,0 +1,15 @@
1
+ <!-- Source: https://kiro.dev/icon.svg (official Kiro app icon, fetched 2026-05-31) -->
2
+ <svg width="1em" height="1em" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <title>Kiro</title>
4
+ <g transform="scale(0.02)">
5
+ <rect width="1200" height="1200" rx="260" fill="#9046FF"/>
6
+ <mask id="kiroColorMask" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="272" y="202" width="655" height="796">
7
+ <path d="M926.578 202.793H272.637V997.857H926.578V202.793Z" fill="white"/>
8
+ </mask>
9
+ <g mask="url(#kiroColorMask)">
10
+ <path d="M398.554 818.914C316.315 1001.03 491.477 1046.74 620.672 940.156C658.687 1059.66 801.052 970.473 852.234 877.795C964.787 673.567 919.318 465.357 907.64 422.374C827.637 129.443 427.623 128.946 358.8 423.865C342.651 475.544 342.402 534.18 333.458 595.051C328.986 625.86 325.507 645.488 313.83 677.785C306.873 696.424 297.68 712.819 282.773 740.645C259.915 783.881 269.604 867.113 387.87 823.883L399.051 818.914H398.554Z" fill="white"/>
11
+ <path d="M636.123 549.353C603.328 549.353 598.359 510.097 598.359 486.742C598.359 465.623 602.086 448.977 609.293 438.293C615.504 428.852 624.697 424.131 636.123 424.131C647.555 424.131 657.492 428.852 664.447 438.541C672.398 449.474 676.623 466.12 676.623 486.742C676.623 525.998 661.471 549.353 636.375 549.353H636.123Z" fill="black"/>
12
+ <path d="M771.24 549.353C738.445 549.353 733.477 510.097 733.477 486.742C733.477 465.623 737.203 448.977 744.41 438.293C750.621 428.852 759.814 424.131 771.24 424.131C782.672 424.131 792.609 428.852 799.564 438.541C807.516 449.474 811.74 466.12 811.74 486.742C811.74 525.998 796.588 549.353 771.492 549.353H771.24Z" fill="black"/>
13
+ </g>
14
+ </g>
15
+ </svg>
@@ -0,0 +1,14 @@
1
+ <!-- Source: https://kiro.dev/icon.svg (official Kiro mascot mark, fetched 2026-05-31) -->
2
+ <svg width="1em" height="1em" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <title>Kiro</title>
4
+ <g transform="scale(0.02)">
5
+ <mask id="kiroMonoMask" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="272" y="202" width="655" height="796">
6
+ <path d="M926.578 202.793H272.637V997.857H926.578V202.793Z" fill="white"/>
7
+ </mask>
8
+ <g mask="url(#kiroMonoMask)">
9
+ <path d="M398.554 818.914C316.315 1001.03 491.477 1046.74 620.672 940.156C658.687 1059.66 801.052 970.473 852.234 877.795C964.787 673.567 919.318 465.357 907.64 422.374C827.637 129.443 427.623 128.946 358.8 423.865C342.651 475.544 342.402 534.18 333.458 595.051C328.986 625.86 325.507 645.488 313.83 677.785C306.873 696.424 297.68 712.819 282.773 740.645C259.915 783.881 269.604 867.113 387.87 823.883L399.051 818.914H398.554Z" fill="currentColor"/>
10
+ <path d="M636.123 549.353C603.328 549.353 598.359 510.097 598.359 486.742C598.359 465.623 602.086 448.977 609.293 438.293C615.504 428.852 624.697 424.131 636.123 424.131C647.555 424.131 657.492 428.852 664.447 438.541C672.398 449.474 676.623 466.12 676.623 486.742C676.623 525.998 661.471 549.353 636.375 549.353H636.123Z" fill="black"/>
11
+ <path d="M771.24 549.353C738.445 549.353 733.477 510.097 733.477 486.742C733.477 465.623 737.203 448.977 744.41 438.293C750.621 428.852 759.814 424.131 771.24 424.131C782.672 424.131 792.609 428.852 799.564 438.541C807.516 449.474 811.74 466.12 811.74 486.742C811.74 525.998 796.588 549.353 771.492 549.353H771.24Z" fill="black"/>
12
+ </g>
13
+ </g>
14
+ </svg>
@@ -461,3 +461,82 @@
461
461
  .hb-add:hover {
462
462
  opacity: .9;
463
463
  }
464
+
465
+ /* ── MCP Modal overrides ── */
466
+ .mcp-modal-overlay {
467
+ background: rgba(0, 0, 0, 0.85);
468
+ backdrop-filter: blur(16px);
469
+ -webkit-backdrop-filter: blur(16px);
470
+ }
471
+
472
+ .mcp-modal-box {
473
+ background: var(--surface);
474
+ backdrop-filter: none;
475
+ -webkit-backdrop-filter: none;
476
+ width: 620px;
477
+ max-height: 85vh;
478
+ }
479
+
480
+ .mcp-modal-box .modal-header {
481
+ font-size: 14px;
482
+ }
483
+
484
+ .mcp-active-row {
485
+ display: flex;
486
+ align-items: flex-start;
487
+ gap: 8px;
488
+ padding: 10px 0;
489
+ border-bottom: 1px solid var(--border);
490
+ }
491
+
492
+ .mcp-active-name {
493
+ font-weight: 600;
494
+ min-width: 80px;
495
+ }
496
+
497
+ .mcp-active-detail {
498
+ flex: 1;
499
+ opacity: 0.6;
500
+ font-size: 0.9em;
501
+ word-break: break-all;
502
+ }
503
+
504
+ .mcp-active-tag {
505
+ opacity: 0.5;
506
+ font-size: 0.85em;
507
+ white-space: nowrap;
508
+ }
509
+
510
+ .mcp-active-remove {
511
+ color: var(--color-error);
512
+ font-size: 0.85em;
513
+ white-space: nowrap;
514
+ }
515
+
516
+ .mcp-help-inner {
517
+ background: var(--surface);
518
+ border: 1px solid var(--border);
519
+ border-radius: var(--radius-xl);
520
+ padding: 16px;
521
+ max-width: 460px;
522
+ max-height: 70vh;
523
+ overflow-y: auto;
524
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
525
+ position: relative;
526
+ z-index: 1001;
527
+ }
528
+
529
+ .mcp-help-overlay {
530
+ position: fixed;
531
+ inset: 0;
532
+ background: rgba(0, 0, 0, 0.6);
533
+ z-index: 1000;
534
+ display: flex;
535
+ align-items: center;
536
+ justify-content: center;
537
+ }
538
+
539
+ .mcp-help-inner h4 { margin: 0 0 8px; font-size: 13px; }
540
+ .mcp-help-inner p { margin: 4px 0; font-size: 12px; opacity: 0.85; }
541
+ .mcp-help-inner code { background: var(--bg); padding: 1px 4px; border-radius: 3px; font-size: 11px; }
542
+ .mcp-help-inner pre { background: var(--bg); padding: 8px; border-radius: 6px; font-size: 11px; overflow-x: auto; margin: 6px 0; }
@@ -240,10 +240,29 @@ body[data-orc-state].orc-pulse #chatMessages {
240
240
  }
241
241
 
242
242
  /* ─── Interview Panel ─── */
243
- .interview-panel { margin: 0 auto 8px; max-width: 600px; display: flex; gap: 16px; font-size: 0.82rem; }
243
+ .interview-panel { margin: 0 auto 8px; max-width: 600px; font-size: 0.82rem; }
244
244
  .interview-panel[hidden] { display: none; }
245
+
246
+ /* One-line toggle header — sits right under the IPABCD bar */
247
+ .iv-toggle {
248
+ display: flex; align-items: center; gap: 6px; width: 100%;
249
+ background: var(--bg-secondary, rgba(255,255,255,0.04));
250
+ border: 1px solid var(--border-color, rgba(255,255,255,0.08));
251
+ border-radius: 8px; padding: 4px 10px; cursor: pointer;
252
+ color: var(--text-secondary, inherit); font: inherit; font-size: 0.78rem;
253
+ text-align: left;
254
+ }
255
+ .iv-toggle:hover { background: var(--bg-hover, rgba(255,255,255,0.08)); }
256
+ .iv-chevron { display: inline-block; opacity: 0.65; transition: transform 0.15s ease; }
257
+ .interview-panel:not(.collapsed) .iv-chevron { transform: rotate(90deg); }
258
+ .iv-summary { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
259
+ .iv-known-count { color: var(--accent-green, #4caf50); }
260
+ .iv-unknown-count { color: var(--accent-yellow, #ff9800); }
261
+
262
+ /* Expandable body — capped height so it never buries the chat */
263
+ .iv-body { display: flex; gap: 16px; margin-top: 6px; max-height: 220px; overflow-y: auto; }
264
+ .interview-panel.collapsed .iv-body { display: none; }
245
265
  .iv-section { flex: 1; }
246
266
  .iv-section ul { list-style: none; padding: 0; margin: 4px 0; }
247
267
  .iv-known::before { content: '✓ '; color: var(--accent-green, #4caf50); }
248
268
  .iv-unknown::before { content: '? '; color: var(--accent-yellow, #ff9800); }
249
- .iv-round { font-size: 0.75rem; opacity: 0.6; align-self: flex-end; }
@@ -16,6 +16,91 @@
16
16
  content: '▾';
17
17
  }
18
18
 
19
+ .cli-status-toolbar {
20
+ display: flex;
21
+ align-items: center;
22
+ gap: var(--space-2);
23
+ }
24
+
25
+ .cli-status-toolbar .cli-status-header {
26
+ flex: 1;
27
+ min-width: 0;
28
+ }
29
+
30
+ .btn-refresh {
31
+ transition:
32
+ color var(--duration-fast),
33
+ border-color var(--duration-fast),
34
+ background var(--duration-fast),
35
+ transform var(--duration-fast);
36
+ }
37
+
38
+ .btn-refresh:active:not(:disabled) {
39
+ transform: translateY(1px);
40
+ }
41
+
42
+ .btn-refresh:disabled {
43
+ cursor: wait;
44
+ opacity: 0.72;
45
+ }
46
+
47
+ .btn-refresh.is-refreshing {
48
+ color: var(--accent);
49
+ border-color: color-mix(in oklch, var(--accent) 38%, var(--border));
50
+ background: color-mix(in oklch, var(--accent) 10%, transparent);
51
+ }
52
+
53
+ .btn-refresh.is-refreshing svg {
54
+ animation: cliRefreshSpin 0.85s linear infinite;
55
+ }
56
+
57
+ .btn-refresh.is-success {
58
+ color: var(--success);
59
+ border-color: color-mix(in oklch, var(--success) 42%, var(--border));
60
+ background: var(--success-dim);
61
+ }
62
+
63
+ .btn-refresh.is-error {
64
+ color: var(--error);
65
+ border-color: color-mix(in oklch, var(--error) 42%, var(--border));
66
+ background: var(--error-dim);
67
+ }
68
+
69
+ .cli-refresh-state {
70
+ min-height: 13px;
71
+ max-width: 86px;
72
+ color: var(--text-dim);
73
+ font-family: var(--font-mono);
74
+ font-size: 10px;
75
+ line-height: 1.2;
76
+ overflow: hidden;
77
+ text-align: right;
78
+ text-overflow: ellipsis;
79
+ white-space: nowrap;
80
+ }
81
+
82
+ .cli-refresh-state[data-state="refreshing"] {
83
+ color: var(--accent);
84
+ }
85
+
86
+ .cli-refresh-state[data-state="success"] {
87
+ color: var(--success);
88
+ }
89
+
90
+ .cli-refresh-state[data-state="error"] {
91
+ color: var(--error);
92
+ }
93
+
94
+ @keyframes cliRefreshSpin {
95
+ to { transform: rotate(360deg); }
96
+ }
97
+
98
+ @media (prefers-reduced-motion: reduce) {
99
+ .btn-refresh.is-refreshing svg {
100
+ animation: none;
101
+ }
102
+ }
103
+
19
104
  /* ── Settings Tab ── */
20
105
  .cli-status-row {
21
106
  display: flex;
@@ -495,8 +495,8 @@ select:focus-visible {
495
495
  /* Queue badge on send button */
496
496
  .queue-badge {
497
497
  position: absolute;
498
- top: -6px;
499
- right: -6px;
498
+ top: 6px;
499
+ right: 6px;
500
500
  background: var(--warning);
501
501
  color: var(--bg);
502
502
  border-radius: var(--radius-full);
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-k5-hYhKb.js";import{i as c,s as l}from"./fields-C-y_8RgA.js";import{a as u,n as d,o as f}from"./Permissions-BvtVczZS.js";import{a as p,i as m,n as h,r as g,t as _}from"./agent-meta-BhEbjy4P.js";import{t as v}from"./path-utils-ztBHV7MX.js";var y=e(t(),1),b=n();function x({cli:e,cliOptions:t,provider:n=``,providerOptions:r=[],model:a,modelOptions:o,effort:s,effortOptions:u,workingDir:d,workingDirError:f,onCliChange:p,onProviderChange:m,onModelChange:g,onEffortChange:v,onWorkingDirChange:y}){return(0,b.jsx)(i,{title:`Agent runtime`,hint:`Active CLI, model, effort, and workspace used by this instance.`,children:(0,b.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,b.jsx)(c,{id:`agent-cli`,label:`Active CLI`,value:e,options:[...t.filter(e=>_.includes(e)).map(e=>({value:e,label:h(e).label||e})),...t.filter(e=>!_.includes(e)).map(e=>({value:e,label:h(e).label||e}))],collapsedAfter:t.filter(e=>_.includes(e)).length,onChange:p}),e===`ai-e`&&r.length>0?(0,b.jsx)(c,{id:`agent-ai-e-provider`,label:`AI-E provider`,value:n,options:r.map(e=>({value:e,label:e})),onChange:e=>m?.(e)}):null,(0,b.jsx)(c,{id:`agent-model`,label:`Active model`,value:a,options:o.length>0?o:[{value:``,label:`(default)`}],onChange:g}),(0,b.jsx)(c,{id:`agent-effort`,label:`Effort`,value:s,options:[{value:``,label:`(default)`},...u.map(e=>({value:e,label:e}))],disabled:u.length===0,onChange:v}),(0,b.jsx)(l,{id:`agent-workingDir`,label:`Working directory`,value:d,error:f,placeholder:`/path/to/project`,onChange:y})]})})}var S=[{value:`auto`,label:`Auto`},{value:`custom`,label:`Custom allowlist`}];function C({value:e,onChange:t}){let n=u(e),r=n.mode===`custom`?`custom`:`auto`,a=n.mode===`custom`?n.tokens:[],o=n.mode===`custom`?`${a.length} explicit token${a.length===1?``:`s`}`:`Runtime resolves allowed capabilities`;return(0,b.jsxs)(i,{title:`Permissions`,hint:`Quick runtime mode. Open Permissions for detailed allowlist editing.`,children:[(0,b.jsx)(c,{id:`agent-permissions-mode`,label:`Mode`,value:r,options:S,onChange:e=>{t(e===`auto`?`auto`:a.length>0&&d(a)?a:f(null))}}),(0,b.jsx)(`p`,{className:`settings-agent-note`,children:o})]})}function w({activeCli:e,flushCli:t,flushModel:n,cliOptions:r,modelOptions:a,loading:o,error:s,onFlushCliChange:l,onFlushModelChange:u}){let d=t||e,f=d?h(d).label||d:`active`;return(0,b.jsx)(i,{title:`Flush Agent`,hint:`Separate summary agent used for context flush and compact work.`,children:(0,b.jsxs)(`details`,{className:`settings-agent-flush`,children:[(0,b.jsxs)(`summary`,{children:[(0,b.jsx)(`span`,{children:`Flush runtime`}),(0,b.jsxs)(`code`,{children:[f,n&&n!==`default`?` / ${n}`:``]})]}),o?(0,b.jsx)(`p`,{className:`settings-agent-note`,children:`Loading flush settings...`}):null,s?(0,b.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:s}):null,(0,b.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,b.jsx)(c,{id:`agent-flush-cli`,label:`Flush CLI`,value:t,options:[{value:``,label:`(active CLI)`},...r.map(e=>({value:e,label:h(e).label||e}))],onChange:l}),(0,b.jsx)(c,{id:`agent-flush-model`,label:`Flush model`,value:n,options:[{value:``,label:`(default)`},...a],onChange:u})]})]})})}function T(e){return e.source===`static`||e.id.startsWith(`static:`)}function E(){return`new:${Date.now().toString(36)}:${Math.random().toString(36).slice(2,8)}`}function D(e){let t=e[0]||`claude`;return{id:E(),name:`New Agent`,cli:t,model:`default`,role:``,status:`idle`,source:`db`}}function ee(e){return Array.isArray(e)?e.map(O).filter(Boolean):e.data.map(O).filter(Boolean)}function O(e){if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.id==`string`?t.id:``,r=typeof t.name==`string`?t.name:``;if(!n||!r)return null;let i=t.source===`static`||n.startsWith(`static:`)?`static`:`db`,a={id:n,name:r,cli:typeof t.cli==`string`&&t.cli?t.cli:`claude`,model:typeof t.model==`string`&&t.model?t.model:`default`,role:typeof t.role==`string`?t.role:``,source:i};return typeof t.status==`string`&&(a.status=t.status),a}function k(e){return e.name.trim()?e.cli.trim()?e.model.trim()?null:`Model is required`:`CLI is required`:`Name is required`}function A(e){return e.some(e=>k(e)!==null)}function j(e,t){return JSON.stringify(e.map(L))===JSON.stringify(t.map(L))}function M(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Set(t.map(e=>e.id)),i=[],a=[],o=[];for(let e of t){let t=n.get(e.id);if(!t||e.id.startsWith(`new:`)){i.push(e);continue}let r=F(t,e);Object.keys(r).length>0&&a.push({before:t,after:e,patch:r})}for(let t of e)!r.has(t.id)&&!T(t)&&o.push(t);return{added:i,updated:a,removed:o}}function N(e,t){let n=M(e,t);return{added:n.added.length,updated:n.updated.length,removed:n.removed.length}}async function P(e,t,n){let r=M(t,n);for(let t of r.removed)await e.delete(`/api/employees/${encodeURIComponent(t.id)}`);for(let t of r.added)await e.post(`/api/employees`,I(t));for(let t of r.updated)await e.put(`/api/employees/${encodeURIComponent(t.after.id)}`,t.patch)}function F(e,t){if(T(t))return e.model===t.model?{}:{model:t.model};let n={};for(let r of[`name`,`cli`,`model`,`role`,`status`])(e[r]||``)!==(t[r]||``)&&(n[r]=t[r]||``);return n}function I(e){return{name:e.name.trim()||`New Agent`,cli:e.cli.trim()||`claude`,model:e.model.trim()||`default`,role:e.role.trim()}}function L(e){let t={id:e.id,name:e.name,cli:e.cli,model:e.model,role:e.role,source:e.source};return e.status!==void 0&&(t.status=e.status),t}function R({employee:e,index:t,cliOptions:n,onChange:r,onRemove:i}){let a=T(e),o=g(h(e.cli).models,e.model),s=k(e),u=Array.from(new Set([...n,e.cli,`claude`])).filter(Boolean);return(0,b.jsxs)(`fieldset`,{className:`settings-runtime-employee-row`,children:[(0,b.jsxs)(`legend`,{children:[e.name||`Employee ${t+1}`,a?(0,b.jsx)(`span`,{children:`static`}):null]}),(0,b.jsxs)(`div`,{className:`settings-runtime-employee-grid`,children:[(0,b.jsx)(l,{id:`runtime-employee-${e.id}-name`,label:`Name`,value:e.name,disabled:a,error:s===`Name is required`?s:null,onChange:e=>r({name:e})}),(0,b.jsx)(c,{id:`runtime-employee-${e.id}-cli`,label:`CLI`,value:e.cli,disabled:a,options:u.map(e=>({value:e,label:h(e).label||e})),onChange:e=>{r({cli:e,model:h(e).models[0]||`default`})}}),(0,b.jsx)(c,{id:`runtime-employee-${e.id}-model`,label:`Model`,value:e.model,options:o.length>0?o:[{value:`default`,label:`default`}],onChange:e=>r({model:e})}),(0,b.jsx)(l,{id:`runtime-employee-${e.id}-role`,label:`Role`,value:e.role,disabled:a,onChange:e=>r({role:e})})]}),(0,b.jsxs)(`div`,{className:`settings-runtime-employee-footer`,children:[(0,b.jsxs)(`span`,{children:[e.source,e.status?` / ${e.status}`:``]}),(0,b.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:a,onClick:i,"aria-label":`Remove employee ${e.name||t+1}`,children:`Remove`})]})]})}function z({roster:e,original:t,cliOptions:n,loading:r,error:a,onRosterChange:o}){let s=N(t,e),c=A(e);function l(t,n){o(e.map((e,r)=>r===t?{...e,...n}:e))}function u(t){o(e.filter((e,n)=>n!==t))}return(0,b.jsxs)(i,{title:`Employees`,hint:`Runtime dispatch roster. Static employees keep their locked identity; database employees can be edited.`,children:[(0,b.jsxs)(`div`,{className:`settings-runtime-employee-summary`,children:[(0,b.jsxs)(`span`,{children:[`+`,s.added]}),(0,b.jsxs)(`span`,{children:[`~`,s.updated]}),(0,b.jsxs)(`span`,{children:[`-`,s.removed]}),c?(0,b.jsx)(`strong`,{children:`Fix invalid rows before saving.`}):null]}),r?(0,b.jsx)(`p`,{className:`settings-agent-note`,children:`Loading employees...`}):null,a?(0,b.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:a}):null,e.length===0?(0,b.jsx)(`p`,{className:`settings-empty`,children:`No runtime employees configured.`}):(0,b.jsx)(`div`,{className:`settings-runtime-employee-list`,children:e.map((e,t)=>(0,b.jsx)(R,{employee:e,index:t,cliOptions:n,onChange:e=>l(t,e),onRemove:()=>u(t)},e.id))}),(0,b.jsx)(`div`,{className:`settings-employee-footer-bar`,children:(0,b.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>o([...e,D(n)]),children:`+ Add employee`})})]})}var B=new Set([`runtimeEmployees`,`flushCli`,`flushModel`]);function V(e){let t={},n=null,r=null;for(let[i,a]of Object.entries(e))i===`runtimeEmployees`?r=a:i===`flushCli`||i===`flushModel`?(n??={},n[i===`flushCli`?`cli`:`model`]=String(a??``)):B.has(i)||(t[i]=a);return{settingsBundle:t,flushPatch:n,runtimeEmployeesNext:r}}async function H(e){let{client:t,bundle:n,employeeDraft:r,employeeOriginal:i}=e;if(A(r))throw Error(`runtime employees: fix invalid rows before saving`);let{settingsBundle:a,flushPatch:o,runtimeEmployeesNext:s}=V(n),c=null;try{if(Object.keys(a).length>0){let e=await t.put(`/api/settings`,v(a));c=e&&typeof e==`object`&&`data`in e?e.data:e}}catch(e){throw Error(`settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{o&&await t.put(`/api/memory-files/settings`,o)}catch(e){throw Error(`flush settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{s&&await P(t,i,s)}catch(e){throw Error(`runtime employees save failed: ${e instanceof Error?e.message:String(e)}`)}return c}function U({port:e,client:t,dirty:n,registerSave:i}){let{state:c,refresh:l,setData:d}=r(t,`/api/settings`),[f,_]=(0,y.useState)({cli:``,provider:``,model:``,effort:``,workingDir:``,permissions:`auto`}),[v,S]=(0,y.useState)({}),[T,E]=(0,y.useState)({}),[D,O]=(0,y.useState)(!0),[k,M]=(0,y.useState)(null),[N,P]=(0,y.useState)([]),[F,I]=(0,y.useState)([]),[L,R]=(0,y.useState)(!0),[B,V]=(0,y.useState)(null),U=(0,y.useCallback)(async()=>{O(!0),M(null);try{let e=await t.get(`/api/memory-files`),n={cli:e.cli||``,model:e.model||``};S(n),E(n)}catch(e){M(e instanceof Error?e.message:String(e))}finally{O(!1)}},[t]),W=(0,y.useCallback)(async()=>{R(!0),V(null);try{let e=ee(await t.get(`/api/employees`));P(e),I(e)}catch(e){V(e instanceof Error?e.message:String(e))}finally{R(!1)}},[t]);(0,y.useEffect)(()=>{U(),W()},[W,U]),(0,y.useEffect)(()=>{if(c.kind!==`ready`)return;let e=Object.keys(c.data.perCli||{}),t=c.data.cli||e[0]||``,n=u(c.data.permissions);_({cli:t,provider:c.data.perCli?.[t]?.provider||h(t).defaultProvider||``,model:p(t,c.data.perCli,c.data.activeOverrides),effort:m(t,c.data.perCli,c.data.activeOverrides),workingDir:c.data.workingDir||``,permissions:n.mode===`custom`?n.tokens:`auto`})},[c]),(0,y.useEffect)(()=>()=>{for(let e of Array.from(n.pending.keys()))(e===`cli`||e===`workingDir`||e===`permissions`||e===`runtimeEmployees`||e===`flushCli`||e===`flushModel`||e.startsWith(`activeOverrides.`))&&n.remove(e)},[n]);let G=(0,y.useCallback)((e,t)=>n.set(e,t),[n]),K=(0,y.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=await H({client:t,bundle:e,employeeDraft:F,employeeOriginal:N});n.clear(),r&&d(r),await l(),await U(),await W()},[t,n,F,N,W,U,l,d]);(0,y.useEffect)(()=>{if(i)return i(K),()=>i(null)},[i,K]);let q=c.kind===`ready`?c.data:{},J=q.perCli||{},Y=q.activeOverrides||{},X=(0,y.useMemo)(()=>Object.keys(J),[J]),Z=h(f.cli),Q=f.provider||Z.defaultProvider||Z.providers?.[0]||``,te=f.cli===`ai-e`?g(Z.modelsByProvider?.[Q]||Z.models,f.model):g(Z.models,f.model),ne=f.cli===`ai-e`&&Z.effortsByProvider?.[Q]||Z.efforts,re=f.workingDir.trim()?null:`Required`;if(c.kind===`loading`)return(0,b.jsx)(a,{});if(c.kind===`offline`)return(0,b.jsx)(o,{port:e});if(c.kind===`error`)return(0,b.jsx)(s,{message:c.message});function ie(){for(let e of Array.from(n.pending.keys()))e.startsWith(`activeOverrides.`)&&n.remove(e)}function $(e){_(e)}return(0,b.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),K()},children:[(0,b.jsx)(x,{cli:f.cli,cliOptions:X.length>0?X:[f.cli||`claude`],provider:Q,providerOptions:Z.providers||[],model:f.model,modelOptions:te,effort:f.effort,effortOptions:ne,workingDir:f.workingDir,workingDirError:re,onCliChange:e=>{let t={...f,cli:e,provider:J[e]?.provider||h(e).defaultProvider||``,model:p(e,J,Y),effort:m(e,J,Y)};ie(),$(t),G(`cli`,{value:e,original:q.cli||``,valid:!0})},onProviderChange:e=>{let t=Z.modelsByProvider?.[e]||[],n=Z.effortsByProvider?.[e]||[],r=t.includes(f.model)?f.model:t[0]||``,i=n.includes(f.effort)?f.effort:``;$({...f,provider:e,model:r,effort:i}),G(`perCli.ai-e.provider`,{value:e,original:J[`ai-e`]?.provider||Z.defaultProvider||`claude`,valid:!0}),G(`activeOverrides.ai-e.model`,{value:r,original:p(`ai-e`,J,Y),valid:r.trim().length>0}),G(`activeOverrides.ai-e.effort`,{value:i,original:m(`ai-e`,J,Y),valid:!0})},onModelChange:e=>{$({...f,model:e}),G(`activeOverrides.${f.cli}.model`,{value:e,original:p(f.cli,J,Y),valid:e.trim().length>0})},onEffortChange:e=>{$({...f,effort:e}),G(`activeOverrides.${f.cli}.effort`,{value:e,original:m(f.cli,J,Y),valid:!0})},onWorkingDirChange:e=>{$({...f,workingDir:e}),G(`workingDir`,{value:e,original:q.workingDir||``,valid:e.trim().length>0})}}),(0,b.jsx)(C,{value:f.permissions,onChange:e=>{$({...f,permissions:e}),G(`permissions`,{value:e,original:q.permissions??`auto`,valid:e===`auto`||e.length>0})}}),(0,b.jsx)(w,{activeCli:f.cli,flushCli:T.cli||``,flushModel:T.model||``,cliOptions:X,modelOptions:g(h(T.cli||f.cli).models,T.model||``),loading:D,error:k,onFlushCliChange:e=>{let t=e&&h(e).models[0]||``;E({cli:e,model:t}),G(`flushCli`,{value:e,original:v.cli||``,valid:!0}),G(`flushModel`,{value:t,original:v.model||``,valid:!0})},onFlushModelChange:e=>{E({...T,model:e}),G(`flushModel`,{value:e,original:v.model||``,valid:!0})}}),(0,b.jsx)(z,{roster:F,original:N,cliOptions:X,loading:L,error:B,onRosterChange:e=>{if(I(e),j(e,N)){n.remove(`runtimeEmployees`);return}n.set(`runtimeEmployees`,{value:e,original:N,valid:!A(e)})}})]})}export{U as default,V as splitAgentSaveBundle};
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-k5-hYhKb.js";import{i as c,s as l}from"./fields-C-y_8RgA.js";import{a as u,n as d,o as f}from"./Permissions-BvtVczZS.js";import{a as p,i as m,n as h,r as g,t as _}from"./agent-meta-B1098B_a.js";import{t as v}from"./path-utils-ztBHV7MX.js";var y=e(t(),1),b=n();function x({cli:e,cliOptions:t,provider:n=``,providerOptions:r=[],model:a,modelOptions:o,effort:s,effortOptions:u,workingDir:d,workingDirError:f,onCliChange:p,onProviderChange:m,onModelChange:g,onEffortChange:v,onWorkingDirChange:y}){return(0,b.jsx)(i,{title:`Agent runtime`,hint:`Active CLI, model, effort, and workspace used by this instance.`,children:(0,b.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,b.jsx)(c,{id:`agent-cli`,label:`Active CLI`,value:e,options:[...t.filter(e=>_.includes(e)).map(e=>({value:e,label:h(e).label||e})),...t.filter(e=>!_.includes(e)).map(e=>({value:e,label:h(e).label||e}))],collapsedAfter:t.filter(e=>_.includes(e)).length,onChange:p}),e===`ai-e`&&r.length>0?(0,b.jsx)(c,{id:`agent-ai-e-provider`,label:`AI-E provider`,value:n,options:r.map(e=>({value:e,label:e})),onChange:e=>m?.(e)}):null,(0,b.jsx)(c,{id:`agent-model`,label:`Active model`,value:a,options:o.length>0?o:[{value:``,label:`(default)`}],onChange:g}),(0,b.jsx)(c,{id:`agent-effort`,label:`Effort`,value:s,options:[{value:``,label:`(default)`},...u.map(e=>({value:e,label:e}))],disabled:u.length===0,onChange:v}),(0,b.jsx)(l,{id:`agent-workingDir`,label:`Working directory`,value:d,error:f,placeholder:`/path/to/project`,onChange:y})]})})}var S=[{value:`auto`,label:`Auto`},{value:`custom`,label:`Custom allowlist`}];function C({value:e,onChange:t}){let n=u(e),r=n.mode===`custom`?`custom`:`auto`,a=n.mode===`custom`?n.tokens:[],o=n.mode===`custom`?`${a.length} explicit token${a.length===1?``:`s`}`:`Runtime resolves allowed capabilities`;return(0,b.jsxs)(i,{title:`Permissions`,hint:`Quick runtime mode. Open Permissions for detailed allowlist editing.`,children:[(0,b.jsx)(c,{id:`agent-permissions-mode`,label:`Mode`,value:r,options:S,onChange:e=>{t(e===`auto`?`auto`:a.length>0&&d(a)?a:f(null))}}),(0,b.jsx)(`p`,{className:`settings-agent-note`,children:o})]})}function w({activeCli:e,flushCli:t,flushModel:n,cliOptions:r,modelOptions:a,loading:o,error:s,onFlushCliChange:l,onFlushModelChange:u}){let d=t||e,f=d?h(d).label||d:`active`;return(0,b.jsx)(i,{title:`Flush Agent`,hint:`Separate summary agent used for context flush and compact work.`,children:(0,b.jsxs)(`details`,{className:`settings-agent-flush`,children:[(0,b.jsxs)(`summary`,{children:[(0,b.jsx)(`span`,{children:`Flush runtime`}),(0,b.jsxs)(`code`,{children:[f,n&&n!==`default`?` / ${n}`:``]})]}),o?(0,b.jsx)(`p`,{className:`settings-agent-note`,children:`Loading flush settings...`}):null,s?(0,b.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:s}):null,(0,b.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,b.jsx)(c,{id:`agent-flush-cli`,label:`Flush CLI`,value:t,options:[{value:``,label:`(active CLI)`},...r.map(e=>({value:e,label:h(e).label||e}))],onChange:l}),(0,b.jsx)(c,{id:`agent-flush-model`,label:`Flush model`,value:n,options:[{value:``,label:`(default)`},...a],onChange:u})]})]})})}function T(e){return e.source===`static`||e.id.startsWith(`static:`)}function E(){return`new:${Date.now().toString(36)}:${Math.random().toString(36).slice(2,8)}`}function D(e){let t=e[0]||`claude`;return{id:E(),name:`New Agent`,cli:t,model:`default`,role:``,status:`idle`,source:`db`}}function ee(e){return Array.isArray(e)?e.map(O).filter(Boolean):e.data.map(O).filter(Boolean)}function O(e){if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.id==`string`?t.id:``,r=typeof t.name==`string`?t.name:``;if(!n||!r)return null;let i=t.source===`static`||n.startsWith(`static:`)?`static`:`db`,a={id:n,name:r,cli:typeof t.cli==`string`&&t.cli?t.cli:`claude`,model:typeof t.model==`string`&&t.model?t.model:`default`,role:typeof t.role==`string`?t.role:``,source:i};return typeof t.status==`string`&&(a.status=t.status),a}function k(e){return e.name.trim()?e.cli.trim()?e.model.trim()?null:`Model is required`:`CLI is required`:`Name is required`}function A(e){return e.some(e=>k(e)!==null)}function j(e,t){return JSON.stringify(e.map(L))===JSON.stringify(t.map(L))}function M(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Set(t.map(e=>e.id)),i=[],a=[],o=[];for(let e of t){let t=n.get(e.id);if(!t||e.id.startsWith(`new:`)){i.push(e);continue}let r=F(t,e);Object.keys(r).length>0&&a.push({before:t,after:e,patch:r})}for(let t of e)!r.has(t.id)&&!T(t)&&o.push(t);return{added:i,updated:a,removed:o}}function N(e,t){let n=M(e,t);return{added:n.added.length,updated:n.updated.length,removed:n.removed.length}}async function P(e,t,n){let r=M(t,n);for(let t of r.removed)await e.delete(`/api/employees/${encodeURIComponent(t.id)}`);for(let t of r.added)await e.post(`/api/employees`,I(t));for(let t of r.updated)await e.put(`/api/employees/${encodeURIComponent(t.after.id)}`,t.patch)}function F(e,t){if(T(t))return e.model===t.model?{}:{model:t.model};let n={};for(let r of[`name`,`cli`,`model`,`role`,`status`])(e[r]||``)!==(t[r]||``)&&(n[r]=t[r]||``);return n}function I(e){return{name:e.name.trim()||`New Agent`,cli:e.cli.trim()||`claude`,model:e.model.trim()||`default`,role:e.role.trim()}}function L(e){let t={id:e.id,name:e.name,cli:e.cli,model:e.model,role:e.role,source:e.source};return e.status!==void 0&&(t.status=e.status),t}function R({employee:e,index:t,cliOptions:n,onChange:r,onRemove:i}){let a=T(e),o=g(h(e.cli).models,e.model),s=k(e),u=Array.from(new Set([...n,e.cli,`claude`])).filter(Boolean);return(0,b.jsxs)(`fieldset`,{className:`settings-runtime-employee-row`,children:[(0,b.jsxs)(`legend`,{children:[e.name||`Employee ${t+1}`,a?(0,b.jsx)(`span`,{children:`static`}):null]}),(0,b.jsxs)(`div`,{className:`settings-runtime-employee-grid`,children:[(0,b.jsx)(l,{id:`runtime-employee-${e.id}-name`,label:`Name`,value:e.name,disabled:a,error:s===`Name is required`?s:null,onChange:e=>r({name:e})}),(0,b.jsx)(c,{id:`runtime-employee-${e.id}-cli`,label:`CLI`,value:e.cli,disabled:a,options:u.map(e=>({value:e,label:h(e).label||e})),onChange:e=>{r({cli:e,model:h(e).models[0]||`default`})}}),(0,b.jsx)(c,{id:`runtime-employee-${e.id}-model`,label:`Model`,value:e.model,options:o.length>0?o:[{value:`default`,label:`default`}],onChange:e=>r({model:e})}),(0,b.jsx)(l,{id:`runtime-employee-${e.id}-role`,label:`Role`,value:e.role,disabled:a,onChange:e=>r({role:e})})]}),(0,b.jsxs)(`div`,{className:`settings-runtime-employee-footer`,children:[(0,b.jsxs)(`span`,{children:[e.source,e.status?` / ${e.status}`:``]}),(0,b.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:a,onClick:i,"aria-label":`Remove employee ${e.name||t+1}`,children:`Remove`})]})]})}function z({roster:e,original:t,cliOptions:n,loading:r,error:a,onRosterChange:o}){let s=N(t,e),c=A(e);function l(t,n){o(e.map((e,r)=>r===t?{...e,...n}:e))}function u(t){o(e.filter((e,n)=>n!==t))}return(0,b.jsxs)(i,{title:`Employees`,hint:`Runtime dispatch roster. Static employees keep their locked identity; database employees can be edited.`,children:[(0,b.jsxs)(`div`,{className:`settings-runtime-employee-summary`,children:[(0,b.jsxs)(`span`,{children:[`+`,s.added]}),(0,b.jsxs)(`span`,{children:[`~`,s.updated]}),(0,b.jsxs)(`span`,{children:[`-`,s.removed]}),c?(0,b.jsx)(`strong`,{children:`Fix invalid rows before saving.`}):null]}),r?(0,b.jsx)(`p`,{className:`settings-agent-note`,children:`Loading employees...`}):null,a?(0,b.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:a}):null,e.length===0?(0,b.jsx)(`p`,{className:`settings-empty`,children:`No runtime employees configured.`}):(0,b.jsx)(`div`,{className:`settings-runtime-employee-list`,children:e.map((e,t)=>(0,b.jsx)(R,{employee:e,index:t,cliOptions:n,onChange:e=>l(t,e),onRemove:()=>u(t)},e.id))}),(0,b.jsx)(`div`,{className:`settings-employee-footer-bar`,children:(0,b.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>o([...e,D(n)]),children:`+ Add employee`})})]})}var B=new Set([`runtimeEmployees`,`flushCli`,`flushModel`]);function V(e){let t={},n=null,r=null;for(let[i,a]of Object.entries(e))i===`runtimeEmployees`?r=a:i===`flushCli`||i===`flushModel`?(n??={},n[i===`flushCli`?`cli`:`model`]=String(a??``)):B.has(i)||(t[i]=a);return{settingsBundle:t,flushPatch:n,runtimeEmployeesNext:r}}async function H(e){let{client:t,bundle:n,employeeDraft:r,employeeOriginal:i}=e;if(A(r))throw Error(`runtime employees: fix invalid rows before saving`);let{settingsBundle:a,flushPatch:o,runtimeEmployeesNext:s}=V(n),c=null;try{if(Object.keys(a).length>0){let e=await t.put(`/api/settings`,v(a));c=e&&typeof e==`object`&&`data`in e?e.data:e}}catch(e){throw Error(`settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{o&&await t.put(`/api/memory-files/settings`,o)}catch(e){throw Error(`flush settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{s&&await P(t,i,s)}catch(e){throw Error(`runtime employees save failed: ${e instanceof Error?e.message:String(e)}`)}return c}function U({port:e,client:t,dirty:n,registerSave:i}){let{state:c,refresh:l,setData:d}=r(t,`/api/settings`),[f,_]=(0,y.useState)({cli:``,provider:``,model:``,effort:``,workingDir:``,permissions:`auto`}),[v,S]=(0,y.useState)({}),[T,E]=(0,y.useState)({}),[D,O]=(0,y.useState)(!0),[k,M]=(0,y.useState)(null),[N,P]=(0,y.useState)([]),[F,I]=(0,y.useState)([]),[L,R]=(0,y.useState)(!0),[B,V]=(0,y.useState)(null),U=(0,y.useCallback)(async()=>{O(!0),M(null);try{let e=await t.get(`/api/memory-files`),n={cli:e.cli||``,model:e.model||``};S(n),E(n)}catch(e){M(e instanceof Error?e.message:String(e))}finally{O(!1)}},[t]),W=(0,y.useCallback)(async()=>{R(!0),V(null);try{let e=ee(await t.get(`/api/employees`));P(e),I(e)}catch(e){V(e instanceof Error?e.message:String(e))}finally{R(!1)}},[t]);(0,y.useEffect)(()=>{U(),W()},[W,U]),(0,y.useEffect)(()=>{if(c.kind!==`ready`)return;let e=Object.keys(c.data.perCli||{}),t=c.data.cli||e[0]||``,n=u(c.data.permissions);_({cli:t,provider:c.data.perCli?.[t]?.provider||h(t).defaultProvider||``,model:p(t,c.data.perCli,c.data.activeOverrides),effort:m(t,c.data.perCli,c.data.activeOverrides),workingDir:c.data.workingDir||``,permissions:n.mode===`custom`?n.tokens:`auto`})},[c]),(0,y.useEffect)(()=>()=>{for(let e of Array.from(n.pending.keys()))(e===`cli`||e===`workingDir`||e===`permissions`||e===`runtimeEmployees`||e===`flushCli`||e===`flushModel`||e.startsWith(`activeOverrides.`))&&n.remove(e)},[n]);let G=(0,y.useCallback)((e,t)=>n.set(e,t),[n]),K=(0,y.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=await H({client:t,bundle:e,employeeDraft:F,employeeOriginal:N});n.clear(),r&&d(r),await l(),await U(),await W()},[t,n,F,N,W,U,l,d]);(0,y.useEffect)(()=>{if(i)return i(K),()=>i(null)},[i,K]);let q=c.kind===`ready`?c.data:{},J=q.perCli||{},Y=q.activeOverrides||{},X=(0,y.useMemo)(()=>Object.keys(J),[J]),Z=h(f.cli),Q=f.provider||Z.defaultProvider||Z.providers?.[0]||``,te=f.cli===`ai-e`?g(Z.modelsByProvider?.[Q]||Z.models,f.model):g(Z.models,f.model),ne=f.cli===`ai-e`&&Z.effortsByProvider?.[Q]||Z.efforts,re=f.workingDir.trim()?null:`Required`;if(c.kind===`loading`)return(0,b.jsx)(a,{});if(c.kind===`offline`)return(0,b.jsx)(o,{port:e});if(c.kind===`error`)return(0,b.jsx)(s,{message:c.message});function ie(){for(let e of Array.from(n.pending.keys()))e.startsWith(`activeOverrides.`)&&n.remove(e)}function $(e){_(e)}return(0,b.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),K()},children:[(0,b.jsx)(x,{cli:f.cli,cliOptions:X.length>0?X:[f.cli||`claude`],provider:Q,providerOptions:Z.providers||[],model:f.model,modelOptions:te,effort:f.effort,effortOptions:ne,workingDir:f.workingDir,workingDirError:re,onCliChange:e=>{let t={...f,cli:e,provider:J[e]?.provider||h(e).defaultProvider||``,model:p(e,J,Y),effort:m(e,J,Y)};ie(),$(t),G(`cli`,{value:e,original:q.cli||``,valid:!0})},onProviderChange:e=>{let t=Z.modelsByProvider?.[e]||[],n=Z.effortsByProvider?.[e]||[],r=t.includes(f.model)?f.model:t[0]||``,i=n.includes(f.effort)?f.effort:``;$({...f,provider:e,model:r,effort:i}),G(`perCli.ai-e.provider`,{value:e,original:J[`ai-e`]?.provider||Z.defaultProvider||`claude`,valid:!0}),G(`activeOverrides.ai-e.model`,{value:r,original:p(`ai-e`,J,Y),valid:r.trim().length>0}),G(`activeOverrides.ai-e.effort`,{value:i,original:m(`ai-e`,J,Y),valid:!0})},onModelChange:e=>{$({...f,model:e}),G(`activeOverrides.${f.cli}.model`,{value:e,original:p(f.cli,J,Y),valid:e.trim().length>0})},onEffortChange:e=>{$({...f,effort:e}),G(`activeOverrides.${f.cli}.effort`,{value:e,original:m(f.cli,J,Y),valid:!0})},onWorkingDirChange:e=>{$({...f,workingDir:e}),G(`workingDir`,{value:e,original:q.workingDir||``,valid:e.trim().length>0})}}),(0,b.jsx)(C,{value:f.permissions,onChange:e=>{$({...f,permissions:e}),G(`permissions`,{value:e,original:q.permissions??`auto`,valid:e===`auto`||e.length>0})}}),(0,b.jsx)(w,{activeCli:f.cli,flushCli:T.cli||``,flushModel:T.model||``,cliOptions:X,modelOptions:g(h(T.cli||f.cli).models,T.model||``),loading:D,error:k,onFlushCliChange:e=>{let t=e&&h(e).models[0]||``;E({cli:e,model:t}),G(`flushCli`,{value:e,original:v.cli||``,valid:!0}),G(`flushModel`,{value:t,original:v.model||``,valid:!0})},onFlushModelChange:e=>{E({...T,model:e}),G(`flushModel`,{value:e,original:v.model||``,valid:!0})}}),(0,b.jsx)(z,{roster:F,original:N,cliOptions:X,loading:L,error:B,onRosterChange:e=>{if(I(e),j(e,N)){n.remove(`runtimeEmployees`);return}n.set(`runtimeEmployees`,{value:e,original:N,valid:!A(e)})}})]})}export{U as default,V as splitAgentSaveBundle};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{c as r}from"./api-30EcU_Lb.js";import{t as i}from"./desktop-bridge-CrqidwSb.js";import{n as a,t as o}from"./MarkdownRenderer-CS6jvLpf.js";var s=e(t(),1),c=n(),l={ts:`typescript`,tsx:`typescript`,js:`javascript`,jsx:`javascript`,py:`python`,rs:`rust`,go:`go`,java:`java`,cpp:`cpp`,c:`cpp`,css:`css`,html:`html`,xml:`xml`,json:`json`,yaml:`yaml`,yml:`yaml`,sh:`bash`,bash:`bash`,sql:`sql`};function u(e){let t=e.split(`.`).pop()?.toLowerCase();return t?l[t]??null:null}function d(e){return/\.(md|mdx)$/i.test(e)}function f(){return i()?.folder??null}function p(e){return!e.startsWith(`/`)&&!/^[a-zA-Z]:[\\/]/.test(e)}function m(e){if(d(e.filePath))return(0,c.jsx)(`article`,{className:`notes-preview doc-markdown`,children:(0,c.jsx)(o,{markdown:e.content})});let t=u(e.filePath);return t?(0,c.jsx)(a,{code:e.content,language:t}):(0,c.jsx)(`pre`,{className:`doc-pre`,children:(0,c.jsx)(`code`,{children:e.content})})}function h(e){let t=f(),[n,i]=(0,s.useState)(``),[a,o]=(0,s.useState)(null),[l,u]=(0,s.useState)(!1);return(0,s.useEffect)(()=>{if(!e.filePath){i(``),o(null);return}(async()=>{if(t){let n=await t.readFile(e.filePath);n.ok&&n.content!==void 0?(n.binary?(u(!0),i(``)):(u(!1),i(n.content)),o(null)):o(n.error??`Failed to read file`);return}if(!p(e.filePath)){o(`Document preview for arbitrary local files requires Electron desktop app`);return}try{let t=await r(e.filePath);u(!1),i(t.content),o(null)}catch(e){o(e.message)}})()},[t,e.filePath]),e.filePath?a?(0,c.jsx)(`div`,{className:`doc-panel doc-error`,children:a}):l?(0,c.jsx)(`div`,{className:`doc-panel doc-binary`,children:`Binary file — cannot preview`}):(0,c.jsxs)(`div`,{className:`doc-panel`,children:[(0,c.jsx)(`div`,{className:`doc-toolbar`,children:(0,c.jsx)(`span`,{className:`doc-file-name`,children:e.filePath.split(`/`).pop()})}),(0,c.jsx)(`div`,{className:`doc-content`,children:(0,c.jsx)(m,{filePath:e.filePath,content:n})})]}):(0,c.jsx)(`div`,{className:`doc-panel doc-empty`,children:`Open Folders and select a file to preview it here.`})}export{h as DocPanel};
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{c as r}from"./api-30EcU_Lb.js";import{t as i}from"./desktop-bridge-CrqidwSb.js";import{n as a,t as o}from"./MarkdownRenderer-CS6jvLpf.js";var s=e(t(),1),c=n(),l={ts:`typescript`,tsx:`typescript`,js:`javascript`,jsx:`javascript`,py:`python`,rs:`rust`,go:`go`,java:`java`,cpp:`cpp`,c:`cpp`,css:`css`,html:`html`,xml:`xml`,json:`json`,yaml:`yaml`,yml:`yaml`,sh:`bash`,bash:`bash`,sql:`sql`};function u(e){let t=e.split(`.`).pop()?.toLowerCase();return t?l[t]??null:null}function d(e){return/\.(md|mdx)$/i.test(e)}function f(){return i()?.folder??null}function p(e){return!e.startsWith(`/`)&&!/^[a-zA-Z]:[\\/]/.test(e)}function m(e){if(d(e.filePath))return(0,c.jsx)(`article`,{className:`notes-preview doc-markdown`,children:(0,c.jsx)(o,{markdown:e.content})});let t=u(e.filePath);return t?(0,c.jsx)(a,{code:e.content,language:t}):(0,c.jsx)(`pre`,{className:`doc-pre`,children:(0,c.jsx)(`code`,{children:e.content})})}function h(e){let t=f(),[n,i]=(0,s.useState)(``),[a,o]=(0,s.useState)(null),[l,u]=(0,s.useState)(!1);return(0,s.useEffect)(()=>{if(!e.filePath){i(``),o(null);return}(async()=>{if(t){let n=await t.readFile(e.filePath);n.ok&&n.content!==void 0?(n.binary?(u(!0),i(``)):(u(!1),i(n.content)),o(null)):o(n.error??`Failed to read file`);return}if(!p(e.filePath)){o(`Document preview for arbitrary local files requires Electron desktop app`);return}try{let t=await r(e.filePath);u(!1),i(t.content),o(null)}catch(e){o(e.message)}})()},[t,e.filePath]),e.filePath?a?(0,c.jsx)(`div`,{className:`doc-panel doc-error`,children:a}):l?(0,c.jsx)(`div`,{className:`doc-panel doc-binary`,children:`Binary file — cannot preview`}):(0,c.jsxs)(`div`,{className:`doc-panel`,children:[(0,c.jsxs)(`div`,{className:`doc-toolbar`,children:[(0,c.jsx)(`span`,{className:`doc-file-name`,title:e.filePath,children:e.filePath.split(`/`).pop()}),(0,c.jsx)(`button`,{type:`button`,className:`doc-copy-path`,title:`Copy full path`,onClick:()=>{navigator.clipboard.writeText(e.filePath).then(()=>{let e=document.querySelector(`.doc-copy-path`);e&&(e.textContent=`Copied`,setTimeout(()=>{e.textContent=`Path`},1200))})},children:`Path`})]}),(0,c.jsx)(`div`,{className:`doc-content`,children:(0,c.jsx)(m,{filePath:e.filePath,content:n})})]}):(0,c.jsx)(`div`,{className:`doc-panel doc-empty`,children:`Open Folders and select a file to preview it here.`})}export{h as DocPanel};
@@ -0,0 +1 @@
1
+ .doc-panel{flex-direction:column;min-width:0;height:100%;min-height:0;font-size:12px;display:flex;overflow:hidden}.doc-unavailable,.doc-empty,.doc-error,.doc-binary{color:var(--text-dim);justify-content:center;align-items:center;padding:12px;font-size:11px;display:flex}.doc-error{color:var(--status-error)}.doc-toolbar{border-bottom:1px solid var(--border-subtle);flex-shrink:0;align-items:center;padding:6px 10px;display:flex}.doc-file-name{color:var(--text-base);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:11px;font-weight:500;overflow:hidden}.doc-copy-path{border:1px solid var(--border-subtle);color:var(--text-dim);cursor:pointer;background:0 0;border-radius:3px;flex-shrink:0;margin-left:6px;padding:1px 6px;font-size:10px}.doc-copy-path:hover{background:var(--border-subtle);color:var(--text-base)}.doc-content{flex:1;min-height:0;overflow:auto}.doc-pre{white-space:pre-wrap;word-break:break-all;margin:0;padding:8px 10px;font-family:SF Mono,Menlo,monospace;font-size:12px;line-height:1.5}.doc-markdown{padding:12px 16px}.doc-content .notes-code-block{border-radius:0;margin:0}.doc-content .notes-code-block pre{max-height:none}
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-BZmCptaP.js";import{i as r}from"./page-shell-k5-hYhKb.js";var i=e(t(),1),a=n(),o=[`employees`],s=[`ai-e`,`claude`,`claude-e`,`codex`,`codex-app`,`copilot`,`cursor`,`kiro-code`,`gemini`,`grok`,`opencode`],c=0;function l(){return c+=1,`emp_${Date.now().toString(36)}_${c}`}function u(){let e=globalThis.crypto;if(e&&typeof e.randomUUID==`function`)try{return e.randomUUID()}catch{}return l()}function d(e=u()){return{id:e,name:``,cli:`claude`,role:``,prompt:``,active:!0}}function f(e){if(!Array.isArray(e))return[];let t=[],n=0;for(let r of e){if(typeof r==`string`){n+=1,t.push({...d(`emp_legacy_${n}`),name:r});continue}if(!r||typeof r!=`object`)continue;let e=r,i=typeof e.name==`string`?e.name:``;if(!i&&!e.id)continue;n+=1;let a=typeof e.id==`string`&&e.id.trim()?e.id.trim():`emp_unknown_${n}`,o=typeof e.cli==`string`&&e.cli.trim()?e.cli.trim():`claude`,s=typeof e.role==`string`?e.role:``,c=typeof e.prompt==`string`?e.prompt:``,l=e.active!==!1;t.push({id:a,name:i,cli:o,role:s,prompt:c,active:l})}return t}function p(e){return e.name.trim()?e.cli.trim()?null:`CLI is required`:`Name is required`}function m(e){return e.some(e=>p(e)!==null)}function h(e){let t=new Map;for(let n of e){let e=n.name.trim().toLowerCase();e&&t.set(e,(t.get(e)??0)+1)}let n=new Set;for(let[e,r]of t)r>1&&n.add(e);return n}function g(e){return e.map(e=>{let t={id:e.id,name:e.name.trim(),cli:e.cli.trim()||`claude`,role:e.role.trim(),active:e.active};return e.prompt.trim()&&(t.prompt=e.prompt),t})}function _({registerSave:e}){return(0,i.useEffect)(()=>{if(e)return e(null),()=>e(null)},[e]),(0,a.jsx)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:(0,a.jsx)(r,{title:`Employees`,hint:`Runtime employees are now managed from the Agent page.`,children:(0,a.jsx)(`p`,{className:`settings-section-hint`,children:`Open Runtime / Agent to edit dispatchable employees, static employee model overrides, and database-backed employees in one place.`})})})}export{s as DEFAULT_CLI_OPTIONS,o as EMPLOYEE_KEYS,_ as default,h as duplicateNameSet,p as employeeRowError,m as employeesHaveErrors,d as makeDefaultEmployee,u as newEmployeeId,f as normalizeEmployees,g as toPersistShape};