cli-jaw 2.1.1 → 2.1.3

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 (477) hide show
  1. package/README.ja.md +8 -6
  2. package/README.ko.md +8 -6
  3. package/README.md +18 -11
  4. package/README.zh-CN.md +8 -6
  5. package/dist/bin/cli-jaw.js +19 -3
  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-search.js +71 -0
  10. package/dist/bin/commands/chat-search.js.map +1 -0
  11. package/dist/bin/commands/chat.js +98 -58
  12. package/dist/bin/commands/chat.js.map +1 -1
  13. package/dist/bin/commands/dispatch.js +130 -5
  14. package/dist/bin/commands/dispatch.js.map +1 -1
  15. package/dist/bin/commands/goal.js +66 -9
  16. package/dist/bin/commands/goal.js.map +1 -1
  17. package/dist/bin/commands/history.js +61 -0
  18. package/dist/bin/commands/history.js.map +1 -0
  19. package/dist/bin/commands/lock.js +104 -0
  20. package/dist/bin/commands/lock.js.map +1 -0
  21. package/dist/bin/commands/memory.js +23 -2
  22. package/dist/bin/commands/memory.js.map +1 -1
  23. package/dist/bin/commands/orchestrate.js.map +1 -1
  24. package/dist/bin/commands/project.js +4 -1
  25. package/dist/bin/commands/project.js.map +1 -1
  26. package/dist/bin/commands/tui/fullscreen-mode.js +237 -0
  27. package/dist/bin/commands/tui/fullscreen-mode.js.map +1 -0
  28. package/dist/bin/commands/tui/input-handler.js +139 -52
  29. package/dist/bin/commands/tui/input-handler.js.map +1 -1
  30. package/dist/bin/commands/tui/overlays.js +177 -70
  31. package/dist/bin/commands/tui/overlays.js.map +1 -1
  32. package/dist/bin/commands/tui/renderer.js +70 -20
  33. package/dist/bin/commands/tui/renderer.js.map +1 -1
  34. package/dist/bin/commands/tui/simple-mode.js +1 -2
  35. package/dist/bin/commands/tui/simple-mode.js.map +1 -1
  36. package/dist/bin/commands/tui/tui-io.js +8 -0
  37. package/dist/bin/commands/tui/tui-io.js.map +1 -0
  38. package/dist/bin/commands/tui/types.js +9 -0
  39. package/dist/bin/commands/tui/types.js.map +1 -1
  40. package/dist/bin/commands/tui/ws-handler.js +115 -23
  41. package/dist/bin/commands/tui/ws-handler.js.map +1 -1
  42. package/dist/bin/commands/worker.js +159 -0
  43. package/dist/bin/commands/worker.js.map +1 -0
  44. package/dist/bin/postinstall.js +0 -76
  45. package/dist/bin/postinstall.js.map +1 -1
  46. package/dist/lib/mcp/format-converters.js +21 -2
  47. package/dist/lib/mcp/format-converters.js.map +1 -1
  48. package/dist/lib/mcp/mcp-registry.js +75 -0
  49. package/dist/lib/mcp/mcp-registry.js.map +1 -0
  50. package/dist/lib/stt.js +1 -1
  51. package/dist/lib/stt.js.map +1 -1
  52. package/dist/lib/upload.js +7 -0
  53. package/dist/lib/upload.js.map +1 -1
  54. package/dist/scripts/fresh-install-smoke.js +1 -1
  55. package/dist/scripts/fresh-install-smoke.js.map +1 -1
  56. package/dist/server.js +151 -22
  57. package/dist/server.js.map +1 -1
  58. package/dist/src/agent/agy-runtime.js +1 -0
  59. package/dist/src/agent/agy-runtime.js.map +1 -1
  60. package/dist/src/agent/agy-transcript-watcher.js +78 -0
  61. package/dist/src/agent/agy-transcript-watcher.js.map +1 -0
  62. package/dist/src/agent/agy-transcript.js +158 -0
  63. package/dist/src/agent/agy-transcript.js.map +1 -0
  64. package/dist/src/agent/args.js +51 -5
  65. package/dist/src/agent/args.js.map +1 -1
  66. package/dist/src/agent/claude-e-runtime.js +1 -1
  67. package/dist/src/agent/claude-e-runtime.js.map +1 -1
  68. package/dist/src/agent/codex-app-client.js +2 -2
  69. package/dist/src/agent/codex-app-client.js.map +1 -1
  70. package/dist/src/agent/cursor-runtime.js +1 -0
  71. package/dist/src/agent/cursor-runtime.js.map +1 -1
  72. package/dist/src/agent/error-classifier.js +6 -1
  73. package/dist/src/agent/error-classifier.js.map +1 -1
  74. package/dist/src/agent/events/claude.js +1 -0
  75. package/dist/src/agent/events/claude.js.map +1 -1
  76. package/dist/src/agent/events/codex.js +0 -44
  77. package/dist/src/agent/events/codex.js.map +1 -1
  78. package/dist/src/agent/events/helpers.js +52 -5
  79. package/dist/src/agent/events/helpers.js.map +1 -1
  80. package/dist/src/agent/events/opencode.js +6 -2
  81. package/dist/src/agent/events/opencode.js.map +1 -1
  82. package/dist/src/agent/events/summary.js +3 -2
  83. package/dist/src/agent/events/summary.js.map +1 -1
  84. package/dist/src/agent/events/tool-labels.js +8 -5
  85. package/dist/src/agent/events/tool-labels.js.map +1 -1
  86. package/dist/src/agent/kiro-auth.js +213 -0
  87. package/dist/src/agent/kiro-auth.js.map +1 -0
  88. package/dist/src/agent/kiro-models.js +79 -0
  89. package/dist/src/agent/kiro-models.js.map +1 -0
  90. package/dist/src/agent/kiro-runtime.js +314 -0
  91. package/dist/src/agent/kiro-runtime.js.map +1 -0
  92. package/dist/src/agent/lifecycle-handler.js +208 -23
  93. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  94. package/dist/src/agent/memory-flush-controller.js +3 -4
  95. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  96. package/dist/src/agent/resume-classifier.js +18 -1
  97. package/dist/src/agent/resume-classifier.js.map +1 -1
  98. package/dist/src/agent/session-persistence.js +2 -2
  99. package/dist/src/agent/session-persistence.js.map +1 -1
  100. package/dist/src/agent/smoke-detector.js +3 -0
  101. package/dist/src/agent/smoke-detector.js.map +1 -1
  102. package/dist/src/agent/spawn/queue.js +11 -5
  103. package/dist/src/agent/spawn/queue.js.map +1 -1
  104. package/dist/src/agent/spawn/resume.js +6 -1
  105. package/dist/src/agent/spawn/resume.js.map +1 -1
  106. package/dist/src/agent/spawn-env.js +1 -1
  107. package/dist/src/agent/spawn-env.js.map +1 -1
  108. package/dist/src/agent/spawn.js +231 -43
  109. package/dist/src/agent/spawn.js.map +1 -1
  110. package/dist/src/agent/watchdog.js +1 -1
  111. package/dist/src/agent/watchdog.js.map +1 -1
  112. package/dist/src/browser/actions.js +0 -8
  113. package/dist/src/browser/actions.js.map +1 -1
  114. package/dist/src/browser/adaptive-fetch/browser-escalation.js +5 -29
  115. package/dist/src/browser/adaptive-fetch/browser-escalation.js.map +1 -1
  116. package/dist/src/browser/adaptive-fetch/browser-runtime.js +5 -14
  117. package/dist/src/browser/adaptive-fetch/browser-runtime.js.map +1 -1
  118. package/dist/src/browser/adaptive-fetch/browser-session.js +14 -28
  119. package/dist/src/browser/adaptive-fetch/browser-session.js.map +1 -1
  120. package/dist/src/browser/adaptive-fetch/challenge-detector.js +4 -26
  121. package/dist/src/browser/adaptive-fetch/challenge-detector.js.map +1 -1
  122. package/dist/src/browser/adaptive-fetch/content-scorer.js +5 -29
  123. package/dist/src/browser/adaptive-fetch/content-scorer.js.map +1 -1
  124. package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js +0 -64
  125. package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js.map +1 -1
  126. package/dist/src/browser/adaptive-fetch/fetcher.js +4 -19
  127. package/dist/src/browser/adaptive-fetch/fetcher.js.map +1 -1
  128. package/dist/src/browser/adaptive-fetch/human-loop.js +0 -26
  129. package/dist/src/browser/adaptive-fetch/human-loop.js.map +1 -1
  130. package/dist/src/browser/adaptive-fetch/index.js +74 -145
  131. package/dist/src/browser/adaptive-fetch/index.js.map +1 -1
  132. package/dist/src/browser/adaptive-fetch/metadata.js +1 -41
  133. package/dist/src/browser/adaptive-fetch/metadata.js.map +1 -1
  134. package/dist/src/browser/adaptive-fetch/output.js +1 -18
  135. package/dist/src/browser/adaptive-fetch/output.js.map +1 -1
  136. package/dist/src/browser/adaptive-fetch/reader-adapters.js +43 -75
  137. package/dist/src/browser/adaptive-fetch/reader-adapters.js.map +1 -1
  138. package/dist/src/browser/adaptive-fetch/safety.js +5 -48
  139. package/dist/src/browser/adaptive-fetch/safety.js.map +1 -1
  140. package/dist/src/browser/adaptive-fetch/third-party-readers.js +0 -11
  141. package/dist/src/browser/adaptive-fetch/third-party-readers.js.map +1 -1
  142. package/dist/src/browser/adaptive-fetch/trace.js +3 -18
  143. package/dist/src/browser/adaptive-fetch/trace.js.map +1 -1
  144. package/dist/src/browser/adaptive-fetch/transforms.js +0 -23
  145. package/dist/src/browser/adaptive-fetch/transforms.js.map +1 -1
  146. package/dist/src/browser/adaptive-fetch/types.js +3 -0
  147. package/dist/src/browser/adaptive-fetch/types.js.map +1 -0
  148. package/dist/src/browser/adaptive-fetch/validators.js +0 -17
  149. package/dist/src/browser/adaptive-fetch/validators.js.map +1 -1
  150. package/dist/src/browser/adaptive-fetch/waf-profiles.js +0 -10
  151. package/dist/src/browser/adaptive-fetch/waf-profiles.js.map +1 -1
  152. package/dist/src/browser/connection.js +1 -1
  153. package/dist/src/browser/connection.js.map +1 -1
  154. package/dist/src/browser/web-ai/chatgpt-response.js +0 -1
  155. package/dist/src/browser/web-ai/chatgpt-response.js.map +1 -1
  156. package/dist/src/browser/web-ai/chatgpt.js +0 -33
  157. package/dist/src/browser/web-ai/chatgpt.js.map +1 -1
  158. package/dist/src/browser/web-ai/diagnostics.js +0 -16
  159. package/dist/src/browser/web-ai/diagnostics.js.map +1 -1
  160. package/dist/src/browser/web-ai/doctor.js.map +1 -1
  161. package/dist/src/browser/web-ai/errors.js +1 -1
  162. package/dist/src/browser/web-ai/errors.js.map +1 -1
  163. package/dist/src/browser/web-ai/grok-live.js +2 -0
  164. package/dist/src/browser/web-ai/grok-live.js.map +1 -1
  165. package/dist/src/cli/claude-models.js +2 -2
  166. package/dist/src/cli/claude-models.js.map +1 -1
  167. package/dist/src/cli/command-context.js.map +1 -1
  168. package/dist/src/cli/commands.js +16 -4
  169. package/dist/src/cli/commands.js.map +1 -1
  170. package/dist/src/cli/compact.js +2 -1
  171. package/dist/src/cli/compact.js.map +1 -1
  172. package/dist/src/cli/handlers/session-handlers.js +34 -0
  173. package/dist/src/cli/handlers/session-handlers.js.map +1 -0
  174. package/dist/src/cli/handlers-project.js.map +1 -1
  175. package/dist/src/cli/handlers-runtime.js +2 -0
  176. package/dist/src/cli/handlers-runtime.js.map +1 -1
  177. package/dist/src/cli/handlers-workflows.js +85 -17
  178. package/dist/src/cli/handlers-workflows.js.map +1 -1
  179. package/dist/src/cli/handlers.js +84 -43
  180. package/dist/src/cli/handlers.js.map +1 -1
  181. package/dist/src/cli/readiness.js +17 -1
  182. package/dist/src/cli/readiness.js.map +1 -1
  183. package/dist/src/cli/registry-live.js +17 -0
  184. package/dist/src/cli/registry-live.js.map +1 -0
  185. package/dist/src/cli/registry.js +51 -10
  186. package/dist/src/cli/registry.js.map +1 -1
  187. package/dist/src/cli/tui/composer.js +135 -5
  188. package/dist/src/cli/tui/composer.js.map +1 -1
  189. package/dist/src/cli/tui/diffview.js +41 -0
  190. package/dist/src/cli/tui/diffview.js.map +1 -0
  191. package/dist/src/cli/tui/editor.js +45 -0
  192. package/dist/src/cli/tui/editor.js.map +1 -0
  193. package/dist/src/cli/tui/file-mention.js +78 -0
  194. package/dist/src/cli/tui/file-mention.js.map +1 -0
  195. package/dist/src/cli/tui/highlight.js +82 -0
  196. package/dist/src/cli/tui/highlight.js.map +1 -0
  197. package/dist/src/cli/tui/keymap.js +21 -0
  198. package/dist/src/cli/tui/keymap.js.map +1 -1
  199. package/dist/src/cli/tui/markdown.js +124 -0
  200. package/dist/src/cli/tui/markdown.js.map +1 -0
  201. package/dist/src/cli/tui/mode.js +26 -0
  202. package/dist/src/cli/tui/mode.js.map +1 -0
  203. package/dist/src/cli/tui/overlay.js +121 -98
  204. package/dist/src/cli/tui/overlay.js.map +1 -1
  205. package/dist/src/cli/tui/render/frame.js +72 -0
  206. package/dist/src/cli/tui/render/frame.js.map +1 -0
  207. package/dist/src/cli/tui/render/layout.js +22 -0
  208. package/dist/src/cli/tui/render/layout.js.map +1 -0
  209. package/dist/src/cli/tui/render/mouse.js +25 -0
  210. package/dist/src/cli/tui/render/mouse.js.map +1 -0
  211. package/dist/src/cli/tui/render/scheduler.js +37 -0
  212. package/dist/src/cli/tui/render/scheduler.js.map +1 -0
  213. package/dist/src/cli/tui/render/viewport.js +82 -0
  214. package/dist/src/cli/tui/render/viewport.js.map +1 -0
  215. package/dist/src/cli/tui/renderers.js +37 -0
  216. package/dist/src/cli/tui/renderers.js.map +1 -1
  217. package/dist/src/cli/tui/stream.js +48 -0
  218. package/dist/src/cli/tui/stream.js.map +1 -0
  219. package/dist/src/cli/tui/text-buffer.js +143 -0
  220. package/dist/src/cli/tui/text-buffer.js.map +1 -0
  221. package/dist/src/cli/tui/theme.js +128 -0
  222. package/dist/src/cli/tui/theme.js.map +1 -0
  223. package/dist/src/cli/tui/transcript.js +4 -0
  224. package/dist/src/cli/tui/transcript.js.map +1 -1
  225. package/dist/src/command-contract/help-renderer.js +1 -1
  226. package/dist/src/command-contract/help-renderer.js.map +1 -1
  227. package/dist/src/core/chat-sessions.js +63 -0
  228. package/dist/src/core/chat-sessions.js.map +1 -0
  229. package/dist/src/core/cli-detection.js +14 -0
  230. package/dist/src/core/cli-detection.js.map +1 -1
  231. package/dist/src/core/compact.js +43 -11
  232. package/dist/src/core/compact.js.map +1 -1
  233. package/dist/src/core/config.js +14 -1
  234. package/dist/src/core/config.js.map +1 -1
  235. package/dist/src/core/db.js +52 -12
  236. package/dist/src/core/db.js.map +1 -1
  237. package/dist/src/core/employees.js +2 -2
  238. package/dist/src/core/employees.js.map +1 -1
  239. package/dist/src/core/main-session.js +3 -2
  240. package/dist/src/core/main-session.js.map +1 -1
  241. package/dist/src/discord/bot.js.map +1 -1
  242. package/dist/src/discord/discord-file.js +1 -1
  243. package/dist/src/discord/discord-file.js.map +1 -1
  244. package/dist/src/discord/send-only-client.js +1 -3
  245. package/dist/src/discord/send-only-client.js.map +1 -1
  246. package/dist/src/goal/heartbeat.js +113 -7
  247. package/dist/src/goal/heartbeat.js.map +1 -1
  248. package/dist/src/goal/store.js +44 -5
  249. package/dist/src/goal/store.js.map +1 -1
  250. package/dist/src/ide/diff.js +37 -0
  251. package/dist/src/ide/diff.js.map +1 -1
  252. package/dist/src/manager/launchd-service.js +1 -1
  253. package/dist/src/manager/launchd-service.js.map +1 -1
  254. package/dist/src/manager/lifecycle-helpers.js +14 -0
  255. package/dist/src/manager/lifecycle-helpers.js.map +1 -1
  256. package/dist/src/manager/lifecycle-store.js.map +1 -1
  257. package/dist/src/manager/lifecycle.js +94 -5
  258. package/dist/src/manager/lifecycle.js.map +1 -1
  259. package/dist/src/manager/notes/routes.js +0 -31
  260. package/dist/src/manager/notes/routes.js.map +1 -1
  261. package/dist/src/manager/notes/ws.js.map +1 -1
  262. package/dist/src/manager/preview-link-policy.js +11 -4
  263. package/dist/src/manager/preview-link-policy.js.map +1 -1
  264. package/dist/src/manager/registry.js.map +1 -1
  265. package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
  266. package/dist/src/manager/scan.js +36 -1
  267. package/dist/src/manager/scan.js.map +1 -1
  268. package/dist/src/manager/server.js +42 -7
  269. package/dist/src/manager/server.js.map +1 -1
  270. package/dist/src/manager/shutdown.js +8 -3
  271. package/dist/src/manager/shutdown.js.map +1 -1
  272. package/dist/src/manager/systemd-service.js +1 -1
  273. package/dist/src/manager/systemd-service.js.map +1 -1
  274. package/dist/src/memory/indexing.js +49 -1
  275. package/dist/src/memory/indexing.js.map +1 -1
  276. package/dist/src/memory/keyword-expand.js +0 -187
  277. package/dist/src/memory/keyword-expand.js.map +1 -1
  278. package/dist/src/memory/runtime.js +3 -2
  279. package/dist/src/memory/runtime.js.map +1 -1
  280. package/dist/src/memory/shared.js.map +1 -1
  281. package/dist/src/messaging/send.js +66 -7
  282. package/dist/src/messaging/send.js.map +1 -1
  283. package/dist/src/orchestrator/collect.js +3 -2
  284. package/dist/src/orchestrator/collect.js.map +1 -1
  285. package/dist/src/orchestrator/distribute.js +9 -3
  286. package/dist/src/orchestrator/distribute.js.map +1 -1
  287. package/dist/src/orchestrator/friction.js +59 -0
  288. package/dist/src/orchestrator/friction.js.map +1 -0
  289. package/dist/src/orchestrator/gateway.js +4 -4
  290. package/dist/src/orchestrator/gateway.js.map +1 -1
  291. package/dist/src/orchestrator/pipeline.js +89 -45
  292. package/dist/src/orchestrator/pipeline.js.map +1 -1
  293. package/dist/src/orchestrator/sanitize.js +69 -0
  294. package/dist/src/orchestrator/sanitize.js.map +1 -0
  295. package/dist/src/orchestrator/seed.js +50 -0
  296. package/dist/src/orchestrator/seed.js.map +1 -0
  297. package/dist/src/orchestrator/state-machine.js +215 -76
  298. package/dist/src/orchestrator/state-machine.js.map +1 -1
  299. package/dist/src/orchestrator/worker-monitor.js +1 -1
  300. package/dist/src/orchestrator/worker-monitor.js.map +1 -1
  301. package/dist/src/orchestrator/worker-progress.js +29 -0
  302. package/dist/src/orchestrator/worker-progress.js.map +1 -0
  303. package/dist/src/orchestrator/worker-registry.js +63 -2
  304. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  305. package/dist/src/prompt/builder.js +190 -115
  306. package/dist/src/prompt/builder.js.map +1 -1
  307. package/dist/src/prompt/templates/a1-system.md +124 -61
  308. package/dist/src/prompt/templates/control-system.md +2 -2
  309. package/dist/src/prompt/templates/employee.md +41 -56
  310. package/dist/src/prompt/templates/orchestration.md +23 -8
  311. package/dist/src/prompt/templates/skills.md +6 -0
  312. package/dist/src/routes/browser.js +3 -3
  313. package/dist/src/routes/browser.js.map +1 -1
  314. package/dist/src/routes/employees.js +4 -4
  315. package/dist/src/routes/employees.js.map +1 -1
  316. package/dist/src/routes/goal.js +48 -4
  317. package/dist/src/routes/goal.js.map +1 -1
  318. package/dist/src/routes/heartbeat.js +1 -1
  319. package/dist/src/routes/heartbeat.js.map +1 -1
  320. package/dist/src/routes/i18n.js +1 -1
  321. package/dist/src/routes/i18n.js.map +1 -1
  322. package/dist/src/routes/jaw-memory.js +1 -1
  323. package/dist/src/routes/jaw-memory.js.map +1 -1
  324. package/dist/src/routes/memory.js.map +1 -1
  325. package/dist/src/routes/messaging.js +8 -3
  326. package/dist/src/routes/messaging.js.map +1 -1
  327. package/dist/src/routes/orchestrate.js +267 -117
  328. package/dist/src/routes/orchestrate.js.map +1 -1
  329. package/dist/src/routes/quota-agy-reverse.js +6 -5
  330. package/dist/src/routes/quota-agy-reverse.js.map +1 -1
  331. package/dist/src/routes/quota-kiro-reverse.js +187 -0
  332. package/dist/src/routes/quota-kiro-reverse.js.map +1 -0
  333. package/dist/src/routes/quota.js +68 -6
  334. package/dist/src/routes/quota.js.map +1 -1
  335. package/dist/src/routes/settings.js +37 -8
  336. package/dist/src/routes/settings.js.map +1 -1
  337. package/dist/src/routes/skills.js.map +1 -1
  338. package/dist/src/security/path-guards.js +0 -3
  339. package/dist/src/security/path-guards.js.map +1 -1
  340. package/dist/src/security/security-audit-log.js.map +1 -1
  341. package/dist/src/shared/shell-command-display.js +51 -0
  342. package/dist/src/shared/shell-command-display.js.map +1 -0
  343. package/dist/src/telegram/bot.js.map +1 -1
  344. package/dist/src/trace/store.js +32 -0
  345. package/dist/src/trace/store.js.map +1 -1
  346. package/dist/src/types/cli-engine.js +1 -0
  347. package/dist/src/types/cli-engine.js.map +1 -1
  348. package/dist/src/workflows/employee-boundary.js +7 -7
  349. package/dist/src/workflows/employee-boundary.js.map +1 -1
  350. package/dist/src/workflows/handoff.js +16 -16
  351. package/dist/src/workflows/handoff.js.map +1 -1
  352. package/dist/src/workflows/scope-sandbox.js +58 -0
  353. package/dist/src/workflows/scope-sandbox.js.map +1 -0
  354. package/package.json +1 -1
  355. package/public/assets/providers/kiro-color.svg +15 -0
  356. package/public/assets/providers/kiro.svg +14 -0
  357. package/public/css/chat.css +27 -0
  358. package/public/css/modals.css +79 -0
  359. package/public/css/orc-state.css +10 -6
  360. package/public/css/sidebar.css +85 -0
  361. package/public/css/variables.css +6 -2
  362. package/public/dist/assets/{Agent-CIUGaUVn.js → Agent-DBKNQ6tp.js} +1 -1
  363. package/public/dist/assets/{DocPanel-C1pGgE-S.js → DocPanel-BU16GUlB.js} +1 -1
  364. package/public/dist/assets/DocPanel-gU-WkgyA.css +1 -0
  365. package/public/dist/assets/Employees-F0ssNuO-.js +1 -0
  366. package/public/dist/assets/{FolderPanel-DSkanaGN.js → FolderPanel-DT0fU8f2.js} +1 -1
  367. package/public/dist/assets/Heartbeat-fsuLzY9c.js +1 -0
  368. package/public/dist/assets/Mcp-_Yq4N3Sk.js +4 -0
  369. package/public/dist/assets/{Memory-BgN8djV4.js → Memory-CRR8kotI.js} +1 -1
  370. package/public/dist/assets/{ModelProvider-DHQ1Zvw0.js → ModelProvider-DQgISbKw.js} +1 -1
  371. package/public/dist/assets/agent-meta-C4mauPL5.js +1 -0
  372. package/public/dist/assets/app-0OQhPpTG.css +1 -0
  373. package/public/dist/assets/app-CSqIyg9A.js +55 -0
  374. package/public/dist/assets/constants-BHMkzpN_.js +1 -0
  375. package/public/dist/assets/{employees-DiNLzEXS.js → employees-CZdWHH-r.js} +7 -7
  376. package/public/dist/assets/idb-cache-0LNMskFB.js +1 -0
  377. package/public/dist/assets/idb-cache-5H89a4l8.js +1 -0
  378. package/public/dist/assets/manager-CGTQ5EIm.js +12 -0
  379. package/public/dist/assets/manager-UBunDqMH.css +1 -0
  380. package/public/dist/assets/{memory-B_nn0A4v.js → memory-B3QSmj_e.js} +9 -9
  381. package/public/dist/assets/memory-DOBqiuPc.js +1 -0
  382. package/public/dist/assets/{provider-icons-XEfJPGTe.js → provider-icons-Crv6yvlG.js} +35 -6
  383. package/public/dist/assets/render-J11oxfnl.js +28 -0
  384. package/public/dist/assets/settings-BV_2Bh0_.js +1 -0
  385. package/public/dist/assets/settings-m_cim0ov.js +151 -0
  386. package/public/dist/assets/sidebar-ZBXdBgF7.js +49 -0
  387. package/public/dist/assets/{skills-COa4iSwL.js → skills-CjaBmIPV.js} +6 -6
  388. package/public/dist/assets/skills-Xm3fl1zr.js +1 -0
  389. package/public/dist/assets/{slash-commands-C_ePvrPi.js → slash-commands-71jc07Wf.js} +1 -1
  390. package/public/dist/assets/slash-commands-BO6ssnAz.js +1 -0
  391. package/public/dist/assets/{trace-drawer-CY4z_Ie8.js → trace-drawer-Czvf2P2o.js} +1 -1
  392. package/public/dist/assets/ui-CverZJnd.js +1 -0
  393. package/public/dist/assets/ui-qKxy-4p9.js +142 -0
  394. package/public/dist/index.html +113 -86
  395. package/public/dist/manager/index.html +2 -2
  396. package/public/index.html +111 -84
  397. package/public/js/constants.ts +34 -11
  398. package/public/js/features/chat-messages.ts +13 -2
  399. package/public/js/features/chat-search.ts +5 -1
  400. package/public/js/features/chat.ts +86 -44
  401. package/public/js/features/employees.ts +7 -2
  402. package/public/js/features/idb-cache.ts +4 -0
  403. package/public/js/features/media-lightbox.ts +40 -0
  404. package/public/js/features/message-history.ts +55 -7
  405. package/public/js/features/pending-queue.ts +28 -4
  406. package/public/js/features/process-block.ts +32 -17
  407. package/public/js/features/process-log-adapter.ts +11 -2
  408. package/public/js/features/settings-cli-status-render.ts +161 -0
  409. package/public/js/features/settings-cli-status.ts +136 -187
  410. package/public/js/features/settings-core.ts +5 -1
  411. package/public/js/features/settings-mcp.ts +513 -7
  412. package/public/js/features/settings-types.ts +1 -0
  413. package/public/js/features/settings.ts +1 -1
  414. package/public/js/features/tool-ui.ts +18 -4
  415. package/public/js/features/transport-status-row.ts +3 -0
  416. package/public/js/features/ui-status.ts +5 -1
  417. package/public/js/main.ts +5 -0
  418. package/public/js/preview-parent-origin.ts +14 -0
  419. package/public/js/provider-icons.ts +6 -1
  420. package/public/js/render/file-links.ts +10 -2
  421. package/public/js/render/markdown.ts +16 -0
  422. package/public/js/ui.ts +8 -1
  423. package/public/js/virtual-scroll.ts +19 -0
  424. package/public/js/ws.ts +151 -15
  425. package/public/locales/en.json +9 -2
  426. package/public/locales/ja.json +9 -2
  427. package/public/locales/ko.json +9 -2
  428. package/public/locales/zh.json +9 -2
  429. package/public/manager/src/App.tsx +13 -70
  430. package/public/manager/src/InstancePreview.tsx +56 -11
  431. package/public/manager/src/SidebarRailRouter.tsx +32 -4
  432. package/public/manager/src/components/InstanceRow.tsx +0 -1
  433. package/public/manager/src/components/WorkbenchHeader.tsx +17 -7
  434. package/public/manager/src/doc-panel/DocPanel.tsx +14 -1
  435. package/public/manager/src/doc-panel/doc-panel.css +16 -0
  436. package/public/manager/src/folder-panel/FolderPanel.tsx +13 -2
  437. package/public/manager/src/hooks/useElectronDroppedPaths.ts +89 -0
  438. package/public/manager/src/hooks/useInstanceMessageEvents.ts +4 -15
  439. package/public/manager/src/manager-components.css +35 -1
  440. package/public/manager/src/manager-polish.css +11 -1
  441. package/public/manager/src/manager-shortcut-runner.ts +107 -0
  442. package/public/manager/src/manager-shortcuts.ts +15 -0
  443. package/public/manager/src/panels/desktop-bridge.ts +13 -0
  444. package/public/manager/src/settings/SettingsSidebar.tsx +1 -1
  445. package/public/manager/src/settings/components/sidebar-filter.ts +2 -0
  446. package/public/manager/src/settings/pages/Mcp.tsx +311 -43
  447. package/public/manager/src/settings/pages/components/McpServerCard.tsx +89 -55
  448. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +32 -9
  449. package/public/manager/src/settings/pages/components/employees-helpers.ts +1 -0
  450. package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +1 -0
  451. package/public/manager/src/settings/pages/mcp-helpers.ts +54 -12
  452. package/public/manager/src/settings/types.ts +1 -0
  453. package/public/manager/src/types.ts +2 -1
  454. package/scripts/fresh-install-smoke.ts +1 -1
  455. package/scripts/smoke/agy-transcript-tail-smoke.mjs +89 -0
  456. package/public/dist/assets/DocPanel-CL1scIfq.css +0 -1
  457. package/public/dist/assets/Employees-BL9MAzzx.js +0 -1
  458. package/public/dist/assets/Heartbeat-D64JCg4t.js +0 -1
  459. package/public/dist/assets/Mcp-wYwJA_61.js +0 -3
  460. package/public/dist/assets/agent-meta-BhEbjy4P.js +0 -1
  461. package/public/dist/assets/app-2Rz848bQ.js +0 -48
  462. package/public/dist/assets/app-BW-Xz2p6.css +0 -1
  463. package/public/dist/assets/constants-ahKI_aEG.js +0 -1
  464. package/public/dist/assets/idb-cache-BnZfG5FD.js +0 -1
  465. package/public/dist/assets/idb-cache-CZ3JdK8r.js +0 -1
  466. package/public/dist/assets/manager-CfyZloIP.js +0 -12
  467. package/public/dist/assets/manager-DyrwJLZr.css +0 -1
  468. package/public/dist/assets/memory-CCjNFWmO.js +0 -1
  469. package/public/dist/assets/render-CgDEBoCX.js +0 -28
  470. package/public/dist/assets/settings-CY_6tGuS.js +0 -1
  471. package/public/dist/assets/settings-DWW4GzNc.js +0 -66
  472. package/public/dist/assets/sidebar-DQKE5IA1.js +0 -23
  473. package/public/dist/assets/skills-DYTlqoke.js +0 -1
  474. package/public/dist/assets/slash-commands-D7CU5oso.js +0 -1
  475. package/public/dist/assets/ui-Car1OUvV.js +0 -1
  476. package/public/dist/assets/ui-DK_9ndj0.js +0 -140
  477. /package/public/dist/assets/{locale-DT1WRaeJ.js → locale-BHMJIzyw.js} +0 -0
