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
package/public/js/main.ts CHANGED
@@ -51,6 +51,7 @@ import {
51
51
  onPerCliAiEProviderChange, saveActiveCliSettings, savePerCli, openPromptModal,
52
52
  onFlushCliChange, loadFlushAgentSidebar,
53
53
  closePromptModal, savePromptFromModal, syncMcpServers, installMcpGlobal,
54
+ openMcpModal, initMcpModal,
54
55
  loadCliStatus, scheduleCliStatusRefresh, setCliStatusInterval,
55
56
  initCliStatusToggle, initCliStatusPreviewHooks, isCliStatusExpanded, expandCliStatus, isEmbeddedPreviewFrame,
56
57
  setTelegram, setForwardAll, setTelegramMentionOnly, saveTelegramSettings,
@@ -89,6 +90,7 @@ import { initPendingQueue } from './features/pending-queue.js';
89
90
  import { initAttentionBadge } from './features/attention-badge.js';
90
91
  import { initHelpDialog } from './features/help-dialog.js';
91
92
  import { initChatSearch, toggleChatSearch, closeChatSearch } from './features/chat-search.js';
93
+ import { initMediaLightbox } from './features/media-lightbox.js';
92
94
 
93
95
  function isLocalPreviewOrigin(origin: string): boolean {
94
96
  if (origin === window.location.origin) return true;
@@ -367,8 +369,10 @@ function bindPerCliControlEvents(): void {
367
369
  }
368
370
 
369
371
  // MCP
372
+ document.querySelector('[data-action="openMcpModal"]')?.addEventListener('click', openMcpModal);
370
373
  document.querySelector('[data-action="syncMcp"]')?.addEventListener('click', syncMcpServers);
371
374
  document.querySelector('[data-action="installMcp"]')?.addEventListener('click', installMcpGlobal);
375
+ initMcpModal();
372
376
  document.querySelector('[data-action="refreshCli"]')?.addEventListener('click', () => {
373
377
  if (!isCliStatusExpanded()) expandCliStatus();
374
378
  else loadCliStatus(true);
@@ -516,6 +520,7 @@ async function bootstrap(): Promise<void> {
516
520
  bindPerCliControlEvents();
517
521
  initHelpDialog();
518
522
  initChatSearch();
523
+ initMediaLightbox();
519
524
  document.getElementById('chatSearchTrigger')?.addEventListener('click', toggleChatSearch);
520
525
  initAttentionBadge();
521
526
  connect();
@@ -36,3 +36,17 @@ export function postPreviewOpenNotes(path: string): boolean {
36
36
  window.parent.postMessage({ type: 'jaw-preview-open-notes', path }, targetOrigin);
37
37
  return true;
38
38
  }
39
+
40
+ export function postPreviewOpenDoc(absolutePath: string): boolean {
41
+ const targetOrigin = previewParentOrigin();
42
+ if (!targetOrigin || !absolutePath.trim()) return false;
43
+ window.parent.postMessage({ type: 'jaw-preview-open-doc', path: absolutePath }, targetOrigin);
44
+ return true;
45
+ }
46
+
47
+ export function postPreviewInvalidate(topics: string[], reason: string): boolean {
48
+ const targetOrigin = previewParentOrigin();
49
+ if (!targetOrigin || topics.length === 0) return false;
50
+ window.parent.postMessage({ type: 'dashboard.invalidate', topics, reason }, targetOrigin);
51
+ return true;
52
+ }
@@ -9,6 +9,7 @@ import antigravitySvg from '../assets/providers/antigravity-color.svg?raw';
9
9
  import grokSvg from '../assets/providers/grok-color.svg?raw';
10
10
  import copilotSvg from '../assets/providers/copilot-color.svg?raw';
11
11
  import cursorSvg from '../assets/providers/cursor-color.svg?raw';
12
+ import kiroSvg from '../assets/providers/kiro-color.svg?raw';
12
13
 
13
14
  // Mono variants for dark/light mode flexibility
14
15
  import claudeMonoSvg from '../assets/providers/claude.svg?raw';
@@ -17,13 +18,14 @@ import antigravityMonoSvg from '../assets/providers/antigravity.svg?raw';
17
18
  import grokMonoSvg from '../assets/providers/grok.svg?raw';
18
19
  import copilotMonoSvg from '../assets/providers/copilot.svg?raw';
19
20
  import cursorMonoSvg from '../assets/providers/cursor.svg?raw';
21
+ import kiroMonoSvg from '../assets/providers/kiro.svg?raw';
20
22
 
21
23
  // Service icons (Discord, Telegram)
22
24
  import discordSvg from '../assets/providers/discord.svg?raw';
23
25
  import telegramSvg from '../assets/providers/telegram.svg?raw';
24
26
  import opencodeSvg from '../assets/providers/opencode.svg?raw';
25
27
 
26
- export type ProviderSlug = 'ai-e' | 'claude' | 'openai' | 'gemini' | 'antigravity' | 'grok' | 'copilot' | 'cursor' | 'codex' | 'codex-app' | 'opencode' | 'discord' | 'telegram';
28
+ export type ProviderSlug = 'ai-e' | 'claude' | 'openai' | 'gemini' | 'antigravity' | 'grok' | 'copilot' | 'cursor' | 'kiro-code' | 'codex' | 'codex-app' | 'opencode' | 'discord' | 'telegram';
27
29
 
28
30
  interface ProviderIcon {
29
31
  color: string;
@@ -42,6 +44,7 @@ const PROVIDER_ICONS: Record<ProviderSlug, ProviderIcon> = {
42
44
  grok: { color: grokSvg, mono: grokMonoSvg, label: 'Grok' },
43
45
  copilot: { color: copilotSvg, mono: copilotMonoSvg, label: 'Copilot' },
44
46
  cursor: { color: cursorSvg, mono: cursorMonoSvg, label: 'Cursor' },
47
+ 'kiro-code': { color: kiroSvg, mono: kiroMonoSvg, label: 'Kiro' },
45
48
  codex: { color: openaiSvg, mono: openaiSvg, label: 'Codex' },
46
49
  'codex-app': { color: openaiColorSvg, mono: openaiSvg, label: 'Codex App' },
47
50
  opencode: { color: opencodeSvg, mono: opencodeSvg, label: 'OpenCode' },
@@ -57,6 +60,7 @@ const PROVIDER_LABEL_ALIASES: Record<string, string> = {
57
60
  'claude-i': 'Claude E',
58
61
  'agy': 'Antigravity',
59
62
  cursor: 'Cursor',
63
+ 'kiro-code': 'Kiro',
60
64
  };
61
65
 
62
66
  function resolveProviderSlug(slug: string): ProviderSlug | null {
@@ -68,6 +72,7 @@ function resolveProviderSlug(slug: string): ProviderSlug | null {
68
72
  if (normalized === 'grok' || normalized.startsWith('grok')) return 'grok';
69
73
  if (normalized.startsWith('copilot') || normalized === 'githubcopilot') return 'copilot';
70
74
  if (normalized === 'cursor' || normalized.startsWith('cursor')) return 'cursor';
75
+ if (normalized === 'kirocode' || normalized === 'kiro') return 'kiro-code';
71
76
  if (normalized === 'codexapp' || normalized === 'codexappserver') return 'codex-app';
72
77
  if (normalized === 'codex') return 'codex';
73
78
  if (normalized === 'opencode') return 'opencode';
@@ -1,6 +1,6 @@
1
1
  // ── File path linkification and click-to-open delegation ──
2
2
  import { apiJson } from '../api.js';
3
- import { postPreviewOpenNotes, previewParentOrigin } from '../preview-parent-origin.js';
3
+ import { postPreviewOpenNotes, postPreviewOpenDoc, previewParentOrigin } from '../preview-parent-origin.js';
4
4
  import { normalizeNotesVaultPath } from './notes-vault-path.js';
5
5
 
6
6
  const FILE_PATH_RE_G = /(?:~\/[^\s)`\]"'<>]+|\/(?:Users|home|tmp|var|opt|private)\/[^\s)`\]"'<>]+)/g;
@@ -88,7 +88,10 @@ function appendFileLink(
88
88
  if (vaultRel) span.setAttribute('data-vault-rel', vaultRel);
89
89
  span.setAttribute('role', 'button');
90
90
  span.setAttribute('tabindex', '0');
91
- span.textContent = clean;
91
+ const basename = clean.split('/').pop() || clean;
92
+ const hasExt = /\.\w{1,10}$/.test(basename);
93
+ span.textContent = hasExt ? basename : clean;
94
+ if (hasExt) span.title = clean;
92
95
  frag.appendChild(span);
93
96
  }
94
97
 
@@ -203,6 +206,11 @@ async function handleFilePathClick(path: string, link: HTMLElement): Promise<voi
203
206
  setTimeout(() => link.classList.remove('opened'), 1500);
204
207
  return;
205
208
  }
209
+ if (/\.(md|mdx)$/i.test(path) && previewParentOrigin() && postPreviewOpenDoc(path)) {
210
+ link.classList.add('opened');
211
+ setTimeout(() => link.classList.remove('opened'), 1500);
212
+ return;
213
+ }
206
214
  openLocalPath(path, link);
207
215
  }
208
216
 
@@ -10,6 +10,7 @@ import { unshieldSvgBlocks } from './svg-actions.js';
10
10
  import { highlightCode, ensureHighlightLanguages } from './highlight.js';
11
11
  import { schedulePostRender } from './post-render.js';
12
12
  import { ensureRenderDelegations } from './delegations.js';
13
+ import { API_BASE } from '../api.js';
13
14
 
14
15
  // ── marked.js configuration (ES module — always available) ──
15
16
  let markedReady = false;
@@ -46,6 +47,21 @@ function ensureMarked(): boolean {
46
47
  return `<div class="code-block"><div class="code-header"><span class="code-lang">${langDisplay}</span><button class="code-copy-btn" type="button" aria-label="${escapeHtml(copyLabel)}">${escapeHtml(copyLabel)}</button></div><pre><code class="hljs${lang ? ` language-${escapeHtml(lang)}` : ''}">${highlighted}</code></pre></div>`;
47
48
  };
48
49
 
50
+ // Inline media: rewrite absolute paths to /media/ URL, detect video
51
+ renderer.image = function ({ href, title, text }: { href: string; title?: string | null; text: string }) {
52
+ if (!href) return '';
53
+ const src = (href.startsWith('/') || href.includes('/uploads/'))
54
+ ? `${API_BASE}/media/${encodeURIComponent(href.split('/').pop()!)}`
55
+ : escapeHtml(href);
56
+ const alt = escapeHtml(text || '');
57
+ const titleAttr = title ? ` title="${escapeHtml(title)}"` : '';
58
+ const ext = (src.split('.').pop() || '').toLowerCase().split('?')[0] || '';
59
+ if (['mp4', 'webm', 'mov', 'ogg'].includes(ext)) {
60
+ return `<video src="${src}" controls class="chat-inline-video" preload="metadata"${titleAttr}></video>`;
61
+ }
62
+ return `<img src="${src}" alt="${alt}" class="chat-inline-img" loading="lazy"${titleAttr} />`;
63
+ };
64
+
49
65
  renderer.link = function ({ href, title, text }: { href: string; title?: string | null; text: string }) {
50
66
  const safeHref = escapeHtml(href || '');
51
67
  const titleAttr = title ? ` title="${escapeHtml(title)}"` : '';
package/public/js/ui.ts CHANGED
@@ -76,6 +76,12 @@ export function cleanupToolActivity(): void {
76
76
  currentStream = null;
77
77
  }
78
78
 
79
+ /** Timestamp of last steer — used to suppress late agent_done after steer. */
80
+ let lastSteerTs = 0;
81
+ export function markSteered(): void { lastSteerTs = Date.now(); }
82
+ export function clearSteer(): void { lastSteerTs = 0; }
83
+ export function isRecentSteer(): boolean { return Date.now() - lastSteerTs < 8000; }
84
+
79
85
  export function showLiveToolActivity(label: string): void {
80
86
  removeSkeleton();
81
87
  if (!state.currentAgentDiv || !state.currentAgentDiv.isConnected) {
@@ -307,7 +313,7 @@ export function finalizeAgent(text: string, toolLog?: ToolLogEntry[]): void {
307
313
  }
308
314
  state.currentAgentDiv.removeAttribute(ACTIVE_RUN_HYDRATED_ATTR);
309
315
  const content = (state.currentAgentDiv as HTMLElement)?.querySelector('.msg-content');
310
- // Live stream is preview-only; agent_done text stays authoritative.
316
+ // Live stream is preview-only; agent_done text is always authoritative.
311
317
  const streamedText = currentStream ? finalizeStream(currentStream, true) : '';
312
318
  const finalText = text || streamedText;
313
319
  currentStream = null;
@@ -359,6 +365,7 @@ export function finalizeAgent(text: string, toolLog?: ToolLogEntry[]): void {
359
365
  tool_log: durableToolLogJson,
360
366
  }, vs.count));
361
367
  releaseProcessBlockDetails(div);
368
+ vs.scrollToBottom();
362
369
  } else {
363
370
  vs.appendLiveItem(div);
364
371
  }
@@ -421,6 +421,25 @@ export class VirtualScroll {
421
421
  });
422
422
  containerObserver.observe(this.container);
423
423
  cleanupFns.push(() => containerObserver.disconnect());
424
+
425
+ // ── Content-growth bottom lock ──
426
+ // innerEl height tracks the virtualizer total size (set in render).
427
+ // Lazy markdown / mermaid / images grow it *after* the time-boxed
428
+ // initial settle finishes, drifting the bottom anchor upward with
429
+ // nothing left to re-bottom. Re-bottom when total content height
430
+ // grows — but only while bottom-follow intent still holds, so it
431
+ // releases the moment the user scrolls up (260508 rule preserved).
432
+ let prevTotal = this.virtualizer?.getTotalSize() ?? 0;
433
+ const contentObserver = new ResizeObserver(() => {
434
+ const total = this.virtualizer?.getTotalSize() ?? 0;
435
+ if (total <= prevTotal) { prevTotal = total; return; }
436
+ prevTotal = total;
437
+ if (this.shouldFollowAfterRestore()) {
438
+ this.reconcileBottomAfterLayout('manual', true);
439
+ }
440
+ });
441
+ contentObserver.observe(this.innerEl);
442
+ cleanupFns.push(() => contentObserver.disconnect());
424
443
  }
425
444
 
426
445
  // ── Browser restore reconciliation ──
package/public/js/ws.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  // ── WebSocket Connection ──
2
2
  import { state } from './state.js';
3
3
  import { API_BASE } from './api.js';
4
- import { setStatus, updateQueueBadge, addSystemMsg, appendAgentText, finalizeAgent, addMessage, showProcessStep, cleanupToolActivity, showLiveToolActivity, applyQueuedOverlay, hydrateActiveRun, reconcileChatBottomAfterRestore, showChatRestoreIndicator } from './ui.js';
4
+ import { setStatus, updateQueueBadge, addSystemMsg, appendAgentText, finalizeAgent, addMessage, showProcessStep, cleanupToolActivity, applyQueuedOverlay, hydrateActiveRun, reconcileChatBottomAfterRestore, showChatRestoreIndicator, markSteered, clearSteer, isRecentSteer } from './ui.js';
5
5
  import { renderPendingQueue } from './features/pending-queue.js';
6
6
  import { t, getLang } from './features/i18n.js';
7
7
  import { getVirtualScroll } from './virtual-scroll.js';
@@ -51,6 +51,7 @@ interface WsMessage {
51
51
  phase?: string;
52
52
  phaseLabel?: string;
53
53
  pending?: number;
54
+ queued?: Array<{ id: string; prompt: string; source?: string; ts?: number }>;
54
55
  path?: string;
55
56
  round?: number;
56
57
  agentPhases?: { agent?: string; name?: string }[];
@@ -87,6 +88,16 @@ interface WsMessage {
87
88
  deferredPending?: number;
88
89
  taskAnchor?: string | null;
89
90
  resolvedSelection?: ResolvedSelectionState | null;
91
+ buildBudget?: {
92
+ maxWorkerDispatches: number;
93
+ maxSelfHealRetries: number;
94
+ maxVerificationRounds: number;
95
+ spent: {
96
+ workerDispatches: number;
97
+ selfHealRetries: number;
98
+ verificationRounds: number;
99
+ };
100
+ } | null;
90
101
  interview?: { known: string[]; unknown: string[]; round: number } | null;
91
102
  delaySeconds?: number;
92
103
  attempts?: number;
@@ -96,6 +107,8 @@ interface WsMessage {
96
107
  exitCode?: number;
97
108
  error?: string;
98
109
  message?: string;
110
+ steered?: boolean;
111
+ steerWaitMs?: number;
99
112
  }
100
113
 
101
114
  // Agent phase state (populated by agent_status events from orchestrator)
@@ -123,8 +136,11 @@ async function refreshRuntimeSnapshot(options: { hydrateRun?: boolean } = {}): P
123
136
  renderPendingQueue(snap.queued || []);
124
137
  if (options.hydrateRun) hydrateActiveRun(snap.activeRun);
125
138
  hydrateGoalState();
126
- setStatus(snap.runtime.busy ? 'running' : 'idle');
127
- if (snap.runtime.busy && snap.activeRun?.cli === 'agy') showLiveToolActivity(`${providerLabel(snap.activeRun.cli)} working...`);
139
+ if (snap.runtime.busy) {
140
+ setStatus('running');
141
+ } else if (!isRecentSteer()) {
142
+ setStatus('idle');
143
+ }
128
144
  import('./features/employees.js').then(m => {
129
145
  if (typeof m.renderEmployees === 'function') m.renderEmployees();
130
146
  });
@@ -268,7 +284,70 @@ function setInterviewCollapsed(collapsed: boolean): void {
268
284
  if (toggle) toggle.setAttribute('aria-expanded', String(!collapsed));
269
285
  }
270
286
 
271
- function renderInterviewPanel(interview: { known: string[]; unknown: string[]; round: number } | null): void {
287
+ interface InterviewEvidenceView {
288
+ fact: string;
289
+ source?: string;
290
+ confidence?: number;
291
+ turnNumber?: number;
292
+ dimension?: string;
293
+ }
294
+
295
+ interface DimensionAssessmentView {
296
+ goal: string;
297
+ constraint: string;
298
+ success: string;
299
+ ontology: string;
300
+ }
301
+
302
+ function renderDimensionBars(assessment: DimensionAssessmentView): string {
303
+ const levelToScore = (l: string) => {
304
+ switch (l) {
305
+ case 'max': return 1.0;
306
+ case 'xhigh': return 0.8;
307
+ case 'high': return 0.6;
308
+ case 'medium': return 0.4;
309
+ default: return 0.2;
310
+ }
311
+ };
312
+ const levelColor = (l: string) => {
313
+ switch (l) {
314
+ case 'max': return '#2196f3';
315
+ case 'xhigh': return '#4caf50';
316
+ case 'high': return '#8bc34a';
317
+ case 'medium': return '#ff9800';
318
+ default: return '#f44336';
319
+ }
320
+ };
321
+ const scores = [levelToScore(assessment.goal), levelToScore(assessment.constraint), levelToScore(assessment.success), levelToScore(assessment.ontology)];
322
+ const overall = 1 - (scores.reduce((a, b) => a + b, 0) / scores.length);
323
+ const allMax = Object.values(assessment).every(v => v === 'max');
324
+ const overallLabel = allMax ? '🟢 Ready' : overall <= 0.2 ? '🟢 Ready' : overall <= 0.4 ? '🟡 Almost' : '🔴 Needs work';
325
+
326
+ const bar = (dim: string, level: string) => {
327
+ const score = levelToScore(level);
328
+ const pct = score * 100;
329
+ const color = levelColor(level);
330
+ return `<div style="display:flex;align-items:center;gap:6px;font-size:12px">
331
+ <span style="width:70px;color:var(--text-secondary)">${dim}</span>
332
+ <div style="flex:1;height:5px;background:var(--bg-tertiary);border-radius:3px">
333
+ <div style="width:${pct}%;height:100%;background:${color};border-radius:3px;transition:width .3s"></div>
334
+ </div>
335
+ <span style="width:60px;text-align:right;font-weight:600;font-size:11px">${score.toFixed(1)} ${level.toUpperCase()}</span>
336
+ </div>`;
337
+ };
338
+ return `<div style="display:flex;flex-direction:column;gap:3px;margin:6px 0">
339
+ <div style="display:flex;justify-content:space-between;font-size:11px;margin-bottom:2px">
340
+ <span style="color:var(--text-secondary)">Ambiguity: ${overall.toFixed(2)}</span>
341
+ <span>${overallLabel}</span>
342
+ </div>
343
+ ${bar('Goal', assessment.goal)}
344
+ ${bar('Constraint', assessment.constraint)}
345
+ ${bar('Success', assessment.success)}
346
+ ${bar('Ontology', assessment.ontology)}
347
+ </div>`;
348
+ }
349
+
350
+ function renderInterviewPanel(interview: { known: (string | InterviewEvidenceView)[]; unknown: string[]; round: number; assessment?: DimensionAssessmentView } | null): void {
272
351
  const panel = document.getElementById('interviewPanel');
273
352
  if (!panel) return;
274
353
  if (!interview || (!interview.known.length && !interview.unknown.length)) {
@@ -277,16 +356,35 @@ function renderInterviewPanel(interview: { known: string[]; unknown: string[]; r
277
356
  }
278
357
  panel.hidden = false;
279
358
  panel.classList.toggle('collapsed', interviewCollapsed);
280
- const knownHtml = interview.known.map(k => `<li class="iv-known">${escapeHtml(k)}</li>`).join('');
281
- const unknownHtml = interview.unknown.map(u => `<li class="iv-unknown">${escapeHtml(u)}</li>`).join('');
359
+
360
+ const sourceIcon = (src?: string) => {
361
+ switch (src) {
362
+ case 'user_statement': return '🟢';
363
+ case 'repo_fact': return '🔵';
364
+ case 'inference': return '🟡';
365
+ case 'assumption': return '🟠';
366
+ case 'default': return '⚪';
367
+ default: return '·';
368
+ }
369
+ };
370
+
371
+ const knownHtml = interview.known.map(k => {
372
+ if (typeof k === 'string') return `<li class="iv-known">· ${escapeHtml(k)}</li>`;
373
+ const ev = k as InterviewEvidenceView;
374
+ const icon = sourceIcon(ev.source);
375
+ const dim = ev.dimension ? ` <span class="iv-dim">[${ev.dimension}]</span>` : '';
376
+ return `<li class="iv-known">${icon} ${escapeHtml(ev.fact)}${dim}</li>`;
377
+ }).join('');
378
+ const unknownHtml = interview.unknown.map(u => `<li class="iv-unknown">❓ ${escapeHtml(typeof u === 'string' ? u : JSON.stringify(u))}</li>`).join('');
282
379
  panel.innerHTML = `
283
380
  <button type="button" class="iv-toggle" aria-expanded="${!interviewCollapsed}" aria-controls="interviewBody" title="인터뷰 트래커 접기/펼치기">
284
381
  <span class="iv-chevron" aria-hidden="true">▸</span>
285
- <span class="iv-summary">Interview · <span class="iv-known-count">Known ${interview.known.length}</span> · <span class="iv-unknown-count">Unknown ${interview.unknown.length}</span> · Round ${interview.round}</span>
382
+ <span class="iv-summary">Interview · <span class="iv-known-count">Known ${interview.known.length}</span> · <span class="iv-unknown-count">Unknown ${interview.unknown.length}</span>${interview.known.filter(k => typeof k === 'object' && k && 'source' in k && (k as InterviewEvidenceView).source === 'assumption').length > 0 ? ` · <span class="iv-assumption-count">⚠️ ${interview.known.filter(k => typeof k === 'object' && k && 'source' in k && (k as InterviewEvidenceView).source === 'assumption').length} assumptions</span>` : ''} · Round ${interview.round}</span>
286
383
  </button>
287
384
  <div class="iv-body" id="interviewBody">
288
- <div class="iv-section"><strong>Known (${interview.known.length})</strong><ul>${knownHtml}</ul></div>
289
- <div class="iv-section"><strong>Unknown (${interview.unknown.length})</strong><ul>${unknownHtml}</ul></div>
385
+ ${interview.assessment ? `<div class="iv-section iv-section-ambiguity">${renderDimensionBars(interview.assessment)}</div>` : ''}
386
+ <div class="iv-section iv-section-known"><strong>Known (${interview.known.length})</strong><ul>${knownHtml}</ul></div>
387
+ <div class="iv-section iv-section-unknown"><strong>Unknown (${interview.unknown.length})</strong><ul>${unknownHtml}</ul></div>
290
388
  </div>
291
389
  `;
292
390
  if (!panel.dataset['toggleBound']) {
@@ -299,6 +397,28 @@ function renderInterviewPanel(interview: { known: string[]; unknown: string[]; r
299
397
  }
300
398
  }
301
399
 
400
+ function renderBudgetPanel(budget: { maxWorkerDispatches: number; maxSelfHealRetries: number; maxVerificationRounds: number; spent: { workerDispatches: number; selfHealRetries: number; verificationRounds: number } } | null, orcState: string): void {
401
+ const panel = document.getElementById('budgetPanel');
402
+ if (!panel) return;
403
+ if (!budget || orcState !== 'B') { panel.hidden = true; return; }
404
+ panel.hidden = false;
405
+ const bar = (label: string, spent: number, max: number) => {
406
+ const pct = max > 0 ? Math.min((spent / max) * 100, 100) : 0;
407
+ const color = pct >= 100 ? '#f44336' : pct >= 66 ? '#ff9800' : '#4caf50';
408
+ return `<div style="display:flex;align-items:center;gap:6px;font-size:12px">
409
+ <span style="width:70px;color:var(--text-secondary)">${label}</span>
410
+ <div style="flex:1;height:5px;background:var(--bg-tertiary);border-radius:3px">
411
+ <div style="width:${pct}%;height:100%;background:${color};border-radius:3px"></div>
412
+ </div>
413
+ <span style="width:30px;text-align:right;font-size:11px">${spent}/${max}</span>
414
+ </div>`;
415
+ };
416
+ panel.innerHTML = `<div style="font-size:11px;font-weight:600;margin-bottom:4px;color:var(--text-secondary)">Build Budget</div>
417
+ ${bar('Workers', budget.spent.workerDispatches, budget.maxWorkerDispatches)}
418
+ ${bar('Self-heal', budget.spent.selfHealRetries, budget.maxSelfHealRetries)}
419
+ ${bar('Verify', budget.spent.verificationRounds, budget.maxVerificationRounds)}`;
420
+ }
421
+
302
422
  async function hydrateGoalState(): Promise<void> {
303
423
  try {
304
424
  const res = await fetch(`${API_BASE}/api/goal`);
@@ -463,12 +583,12 @@ export function connect(): void {
463
583
  return;
464
584
  }
465
585
  if (msg.type === 'agent_status') {
586
+ if (!msg.running && isRecentSteer()) return;
587
+ if (msg.running && isRecentSteer()) clearSteer();
466
588
  if (msg.running !== undefined) {
467
589
  setStatus(msg.running ? 'running' : 'idle');
468
- if (msg.running && msg.cli === 'agy') showLiveToolActivity(`${providerLabel(msg.cli)} working...`);
469
590
  } else {
470
591
  setStatus(msg.status || 'idle');
471
- if (msg.status === 'running' && msg.cli === 'agy') showLiveToolActivity(`${providerLabel(msg.cli)} working...`);
472
592
  }
473
593
  // Track per-agent phase for badge rendering
474
594
  if (msg.agentId && msg.phase) {
@@ -477,6 +597,9 @@ export function connect(): void {
477
597
  }
478
598
  } else if (msg.type === 'queue_update') {
479
599
  updateQueueBadge(msg.pending || 0);
600
+ if (Array.isArray(msg.queued)) {
601
+ renderPendingQueue(msg.queued);
602
+ }
480
603
  syncOrchestrateSnapshot('queue_update').catch(() => { /* snapshot not critical — UI recovers on next event */ });
481
604
  } else if (msg.type === 'worklog_created') {
482
605
  addSystemMsg(`${ICONS.clipboard} Worklog: ${escapeHtml(msg.path || '')}`);
@@ -493,6 +616,7 @@ export function connect(): void {
493
616
  addSystemMsg(t('ws.roundRetry', { round: msg.round || 0 }));
494
617
  }
495
618
  } else if (msg.type === 'agent_tool') {
619
+ if (isRecentSteer()) return;
496
620
  const stepType = msg.toolType === 'thinking' ? 'thinking'
497
621
  : msg.toolType === 'search' ? 'search'
498
622
  : msg.toolType === 'subagent' ? 'subagent' : 'tool';
@@ -513,7 +637,8 @@ export function connect(): void {
513
637
  status: (msg.status as 'running' | 'done' | 'error') || 'running',
514
638
  startTime: Date.now(),
515
639
  });
516
- } else if (msg.type === 'agent_output') {
640
+ } else if (msg.type === 'agent_output' || msg.type === 'agent_chunk') {
641
+ if (isRecentSteer()) return;
517
642
  appendAgentText(msg.text || '');
518
643
  } else if (msg.type === 'agent_retry') {
519
644
  const retryDelay = Number(msg.delay ?? 0);
@@ -543,8 +668,13 @@ export function connect(): void {
543
668
  const evt = msg.event;
544
669
  if (evt) applyWorkflowEvent(evt);
545
670
  } else if (msg.type === 'agent_done') {
546
- finalizeAgent(msg.text || '', msg.toolLog);
547
- notifyUnreadResponse();
671
+ if (msg.steered || isRecentSteer()) {
672
+ // Suppress agent_done from steered (killed) process.
673
+ // Server sets steered:true; isRecentSteer is fallback for edge cases.
674
+ } else {
675
+ finalizeAgent(msg.text || '', msg.toolLog);
676
+ notifyUnreadResponse();
677
+ }
548
678
  } else if (msg.type === 'orchestrate_done') {
549
679
  finalizeAgent(msg.text || '');
550
680
  notifyUnreadResponse();
@@ -578,10 +708,13 @@ export function connect(): void {
578
708
  resolvedSelection: msg.resolvedSelection || null,
579
709
  interview: msg.interview || null,
580
710
  });
711
+ renderBudgetPanel(msg.buildBudget || null, typeof msg.state === 'string' ? msg.state : 'IDLE');
581
712
  } else if (msg.type === 'memory_status') {
582
713
  import('./features/memory.js').then(m => m.refreshMemorySidebar());
583
714
  } else if (msg.type === 'steer_started') {
584
- setStatus('running');
715
+ markSteered();
716
+ finalizeAgent('');
717
+ setStatus('steering');
585
718
  } else if (msg.type === 'new_message' && (msg.source === 'telegram' || msg.source === 'discord' || msg.fromQueue === true)) {
586
719
  addMessage(msg.role === 'assistant' ? 'agent' : (msg.role || 'user'), msg.content || '', msg.cli);
587
720
  } else if (msg.type === 'system_notice') {
@@ -600,6 +733,9 @@ export function connect(): void {
600
733
  addSystemMsg(`⚠️ Goal continuation failed: ${escapeHtml(msg.error || '')}`, 'tool-activity');
601
734
  } else if (msg.type === 'settings_change') {
602
735
  syncOrchestrateSnapshot('settings_change').catch(() => {});
736
+ } else if (msg.type === 'session_switched' || msg.type === 'session_created') {
737
+ // Reload messages for the new active session
738
+ window.location.reload();
603
739
  }
604
740
  };
605
741
  state.ws.onopen = () => {
@@ -1,8 +1,10 @@
1
1
  {
2
2
  "cmd.help.desc": "Command list",
3
3
  "cmd.status.desc": "Current status",
4
- "cmd.clear.desc": "Clear screen (non-destructive)",
5
- "cmd.reset.desc": "Full reset (MCP/Skills/Employees/Session)",
4
+ "cmd.clear.desc": "Clear conversation / all: reset skills+employees+MCP",
5
+ "cmd.purge.desc": "Purge conversation and memory",
6
+ "cmd.purge.tg_desc": "Purge chat+memory",
7
+ "cmd.reset.desc": "Bootstrap reset (conversation/memory/skills/employees/MCP)",
6
8
  "cmd.model.desc": "View/change model",
7
9
  "cmd.cli.desc": "View/change active CLI",
8
10
  "cmd.fallback.desc": "Set fallback CLI order",
@@ -89,9 +91,13 @@
89
91
  "cmd.reset.confirm": "Full reset: MCP, skills, employees, and session will be reset to defaults.\nType /reset confirm to proceed.",
90
92
  "cmd.reset.unavailable": "Reset is not supported in this environment.",
91
93
  "cmd.reset.done": "Reset complete: {items}",
94
+ "cmd.reset.bootstrapDone": "🔄 Bootstrap reset complete: {items}",
95
+ "cmd.reset.memory": "Memory",
92
96
  "cmd.reset.skills": "Skills",
93
97
  "cmd.reset.employees": "Employees",
94
98
  "cmd.reset.sessions": "Session",
99
+ "cmd.purge.done": "✅ Conversation + memory purged",
100
+ "cmd.clearAll.done": "✅ {items} reset complete",
95
101
  "cmd.mcp.syncDone": "MCP sync complete ({count} targets)",
96
102
  "cmd.mcp.installDone": "MCP install complete ({count} servers)",
97
103
  "cmd.memory.empty": "No memory files.",
@@ -261,6 +267,7 @@
261
267
  "btn.attach": "Attach file",
262
268
  "input.placeholder": "Type a message...",
263
269
  "queue.pendingTitle": "Pending",
270
+ "queue.copy": "Copy prompt",
264
271
  "queue.delete": "Remove",
265
272
  "queue.steer": "Run now (steer)",
266
273
  "queue.cancelArm": "Click again to cancel",
@@ -1,8 +1,10 @@
1
1
  {
2
2
  "cmd.help.desc": "コマンド一覧",
3
3
  "cmd.status.desc": "現在の状態",
4
- "cmd.clear.desc": "画面をクリア(データは保持)",
5
- "cmd.reset.desc": "完全リセット(MCP/スキル/従業員/セッション)",
4
+ "cmd.clear.desc": "会話削除 / all: スキル+従業員+MCPリセット",
5
+ "cmd.purge.desc": "会話+メモリ削除",
6
+ "cmd.purge.tg_desc": "会話+メモリ削除",
7
+ "cmd.reset.desc": "ブートストラップ初期化(会話/メモリ/スキル/従業員/MCP)",
6
8
  "cmd.model.desc": "モデルの確認/変更",
7
9
  "cmd.cli.desc": "アクティブ CLI の確認/変更",
8
10
  "cmd.fallback.desc": "Fallback CLI の順序を設定",
@@ -89,9 +91,13 @@
89
91
  "cmd.reset.confirm": "完全リセット: MCP、スキル、従業員、セッションをデフォルトに戻します。\n続行するには /reset confirm と入力してください。",
90
92
  "cmd.reset.unavailable": "この環境ではリセットはサポートされていません。",
91
93
  "cmd.reset.done": "リセット完了: {items}",
94
+ "cmd.reset.bootstrapDone": "🔄 ブートストラップ初期化完了: {items}",
95
+ "cmd.reset.memory": "メモリ",
92
96
  "cmd.reset.skills": "スキル",
93
97
  "cmd.reset.employees": "従業員",
94
98
  "cmd.reset.sessions": "セッション",
99
+ "cmd.purge.done": "✅ 会話 + メモリ削除完了",
100
+ "cmd.clearAll.done": "✅ {items} リセット完了",
95
101
  "cmd.mcp.syncDone": "MCP 同期が完了しました({count} 件)",
96
102
  "cmd.mcp.installDone": "MCP インストールが完了しました({count} サーバー)",
97
103
  "cmd.memory.empty": "メモリファイルはありません。",
@@ -250,6 +256,7 @@
250
256
  "btn.attach": "ファイルを添付",
251
257
  "input.placeholder": "メッセージを入力...",
252
258
  "queue.pendingTitle": "待機中",
259
+ "queue.copy": "コピー",
253
260
  "queue.delete": "削除",
254
261
  "queue.steer": "今すぐ実行(steer)",
255
262
  "queue.cancelArm": "もう一度クリックしてキャンセル",
@@ -1,8 +1,10 @@
1
1
  {
2
2
  "cmd.help.desc": "커맨드 목록",
3
3
  "cmd.status.desc": "현재 상태",
4
- "cmd.clear.desc": "화면 정리 (비파괴)",
5
- "cmd.reset.desc": "전체 초기화 (MCP/스킬/직원/세션)",
4
+ "cmd.clear.desc": "대화 삭제 / all: 스킬+직원+MCP 리셋",
5
+ "cmd.purge.desc": "대화 + 메모리 삭제",
6
+ "cmd.purge.tg_desc": "대화+메모리 삭제",
7
+ "cmd.reset.desc": "부트스트랩 초기화 (대화/메모리/스킬/직원/MCP)",
6
8
  "cmd.model.desc": "모델 확인/변경",
7
9
  "cmd.cli.desc": "활성 CLI 확인/변경",
8
10
  "cmd.fallback.desc": "폴백 CLI 순서 설정",
@@ -89,9 +91,13 @@
89
91
  "cmd.reset.confirm": "전체 초기화: MCP, 스킬, 직원, 세션을 기본값으로 재설정합니다.\n실행하려면 /reset confirm 을 입력하세요.",
90
92
  "cmd.reset.unavailable": "이 환경에서는 초기화가 지원되지 않습니다.",
91
93
  "cmd.reset.done": "초기화 완료: {items}",
94
+ "cmd.reset.bootstrapDone": "🔄 부트스트랩 초기화 완료: {items}",
95
+ "cmd.reset.memory": "메모리",
92
96
  "cmd.reset.skills": "스킬",
93
97
  "cmd.reset.employees": "직원",
94
98
  "cmd.reset.sessions": "세션",
99
+ "cmd.purge.done": "✅ 대화 + 메모리 삭제 완료",
100
+ "cmd.clearAll.done": "✅ {items} 리셋 완료",
95
101
  "cmd.mcp.syncDone": "MCP sync 완료 ({count} target)",
96
102
  "cmd.mcp.installDone": "MCP install 완료 ({count} server)",
97
103
  "cmd.memory.empty": "memory 파일이 없습니다.",
@@ -261,6 +267,7 @@
261
267
  "btn.attach": "파일 첨부",
262
268
  "input.placeholder": "메시지 입력...",
263
269
  "queue.pendingTitle": "대기 중",
270
+ "queue.copy": "복사",
264
271
  "queue.delete": "삭제",
265
272
  "queue.steer": "지금 실행 (steer)",
266
273
  "queue.cancelArm": "취소 (3초 안에 한 번 더 누르면 취소)",
@@ -1,8 +1,10 @@
1
1
  {
2
2
  "cmd.help.desc": "命令列表",
3
3
  "cmd.status.desc": "当前状态",
4
- "cmd.clear.desc": "清屏(不删除数据)",
5
- "cmd.reset.desc": "完全重置(MCP/技能/员工/会话)",
4
+ "cmd.clear.desc": "删除对话 / all: 重置技能+员工+MCP",
5
+ "cmd.purge.desc": "删除对话和记忆",
6
+ "cmd.purge.tg_desc": "删除对话+记忆",
7
+ "cmd.reset.desc": "引导重置(对话/记忆/技能/员工/MCP)",
6
8
  "cmd.model.desc": "查看/切换模型",
7
9
  "cmd.cli.desc": "查看/切换当前 CLI",
8
10
  "cmd.fallback.desc": "设置 CLI fallback 顺序",
@@ -89,9 +91,13 @@
89
91
  "cmd.reset.confirm": "完全重置:MCP、技能、员工和会话都会恢复默认值。\n输入 /reset confirm 继续。",
90
92
  "cmd.reset.unavailable": "当前环境不支持重置。",
91
93
  "cmd.reset.done": "重置完成:{items}",
94
+ "cmd.reset.bootstrapDone": "🔄 引导重置完成:{items}",
95
+ "cmd.reset.memory": "记忆",
92
96
  "cmd.reset.skills": "技能",
93
97
  "cmd.reset.employees": "员工",
94
98
  "cmd.reset.sessions": "会话",
99
+ "cmd.purge.done": "✅ 对话 + 记忆已清除",
100
+ "cmd.clearAll.done": "✅ {items} 重置完成",
95
101
  "cmd.mcp.syncDone": "MCP 同步完成({count} 个目标)",
96
102
  "cmd.mcp.installDone": "MCP 安装完成({count} 个服务器)",
97
103
  "cmd.memory.empty": "没有记忆文件。",
@@ -250,6 +256,7 @@
250
256
  "btn.attach": "附加文件",
251
257
  "input.placeholder": "输入消息...",
252
258
  "queue.pendingTitle": "待处理",
259
+ "queue.copy": "复制",
253
260
  "queue.delete": "移除",
254
261
  "queue.steer": "立即运行(steer)",
255
262
  "queue.cancelArm": "再次点击取消",