@@ -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,58 @@
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
+ function isPathWithin(child, parent) {
15
+ const relative = path.relative(parent, child);
16
+ return relative === '' || (!!relative && !relative.startsWith('..') && !path.isAbsolute(relative));
17
+ }
18
+ function listGitChangedFiles(projectRoot) {
19
+ const outputs = [
20
+ execSync('git diff --name-only', { cwd: projectRoot }).toString(),
21
+ execSync('git diff --cached --name-only', { cwd: projectRoot }).toString(),
22
+ execSync('git ls-files --others --exclude-standard', { cwd: projectRoot }).toString(),
23
+ ];
24
+ return [...new Set(outputs.flatMap(output => output.split('\n').filter(Boolean)))];
25
+ }
26
+ export function normalizeScope(projectRoot, scopePath) {
27
+ const resolvedRoot = path.resolve(projectRoot);
28
+ const resolvedScope = path.resolve(projectRoot, scopePath);
29
+ if (!isPathWithin(resolvedScope, resolvedRoot)) {
30
+ throw new Error(`Security Error: Scope [${scopePath}] escapes project root.`);
31
+ }
32
+ if (fs.existsSync(resolvedScope)) {
33
+ const realRoot = fs.realpathSync(resolvedRoot);
34
+ const realScope = fs.realpathSync(resolvedScope);
35
+ if (!isPathWithin(realScope, realRoot)) {
36
+ throw new Error(`Security Error: Realpath of scope is outside project root.`);
37
+ }
38
+ }
39
+ return resolvedScope;
40
+ }
41
+ export function isProtectedPath(filePath) {
42
+ return PROTECTED_PATTERNS.some(regex => regex.test(filePath));
43
+ }
44
+ export function postDispatchDiffCheck(projectRoot, allowedScope) {
45
+ if (!allowedScope)
46
+ return { ok: true, modifiedOutside: [] };
47
+ const modifiedFiles = listGitChangedFiles(projectRoot);
48
+ const absoluteAllowedScope = path.resolve(projectRoot, allowedScope);
49
+ const outsideFiles = modifiedFiles.filter(file => {
50
+ const absFile = path.resolve(projectRoot, file);
51
+ return !isPathWithin(absFile, absoluteAllowedScope) || isProtectedPath(file);
52
+ });
53
+ return {
54
+ ok: outsideFiles.length === 0,
55
+ modifiedOutside: outsideFiles,
56
+ };
57
+ }
58
+ //# 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,SAAS,YAAY,CAAC,KAAa,EAAE,MAAc;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvG,CAAC;AAED,SAAS,mBAAmB,CAAC,WAAmB;IAC5C,MAAM,OAAO,GAAG;QACZ,QAAQ,CAAC,sBAAsB,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,EAAE;QACjE,QAAQ,CAAC,+BAA+B,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC1E,QAAQ,CAAC,0CAA0C,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,EAAE;KACxF,CAAC;IACF,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,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,YAAY,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,yBAAyB,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QACjD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;YACrC,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,aAAa,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAEvD,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,YAAY,CAAC,OAAO,EAAE,oBAAoB,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;IACjF,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.1",
3
+ "version": "2.1.3",
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>
@@ -1397,6 +1397,21 @@ div.math-placeholder {
1397
1397
  opacity: 0.7;
1398
1398
  }
1399
1399
 
1400
+ .status-badge.status-steering {
1401
+ animation: none;
1402
+ }
1403
+
1404
+ .status-badge.status-steering::before {
1405
+ content: '';
1406
+ display: inline-block;
1407
+ width: 6px;
1408
+ height: 6px;
1409
+ border-radius: 50%;
1410
+ background: var(--status-steering-color, var(--primary));
1411
+ animation: dotPing 1s ease-in-out infinite;
1412
+ margin-right: 4px;
1413
+ }
1414
+
1400
1415
  /* ── View Transitions (same-document panel switching) ── */
1401
1416
  ::view-transition-old(root),
1402
1417
  ::view-transition-new(root) {
@@ -1456,3 +1471,15 @@ div.math-placeholder {
1456
1471
  from { opacity: 0.6; }
1457
1472
  to { opacity: 1; }
1458
1473
  }
1474
+
1475
+ /* ── Inline Media + Lightbox ── */
1476
+ .chat-inline-img { max-width: 100%; max-height: 360px; border-radius: 8px; margin: 8px 0; cursor: pointer; display: block; }
1477
+ .chat-inline-video { max-width: 100%; max-height: 360px; border-radius: 8px; margin: 8px 0; display: block; }
1478
+ .media-lightbox { position: fixed; inset: 0; z-index: 9999; display: flex; align-items: center; justify-content: center; }
1479
+ .media-lightbox.hidden { display: none; }
1480
+ .media-lightbox-backdrop { position: absolute; inset: 0; background: rgba(0,0,0,0.85); }
1481
+ .media-lightbox-content { position: relative; display: flex; flex-direction: column; align-items: center; }
1482
+ .media-lightbox-img { max-width: 90vw; max-height: 85vh; object-fit: contain; border-radius: 8px; cursor: pointer; }
1483
+ .media-lightbox-controls { position: absolute; top: 8px; right: 8px; display: flex; gap: 8px; }
1484
+ .media-lightbox-controls button { background: rgba(0,0,0,0.6); color: #fff; border: none; border-radius: 4px; padding: 6px 12px; cursor: pointer; font-size: 14px; }
1485
+ .media-lightbox-controls button:hover { background: rgba(0,0,0,0.9); }
@@ -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,7 +240,7 @@ 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; font-size: 0.82rem; }
243
+ .interview-panel { margin: 0 auto 8px; max-width: 100%; font-size: 0.82rem; }
244
244
  .interview-panel[hidden] { display: none; }
245
245
 
246
246
  /* One-line toggle header — sits right under the IPABCD bar */
@@ -248,21 +248,25 @@ body[data-orc-state].orc-pulse #chatMessages {
248
248
  display: flex; align-items: center; gap: 6px; width: 100%;
249
249
  background: var(--bg-secondary, rgba(255,255,255,0.04));
250
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;
251
+ border-radius: 8px; padding: 8px 14px; cursor: pointer;
252
+ color: var(--text-secondary, inherit); font: inherit; font-size: 0.82rem;
253
253
  text-align: left;
254
254
  }
255
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; }
256
+ .iv-chevron { display: inline-block; opacity: 0.65; transition: transform 0.15s ease; font-size: 1.1em; }
257
257
  .interview-panel:not(.collapsed) .iv-chevron { transform: rotate(90deg); }
258
258
  .iv-summary { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
259
259
  .iv-known-count { color: var(--accent-green, #4caf50); }
260
260
  .iv-unknown-count { color: var(--accent-yellow, #ff9800); }
261
261
 
262
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; }
263
+ .iv-body { display: flex; gap: 12px; margin-top: 6px; max-height: 280px; overflow-y: auto; }
264
264
  .interview-panel.collapsed .iv-body { display: none; }
265
- .iv-section { flex: 1; }
265
+ .iv-section { min-width: 0; }
266
+ .iv-section-ambiguity { flex: 0 0 160px; }
267
+ .iv-section-known { flex: 3 1 0; }
268
+ .iv-section-unknown { flex: 2 1 0; }
269
+ .iv-section-unknown:empty { flex: 0; display: none; }
266
270
  .iv-section ul { list-style: none; padding: 0; margin: 4px 0; }
267
271
  .iv-known::before { content: '✓ '; color: var(--accent-green, #4caf50); }
268
272
  .iv-unknown::before { content: '? '; color: var(--accent-yellow, #ff9800); }
@@ -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;
@@ -13,6 +13,8 @@
13
13
  --status-idle-bg: oklch(15% 0.02 150);
14
14
  --status-running-bg: oklch(17% 0.02 75);
15
15
  --status-running-color: oklch(81% 0.14 85);
16
+ --status-steering-bg: oklch(17% 0.02 250);
17
+ --status-steering-color: oklch(78% 0.12 250);
16
18
  --code-bg: oklch(9% 0.01 250);
17
19
  --link-color: oklch(72% 0.12 250);
18
20
  --table-border: oklch(70% 0.13 200);
@@ -150,6 +152,8 @@ body.right-collapsed {
150
152
  --status-idle-bg: oklch(96% 0.04 150);
151
153
  --status-running-bg: oklch(97% 0.06 90);
152
154
  --status-running-color: oklch(56% 0.12 70);
155
+ --status-steering-bg: oklch(96% 0.04 250);
156
+ --status-steering-color: oklch(50% 0.14 250);
153
157
  --code-bg: oklch(96% 0.005 250);
154
158
  --link-color: oklch(56% 0.18 260);
155
159
  --table-border: oklch(56% 0.18 260);
@@ -495,8 +499,8 @@ select:focus-visible {
495
499
  /* Queue badge on send button */
496
500
  .queue-badge {
497
501
  position: absolute;
498
- top: -6px;
499
- right: -6px;
502
+ top: 6px;
503
+ right: 6px;
500
504
  background: var(--warning);
501
505
  color: var(--bg);
502
506
  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-C4mauPL5.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};
@@ -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";var a=e(t(),1);function o(e){return{name:e.name,path:e.path,kind:e.kind===`folder`?`directory`:`file`,size:e.size}}function s(e,t){for(let n of e){if(n.path===t)return n;let e=s(n.children??[],t);if(e)return e}return null}function c(e){return{kind:`electron-folder`,label:`Folder`,canPickRoot:!0,getDefaultRoot:async()=>{let t=await e.getDefaultRoot();if(!t.ok||!t.path)throw Error(t.error??`Failed to open default folder`);return t.path},pickRoot:async()=>{let t=await e.pickFolder();if(!t.ok)throw Error(t.error??`Failed to pick folder`);return t.path??null},listDir:async t=>{let n=await e.listDir(t);if(!n.ok||!n.entries)throw Error(n.error??`Failed to list directory`);return n.entries},readFile:async t=>{let n=await e.readFile(t);if(!n.ok||n.content===void 0)throw Error(n.error??`Failed to read file`);return{content:n.content,...n.binary===void 0?{}:{binary:n.binary}}},watchDir:t=>e.watchDir(t),unwatchDir:t=>e.unwatchDir(t),onDirChange:t=>e.onDirChange(t)}}function l(e,t){return{kind:`notes-vault`,label:t?`Notes: ${t.split(`/`).pop()||t}`:`Notes vault`,canPickRoot:!1,getDefaultRoot:async()=>``,listDir:async t=>{if(!t)return e.map(o);let n=s(e,t);return!n||n.kind!==`folder`?[]:(n.children??[]).map(o)},readFile:async e=>({content:(await r(e)).content,binary:!1})}}var u=n();function d(){return i()?.folder??null}function f(e){let t=d(),n=(0,a.useMemo)(()=>t?c(t):l(e.notesTree??[],e.notesRoot??null),[t,e.notesRoot,e.notesTree]),[r,i]=(0,a.useState)(null),[o,s]=(0,a.useState)([]),[f,p]=(0,a.useState)(new Set),[m,h]=(0,a.useState)(new Map),[g,_]=(0,a.useState)(null),v=(0,a.useCallback)(async e=>{try{s(await n.listDir(e)),_(null)}catch(e){_(e.message)}},[n]),y=(0,a.useCallback)(async e=>{if(!m.has(e))try{let t=await n.listDir(e);h(n=>new Map(n).set(e,t))}catch(e){_(e.message)}},[m,n]),b=(0,a.useCallback)(e=>{p(t=>{let n=new Set(t);return n.has(e)?n.delete(e):(n.add(e),y(e)),n})},[y]),x=(0,a.useCallback)(async()=>{if(!n.pickRoot)return;let e=await n.pickRoot();e&&(r&&n.unwatchDir&&n.unwatchDir(r),i(e),p(new Set),h(new Map),await v(e))},[v,r,n]);(0,a.useEffect)(()=>{if(r!==null)return;let e=!1;return(async()=>{let t=await n.getDefaultRoot();e||(i(t),await v(t))})(),()=>{e=!0}},[v,r,n]),(0,a.useEffect)(()=>{if(!n.watchDir||!n.onDirChange||r===null)return;n.watchDir(r);let e=n.onDirChange(()=>{v(r)});return()=>{e(),n.unwatchDir?.(r)}},[n,r,v]);function S(t,n){return t.map(t=>(0,u.jsxs)(`div`,{children:[(0,u.jsx)(`div`,{className:`folder-entry folder-entry-${t.kind}`,role:`treeitem`,"aria-selected":t.kind===`file`&&t.path===e.selectedFilePath,style:{paddingLeft:`${8+n*16}px`},children:(0,u.jsxs)(`button`,{type:`button`,className:`folder-entry-btn`,onClick:()=>{t.kind===`directory`?b(t.path):e.onPreviewFile?.(t.path)},children:[(0,u.jsx)(`span`,{className:`folder-entry-icon`,children:t.kind===`directory`?f.has(t.path)?`▾`:`▸`:`·`}),(0,u.jsx)(`span`,{className:`folder-entry-name`,children:t.name})]})}),t.kind===`directory`&&f.has(t.path)&&m.has(t.path)&&S(m.get(t.path),n+1)]},t.path))}return(0,u.jsxs)(`div`,{className:`folder-panel`,children:[(0,u.jsxs)(`div`,{className:`folder-toolbar`,children:[(0,u.jsx)(`button`,{type:`button`,className:`folder-pick-btn`,onClick:()=>void x(),disabled:!n.canPickRoot,children:n.canPickRoot?r?r.split(`/`).pop():`Pick folder...`:n.label}),r!==null&&(0,u.jsx)(`button`,{type:`button`,className:`folder-refresh`,onClick:()=>void v(r),children:`↻`})]}),g&&(0,u.jsx)(`div`,{className:`folder-error`,children:g}),(0,u.jsxs)(`div`,{className:`folder-tree`,role:`tree`,children:[S(o,0),o.length===0&&!g&&r!==null&&(0,u.jsx)(`div`,{className:`folder-empty`,children:n.kind===`notes-vault`?`No notes in vault`:`Empty directory`})]})]})}export{f as FolderPanel};
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";var a=e(t(),1);function o(e){return{name:e.name,path:e.path,kind:e.kind===`folder`?`directory`:`file`,size:e.size}}function s(e,t){for(let n of e){if(n.path===t)return n;let e=s(n.children??[],t);if(e)return e}return null}function c(e){return{kind:`electron-folder`,label:`Folder`,canPickRoot:!0,getDefaultRoot:async()=>{let t=await e.getDefaultRoot();if(!t.ok||!t.path)throw Error(t.error??`Failed to open default folder`);return t.path},pickRoot:async()=>{let t=await e.pickFolder();if(!t.ok)throw Error(t.error??`Failed to pick folder`);return t.path??null},listDir:async t=>{let n=await e.listDir(t);if(!n.ok||!n.entries)throw Error(n.error??`Failed to list directory`);return n.entries},readFile:async t=>{let n=await e.readFile(t);if(!n.ok||n.content===void 0)throw Error(n.error??`Failed to read file`);return{content:n.content,...n.binary===void 0?{}:{binary:n.binary}}},watchDir:t=>e.watchDir(t),unwatchDir:t=>e.unwatchDir(t),onDirChange:t=>e.onDirChange(t)}}function l(e,t){return{kind:`notes-vault`,label:t?`Notes: ${t.split(`/`).pop()||t}`:`Notes vault`,canPickRoot:!1,getDefaultRoot:async()=>``,listDir:async t=>{if(!t)return e.map(o);let n=s(e,t);return!n||n.kind!==`folder`?[]:(n.children??[]).map(o)},readFile:async e=>({content:(await r(e)).content,binary:!1})}}var u=n();function d(){return i()?.folder??null}function f(e){let t=d(),n=(0,a.useMemo)(()=>t?c(t):l(e.notesTree??[],e.notesRoot??null),[t,e.notesRoot,e.notesTree]),[r,i]=(0,a.useState)(null),[o,s]=(0,a.useState)([]),[f,p]=(0,a.useState)(new Set),[m,h]=(0,a.useState)(new Map),[g,_]=(0,a.useState)(null),v=(0,a.useCallback)(async e=>{try{s(await n.listDir(e)),_(null)}catch(e){_(e.message)}},[n]),y=(0,a.useCallback)(async e=>{if(!m.has(e))try{let t=await n.listDir(e);h(n=>new Map(n).set(e,t))}catch(e){_(e.message)}},[m,n]),b=(0,a.useCallback)(e=>{p(t=>{let n=new Set(t);return n.has(e)?n.delete(e):(n.add(e),y(e)),n})},[y]),x=(0,a.useCallback)(async()=>{if(!n.pickRoot)return;let e=await n.pickRoot();e&&(r&&n.unwatchDir&&n.unwatchDir(r),i(e),p(new Set),h(new Map),await v(e))},[v,r,n]);(0,a.useEffect)(()=>{if(r!==null||e.externalRootPath)return;let t=!1;return(async()=>{let e=await n.getDefaultRoot();t||(i(e),await v(e))})(),()=>{t=!0}},[v,e.externalRootPath,r,n]),(0,a.useEffect)(()=>{let t=e.externalRootPath;!t||t===r||(r&&n.unwatchDir&&n.unwatchDir(r),i(t),p(new Set),h(new Map),v(t))},[v,e.externalRootPath,r,n]),(0,a.useEffect)(()=>{if(!n.watchDir||!n.onDirChange||r===null)return;n.watchDir(r);let e=n.onDirChange(()=>{v(r)});return()=>{e(),n.unwatchDir?.(r)}},[n,r,v]);function S(t,n){return t.map(t=>(0,u.jsxs)(`div`,{children:[(0,u.jsx)(`div`,{className:`folder-entry folder-entry-${t.kind}`,role:`treeitem`,"aria-selected":t.kind===`file`&&t.path===e.selectedFilePath,style:{paddingLeft:`${8+n*16}px`},children:(0,u.jsxs)(`button`,{type:`button`,className:`folder-entry-btn`,onClick:()=>{t.kind===`directory`?b(t.path):e.onPreviewFile?.(t.path)},children:[(0,u.jsx)(`span`,{className:`folder-entry-icon`,children:t.kind===`directory`?f.has(t.path)?`▾`:`▸`:`·`}),(0,u.jsx)(`span`,{className:`folder-entry-name`,children:t.name})]})}),t.kind===`directory`&&f.has(t.path)&&m.has(t.path)&&S(m.get(t.path),n+1)]},t.path))}return(0,u.jsxs)(`div`,{className:`folder-panel`,children:[(0,u.jsxs)(`div`,{className:`folder-toolbar`,children:[(0,u.jsx)(`button`,{type:`button`,className:`folder-pick-btn`,onClick:()=>void x(),disabled:!n.canPickRoot,children:n.canPickRoot?r?r.split(`/`).pop():`Pick folder...`:n.label}),r!==null&&(0,u.jsx)(`button`,{type:`button`,className:`folder-refresh`,onClick:()=>void v(r),children:`↻`})]}),g&&(0,u.jsx)(`div`,{className:`folder-error`,children:g}),(0,u.jsxs)(`div`,{className:`folder-tree`,role:`tree`,children:[S(o,0),o.length===0&&!g&&r!==null&&(0,u.jsx)(`div`,{className:`folder-empty`,children:n.kind===`notes-vault`?`No notes in vault`:`Empty directory`})]})]})}export{f as FolderPanel};
@@ -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{a as r,i,n as a,r as o,t as s}from"./page-shell-k5-hYhKb.js";import{a as c,i as l,s as u}from"./fields-C-y_8RgA.js";import{n as d}from"./agent-meta-C4mauPL5.js";import{t as f}from"./path-utils-ztBHV7MX.js";var p=e(t(),1),m=n(),h=[{value:`every`,label:`every (interval)`},{value:`cron`,label:`cron expression`}];function g({job:e,index:t,bodyError:n,timeZoneError:r,onChange:i,onRemove:a}){let o=(0,p.useId)(),s=e.schedule.kind,d=e.schedule.timeZone??``;return(0,m.jsxs)(`fieldset`,{className:`settings-heartbeat-job`,"aria-label":`Heartbeat job ${t+1}${e.name?` (${e.name})`:``}`,children:[(0,m.jsx)(`legend`,{className:`settings-heartbeat-job-legend`,children:e.name||`Job ${t+1}`}),(0,m.jsx)(c,{id:`${o}-enabled`,label:`Enabled`,value:e.enabled,onChange:e=>i({enabled:e})}),(0,m.jsx)(u,{id:`${o}-name`,label:`Name`,value:e.name,placeholder:`Morning summary`,onChange:e=>i({name:e})}),(0,m.jsx)(l,{id:`${o}-kind`,label:`Schedule kind`,value:s,options:h,onChange:e=>{e===`every`&&s!==`every`?i({schedule:{kind:`every`,minutes:30,...d?{timeZone:d}:{}}}):e===`cron`&&s!==`cron`&&i({schedule:{kind:`cron`,cron:`0 9 * * *`,...d?{timeZone:d}:{}}})}}),s===`every`?(0,m.jsx)(u,{id:`${o}-minutes`,label:`Every (minutes)`,value:String(e.schedule.minutes??``),placeholder:`30`,error:n??null,onChange:e=>{let t=e.trim(),n=Number(t);i({schedule:{kind:`every`,minutes:Number.isFinite(n)?n:NaN,...d?{timeZone:d}:{}}})}}):(0,m.jsx)(u,{id:`${o}-cron`,label:`Cron expression`,value:e.schedule.cron??``,placeholder:`0 9 * * *`,error:n??null,onChange:e=>i({schedule:{kind:`cron`,cron:e,...d?{timeZone:d}:{}}})}),(0,m.jsx)(u,{id:`${o}-tz`,label:`Time zone (optional)`,value:d,placeholder:`Asia/Seoul`,error:r??null,onChange:t=>{let n=t.trim();i(s===`every`?{schedule:{kind:`every`,minutes:e.schedule.minutes,...n?{timeZone:n}:{}}}:{schedule:{kind:`cron`,cron:e.schedule.cron,...n?{timeZone:n}:{}}})}}),(0,m.jsxs)(`label`,{className:`settings-field settings-field-textarea`,htmlFor:`${o}-prompt`,children:[(0,m.jsx)(`span`,{className:`settings-field-label`,children:`Prompt`}),(0,m.jsx)(`textarea`,{id:`${o}-prompt`,rows:3,value:e.prompt,placeholder:`What should this heartbeat do?`,onChange:e=>i({prompt:e.target.value})})]}),(0,m.jsx)(`div`,{className:`settings-heartbeat-job-footer`,children:(0,m.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:a,children:`Remove job`})})]})}var _=/^\d+[smh]$/,v=/^([01]\d|2[0-3]):[0-5]\d$/,y=[`ai-e`,`claude`,`claude-e`,`codex`,`codex-app`,`copilot`,`cursor`,`kiro-code`,`gemini`,`grok`,`opencode`],b=[`heartbeat.enabled`,`heartbeat.every`,`heartbeat.activeHours.start`,`heartbeat.activeHours.end`,`heartbeat.target`],x=[`heartbeat.jobs`,`heartbeat.md`];function S(e){return _.test(e.trim())}function C(e){return v.test(e.trim())}function w(e=Date.now()){return{id:`hb_${e}`,name:``,enabled:!0,schedule:{kind:`every`,minutes:30},prompt:``}}function T(e){return e.startsWith(`heartbeat.`)&&e!==`heartbeat.jobs`&&e!==`heartbeat.md`}function E(e,t){if(!e||typeof e!=`object`)return null;let n=e,r=typeof n.id==`string`&&n.id.trim()?n.id.trim():`hb_unknown_${t}`,i=typeof n.name==`string`?n.name:``,a=n.enabled!==!1,o=typeof n.prompt==`string`?n.prompt:``,s=n.schedule,c;if(s&&typeof s==`object`){let e=s;c=e.kind===`cron`&&typeof e.cron==`string`?{kind:`cron`,cron:e.cron,...typeof e.timeZone==`string`&&e.timeZone?{timeZone:e.timeZone}:{}}:{kind:`every`,minutes:typeof e.minutes==`number`?e.minutes:30,...typeof e.timeZone==`string`&&e.timeZone?{timeZone:e.timeZone}:{}}}else c={kind:`every`,minutes:30};return{id:r,name:i,enabled:a,schedule:c,prompt:o}}function D(e){if(!e||typeof e!=`object`)return[];let t=e.jobs;return Array.isArray(t)?t.map((e,t)=>E(e,t)).filter(e=>e!==null):[]}function O(e){if(e.kind===`every`){let t=e.minutes;return!Number.isFinite(t)||t<=0||!Number.isInteger(t)?`Minutes must be a positive integer`:null}let t=e.cron?.trim()??``;return t?t.split(/\s+/).length<5?`Cron must have at least 5 fields`:null:`Cron expression required`}function k(e){return e.some(e=>O(e.schedule)!==null)}function A({port:e,client:t,dirty:n,snapshot:r}){let[i,a]=(0,p.useState)([]),[c,l]=(0,p.useState)([]),[u,d]=(0,p.useState)(!1),[f,h]=(0,p.useState)(null);(0,p.useEffect)(()=>{if(r.kind!==`ready`)return;let e=D(r.data);a(e),l(e)},[r]),(0,p.useEffect)(()=>{n.set(`heartbeat.jobs`,{value:i,original:c,valid:!k(i)})},[i,c,n]),(0,p.useEffect)(()=>()=>{n.remove(`heartbeat.jobs`)},[n]);let _=(0,p.useCallback)(async()=>{if(k(i)){h(`Fix invalid schedules before saving.`);return}d(!0),h(null);try{let e=D(await t.put(`/api/heartbeat`,{jobs:i}));a(e),l(e),n.remove(`heartbeat.jobs`)}catch(e){h(e instanceof Error?e.message:String(e))}finally{d(!1)}},[t,n,i]);if(r.kind===`loading`)return(0,m.jsx)(`p`,{className:`settings-section-hint`,children:`Loading jobs…`});if(r.kind===`offline`)return(0,m.jsx)(o,{port:e});if(r.kind===`error`)return(0,m.jsx)(s,{message:r.message});let v=n.pending.has(`heartbeat.jobs`),y=k(i);function b(e,t){a(n=>n.map((n,r)=>r===e?{...n,...t}:n))}function x(){a(e=>[...e,w()])}function S(e){a(t=>t.filter((t,n)=>n!==e))}return(0,m.jsxs)(m.Fragment,{children:[i.length===0?(0,m.jsx)(`p`,{className:`settings-section-hint`,children:`No jobs configured. Add one below.`}):(0,m.jsx)(`div`,{className:`settings-heartbeat-jobs-list`,children:i.map((e,t)=>(0,m.jsx)(g,{job:e,index:t,bodyError:O(e.schedule),onChange:e=>b(t,e),onRemove:()=>S(t)},e.id))}),(0,m.jsxs)(`div`,{className:`settings-heartbeat-jobs-footer`,children:[(0,m.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:x,children:`+ Add job`}),(0,m.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,onClick:()=>void _(),disabled:u||!v||y,children:u?`Saving…`:`Apply jobs`})]}),f?(0,m.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:f}):null]})}function j({port:e,client:t,dirty:n,snapshot:r}){let[i,a]=(0,p.useState)(``),[c,l]=(0,p.useState)(``),[u,d]=(0,p.useState)(!1),[f,h]=(0,p.useState)(null);(0,p.useEffect)(()=>{if(r.kind!==`ready`)return;let e=r.data.content??``;a(e),l(e)},[r]),(0,p.useEffect)(()=>{n.set(`heartbeat.md`,{value:i,original:c,valid:!0})},[i,c,n]),(0,p.useEffect)(()=>()=>{n.remove(`heartbeat.md`)},[n]);let g=(0,p.useCallback)(async()=>{d(!0),h(null);try{await t.put(`/api/heartbeat-md`,{content:i}),l(i),n.remove(`heartbeat.md`)}catch(e){h(e instanceof Error?e.message:String(e))}finally{d(!1)}},[t,n,i]);if(r.kind===`loading`)return(0,m.jsx)(`p`,{className:`settings-section-hint`,children:`Loading template…`});if(r.kind===`offline`)return(0,m.jsx)(o,{port:e});if(r.kind===`error`)return(0,m.jsx)(s,{message:r.message});let _=n.pending.has(`heartbeat.md`);return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsxs)(`label`,{className:`settings-field settings-field-textarea`,htmlFor:`hb-md`,children:[(0,m.jsx)(`span`,{className:`settings-field-label`,children:`Template`}),(0,m.jsx)(`textarea`,{id:`hb-md`,rows:10,spellCheck:!1,value:i,onChange:e=>a(e.target.value),style:{fontFamily:`ui-monospace, monospace`}})]}),(0,m.jsx)(`div`,{className:`settings-heartbeat-md-footer`,children:(0,m.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,onClick:()=>void g(),disabled:u||!_,children:u?`Saving…`:`Save template`})}),f?(0,m.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:f}):null]})}function M({port:e,client:t,dirty:n,registerSave:h}){let g=r(t,`/api/settings`),_=r(t,`/api/heartbeat`),v=r(t,`/api/heartbeat-md`),[x,w]=(0,p.useState)(!1),[E,D]=(0,p.useState)(`30m`),[O,k]=(0,p.useState)(`08:00`),[M,N]=(0,p.useState)(`22:00`),[P,F]=(0,p.useState)(`all`);(0,p.useEffect)(()=>{if(g.state.kind!==`ready`)return;let e=g.state.data.heartbeat||{};w(!!e.enabled),D(typeof e.every==`string`?e.every:`30m`),k(e.activeHours?.start??`08:00`),N(e.activeHours?.end??`22:00`),F(typeof e.target==`string`?e.target:`all`)},[g.state]),(0,p.useEffect)(()=>()=>{for(let e of b)n.remove(e)},[n]);let I=(0,p.useMemo)(()=>g.state.kind===`ready`&&g.state.data.heartbeat||{},[g.state]),L=(0,p.useCallback)((e,t)=>n.set(e,t),[n]),R=(0,p.useRef)(0),z=(0,p.useCallback)(async()=>{let e=n.saveBundle(),r={};for(let[t,n]of Object.entries(e))T(t)&&(r[t]=n);if(Object.keys(r).length===0)return;let i=++R.current,a=f(r),o=await t.put(`/api/settings`,a);if(i!==R.current)return;let s=o&&typeof o==`object`&&`data`in o?o.data:o;for(let e of b)n.remove(e);g.setData(s);let c=s.heartbeat||{};w(!!c.enabled),D(typeof c.every==`string`?c.every:`30m`),k(c.activeHours?.start??`08:00`),N(c.activeHours?.end??`22:00`),F(typeof c.target==`string`?c.target:`all`),await g.refresh()},[t,n,g]);if((0,p.useEffect)(()=>{if(h)return h(z),()=>h(null)},[h,z]),g.state.kind===`loading`)return(0,m.jsx)(a,{});if(g.state.kind===`offline`)return(0,m.jsx)(o,{port:e});if(g.state.kind===`error`)return(0,m.jsx)(s,{message:g.state.message});let B=S(E)?null:"Use the form `<n>s|m|h`, e.g. `30m`",V=C(O)?null:`Use HH:MM (24h)`,H=C(M)?null:`Use HH:MM (24h)`,U=g.state.data.perCli||{},W=Object.keys(U),G=[{value:`all`,label:`all (broadcast)`},...(W.length>0?W:[...y]).map(e=>({value:e,label:d(e).label||e}))];return G.some(e=>e.value===P)||G.push({value:P,label:`${d(P).label||P} (legacy)`}),(0,m.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),z()},children:[(0,m.jsxs)(i,{title:`Heartbeat`,hint:`Background prompts the agent runs on a schedule.`,children:[(0,m.jsx)(c,{id:`hb-enabled`,label:`Heartbeat enabled`,value:x,onChange:e=>{w(e),L(`heartbeat.enabled`,{value:e,original:!!I.enabled,valid:!0})}}),(0,m.jsx)(u,{id:`hb-every`,label:`Default interval`,value:E,placeholder:`30m`,error:B,onChange:e=>{D(e),L(`heartbeat.every`,{value:e,original:I.every??`30m`,valid:S(e)})}}),(0,m.jsx)(u,{id:`hb-start`,label:`Active hours start`,value:O,placeholder:`08:00`,error:V,onChange:e=>{k(e),L(`heartbeat.activeHours.start`,{value:e,original:I.activeHours?.start??`08:00`,valid:C(e)})}}),(0,m.jsx)(u,{id:`hb-end`,label:`Active hours end`,value:M,placeholder:`22:00`,error:H,onChange:e=>{N(e),L(`heartbeat.activeHours.end`,{value:e,original:I.activeHours?.end??`22:00`,valid:C(e)})}}),(0,m.jsx)(l,{id:`hb-target`,label:`Target`,value:P,options:G,onChange:e=>{F(e),L(`heartbeat.target`,{value:e,original:I.target??`all`,valid:!0})}})]}),(0,m.jsx)(i,{title:`Jobs`,hint:`Each job replaces the entire heartbeat.json on save. Concurrent edits from multiple browsers will overwrite — last write wins.`,children:(0,m.jsx)(A,{port:e,client:t,dirty:n,snapshot:_.state})}),(0,m.jsx)(i,{title:`Default heartbeat prompt template`,hint:`Markdown shown to the agent when a heartbeat fires without a job-specific prompt.`,children:(0,m.jsx)(j,{port:e,client:t,dirty:n,snapshot:v.state})})]})}export{x as PAGE_LOCAL_KEYS,b as SECTION_A_KEYS,y as TARGET_FALLBACK,M as default,T as isHeartbeatSettingsKey,O as jobScheduleBodyError,k as jobsHaveErrors,w as makeDefaultJob,D as normalizeJobsResponse,C as validateHHMM,S as validateInterval};