cli-jaw 2.0.5 → 2.0.6

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 (614) hide show
  1. package/README.ja.md +229 -315
  2. package/README.ko.md +248 -315
  3. package/README.md +103 -186
  4. package/README.zh-CN.md +282 -296
  5. package/dist/bin/commands/browser-web-ai.js +4 -2
  6. package/dist/bin/commands/browser-web-ai.js.map +1 -1
  7. package/dist/bin/commands/browser.js +76 -0
  8. package/dist/bin/commands/browser.js.map +1 -1
  9. package/dist/bin/commands/doctor.js +122 -4
  10. package/dist/bin/commands/doctor.js.map +1 -1
  11. package/dist/bin/commands/skill.js +5 -3
  12. package/dist/bin/commands/skill.js.map +1 -1
  13. package/dist/bin/postinstall.js +507 -89
  14. package/dist/bin/postinstall.js.map +1 -1
  15. package/dist/lib/mcp/format-converters.js +32 -4
  16. package/dist/lib/mcp/format-converters.js.map +1 -1
  17. package/dist/lib/mcp/mcp-install.js +5 -0
  18. package/dist/lib/mcp/mcp-install.js.map +1 -1
  19. package/dist/lib/mcp/skills-distribution.js +52 -53
  20. package/dist/lib/mcp/skills-distribution.js.map +1 -1
  21. package/dist/lib/mcp/skills-reset.js +29 -16
  22. package/dist/lib/mcp/skills-reset.js.map +1 -1
  23. package/dist/lib/mcp/skills-utils.js +64 -2
  24. package/dist/lib/mcp/skills-utils.js.map +1 -1
  25. package/dist/lib/mcp/unified-config.js +7 -3
  26. package/dist/lib/mcp/unified-config.js.map +1 -1
  27. package/dist/scripts/fresh-install-smoke.js +1 -1
  28. package/dist/scripts/fresh-install-smoke.js.map +1 -1
  29. package/dist/server.js +44 -4
  30. package/dist/server.js.map +1 -1
  31. package/dist/src/agent/args.js +148 -1
  32. package/dist/src/agent/args.js.map +1 -1
  33. package/dist/src/agent/claude-e-runtime.js +42 -0
  34. package/dist/src/agent/claude-e-runtime.js.map +1 -0
  35. package/dist/src/agent/claude-i-runtime.js +42 -0
  36. package/dist/src/agent/claude-i-runtime.js.map +1 -0
  37. package/dist/src/agent/cli-helpers.js +9 -0
  38. package/dist/src/agent/cli-helpers.js.map +1 -0
  39. package/dist/src/agent/codex-app-client.js +240 -0
  40. package/dist/src/agent/codex-app-client.js.map +1 -0
  41. package/dist/src/agent/codex-app-events.js +268 -0
  42. package/dist/src/agent/codex-app-events.js.map +1 -0
  43. package/dist/src/agent/error-classifier.js +8 -2
  44. package/dist/src/agent/error-classifier.js.map +1 -1
  45. package/dist/src/agent/events/acp.js +200 -0
  46. package/dist/src/agent/events/acp.js.map +1 -0
  47. package/dist/src/agent/events/claude.js +200 -0
  48. package/dist/src/agent/events/claude.js.map +1 -0
  49. package/dist/src/agent/events/codex.js +118 -0
  50. package/dist/src/agent/events/codex.js.map +1 -0
  51. package/dist/src/agent/events/gemini.js +100 -0
  52. package/dist/src/agent/events/gemini.js.map +1 -0
  53. package/dist/src/agent/events/grok.js +298 -0
  54. package/dist/src/agent/events/grok.js.map +1 -0
  55. package/dist/src/agent/events/helpers.js +237 -0
  56. package/dist/src/agent/events/helpers.js.map +1 -0
  57. package/dist/src/agent/events/index.js +315 -0
  58. package/dist/src/agent/events/index.js.map +1 -0
  59. package/dist/src/agent/events/opencode.js +171 -0
  60. package/dist/src/agent/events/opencode.js.map +1 -0
  61. package/dist/src/agent/events/summary.js +128 -0
  62. package/dist/src/agent/events/summary.js.map +1 -0
  63. package/dist/src/agent/events/tool-labels.js +299 -0
  64. package/dist/src/agent/events/tool-labels.js.map +1 -0
  65. package/dist/src/agent/events/types.js +3 -0
  66. package/dist/src/agent/events/types.js.map +1 -0
  67. package/dist/src/agent/events.js +2 -1487
  68. package/dist/src/agent/events.js.map +1 -1
  69. package/dist/src/agent/grok-trace-backfill.js +153 -0
  70. package/dist/src/agent/grok-trace-backfill.js.map +1 -0
  71. package/dist/src/agent/lifecycle-handler.js +60 -16
  72. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  73. package/dist/src/agent/live-run-state.js +1 -1
  74. package/dist/src/agent/live-run-state.js.map +1 -1
  75. package/dist/src/agent/memory-flush-controller.js +26 -0
  76. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  77. package/dist/src/agent/resume-classifier.js +9 -0
  78. package/dist/src/agent/resume-classifier.js.map +1 -1
  79. package/dist/src/agent/session-persistence.js +7 -2
  80. package/dist/src/agent/session-persistence.js.map +1 -1
  81. package/dist/src/agent/spawn/process-kill.js +29 -0
  82. package/dist/src/agent/spawn/process-kill.js.map +1 -0
  83. package/dist/src/agent/spawn/queue.js +273 -0
  84. package/dist/src/agent/spawn/queue.js.map +1 -0
  85. package/dist/src/agent/spawn/resume.js +56 -0
  86. package/dist/src/agent/spawn/resume.js.map +1 -0
  87. package/dist/src/agent/spawn.js +435 -371
  88. package/dist/src/agent/spawn.js.map +1 -1
  89. package/dist/src/agent/watchdog.js +5 -1
  90. package/dist/src/agent/watchdog.js.map +1 -1
  91. package/dist/src/browser/adaptive-fetch/browser-escalation.js +177 -0
  92. package/dist/src/browser/adaptive-fetch/browser-escalation.js.map +1 -0
  93. package/dist/src/browser/adaptive-fetch/browser-runtime.js +38 -0
  94. package/dist/src/browser/adaptive-fetch/browser-runtime.js.map +1 -0
  95. package/dist/src/browser/adaptive-fetch/browser-session.js +97 -0
  96. package/dist/src/browser/adaptive-fetch/browser-session.js.map +1 -0
  97. package/dist/src/browser/adaptive-fetch/challenge-detector.js +88 -0
  98. package/dist/src/browser/adaptive-fetch/challenge-detector.js.map +1 -0
  99. package/dist/src/browser/adaptive-fetch/content-scorer.js +145 -0
  100. package/dist/src/browser/adaptive-fetch/content-scorer.js.map +1 -0
  101. package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js +382 -0
  102. package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js.map +1 -0
  103. package/dist/src/browser/adaptive-fetch/fetcher.js +105 -0
  104. package/dist/src/browser/adaptive-fetch/fetcher.js.map +1 -0
  105. package/dist/src/browser/adaptive-fetch/human-loop.js +101 -0
  106. package/dist/src/browser/adaptive-fetch/human-loop.js.map +1 -0
  107. package/dist/src/browser/adaptive-fetch/index.js +586 -0
  108. package/dist/src/browser/adaptive-fetch/index.js.map +1 -0
  109. package/dist/src/browser/adaptive-fetch/metadata.js +169 -0
  110. package/dist/src/browser/adaptive-fetch/metadata.js.map +1 -0
  111. package/dist/src/browser/adaptive-fetch/output.js +71 -0
  112. package/dist/src/browser/adaptive-fetch/output.js.map +1 -0
  113. package/dist/src/browser/adaptive-fetch/reader-adapters.js +135 -0
  114. package/dist/src/browser/adaptive-fetch/reader-adapters.js.map +1 -0
  115. package/dist/src/browser/adaptive-fetch/safety.js +296 -0
  116. package/dist/src/browser/adaptive-fetch/safety.js.map +1 -0
  117. package/dist/src/browser/adaptive-fetch/third-party-readers.js +43 -0
  118. package/dist/src/browser/adaptive-fetch/third-party-readers.js.map +1 -0
  119. package/dist/src/browser/adaptive-fetch/trace.js +61 -0
  120. package/dist/src/browser/adaptive-fetch/trace.js.map +1 -0
  121. package/dist/src/browser/adaptive-fetch/transforms.js +81 -0
  122. package/dist/src/browser/adaptive-fetch/transforms.js.map +1 -0
  123. package/dist/src/browser/adaptive-fetch/validators.js +108 -0
  124. package/dist/src/browser/adaptive-fetch/validators.js.map +1 -0
  125. package/dist/src/browser/adaptive-fetch/waf-profiles.js +135 -0
  126. package/dist/src/browser/adaptive-fetch/waf-profiles.js.map +1 -0
  127. package/dist/src/browser/index.js +1 -0
  128. package/dist/src/browser/index.js.map +1 -1
  129. package/dist/src/browser/web-ai/gemini-model.js +42 -15
  130. package/dist/src/browser/web-ai/gemini-model.js.map +1 -1
  131. package/dist/src/cli/claude-models.js +1 -1
  132. package/dist/src/cli/claude-models.js.map +1 -1
  133. package/dist/src/cli/compact.js +2 -0
  134. package/dist/src/cli/compact.js.map +1 -1
  135. package/dist/src/cli/handlers-completions.js +3 -0
  136. package/dist/src/cli/handlers-completions.js.map +1 -1
  137. package/dist/src/cli/handlers-runtime.js +5 -2
  138. package/dist/src/cli/handlers-runtime.js.map +1 -1
  139. package/dist/src/cli/readiness.js +43 -1
  140. package/dist/src/cli/readiness.js.map +1 -1
  141. package/dist/src/cli/registry.js +58 -0
  142. package/dist/src/cli/registry.js.map +1 -1
  143. package/dist/src/core/browser-open.js +4 -1
  144. package/dist/src/core/browser-open.js.map +1 -1
  145. package/dist/src/core/claude-install.js +4 -0
  146. package/dist/src/core/claude-install.js.map +1 -1
  147. package/dist/src/core/cli-detect.js +61 -13
  148. package/dist/src/core/cli-detect.js.map +1 -1
  149. package/dist/src/core/compact.js +295 -63
  150. package/dist/src/core/compact.js.map +1 -1
  151. package/dist/src/core/config.js +151 -11
  152. package/dist/src/core/config.js.map +1 -1
  153. package/dist/src/core/db.js +10 -1
  154. package/dist/src/core/db.js.map +1 -1
  155. package/dist/src/core/employees.js +1 -1
  156. package/dist/src/core/employees.js.map +1 -1
  157. package/dist/src/core/logger.js +28 -9
  158. package/dist/src/core/logger.js.map +1 -1
  159. package/dist/src/core/runtime-settings.js +32 -5
  160. package/dist/src/core/runtime-settings.js.map +1 -1
  161. package/dist/src/manager/memory/embedding/state-machine.js +2 -1
  162. package/dist/src/manager/memory/embedding/state-machine.js.map +1 -1
  163. package/dist/src/manager/memory/embedding/sync.js +52 -33
  164. package/dist/src/manager/memory/embedding/sync.js.map +1 -1
  165. package/dist/src/manager/memory/embedding/vec-store.js +10 -10
  166. package/dist/src/manager/memory/embedding/vec-store.js.map +1 -1
  167. package/dist/src/manager/routes/dashboard-memory.js +43 -16
  168. package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
  169. package/dist/src/manager/server.js +11 -0
  170. package/dist/src/manager/server.js.map +1 -1
  171. package/dist/src/memory/indexing.js +6 -1
  172. package/dist/src/memory/indexing.js.map +1 -1
  173. package/dist/src/orchestrator/distribute.js +5 -4
  174. package/dist/src/orchestrator/distribute.js.map +1 -1
  175. package/dist/src/prompt/builder.js +12 -1
  176. package/dist/src/prompt/builder.js.map +1 -1
  177. package/dist/src/prompt/runtime-context.js +69 -0
  178. package/dist/src/prompt/runtime-context.js.map +1 -0
  179. package/dist/src/routes/browser.js +33 -0
  180. package/dist/src/routes/browser.js.map +1 -1
  181. package/dist/src/routes/employees.js +1 -1
  182. package/dist/src/routes/employees.js.map +1 -1
  183. package/dist/src/routes/memory.js +1 -1
  184. package/dist/src/routes/memory.js.map +1 -1
  185. package/dist/src/routes/orchestrate.js +37 -10
  186. package/dist/src/routes/orchestrate.js.map +1 -1
  187. package/dist/src/routes/quota.js +91 -1
  188. package/dist/src/routes/quota.js.map +1 -1
  189. package/dist/src/routes/runtime-context.js +43 -0
  190. package/dist/src/routes/runtime-context.js.map +1 -0
  191. package/dist/src/routes/security-audit.js +14 -0
  192. package/dist/src/routes/security-audit.js.map +1 -0
  193. package/dist/src/routes/settings.js +8 -1
  194. package/dist/src/routes/settings.js.map +1 -1
  195. package/dist/src/security/security-audit-log.js +99 -0
  196. package/dist/src/security/security-audit-log.js.map +1 -0
  197. package/dist/src/telegram/bot.js +4 -2
  198. package/dist/src/telegram/bot.js.map +1 -1
  199. package/dist/src/types/cli-engine.js +4 -0
  200. package/dist/src/types/cli-engine.js.map +1 -1
  201. package/dist/src/types/cli-events.js +1 -1
  202. package/dist/src/types/cli-events.js.map +1 -1
  203. package/package.json +9 -3
  204. package/public/assets/providers/antigravity-color.svg +1 -0
  205. package/public/assets/providers/antigravity.svg +1 -0
  206. package/public/assets/providers/copilot-color.svg +1 -1
  207. package/public/assets/providers/copilot.svg +1 -1
  208. package/public/assets/providers/grok-color.svg +1 -0
  209. package/public/assets/providers/grok.svg +1 -0
  210. package/public/css/chat-search.css +168 -0
  211. package/public/css/chat.css +43 -1
  212. package/public/css/modals.css +41 -0
  213. package/public/dist/assets/{AdvancedExport-BAdZUC-6.js → AdvancedExport-CBvz4_IZ.js} +1 -1
  214. package/public/dist/assets/Agent-DlUqCMXJ.js +1 -0
  215. package/public/dist/assets/{Browser-BsdxDVgM.js → Browser-66BpLQck.js} +1 -1
  216. package/public/dist/assets/{ChannelsDiscord-Dg_jto6l.js → ChannelsDiscord-BifT2Dum.js} +1 -1
  217. package/public/dist/assets/{ChannelsTelegram-DGyZfJGS.js → ChannelsTelegram-CK6tYQ8k.js} +1 -1
  218. package/public/dist/assets/DashboardEmbeddingSection-6F8zSSja.js +2 -0
  219. package/public/dist/assets/{DashboardMeta-CAH9ONTb.js → DashboardMeta-Cc03HT5R.js} +1 -1
  220. package/public/dist/assets/{Display-DM_yvyKL.js → Display-arOjcMQZ.js} +1 -1
  221. package/public/dist/assets/Employees-YbW-mI67.js +1 -0
  222. package/public/dist/assets/{HealthBadge-Dtr-dDnw.js → HealthBadge-DEPFkcA0.js} +1 -1
  223. package/public/dist/assets/Heartbeat-CW4eIhtJ.js +1 -0
  224. package/public/dist/assets/{InlineWarn-E64UaKFh.js → InlineWarn-DoJS7AgM.js} +1 -1
  225. package/public/dist/assets/{Mcp-Dlp2X7X7.js → Mcp-ZQ6ARQb6.js} +1 -1
  226. package/public/dist/assets/Memory-BAUWJMqc.js +1 -0
  227. package/public/dist/assets/{MilkdownWysiwygEditor-Ctww8i0L.js → MilkdownWysiwygEditor-IAqFtXvM.js} +1 -1
  228. package/public/dist/assets/ModelProvider-DUtmFh0J.js +1 -0
  229. package/public/dist/assets/{Network-Df1R2YcQ.js → Network-B_4E82zQ.js} +1 -1
  230. package/public/dist/assets/{Permissions-BKJ5K6EL.js → Permissions-BkADXjQ4.js} +1 -1
  231. package/public/dist/assets/{Permissions-CcWZoOVP.js → Permissions-DvUCB8wA.js} +1 -1
  232. package/public/dist/assets/{Profile-DZ7xf1WZ.js → Profile-BcnTCSYM.js} +1 -1
  233. package/public/dist/assets/{Prompts-Bh5DYt8e.js → Prompts-CUs_RoRE.js} +1 -1
  234. package/public/dist/assets/{SpeechKeys-CQwtVxOP.js → SpeechKeys-qxc-ROWN.js} +1 -1
  235. package/public/dist/assets/agent-meta-Du8y6mSM.js +1 -0
  236. package/public/dist/assets/app-CGqTcIeF.js +39 -0
  237. package/public/dist/assets/app-Dpk6cE6C.css +1 -0
  238. package/public/dist/assets/architecture-7EHR7CIX-wVaUQezY.js +1 -0
  239. package/public/dist/assets/architectureDiagram-3BPJPVTR-kYIVzmWe.js +36 -0
  240. package/public/dist/assets/blockDiagram-GPEHLZMM-B204CPhe.js +132 -0
  241. package/public/dist/assets/{c4Diagram-AHTNJAMY-Bp2QLC-s.js → c4Diagram-AAUBKEIU-DAv6TAjg.js} +6 -6
  242. package/public/dist/assets/channel-CCQujL1n.js +1 -0
  243. package/public/dist/assets/{chunk-EDXVE4YY-COudQKkJ.js → chunk-2J33WTMH-xiPJWKcl.js} +1 -1
  244. package/public/dist/assets/chunk-3OPIFGDE-DOAvk9x8.js +62 -0
  245. package/public/dist/assets/{chunk-4BX2VUAB-Cm3KqBkS.js → chunk-4BX2VUAB-6lTRwyT0.js} +1 -1
  246. package/public/dist/assets/chunk-4EGX6M5U-DXtAEgX6.js +1 -0
  247. package/public/dist/assets/chunk-55IACEB6-Dx2JkQLw.js +1 -0
  248. package/public/dist/assets/chunk-5DO6E6H7-DDcMHB95.js +1 -0
  249. package/public/dist/assets/chunk-5ZQYHXKU-Bd-RFO5i.js +2 -0
  250. package/public/dist/assets/chunk-727SXJPM-BrsRzj8z.js +206 -0
  251. package/public/dist/assets/{chunk-AGHRB4JF-DIMn8T3_.js → chunk-AGHRB4JF-CYdXVA2-.js} +1 -1
  252. package/public/dist/assets/chunk-AQP2D5EJ-Di6Gstk-.js +231 -0
  253. package/public/dist/assets/{chunk-LIHQZDEY-Xw9ZX8of.js → chunk-BR22UD5L-CVuYkAd1.js} +1 -1
  254. package/public/dist/assets/{chunk-BSJP7CBP-DnSYKjii.js → chunk-BSJP7CBP-B47GpxcW.js} +1 -1
  255. package/public/dist/assets/chunk-CSCIHK7Q-CAE1p4Em.js +123 -0
  256. package/public/dist/assets/chunk-FHYWG6QK-CxZt-yZZ.js +1 -0
  257. package/public/dist/assets/{chunk-FMBD7UC4-6yXYicjw.js → chunk-FMBD7UC4-CwqBlx0l.js} +1 -1
  258. package/public/dist/assets/chunk-KSCS5N6A-D9a4ZkOy.js +10 -0
  259. package/public/dist/assets/{chunk-ZZ45TVLE-D5oxCC1O.js → chunk-L5ZTLDWV-D208QbfC.js} +1 -1
  260. package/public/dist/assets/{chunk-336JU56O-CAt5aBOe.js → chunk-LZXEDZCA-CE2KFduj.js} +1 -1
  261. package/public/dist/assets/chunk-MPE355IW-Bp4qAOUf.js +1 -0
  262. package/public/dist/assets/chunk-MZUSXYTE-DAU-v-0c.js +1 -0
  263. package/public/dist/assets/chunk-N66VUXT2-CpPz1L5u.js +1 -0
  264. package/public/dist/assets/chunk-ND2GUHAM-zZ7h1CPf.js +1 -0
  265. package/public/dist/assets/chunk-NNHCCRGN-BaiX9a5F.js +159 -0
  266. package/public/dist/assets/{chunk-X2U36JSP-CoMFMVNF.js → chunk-NZK2D7GU-CTqFQ8K5.js} +1 -1
  267. package/public/dist/assets/chunk-O5CBEL6O-BTuvXKFi.js +11 -0
  268. package/public/dist/assets/chunk-PUPMXCY4-ppZvktf-.js +1 -0
  269. package/public/dist/assets/chunk-QZHKN3VN-CBAtPPT7.js +1 -0
  270. package/public/dist/assets/chunk-UIBZB4QT-rJZEVBX0.js +1 -0
  271. package/public/dist/assets/chunk-WCWK7LTN-CGvUyB8h.js +1 -0
  272. package/public/dist/assets/chunk-WU5MYG2G-C3fKlSvP.js +1 -0
  273. package/public/dist/assets/{chunk-XPW4576I-CmAz5C-j.js → chunk-XPW4576I-BaQfzRci.js} +1 -1
  274. package/public/dist/assets/classDiagram-4FO5ZUOK-Cb-qL5u3.js +1 -0
  275. package/public/dist/assets/classDiagram-v2-Q7XG4LA2-BPhGdj15.js +1 -0
  276. package/public/dist/assets/constants-BxG09J6S.js +1 -0
  277. package/public/dist/assets/cose-bilkent-S5V4N54A-D1zmarou.js +1 -0
  278. package/public/dist/assets/dagre-BM42HDAG-BVkBttzA.js +4 -0
  279. package/public/dist/assets/dagre-DnoxfNXr.js +1 -0
  280. package/public/dist/assets/diagram-2AECGRRQ-Bs32KPnT.js +43 -0
  281. package/public/dist/assets/{diagram-5BDNPKRD-Cl4PzCD0.js → diagram-5GNKFQAL-YDYgPOQj.js} +2 -2
  282. package/public/dist/assets/diagram-KO2AKTUF-1tIdFl26.js +3 -0
  283. package/public/dist/assets/{diagram-TYMM5635-B_Xoa1Gp.js → diagram-LMA3HP47-B1y15kav.js} +1 -1
  284. package/public/dist/assets/diagram-OG6HWLK6-C25j1jGg.js +24 -0
  285. package/public/dist/assets/{dist-C9LWf2uC.js → dist-0v1UKkQ3.js} +1 -1
  286. package/public/dist/assets/dist-BMi_buEb.js +1 -0
  287. package/public/dist/assets/{dist-B6G8pbap.js → dist-BQNQk-1M.js} +1 -1
  288. package/public/dist/assets/{dist-CCKktDoF.js → dist-BVpa_e6W.js} +1 -1
  289. package/public/dist/assets/dist-BkrbW_LS.js +1 -0
  290. package/public/dist/assets/{dist-CkMC2PPt.js → dist-C1VqWrYZ.js} +1 -1
  291. package/public/dist/assets/{dist-BA7sRne4.js → dist-C3vh7d65.js} +1 -1
  292. package/public/dist/assets/{dist-BhzKO6nt2.js → dist-CE4s7vg82.js} +1 -1
  293. package/public/dist/assets/{dist-BDMNMdPF.js → dist-CjPin7Mr.js} +1 -1
  294. package/public/dist/assets/{dist-W7IGn2ug.js → dist-Ck6PnIlo.js} +1 -1
  295. package/public/dist/assets/{dist-B1rKu9eP.js → dist-CnIrGAPx.js} +1 -1
  296. package/public/dist/assets/{dist-CEDX2HGI.js → dist-Cv8S3FhF.js} +1 -1
  297. package/public/dist/assets/{dist-55MYVjjj.js → dist-D0PYXGt2.js} +1 -1
  298. package/public/dist/assets/{dist-C0sOT_UM.js → dist-D5GUqT-6.js} +1 -1
  299. package/public/dist/assets/{dist-C5S-Rbvc.js → dist-D66X8iAn.js} +1 -1
  300. package/public/dist/assets/dist-D815C1Fv.js +1 -0
  301. package/public/dist/assets/{dist-Ch6JG5jE.js → dist-DDDFJ8jG.js} +1 -1
  302. package/public/dist/assets/{dist-2oDfqE98.js → dist-DHQI31dn.js} +1 -1
  303. package/public/dist/assets/{dist-BTp_Oy_x.js → dist-DTQW91xt.js} +1 -1
  304. package/public/dist/assets/{dist-BuaQLcgQ.js → dist-Dm7RAaUo.js} +1 -1
  305. package/public/dist/assets/{dist-BJyDhGpS.js → dist-DrIWh2fi.js} +1 -1
  306. package/public/dist/assets/{dist-BGzHP3f8.js → dist-DzT7frM2.js} +1 -1
  307. package/public/dist/assets/{dist-wdLr2dSH.js → dist-Qs7HHNCC.js} +1 -1
  308. package/public/dist/assets/{dist-BjqyutOM.js → dist-Rs_Khtjb.js} +1 -1
  309. package/public/dist/assets/{dist-DdhWu7OM.js → dist-fJAyK82z.js} +1 -1
  310. package/public/dist/assets/{dist-G7QUHtDS.js → dist-jcptfm_T.js} +1 -1
  311. package/public/dist/assets/dist-sOV2kBhQ.js +1 -0
  312. package/public/dist/assets/{dist-BoG5I6U5.js → dist-vQskrHxt.js} +1 -1
  313. package/public/dist/assets/{dockerfile-CrC2HXHP.js → dockerfile-DAfh5qoE.js} +1 -1
  314. package/public/dist/assets/{employees-CIkIyvtL.js → employees-DRmX2RDd.js} +2 -2
  315. package/public/dist/assets/{erDiagram-SMLLAGMA-BvtqhMsS.js → erDiagram-TEJ5UH35-CRvCbztR.js} +6 -6
  316. package/public/dist/assets/{error-normalize-CkhPeQYx.js → error-normalize-CNbPE4lO.js} +1 -1
  317. package/public/dist/assets/eventmodeling-FCH6USID-Cq0nylxO.js +1 -0
  318. package/public/dist/assets/{factor-1CttFx2G.js → factor-BpoYJieo.js} +1 -1
  319. package/public/dist/assets/fields-DUawAHWZ.js +1 -0
  320. package/public/dist/assets/flowDiagram-I6XJVG4X-CzvVnib_.js +162 -0
  321. package/public/dist/assets/ganttDiagram-6RSMTGT7-BbUYP6iv.js +292 -0
  322. package/public/dist/assets/gitGraph-WXDBUCRP-DDq6-3D3.js +1 -0
  323. package/public/dist/assets/gitGraphDiagram-PVQCEYII-CbKdM7nW.js +106 -0
  324. package/public/dist/assets/graphlib-BLOO0H5r.js +1 -0
  325. package/public/dist/assets/info-J43DQDTF-OUnqwpUV.js +1 -0
  326. package/public/dist/assets/infoDiagram-5YYISTIA-BrZmg1At.js +2 -0
  327. package/public/dist/assets/{ishikawaDiagram-UXIWVN3A-DZW-Nqsf.js → ishikawaDiagram-YF4QCWOH-BDWXqJi5.js} +2 -2
  328. package/public/dist/assets/javascript-CZjRNq5R.js +1 -0
  329. package/public/dist/assets/{journeyDiagram-VCZTEJTY-ByVRJxVF.js → journeyDiagram-JHISSGLW-CPFRd_M3.js} +6 -6
  330. package/public/dist/assets/{jsx-runtime-BjL7qHh8.js → jsx-runtime-BZmCptaP.js} +1 -1
  331. package/public/dist/assets/{kanban-definition-6JOO6SKY-xwN0YCW2.js → kanban-definition-UN3LZRKU-BcQbBplS.js} +10 -10
  332. package/public/dist/assets/katex-CF5bGce6.js +1 -0
  333. package/public/dist/assets/manager-B5OmizBL.css +1 -0
  334. package/public/dist/assets/manager-Cs3eMBcx.js +25 -0
  335. package/public/dist/assets/{memory-CnBc2_Va.js → memory-BA-ki3gn.js} +1 -1
  336. package/public/dist/assets/memory-DLQbyBA3.js +1 -0
  337. package/public/dist/assets/mermaid-loader-BVPsKrpr.js +1 -0
  338. package/public/dist/assets/mermaid-parser.core-C62NUJRb.js +3 -0
  339. package/public/dist/assets/mermaid.core-ArqR5iFa.js +9 -0
  340. package/public/dist/assets/mermaid.core-BAwu4U2Y.js +1 -0
  341. package/public/dist/assets/{mindmap-definition-QFDTVHPH-Chqgsh1N.js → mindmap-definition-RKZ34NQL-C35cGkNU.js} +29 -29
  342. package/public/dist/assets/{nsis-_CjIiUyF.js → nsis-Ch4QINLN.js} +1 -1
  343. package/public/dist/assets/packet-YPE3B663-Bb9hBQ06.js +1 -0
  344. package/public/dist/assets/{page-shell-CTxVDJ8Y.js → page-shell-CVAobxbP.js} +1 -1
  345. package/public/dist/assets/pie-LRSECV5Y-CNRQnRNZ.js +1 -0
  346. package/public/dist/assets/pieDiagram-4H26LBE5-B8C_hoqJ.js +30 -0
  347. package/public/dist/assets/provider-icons-dxT69zGg.js +8 -0
  348. package/public/dist/assets/{pug-CbR8lCtK.js → pug-CXYqmmpP.js} +1 -1
  349. package/public/dist/assets/quadrantDiagram-W4KKPZXB-BEPrine5.js +7 -0
  350. package/public/dist/assets/radar-GUYGQ44K-BxngU2v0.js +1 -0
  351. package/public/dist/assets/{render-lpTpN1El.js → render-C7_e0J_X.js} +3 -3
  352. package/public/dist/assets/{requirementDiagram-MS252O5E-wnPtv0LG.js → requirementDiagram-4Y6WPE33-ClDDon9c.js} +4 -4
  353. package/public/dist/assets/rolldown-runtime-XQCOJYun.js +1 -0
  354. package/public/dist/assets/sankeyDiagram-5OEKKPKP-Bjs3OE-1.js +40 -0
  355. package/public/dist/assets/sequenceDiagram-3UESZ5HK-BM8IAaEe.js +162 -0
  356. package/public/dist/assets/settings-DjyKdqev.js +1 -0
  357. package/public/dist/assets/settings-pUJzyeX2.js +42 -0
  358. package/public/dist/assets/{sidebar-Cwt0FxQl.js → sidebar-CO9Qjj6v.js} +2 -2
  359. package/public/dist/assets/skills-CX3qJ77s.js +1 -0
  360. package/public/dist/assets/{skills-DDmTyywh.js → skills-Dq7fD8I3.js} +1 -1
  361. package/public/dist/assets/{slash-commands-D5y5AVvS.js → slash-commands-DRsKtuGT.js} +1 -1
  362. package/public/dist/assets/slash-commands-UbS8w9ij.js +1 -0
  363. package/public/dist/assets/stateDiagram-AJRCARHV-BvNABuXE.js +1 -0
  364. package/public/dist/assets/stateDiagram-v2-BHNVJYJU-CCIo81qy.js +1 -0
  365. package/public/dist/assets/{timeline-definition-GMOUNBTQ-DUz1-iOx.js → timeline-definition-PNZ67QCA-CIvTvac3.js} +8 -8
  366. package/public/dist/assets/trace-drawer-DDFdU07_.js +15 -0
  367. package/public/dist/assets/treeView-BLDUP644-cXRzPGzz.js +1 -0
  368. package/public/dist/assets/treemap-LRROVOQU-BsZE5HPE.js +1 -0
  369. package/public/dist/assets/ui-CeBmBBZM.js +140 -0
  370. package/public/dist/assets/ui-TMXjvH0r.js +1 -0
  371. package/public/dist/assets/{vendor-render-DEStnpJ8.js → vendor-render-DCb9B75Q.js} +38 -37
  372. package/public/dist/assets/vendor-utils-BnxL60_-.js +1 -0
  373. package/public/dist/assets/vennDiagram-CIIHVFJN-C5cbS2KC.js +34 -0
  374. package/public/dist/assets/wardley-L42UT6IY-D_qm0cZD.js +1 -0
  375. package/public/dist/assets/{wardleyDiagram-NUSXRM2D-CLAhOzap.js → wardleyDiagram-YWT4CUSO-BsRBBGFP.js} +61 -3
  376. package/public/dist/assets/{wiki-link-suggestions-LQuYT22G.js → wiki-link-suggestions-BHwNQXT_.js} +2 -2
  377. package/public/dist/assets/{xychartDiagram-5P7HB3ND-DLnY9i8z.js → xychartDiagram-2RQKCTM6-B6rqui6F.js} +6 -6
  378. package/public/dist/index.html +102 -3
  379. package/public/dist/manager/index.html +2 -2
  380. package/public/index.html +101 -1
  381. package/public/js/constants.ts +72 -0
  382. package/public/js/diagram/iframe-renderer.ts +7 -0
  383. package/public/js/features/chat-scroll.ts +31 -0
  384. package/public/js/features/chat-search.ts +223 -0
  385. package/public/js/features/help-content.ts +20 -2
  386. package/public/js/features/help-dialog.ts +38 -2
  387. package/public/js/features/pending-queue.ts +6 -0
  388. package/public/js/features/process-block.ts +20 -0
  389. package/public/js/features/settings-channel.ts +3 -1
  390. package/public/js/features/settings-cli-status.ts +24 -3
  391. package/public/js/features/settings-core.ts +134 -21
  392. package/public/js/features/settings-types.ts +12 -1
  393. package/public/js/features/settings.ts +1 -1
  394. package/public/js/features/trace-drawer.ts +2 -1
  395. package/public/js/features/voice-recorder.ts +222 -42
  396. package/public/js/main.ts +58 -4
  397. package/public/js/provider-icons.ts +46 -27
  398. package/public/js/render/markdown.ts +6 -0
  399. package/public/js/ui.ts +33 -7
  400. package/public/js/ws.ts +5 -1
  401. package/public/locales/en.json +31 -7
  402. package/public/locales/ja.json +31 -7
  403. package/public/locales/ko.json +31 -7
  404. package/public/locales/zh.json +31 -7
  405. package/public/manager/src/App.tsx +19 -55
  406. package/public/manager/src/InstancePreview.tsx +46 -1
  407. package/public/manager/src/components/InstanceDetailPanel.tsx +7 -2
  408. package/public/manager/src/components/InstanceLogsPanel.tsx +138 -0
  409. package/public/manager/src/dashboard-settings/DashboardEmbeddingSection.tsx +37 -7
  410. package/public/manager/src/jaw-ceo/useJawCeoDashboardBridge.tsx +1 -0
  411. package/public/manager/src/manager-components.css +76 -0
  412. package/public/manager/src/preview.ts +26 -3
  413. package/public/manager/src/settings/fields/SelectField.tsx +51 -17
  414. package/public/manager/src/settings/pages/Agent.tsx +37 -2
  415. package/public/manager/src/settings/pages/Heartbeat.tsx +3 -2
  416. package/public/manager/src/settings/pages/Memory.tsx +3 -2
  417. package/public/manager/src/settings/pages/components/EmployeeRow.tsx +8 -4
  418. package/public/manager/src/settings/pages/components/PerCliRow.tsx +31 -5
  419. package/public/manager/src/settings/pages/components/agent/FlushAgentSection.tsx +4 -2
  420. package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +1 -1
  421. package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +23 -1
  422. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +49 -0
  423. package/public/manager/src/settings/pages/components/employees-helpers.ts +6 -1
  424. package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +11 -1
  425. package/public/manager/src/settings-controls.css +25 -0
  426. package/public/manager/src/usePreviewShortcutMessages.ts +30 -0
  427. package/public/manager/src/usePreviewSttLifecycle.ts +31 -0
  428. package/scripts/fresh-install-smoke.ts +1 -1
  429. package/scripts/install-officecli.ps1 +33 -5
  430. package/scripts/install-officecli.sh +52 -8
  431. package/scripts/install-wsl.sh +96 -24
  432. package/scripts/install.sh +82 -11
  433. package/scripts/postinstall-guard.cjs +57 -30
  434. package/public/dist/assets/Agent-DNpehKB2.js +0 -1
  435. package/public/dist/assets/DashboardEmbeddingSection-BYdGgqg7.js +0 -2
  436. package/public/dist/assets/Employees-CuYuTy0R.js +0 -1
  437. package/public/dist/assets/Heartbeat-C-vq02MW.js +0 -1
  438. package/public/dist/assets/Memory-BPKWJDXK.js +0 -1
  439. package/public/dist/assets/ModelProvider-Bd6vGkXT.js +0 -1
  440. package/public/dist/assets/agent-meta-C1pQzExf.js +0 -1
  441. package/public/dist/assets/app-BxsIleo0.js +0 -32
  442. package/public/dist/assets/app-CB9n5A77.css +0 -1
  443. package/public/dist/assets/architecture-YZFGNWBL-BRI-0IaU.js +0 -1
  444. package/public/dist/assets/architectureDiagram-Q4EWVU46-z0JCgZrJ.js +0 -36
  445. package/public/dist/assets/blockDiagram-DXYQGD6D-KaOz3aFS.js +0 -132
  446. package/public/dist/assets/channel-jLopKIgm.js +0 -1
  447. package/public/dist/assets/chunk-2KRD3SAO-C8hJZPJu.js +0 -1
  448. package/public/dist/assets/chunk-426QAEUC-atJRhvKN.js +0 -1
  449. package/public/dist/assets/chunk-4TB4RGXK-BD7UhIN8.js +0 -206
  450. package/public/dist/assets/chunk-55IACEB6-CAWcPDdr.js +0 -1
  451. package/public/dist/assets/chunk-5FUZZQ4R-Cg1pzs6p.js +0 -62
  452. package/public/dist/assets/chunk-5PVQY5BW-otv3HwE_.js +0 -2
  453. package/public/dist/assets/chunk-67CJDMHE-AU2iOKLT.js +0 -1
  454. package/public/dist/assets/chunk-7N4EOEYR-BTIS4jBw.js +0 -1
  455. package/public/dist/assets/chunk-AA7GKIK3-c9UUJO_T.js +0 -1
  456. package/public/dist/assets/chunk-CIAEETIT-Dwbln6rM.js +0 -1
  457. package/public/dist/assets/chunk-ENJZ2VHE-PT_jAckw.js +0 -10
  458. package/public/dist/assets/chunk-FOC6F5B3-BqDmFFeg.js +0 -1
  459. package/public/dist/assets/chunk-ICPOFSXX-P6V6jqiT.js +0 -122
  460. package/public/dist/assets/chunk-K5T4RW27-C42sOmZR.js +0 -27
  461. package/public/dist/assets/chunk-KGLVRYIC-K-BVa8b2.js +0 -1
  462. package/public/dist/assets/chunk-ORNJ4GCN-CEXU6WaD.js +0 -1
  463. package/public/dist/assets/chunk-OYMX7WX6-DmJG2z1S.js +0 -231
  464. package/public/dist/assets/chunk-QZHKN3VN-BkVLii_3.js +0 -1
  465. package/public/dist/assets/chunk-U2HBQHQK-Ny6UwUgK.js +0 -11
  466. package/public/dist/assets/chunk-YZCP3GAM-c7FYtZME.js +0 -1
  467. package/public/dist/assets/classDiagram-6PBFFD2Q-BgOyAynm.js +0 -1
  468. package/public/dist/assets/classDiagram-v2-HSJHXN6E-5gBdoVH9.js +0 -1
  469. package/public/dist/assets/constants-4A2GptQT.js +0 -1
  470. package/public/dist/assets/cose-bilkent-S5V4N54A-CvH6qY_r.js +0 -1
  471. package/public/dist/assets/dagre--20B2-ZQ.js +0 -1
  472. package/public/dist/assets/dagre-KV5264BT-CQ0wo0ma.js +0 -4
  473. package/public/dist/assets/diagram-G4DWMVQ6-_aP6kMTh.js +0 -24
  474. package/public/dist/assets/diagram-MMDJMWI5-J1l6Q0JG.js +0 -43
  475. package/public/dist/assets/dist-B1p80u1b.js +0 -1
  476. package/public/dist/assets/dist-BKyzWv22.js +0 -1
  477. package/public/dist/assets/dist-CxJpXP6s.js +0 -1
  478. package/public/dist/assets/dist-DNLFuTrS.js +0 -1
  479. package/public/dist/assets/fields-BISouxp2.js +0 -1
  480. package/public/dist/assets/flowDiagram-DWJPFMVM-C_F0rqqT.js +0 -162
  481. package/public/dist/assets/ganttDiagram-T4ZO3ILL-B5S8EZRg.js +0 -292
  482. package/public/dist/assets/gitGraph-7Q5UKJZL-DTTW6pxr.js +0 -1
  483. package/public/dist/assets/gitGraphDiagram-UUTBAWPF-DMGzYJeb.js +0 -106
  484. package/public/dist/assets/graphlib-CZk_Ii16.js +0 -1
  485. package/public/dist/assets/info-OMHHGYJF-BU-iuaSm.js +0 -1
  486. package/public/dist/assets/infoDiagram-42DDH7IO-dzSaYFFK.js +0 -2
  487. package/public/dist/assets/javascript-BhB45e0W.js +0 -1
  488. package/public/dist/assets/katex-DamPUmTE.js +0 -1
  489. package/public/dist/assets/manager-B84u-pcn.js +0 -25
  490. package/public/dist/assets/manager-DMg_sTEP.css +0 -1
  491. package/public/dist/assets/memory-BV62wlsG.js +0 -1
  492. package/public/dist/assets/mermaid-loader-DxFGz4EE.js +0 -1
  493. package/public/dist/assets/mermaid-parser.core-CMIZ0my_.js +0 -3
  494. package/public/dist/assets/mermaid.core-CicVBD9l.js +0 -1
  495. package/public/dist/assets/mermaid.core-Dj6viEzN.js +0 -11
  496. package/public/dist/assets/packet-4T2RLAQJ-DzmBsAf0.js +0 -1
  497. package/public/dist/assets/pie-ZZUOXDRM-DyG1KzTn.js +0 -1
  498. package/public/dist/assets/pieDiagram-DEJITSTG-DJLiSymi.js +0 -30
  499. package/public/dist/assets/quadrantDiagram-34T5L4WZ-qcnWmcRr.js +0 -7
  500. package/public/dist/assets/radar-PYXPWWZC-CEBZARUu.js +0 -1
  501. package/public/dist/assets/rolldown-runtime-DE9SaGGd.js +0 -1
  502. package/public/dist/assets/sankeyDiagram-XADWPNL6-Bn3pUd_K.js +0 -10
  503. package/public/dist/assets/sequenceDiagram-FGHM5R23-DfxcHSdj.js +0 -157
  504. package/public/dist/assets/settings-CfAXLa8a.js +0 -1
  505. package/public/dist/assets/settings-FWgmcubl.js +0 -40
  506. package/public/dist/assets/skills-D-qUVJ-e.js +0 -1
  507. package/public/dist/assets/slash-commands-BfI19vIz.js +0 -1
  508. package/public/dist/assets/stateDiagram-FHFEXIEX-CiR7P2OG.js +0 -1
  509. package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-BaWWpysK.js +0 -1
  510. package/public/dist/assets/trace-drawer-DVF5F1df.js +0 -15
  511. package/public/dist/assets/treeView-SZITEDCU-D5-TP7Qp.js +0 -1
  512. package/public/dist/assets/treemap-W4RFUUIX-BQhm_ZSp.js +0 -1
  513. package/public/dist/assets/ui-BJXY16Dk.js +0 -140
  514. package/public/dist/assets/ui-BXm3OPPh.js +0 -1
  515. package/public/dist/assets/vendor-utils-IVTPs69f.js +0 -68
  516. package/public/dist/assets/vennDiagram-DHZGUBPP-CYu7SDdG.js +0 -34
  517. package/public/dist/assets/wardley-RL74JXVD-CpnBMRe0.js +0 -1
  518. package/public/manager/src/settings/pages/Embedding.tsx +0 -382
  519. /package/public/dist/assets/{apl-HYRstREL.js → apl-CieDeb7B.js} +0 -0
  520. /package/public/dist/assets/{asciiarmor-BDXCrhAK.js → asciiarmor-BRTyulZY.js} +0 -0
  521. /package/public/dist/assets/{asn1-CnSBhb0M.js → asn1-DoNAtQ5o.js} +0 -0
  522. /package/public/dist/assets/{asterisk-AqV7rnIi.js → asterisk-CR7oKPxi.js} +0 -0
  523. /package/public/dist/assets/{brainfuck-Dv46-iL9.js → brainfuck-abzPcrOz.js} +0 -0
  524. /package/public/dist/assets/{clike-GRffz5hY.js → clike-B71Zq38G.js} +0 -0
  525. /package/public/dist/assets/{clojure-DzgT_fqE.js → clojure-Zm0UzHPq.js} +0 -0
  526. /package/public/dist/assets/{cmake-Co1237r5.js → cmake-D3UNdg6L.js} +0 -0
  527. /package/public/dist/assets/{cobol-rUaLketb.js → cobol-4fYvwQR0.js} +0 -0
  528. /package/public/dist/assets/{coffeescript-DQyfHE86.js → coffeescript-Ct6bZdRU.js} +0 -0
  529. /package/public/dist/assets/{commonlisp-Buue1PGW.js → commonlisp-CrgXVPcd.js} +0 -0
  530. /package/public/dist/assets/{crystal-BMWO0kOJ.js → crystal-bGOl67VM.js} +0 -0
  531. /package/public/dist/assets/{css-DaxibPo5.js → css-B_EV3Xq2.js} +0 -0
  532. /package/public/dist/assets/{cypher-CmpGfiBR.js → cypher-DXDlHTYf.js} +0 -0
  533. /package/public/dist/assets/{cytoscape.esm-zT8GwLFm.js → cytoscape.esm-BK7ao2Ti.js} +0 -0
  534. /package/public/dist/assets/{d-qmdtoIzU.js → d-RL5ynsiz.js} +0 -0
  535. /package/public/dist/assets/{diff-B40m6u1h.js → diff-B5McBGjz.js} +0 -0
  536. /package/public/dist/assets/{dtd-569ynYVj.js → dtd-l3sK4p_C.js} +0 -0
  537. /package/public/dist/assets/{dylan-Dxolp30i.js → dylan-WjJGY-rW.js} +0 -0
  538. /package/public/dist/assets/{ebnf-BZiX9Iq3.js → ebnf-BGY79HOS.js} +0 -0
  539. /package/public/dist/assets/{ecl-B8F1Q0oZ.js → ecl-BKh7OE1d.js} +0 -0
  540. /package/public/dist/assets/{eiffel-Bv8Kvgh1.js → eiffel-Bzvlg3oK.js} +0 -0
  541. /package/public/dist/assets/{elm-QWXQaIis.js → elm-5_BqNmKu.js} +0 -0
  542. /package/public/dist/assets/{erlang-CuDGzTGm.js → erlang-BdVwz8I8.js} +0 -0
  543. /package/public/dist/assets/{fcl-BiFeqtHf.js → fcl-B9cnfODD.js} +0 -0
  544. /package/public/dist/assets/{forth-R7Uc2VcL.js → forth-wZbbnGzb.js} +0 -0
  545. /package/public/dist/assets/{fortran-kDRG6BzW.js → fortran-BAJZrRfU.js} +0 -0
  546. /package/public/dist/assets/{gas-CyRkuC5T.js → gas-D60ZhBat.js} +0 -0
  547. /package/public/dist/assets/{gherkin-BE0p00ey.js → gherkin-B8tKjAAi.js} +0 -0
  548. /package/public/dist/assets/{groovy-B_Sh3D1t.js → groovy-BAG9eJUD.js} +0 -0
  549. /package/public/dist/assets/{haskell-DWXgCy4o.js → haskell-Cj4TmWbg.js} +0 -0
  550. /package/public/dist/assets/{haxe-xGxZ54Hv.js → haxe-8chnvz-o.js} +0 -0
  551. /package/public/dist/assets/{http-CKv9cSBA.js → http-DDYeO71z.js} +0 -0
  552. /package/public/dist/assets/{idl-DmlI3XzS.js → idl-D1hY-Gp_.js} +0 -0
  553. /package/public/dist/assets/{javascript-j6r5uf_k.js → javascript-Sh0ZUMP2.js} +0 -0
  554. /package/public/dist/assets/{julia-CQSp9Qa0.js → julia-BibioBF2.js} +0 -0
  555. /package/public/dist/assets/{livescript-CqvtVTlb.js → livescript-CSZrB6F4.js} +0 -0
  556. /package/public/dist/assets/{lua-DazQKUZ0.js → lua-BvTlo5w3.js} +0 -0
  557. /package/public/dist/assets/{mathematica-DqhJVCs9.js → mathematica-Bexv8BWZ.js} +0 -0
  558. /package/public/dist/assets/{mbox-Dsyo1_UL.js → mbox-BAhbA8z2.js} +0 -0
  559. /package/public/dist/assets/{mirc-D7ThhoF-.js → mirc-BzT5Kh4S.js} +0 -0
  560. /package/public/dist/assets/{mllike-EPZ6pqQD.js → mllike-DeoJnUZQ.js} +0 -0
  561. /package/public/dist/assets/{modelica-PU45hbqg.js → modelica-FD_-Fxlc.js} +0 -0
  562. /package/public/dist/assets/{mscgen-DEnh2Ojr.js → mscgen-C-OyhbwB.js} +0 -0
  563. /package/public/dist/assets/{mumps-8GhR7rRa.js → mumps-BxkCDTK7.js} +0 -0
  564. /package/public/dist/assets/{nginx-CXwagpwp.js → nginx-2JaV__gC.js} +0 -0
  565. /package/public/dist/assets/{ntriples-BDQxxstw.js → ntriples--rhhCzqb.js} +0 -0
  566. /package/public/dist/assets/{octave-2c90WnyU.js → octave-rS4nMzRe.js} +0 -0
  567. /package/public/dist/assets/{oz-CO0rQ8EL.js → oz-I4fMb_NC.js} +0 -0
  568. /package/public/dist/assets/{pascal-CcVwOGeN.js → pascal-BEghJs8t.js} +0 -0
  569. /package/public/dist/assets/{path-utils-DySmCVZK.js → path-utils-r2bJIu28.js} +0 -0
  570. /package/public/dist/assets/{perl-B9UvGoAV.js → perl-BRO9ZFo9.js} +0 -0
  571. /package/public/dist/assets/{pig-Cd1f86ZJ.js → pig-L4Ii6KI0.js} +0 -0
  572. /package/public/dist/assets/{powershell-DV4cOnkJ.js → powershell-BBeqUCRp.js} +0 -0
  573. /package/public/dist/assets/{properties-DaSVPhrZ.js → properties-Boi0jF2J.js} +0 -0
  574. /package/public/dist/assets/{protobuf-CEtFnY22.js → protobuf-fB2aGypX.js} +0 -0
  575. /package/public/dist/assets/{puppet-Ca0DHfcW.js → puppet-BRmsErtO.js} +0 -0
  576. /package/public/dist/assets/{python-ydzCwWG-.js → python-Be4P9Dgp.js} +0 -0
  577. /package/public/dist/assets/{q-Cl8kzQmk.js → q-DZGhDLYt.js} +0 -0
  578. /package/public/dist/assets/{r-DKZPJFrD.js → r-B4NERjRM.js} +0 -0
  579. /package/public/dist/assets/{rough.esm-Dnk3WN4D.js → rough.esm-C0Gkx4O1.js} +0 -0
  580. /package/public/dist/assets/{rpm-D0lqeHoZ.js → rpm-e-QbHJ1q.js} +0 -0
  581. /package/public/dist/assets/{ruby-RVmtmNDw.js → ruby-BSVP_v59.js} +0 -0
  582. /package/public/dist/assets/{sas-CEzodAB7.js → sas-DHlU4v4g.js} +0 -0
  583. /package/public/dist/assets/{scheme-Pqmt6dh3.js → scheme-BGXbz5Hz.js} +0 -0
  584. /package/public/dist/assets/{settings-client-BN3XzwEo.js → settings-client-DPuJroyk.js} +0 -0
  585. /package/public/dist/assets/{shell-CLG3zy-u.js → shell-yonx6xY2.js} +0 -0
  586. /package/public/dist/assets/{sieve-C95IWC3O.js → sieve-ClPJUZyi.js} +0 -0
  587. /package/public/dist/assets/{simple-mode-B9ErAHMD.js → simple-mode-CjViblDK.js} +0 -0
  588. /package/public/dist/assets/{smalltalk-4cL-gRJb.js → smalltalk-CHXubeqS.js} +0 -0
  589. /package/public/dist/assets/{solr-CEA7oOx_.js → solr-C6q6YwPz.js} +0 -0
  590. /package/public/dist/assets/{sparql-w8kHjP6I.js → sparql-CcspZvEd.js} +0 -0
  591. /package/public/dist/assets/{spreadsheet-C8bDfTgC.js → spreadsheet-DH3a4LBS.js} +0 -0
  592. /package/public/dist/assets/{sql-BrKz8968.js → sql-meoY6gNi.js} +0 -0
  593. /package/public/dist/assets/{stex-xFw1nXeT.js → stex-D2bn6Zsh.js} +0 -0
  594. /package/public/dist/assets/{stylus-gS_68vPk.js → stylus-DbXGih0S.js} +0 -0
  595. /package/public/dist/assets/{swift-D5lXmY2d.js → swift-Ch391uOd.js} +0 -0
  596. /package/public/dist/assets/{tcl-D-41REtC.js → tcl-CQBgGWDP.js} +0 -0
  597. /package/public/dist/assets/{textile-D-Znao0j.js → textile-4i3oG3tg.js} +0 -0
  598. /package/public/dist/assets/{tiddlywiki-Co8lXJKd.js → tiddlywiki-CXG1-CcK.js} +0 -0
  599. /package/public/dist/assets/{tiki-DsiNRYMP.js → tiki-DJqKUhA-.js} +0 -0
  600. /package/public/dist/assets/{toml-CaVZGou4.js → toml-C1FnyICQ.js} +0 -0
  601. /package/public/dist/assets/{troff-DJvDVr-d.js → troff-Cp8NvRO0.js} +0 -0
  602. /package/public/dist/assets/{ttcn-DAC92l4d.js → ttcn-NlmW_fji.js} +0 -0
  603. /package/public/dist/assets/{ttcn-cfg-C0X-mYlr.js → ttcn-cfg-BVuxfGZf.js} +0 -0
  604. /package/public/dist/assets/{turtle-D6WHyCrL.js → turtle-Ba9ERlnm.js} +0 -0
  605. /package/public/dist/assets/{vb-CEo_ccq3.js → vb-DDs4gjJb.js} +0 -0
  606. /package/public/dist/assets/{vbscript-B_PKDV1v.js → vbscript-gOFmdMJN.js} +0 -0
  607. /package/public/dist/assets/{velocity-ClKnKBLH.js → velocity-DtSNZA7i.js} +0 -0
  608. /package/public/dist/assets/{verilog-Pnuspgw6.js → verilog-Pldmtxe7.js} +0 -0
  609. /package/public/dist/assets/{vhdl-CZnyY4fs.js → vhdl-BFfSgWGp.js} +0 -0
  610. /package/public/dist/assets/{w3c-keyname-DJlC6DTY.js → w3c-keyname-BggQEPNo.js} +0 -0
  611. /package/public/dist/assets/{webidl-DHr762Dm.js → webidl-B6ZFYE2L.js} +0 -0
  612. /package/public/dist/assets/{xquery-5-FiyUtN.js → xquery-DhxUT98N.js} +0 -0
  613. /package/public/dist/assets/{yacas-GlqsXIeT.js → yacas-jSkQeF1Q.js} +0 -0
  614. /package/public/dist/assets/{z80-CI7N40Oo.js → z80-D7Lt6v61.js} +0 -0
@@ -1,11 +1,11 @@
1
1
  // ─── Agent Spawn + Kill/Steer/Queue ──────────────────
2
2
  import fs from 'fs';
3
3
  import os from 'os';
4
- import crypto from 'node:crypto';
5
4
  import { join } from 'path';
6
- import { spawn, execFileSync } from 'child_process';
5
+ import { spawn } from 'child_process';
7
6
  import { broadcast } from '../core/bus.js';
8
- import { settings, UPLOADS_DIR, detectCli, normalizeModelForCli } from '../core/config.js';
7
+ import { settings, UPLOADS_DIR, detectCli } from '../core/config.js';
8
+ import { migrateLegacyClaudeValue } from '../cli/claude-models.js';
9
9
  import { stripUndefined } from '../core/strip-undefined.js';
10
10
  import { clearEmployeeSession, getSession, insertMessage, getRecentMessages, listQueuedMessages, insertQueuedMessage, deleteQueuedMessage, getSessionBucket, clearSessionBucket, } from '../core/db.js';
11
11
  import { getSystemPrompt, regenerateB } from '../prompt/builder.js';
@@ -14,7 +14,6 @@ import { detectSmokeResponse } from './smoke-detector.js';
14
14
  import { saveUpload as _saveUpload, buildMediaPrompt, buildMediaPromptMany } from '../../lib/upload.js';
15
15
  import { resolveMainCli, consumePendingBootstrapPrompt } from '../core/main-session.js';
16
16
  import { getSessionOwnershipGeneration, persistMainSession, } from './session-persistence.js';
17
- import { groupQueueKey } from '../messaging/session-key.js';
18
17
  import { isCompactMarkerRow } from '../core/compact.js';
19
18
  import { isRuntimeSettingsMutationInFlight, waitForRuntimeSettingsIdle } from '../core/runtime-settings-gate.js';
20
19
  import { hasBlockingWorkers, hasPendingWorkerReplays, getActiveWorkers, clearAllWorkers } from '../orchestrator/worker-registry.js';
@@ -27,6 +26,7 @@ import { applyCliEnvDefaults, buildSessionResumeKey, ensureOpencodeAlwaysAllowPe
27
26
  import { attachWatchdog } from './watchdog.js';
28
27
  import { buildOpencodeRuntimeSnapshot, buildOpencodeSpawnAudit, pushOpencodeRawEvent, resolveOpencodeBinary, } from './opencode-diagnostics.js';
29
28
  import { asCliEventRecord, discriminate, fieldString } from '../types/cli-events.js';
29
+ import { isJawRuntimeEvent, handleJawRuntimeEvent } from './claude-e-runtime.js';
30
30
  import { appendTraceEvent, stampTraceTool, startTraceRun } from '../trace/store.js';
31
31
  // ─── State ───────────────────────────────────────────
32
32
  export let activeProcess = null;
@@ -38,33 +38,26 @@ export function getCurrentMainMeta() {
38
38
  export function setCurrentMainMeta(meta) {
39
39
  currentMainMeta = meta;
40
40
  }
41
- /**
42
- * Recursively kill a process tree using pgrep -P.
43
- * Codex sub-agents spawn children with separate PGIDs,
44
- * so process.kill(-pid) won't reach them.
45
- */
46
- function killProcessTree(pid, signal = 'SIGTERM') {
47
- if (process.platform === 'win32') {
48
- try {
49
- execFileSync('taskkill', ['/PID', String(pid), '/T', '/F'], { stdio: 'ignore' });
50
- }
51
- catch { /* best effort */ }
52
- return;
53
- }
54
- let childPids = [];
55
- try {
56
- const out = execFileSync('pgrep', ['-P', String(pid)], { encoding: 'utf8', timeout: 3000 });
57
- childPids = out.trim().split('\n').filter(Boolean).map(Number).filter(n => n > 0);
58
- }
59
- catch { /* no children or pgrep failed */ }
60
- for (const cpid of childPids) {
61
- killProcessTree(cpid, signal);
62
- }
63
- try {
64
- process.kill(pid, signal);
65
- }
66
- catch { /* already dead */ }
41
+ export function buildAiERuntimeStatusMeta(cli, provider, model) {
42
+ if (cli !== 'ai-e')
43
+ return {};
44
+ const mode = provider === 'claude' ? 'pty' : 'headless';
45
+ return {
46
+ selector: 'ai-e',
47
+ provider,
48
+ effectiveProvider: provider,
49
+ model,
50
+ mode,
51
+ runtime: {
52
+ cli,
53
+ selector: 'ai-e',
54
+ provider,
55
+ model,
56
+ mode,
57
+ },
58
+ };
67
59
  }
60
+ import { killProcessTree } from './spawn/process-kill.js';
68
61
  export function killAgentById(agentId) {
69
62
  const proc = activeProcesses.get(agentId);
70
63
  if (!proc)
@@ -97,92 +90,50 @@ export function killAgentById(agentId) {
97
90
  }
98
91
  }
99
92
  export { memoryFlushCounter, flushCycleCount } from './memory-flush-controller.js';
100
- function normalizeQueueItem(row) {
101
- try {
102
- const parsed = JSON.parse(row.payload);
103
- if (typeof parsed?.id !== 'string' || typeof parsed?.prompt !== 'string' || typeof parsed?.source !== 'string') {
104
- return [];
105
- }
106
- return [stripUndefined({
107
- id: parsed.id,
108
- prompt: parsed.prompt,
109
- source: parsed.source,
110
- scope: 'default',
111
- target: parsed.target,
112
- chatId: parsed.chatId,
113
- requestId: parsed.requestId,
114
- ts: typeof parsed.ts === 'number' ? parsed.ts : Date.now(),
115
- })];
116
- }
117
- catch {
118
- return [];
119
- }
120
- }
121
- function loadPersistedQueue() {
122
- return listQueuedMessages.all().flatMap(normalizeQueueItem);
123
- }
124
- export const messageQueue = loadPersistedQueue();
125
- if (messageQueue.length > 0) {
126
- console.log(`[queue] recovered ${messageQueue.length} persisted message(s) from previous session`);
127
- }
128
- let queueProcessing = false;
129
- // ─── 429 Retry Timer State ──────────────────────────
130
- // INVARIANT: single-main — 동시에 1개의 main spawnAgent만 존재한다고 가정.
131
- // 멀티 main task 도입 시 request-id 키 맵으로 전환 필요.
132
- let retryPendingTimer = null;
133
- let retryPendingResolve = null;
134
- let retryPendingOrigin = null;
135
- let retryPendingIsEmployee = false;
93
+ const queueCtrl = createQueueController({
94
+ isSpawnBusy: () => Boolean(activeProcess) || mainSpawnStarting || queueCtrl.isRetryPending(),
95
+ hasBlockingWorkers,
96
+ hasPendingWorkerReplays,
97
+ insertMessage,
98
+ insertQueuedMessage,
99
+ deleteQueuedMessage,
100
+ listQueuedMessages: listQueuedMessages,
101
+ broadcast,
102
+ importPipeline: () => import('../orchestrator/pipeline.js'),
103
+ getWorkingDir: () => settings["workingDir"] || null,
104
+ });
105
+ export const { messageQueue, enqueueMessage, removeQueuedMessage, processQueue, setQueueHold, clearQueueHold, getQueueHoldId, clearRetryTimer, resetFallbackState, getFallbackState, getQueuedMessageSnapshotForScope, } = queueCtrl;
136
106
  let mainSpawnStarting = false;
137
107
  let cancelPendingMainSpawn = null;
138
- /** busy = process alive OR retry timer pending OR main spawn waiting on settings gate */
139
108
  export function isAgentBusy() {
140
- return !!activeProcess || !!retryPendingTimer || mainSpawnStarting;
141
- }
142
- /**
143
- * Cancel pending retry timer AND resolve the dangling Promise.
144
- *
145
- * @param resumeQueue - true: 취소 후 대기 메시지 실행 (settings 변경 등)
146
- * false: 큐도 중단 (stop/steer 의도)
147
- *
148
- * 취소 규약: broadcast agent_done(error:true) → collect.ts L39가 수집함.
149
- */
150
- export function clearRetryTimer(resumeQueue = true) {
151
- if (retryPendingTimer) {
152
- clearTimeout(retryPendingTimer);
153
- retryPendingTimer = null;
154
- console.log('[jaw:retry] timer cancelled');
155
- if (retryPendingResolve) {
156
- broadcast('agent_done', {
157
- text: '⏹️ 재시도 취소됨',
158
- error: true,
159
- origin: retryPendingOrigin || 'web',
160
- ...(retryPendingIsEmployee ? { isEmployee: true } : {}),
161
- }, retryPendingIsEmployee ? 'internal' : 'public');
162
- retryPendingResolve({ text: '', code: -1 });
163
- retryPendingResolve = null;
164
- retryPendingOrigin = null;
165
- retryPendingIsEmployee = false;
166
- }
167
- if (resumeQueue)
168
- processQueue();
169
- }
170
- }
171
- // ─── Fallback Retry State ────────────────────────────
172
- // key: originalCli, value: { fallbackCli, retriesLeft }
173
- const FALLBACK_MAX_RETRIES = 3;
174
- const fallbackState = new Map();
175
- export function resetFallbackState() {
176
- clearRetryTimer(true); // settings 변경 = 큐 재개 OK
177
- fallbackState.clear();
178
- console.log('[jaw:fallback] state reset');
179
- }
180
- export function getFallbackState() {
181
- return Object.fromEntries(fallbackState);
109
+ return !!activeProcess || queueCtrl.isRetryPending() || mainSpawnStarting;
182
110
  }
183
111
  // ─── Kill / Steer ────────────────────────────────────
184
112
  // [I2] Per-process kill reason map (replaces global variable to avoid cross-process confusion)
185
113
  const killReasons = new Map();
114
+ const DEFAULT_STEER_WAIT_MS = 3_000;
115
+ const DEFAULT_KILL_ESCALATION_MS = 2_000;
116
+ const CLAUDE_E_STEER_WAIT_MS = 30_000;
117
+ const CLAUDE_E_STEER_KILL_ESCALATION_MS = 8_000;
118
+ function getActiveMainCli() {
119
+ return typeof currentMainMeta?.cli === 'string' ? currentMainMeta.cli : null;
120
+ }
121
+ function getActiveEffectiveProvider() {
122
+ return typeof currentMainMeta?.effectiveProvider === 'string' ? currentMainMeta.effectiveProvider : null;
123
+ }
124
+ function isActiveClaudePtyRuntime() {
125
+ const cli = getActiveMainCli();
126
+ return cli === 'claude-e' || (cli === 'ai-e' && getActiveEffectiveProvider() === 'claude');
127
+ }
128
+ function getKillPolicy(reason) {
129
+ if (reason === 'steer' && isActiveClaudePtyRuntime()) {
130
+ return { signal: 'SIGINT', escalationMs: CLAUDE_E_STEER_KILL_ESCALATION_MS };
131
+ }
132
+ return { signal: 'SIGTERM', escalationMs: DEFAULT_KILL_ESCALATION_MS };
133
+ }
134
+ export function getSteerWaitMsForActiveAgent() {
135
+ return isActiveClaudePtyRuntime() ? CLAUDE_E_STEER_WAIT_MS : DEFAULT_STEER_WAIT_MS;
136
+ }
186
137
  /** Get kill reason for a process (by PID), consuming it */
187
138
  function consumeKillReason(pid) {
188
139
  if (!pid)
@@ -197,19 +148,6 @@ function consumeKillReason(pid) {
197
148
  * 모두 폐기한다. exit handler의 processQueue() 자동 드레인이 stop 직후 잔존
198
149
  * 메시지를 "스스로 steer" 처럼 실행하던 회귀를 차단.
199
150
  */
200
- function purgeQueueOnStop(reason) {
201
- if (messageQueue.length === 0)
202
- return;
203
- const dropped = messageQueue.length;
204
- for (const item of messageQueue.splice(0)) {
205
- try {
206
- deleteQueuedMessage.run(item.id);
207
- }
208
- catch { /* best-effort */ }
209
- }
210
- console.log(`[jaw:stop] cleared ${dropped} pending message(s) (reason=${reason})`);
211
- broadcast('queue_update', { pending: 0 });
212
- }
213
151
  /**
214
152
  * Fix C2: 사용자 stop 시 worker-registry 도 비운다.
215
153
  * gateway.submitMessage가 isAgentBusy() 외에 hasBlockingWorkers()/hasPendingWorkerReplays()
@@ -224,25 +162,26 @@ function clearWorkerSlotsOnStop(reason) {
224
162
  console.log(`[jaw:stop] cleared worker registry (active=${active}, reason=${reason})`);
225
163
  }
226
164
  export function killActiveAgent(reason = 'user') {
227
- const hadTimer = !!retryPendingTimer;
165
+ const hadTimer = queueCtrl.isRetryPending();
228
166
  const cancelledPendingMain = cancelPendingMainSpawn ? (cancelPendingMainSpawn(reason), true) : false;
229
167
  clearRetryTimer(false); // stop 의도: 큐 재개 안 함
230
168
  // Fix A: 사용자 stop은 큐도 폐기. steer/internal kill은 큐 보존.
231
169
  // Fix C2: worker registry 도 비워서 hasBlockingWorkers/hasPendingWorkerReplays가 즉시 false.
232
170
  if (reason === 'api' || reason === 'user') {
233
- purgeQueueOnStop(reason);
171
+ queueCtrl.purgeQueueOnStop(reason);
234
172
  clearWorkerSlotsOnStop(reason);
235
173
  }
236
174
  if (!activeProcess)
237
175
  return hadTimer || cancelledPendingMain; // timer/gated spawn 취소도 "killed" 취급
238
- console.log(`[jaw:kill] reason=${reason}`);
176
+ const policy = getKillPolicy(reason);
177
+ console.log(`[jaw:kill] reason=${reason} cli=${getActiveMainCli() || 'unknown'} signal=${policy.signal} escalationMs=${policy.escalationMs}`);
239
178
  if (activeProcess.pid)
240
179
  killReasons.set(activeProcess.pid, reason);
241
180
  try {
242
- activeProcess.kill('SIGTERM');
181
+ activeProcess.kill(policy.signal);
243
182
  }
244
183
  catch (e) {
245
- console.warn('[agent:kill] SIGTERM failed', { pid: activeProcess?.pid, error: e.message });
184
+ console.warn(`[agent:kill] ${policy.signal} failed`, { pid: activeProcess?.pid, error: e.message });
246
185
  }
247
186
  const proc = activeProcess;
248
187
  setTimeout(() => {
@@ -253,7 +192,7 @@ export function killActiveAgent(reason = 'user') {
253
192
  catch (e) {
254
193
  console.warn('[agent:kill] SIGKILL failed', { pid: proc?.pid, error: e.message });
255
194
  }
256
- }, 2000);
195
+ }, policy.escalationMs);
257
196
  // Fix C1: 사용자 stop 시 isAgentBusy()가 즉시 false가 되도록 참조를 동기 해제.
258
197
  // 실제 child 종료는 위 setTimeout SIGKILL이 백그라운드에서 마무리.
259
198
  // exit handler의 setActiveProcess(null) / activeProcesses.delete 는 idempotent.
@@ -263,12 +202,12 @@ export function killActiveAgent(reason = 'user') {
263
202
  return true;
264
203
  }
265
204
  export function killAllAgents(reason = 'user') {
266
- const hadTimer = !!retryPendingTimer;
205
+ const hadTimer = queueCtrl.isRetryPending();
267
206
  const cancelledPendingMain = cancelPendingMainSpawn ? (cancelPendingMainSpawn(reason), true) : false;
268
207
  clearRetryTimer(false); // stop 의도: 큐 재개 안 함
269
208
  // Fix A: 사용자 stop은 큐도 폐기. Fix C2: worker 슬롯도 비움.
270
209
  if (reason === 'api' || reason === 'user') {
271
- purgeQueueOnStop(reason);
210
+ queueCtrl.purgeQueueOnStop(reason);
272
211
  clearWorkerSlotsOnStop(reason);
273
212
  }
274
213
  let killed = 0;
@@ -331,9 +270,10 @@ export function waitForProcessEnd(timeoutMs = 3000) {
331
270
  });
332
271
  }
333
272
  export async function steerAgent(newPrompt, source) {
273
+ const steerWaitMs = getSteerWaitMsForActiveAgent();
334
274
  const wasRunning = killActiveAgent('steer');
335
275
  if (wasRunning)
336
- await waitForProcessEnd(3000);
276
+ await waitForProcessEnd(steerWaitMs);
337
277
  insertMessage.run('user', newPrompt, source, '', settings["workingDir"] || null);
338
278
  broadcast('new_message', { role: 'user', content: newPrompt, source });
339
279
  const { orchestrate, orchestrateContinue, orchestrateReset, isContinueIntent, isResetIntent } = await import('../orchestrator/pipeline.js');
@@ -348,150 +288,6 @@ export async function steerAgent(newPrompt, source) {
348
288
  broadcast('orchestrate_done', { text: `[error] ${err.message}`, error: true, origin });
349
289
  });
350
290
  }
351
- // ─── Message Queue ───────────────────────────────────
352
- export function getQueuedMessageSnapshotForScope(scope) {
353
- return messageQueue
354
- .filter(item => item.scope === scope)
355
- .map(item => ({
356
- id: item.id,
357
- prompt: item.prompt,
358
- source: item.source,
359
- ts: item.ts,
360
- }));
361
- }
362
- export function removeQueuedMessage(id) {
363
- const idx = messageQueue.findIndex(item => item.id === id);
364
- if (idx === -1)
365
- return { removed: null, pending: messageQueue.length };
366
- const [removed] = messageQueue.splice(idx, 1);
367
- try {
368
- deleteQueuedMessage.run(id);
369
- }
370
- catch (err) {
371
- console.warn(`[queue] DB delete failed for ${id}:`, err.message);
372
- }
373
- console.log(`[queue] -1 (${messageQueue.length} pending) removed=${id}`);
374
- broadcast('queue_update', { pending: messageQueue.length });
375
- return { removed: removed, pending: messageQueue.length };
376
- }
377
- export function enqueueMessage(prompt, source, meta) {
378
- const item = stripUndefined({
379
- id: crypto.randomUUID(),
380
- prompt,
381
- source,
382
- scope: meta?.scope || 'default',
383
- target: meta?.target,
384
- chatId: meta?.chatId,
385
- requestId: meta?.requestId,
386
- ts: Date.now(),
387
- });
388
- insertQueuedMessage.run(item.id, JSON.stringify(item));
389
- messageQueue.push(item);
390
- console.log(`[queue] +1 (${messageQueue.length} pending)`);
391
- broadcast('queue_update', { pending: messageQueue.length });
392
- processQueue();
393
- return item.id;
394
- }
395
- export async function processQueue() {
396
- if (queueProcessing)
397
- return;
398
- // Auto-drain pending worker replays when Boss is idle. Covers the case where
399
- // Boss died after the dispatch client disconnected — the result was stuck in
400
- // pendingReplay and nothing was triggering drainPendingReplays. Dynamic
401
- // import avoids circular dep (pipeline.ts imports from this module).
402
- if (!activeProcess && !retryPendingTimer && !mainSpawnStarting && !hasBlockingWorkers() && hasPendingWorkerReplays()) {
403
- queueMicrotask(() => {
404
- import('../orchestrator/pipeline.js')
405
- .then(({ drainPendingReplays }) => drainPendingReplays({ origin: 'system' }))
406
- .catch(err => console.error('[processQueue:drain]', err.message));
407
- });
408
- // Fall through: if messageQueue has entries, we still process them below.
409
- // orchestrate() inside drain will also drain — idempotent via claimWorkerReplay.
410
- }
411
- if (activeProcess
412
- || retryPendingTimer
413
- || mainSpawnStarting
414
- || hasBlockingWorkers()
415
- || messageQueue.length === 0)
416
- return;
417
- // NOTE: hasPendingWorkerReplays() is intentionally NOT gated here —
418
- // orchestrate() drains pending replays at entry (pipeline.ts drainPendingReplays),
419
- // so the queued user message still arrives AFTER the worker result. Keeping this
420
- // gate caused a deadlock (see devlog/_plan/260417_message_duplication/02_*).
421
- queueProcessing = true;
422
- // Group by source+target — only process the first group, leave rest in queue
423
- const first = messageQueue[0];
424
- const groupKey = groupQueueKey(first.source, first.target);
425
- const batch = [];
426
- const remaining = [];
427
- for (const m of messageQueue) {
428
- const key = groupQueueKey(m.source, m.target);
429
- if (key === groupKey)
430
- batch.push(m);
431
- else
432
- remaining.push(m);
433
- }
434
- // Replace queue with remaining items + unprocessed batch tail
435
- // 📋 Queue policy: "fair" — 다른 chatId 메시지 우선 소비, 같은 chatId tail은 뒤로.
436
- // "chatId-first" 정책이 필요하면 push 순서를 (batch.slice(1), ...remaining)으로 변경.
437
- messageQueue.length = 0;
438
- if (batch.length > 1) {
439
- // 🔑 batch 분리: 첫 메시지만 처리
440
- // remaining(다른 chatId) 먼저 → batch tail(같은 chatId) 뒤 → chatId 독점 방지
441
- messageQueue.push(...remaining, ...batch.slice(1));
442
- }
443
- else {
444
- messageQueue.push(...remaining);
445
- }
446
- const item = batch[0];
447
- const combined = item.prompt;
448
- const source = item.source;
449
- const target = item.target;
450
- const chatId = item.chatId;
451
- const requestId = item.requestId;
452
- const origin = source || 'web';
453
- console.log(`[queue] processing 1/${batch.length} message(s) for ${groupKey}, ${messageQueue.length} remaining`);
454
- let inserted = false;
455
- try {
456
- insertMessage.run('user', combined, source, '', settings["workingDir"] || null);
457
- deleteQueuedMessage.run(item.id);
458
- inserted = true;
459
- // Broadcast WITH fromQueue=true so the web client renders the user bubble
460
- // now (not at enqueue time). gateway.ts:130 also broadcasts at enqueue,
461
- // but the web client ignores that one — it only acts on fromQueue.
462
- broadcast('new_message', { role: 'user', content: combined, source, fromQueue: true });
463
- broadcast('queue_update', { pending: messageQueue.length });
464
- const { orchestrate, orchestrateContinue, orchestrateReset, isContinueIntent, isResetIntent } = await import('../orchestrator/pipeline.js');
465
- const task = isResetIntent(combined)
466
- ? orchestrateReset({ origin, target, chatId, requestId, _skipInsert: true })
467
- : isContinueIntent(combined)
468
- ? orchestrateContinue({ origin, target, chatId, requestId, _skipInsert: true })
469
- : orchestrate(combined, { origin, target, chatId, requestId, _skipInsert: true });
470
- try {
471
- await task;
472
- }
473
- catch (err) {
474
- const msg = err.message;
475
- console.error('[queue:orchestrate]', msg);
476
- broadcast('orchestrate_done', { text: `[error] ${msg}`, error: true, origin, chatId, target, requestId });
477
- }
478
- }
479
- catch (setupErr) {
480
- console.error('[queue:setup]', setupErr);
481
- if (!inserted) {
482
- // insertMessage hasn't run yet — safe to requeue
483
- messageQueue.unshift(item);
484
- }
485
- else {
486
- // Message is already in DB — broadcast error, don't requeue (would cause duplicate)
487
- broadcast('orchestrate_done', { text: `[error] setup failed: ${setupErr.message}`, error: true, origin, chatId, target, requestId });
488
- }
489
- }
490
- finally {
491
- queueProcessing = false;
492
- queueMicrotask(() => processQueue());
493
- }
494
- }
495
291
  // ─── Helpers ─────────────────────────────────────────
496
292
  function makeCleanEnv(extraEnv = {}) {
497
293
  const env = { ...process.env };
@@ -588,68 +384,20 @@ function withHistoryPrompt(prompt, historyBlock) {
588
384
  return body;
589
385
  return `${historyBlock}\n\n---\n[Current Message]\n${body}`;
590
386
  }
591
- import { buildArgs, buildResumeArgs, resolveSessionBucket } from './args.js';
592
- export { buildArgs, buildResumeArgs, resolveSessionBucket };
387
+ import { buildArgs, buildResumeArgs, resolveAiEProvider, resolveSessionBucket } from './args.js';
388
+ export { buildArgs, buildResumeArgs, resolveAiEProvider, resolveSessionBucket };
593
389
  // ─── Upload wrapper ──────────────────────────────────
594
390
  export const saveUpload = (buffer, originalName, options) => _saveUpload(UPLOADS_DIR, Buffer.isBuffer(buffer) ? buffer : Buffer.from(buffer), originalName, options);
595
391
  export { buildMediaPrompt, buildMediaPromptMany };
596
392
  // ─── Spawn Agent ─────────────────────────────────────
597
393
  import { AcpClient } from '../cli/acp-client.js';
598
- // ─── ACP Heartbeat Helper ────────────────────────────
599
- // Pure function for conditional heartbeat gating.
600
- // "visible" = WebUI + Telegram common baseline. 💭 is WebUI-only
601
- // (bot.ts:337 hides it), so it's NOT counted as visible.
602
- const DEFAULT_HEARTBEAT_GATE_MS = 20_000;
603
- export function shouldEmitHeartbeat(lastVisibleTs, heartbeatSent, gateMs = DEFAULT_HEARTBEAT_GATE_MS, now = Date.now()) {
604
- if (heartbeatSent)
605
- return false;
606
- return (now - lastVisibleTs) > gateMs;
607
- }
608
- export function shouldResumeBucketSession(cli, requestedModel, bucketModel, requestedResumeKey, bucketResumeKey, bucketUpdatedAt, nowMs = Date.now()) {
609
- if (cli === 'gemini') {
610
- if (!bucketModel)
611
- return false;
612
- if (isExpiredBucket(bucketUpdatedAt, GEMINI_RESUME_TTL_MS, nowMs))
613
- return false;
614
- const requested = normalizeGeminiResumeModel(requestedModel);
615
- const bucket = normalizeGeminiResumeModel(bucketModel);
616
- if (!requested || !bucket)
617
- return false;
618
- return requested === bucket;
619
- }
620
- if (cli === 'copilot' && bucketModel) {
621
- return normalizeModelForCli(cli, requestedModel) === normalizeModelForCli(cli, bucketModel);
622
- }
623
- if (cli === 'opencode' && requestedResumeKey) {
624
- return requestedResumeKey === (bucketResumeKey ?? null);
625
- }
626
- return true;
627
- }
628
- export const GEMINI_RESUME_TTL_MS = 72 * 60 * 60 * 1000;
394
+ import { CodexAppClient } from './codex-app-client.js';
395
+ import { extractFromCodexAppEvent } from './codex-app-events.js';
396
+ import { shouldEmitHeartbeat, shouldResumeBucketSession, GEMINI_RESUME_TTL_MS } from './spawn/resume.js';
397
+ export { shouldEmitHeartbeat, shouldResumeBucketSession, GEMINI_RESUME_TTL_MS };
398
+ import { createQueueController, FALLBACK_MAX_RETRIES } from './spawn/queue.js';
629
399
  const GEMINI_HISTORY_MAX_SESSIONS = 4;
630
400
  const GEMINI_HISTORY_MAX_CHARS = 3000;
631
- function normalizeGeminiResumeModel(model) {
632
- const normalized = String(model || '').trim().toLowerCase();
633
- if (!normalized || normalized === 'default' || normalized === 'auto')
634
- return '';
635
- return normalized;
636
- }
637
- function parseBucketUpdatedAt(value) {
638
- if (typeof value === 'number' && Number.isFinite(value)) {
639
- return value < 10_000_000_000 ? value * 1000 : value;
640
- }
641
- const text = String(value || '').trim();
642
- if (!text)
643
- return null;
644
- const parsed = Date.parse(text.includes('T') ? text : `${text.replace(' ', 'T')}Z`);
645
- return Number.isFinite(parsed) ? parsed : null;
646
- }
647
- function isExpiredBucket(value, ttlMs, nowMs) {
648
- const updatedAtMs = parseBucketUpdatedAt(value);
649
- if (updatedAtMs === null)
650
- return true;
651
- return nowMs - updatedAtMs > ttlMs;
652
- }
653
401
  function cleanupEmployeeTmpDir(cwd, workingDir, label) {
654
402
  if (cwd !== workingDir) {
655
403
  try {
@@ -669,7 +417,7 @@ export function spawnAgent(prompt, opts = {}) {
669
417
  const isEmployee = !mainManaged;
670
418
  const empTag = isEmployee ? { isEmployee: true } : {};
671
419
  if (gateEligibleMain && !opts._settingsGateWaited && isRuntimeSettingsMutationInFlight()) {
672
- if (activeProcess || retryPendingTimer || mainSpawnStarting) {
420
+ if (activeProcess || queueCtrl.isRetryPending() || mainSpawnStarting) {
673
421
  console.log('[jaw] Agent already running, skipping');
674
422
  return { child: null, promise: Promise.resolve({ text: '', code: -1 }) };
675
423
  }
@@ -733,7 +481,7 @@ export function spawnAgent(prompt, opts = {}) {
733
481
  // instead of the legacy `isResumeGuess` heuristic. See comment near line 762.
734
482
  // ─── Fallback retry: skip to fallback if retries exhausted ───
735
483
  if (!opts._isFallback && !opts.internal) {
736
- const st = fallbackState.get(cli);
484
+ const st = queueCtrl.fallbackState.get(cli);
737
485
  if (st && st.retriesLeft <= 0) {
738
486
  const fbAvail = detectCli(st.fallbackCli)?.available;
739
487
  if (fbAvail) {
@@ -751,8 +499,30 @@ export function spawnAgent(prompt, opts = {}) {
751
499
  }
752
500
  const cfg = settings["perCli"]?.[cli] || {};
753
501
  const ao = settings["activeOverrides"]?.[cli] || {};
754
- const model = opts.model || ao.model || cfg.model || 'default';
502
+ const requestedModel = opts.model || ao.model || cfg.model || 'default';
755
503
  const effort = opts.effort || ao.effort || cfg.effort || '';
504
+ const effectiveProvider = cli === 'ai-e'
505
+ ? resolveAiEProvider(typeof cfg.provider === 'string'
506
+ ? cfg.provider
507
+ : typeof ao.provider === 'string'
508
+ ? ao.provider
509
+ : undefined, requestedModel)
510
+ : cli;
511
+ const model = cli === 'ai-e' && effectiveProvider === 'claude'
512
+ ? migrateLegacyClaudeValue(requestedModel)
513
+ : requestedModel;
514
+ if (mainManaged) {
515
+ setCurrentMainMeta(stripUndefined({
516
+ origin,
517
+ target: opts.target,
518
+ chatId: opts.chatId,
519
+ requestId: opts.requestId,
520
+ scopeId: liveScope,
521
+ cli,
522
+ model,
523
+ effectiveProvider,
524
+ }));
525
+ }
756
526
  const includeDirectories = Array.isArray(cfg.includeDirectories)
757
527
  ? cfg.includeDirectories.filter((dir) => typeof dir === 'string' && dir.trim().length > 0)
758
528
  : [];
@@ -762,7 +532,7 @@ export function spawnAgent(prompt, opts = {}) {
762
532
  // Bucket-aware resume: codex-spark is kept in its own session bucket so
763
533
  // cross-model resume (gpt-5.4 ↔ gpt-5.3-codex-spark) doesn't send a
764
534
  // mismatched session_id to the server.
765
- const currentBucket = resolveSessionBucket(cli, model);
535
+ const currentBucket = resolveSessionBucket(cli, model, effectiveProvider);
766
536
  const cliEnv = applyCliEnvDefaults(cli, opts.env);
767
537
  const spawnEnv = makeCleanEnv(cliEnv);
768
538
  const bucketRow = currentBucket ? getSessionBucket.get(currentBucket) : null;
@@ -771,10 +541,12 @@ export function spawnAgent(prompt, opts = {}) {
771
541
  const bucketResumeKey = typeof bucketRow?.resume_key === 'string' ? bucketRow.resume_key : null;
772
542
  const bucketUpdatedAt = bucketRow?.updated_at ?? null;
773
543
  const resumeKey = buildSessionResumeKey(cli, spawnEnv);
544
+ const providerSupportsResume = !(cli === 'ai-e' && effectiveProvider !== 'claude');
774
545
  const canResumeBucketSession = !bucketSessionId || shouldResumeBucketSession(cli, model, bucketModel, resumeKey, bucketResumeKey, bucketUpdatedAt);
775
546
  const isResume = empSid
776
547
  ? true
777
- : (!opts._skipResume && !forceNew && !!bucketSessionId && canResumeBucketSession);
548
+ : (providerSupportsResume && !opts._skipResume && !forceNew && !!bucketSessionId && canResumeBucketSession);
549
+ const runtimeStatusMeta = buildAiERuntimeStatusMeta(cli, effectiveProvider, model);
778
550
  // ─── Bootstrap compact 1-shot injection (Phase 52: bucket-aware) ───
779
551
  // Vendor-agnostic: compact handler reset session_id and stored bootstrap in DB.
780
552
  // Inject only on fresh main spawns (not employee/fallback/internal/resume).
@@ -820,17 +592,27 @@ export function spawnAgent(prompt, opts = {}) {
820
592
  const historyBlock = !isResume && !opts._skipHistory
821
593
  ? buildHistoryBlock(prompt, settings["workingDir"], cli === 'gemini' ? GEMINI_HISTORY_MAX_SESSIONS : 10, cli === 'gemini' ? GEMINI_HISTORY_MAX_CHARS : 8000)
822
594
  : '';
823
- const promptForArgs = (cli === 'gemini' || cli === 'opencode')
595
+ const promptForArgs = (cli === 'gemini' || cli === 'grok' || cli === 'opencode')
824
596
  ? withHistoryPrompt(prompt, historyBlock)
825
597
  : prompt;
598
+ const claudeBin = (cli === 'claude-e' || (cli === 'ai-e' && effectiveProvider === 'claude'))
599
+ ? detectCli('claude').path
600
+ : null;
601
+ const argOptions = {
602
+ fastMode: cfg.fastMode,
603
+ sysPrompt,
604
+ includeDirectories,
605
+ aiEProvider: effectiveProvider,
606
+ ...(claudeBin ? { claudeBin } : {}),
607
+ };
826
608
  let args;
827
609
  if (isResume) {
828
610
  const sid = resumeSessionId || '';
829
611
  console.log(`[jaw:resume] ${cli} session=${sid.slice(0, 12)}...`);
830
- args = buildResumeArgs(cli, model, effort, sid, prompt, permissions, { fastMode: cfg.fastMode, sysPrompt, includeDirectories });
612
+ args = buildResumeArgs(cli, model, effort, sid, prompt, permissions, argOptions);
831
613
  }
832
614
  else {
833
- args = buildArgs(cli, model, effort, promptForArgs, sysPrompt, permissions, { fastMode: cfg.fastMode, includeDirectories });
615
+ args = buildArgs(cli, model, effort, promptForArgs, sysPrompt, permissions, argOptions);
834
616
  }
835
617
  const agentLabel = agentId || 'main';
836
618
  const traceAudience = (opts.internal || isEmployee) ? 'internal' : 'public';
@@ -886,6 +668,8 @@ export function spawnAgent(prompt, opts = {}) {
886
668
  }
887
669
  else {
888
670
  console.log(`[jaw:${agentLabel}] Spawning: ${cli} ${args.join(' ').slice(0, 120)}...`);
671
+ if (cli === 'claude-e')
672
+ console.log(`[jaw:${agentLabel}:args] ${JSON.stringify(args)}`);
889
673
  }
890
674
  if (cli === 'gemini' && sysPrompt) {
891
675
  const tmpSysFile = join(os.tmpdir(), `jaw-gemini-sys-${agentLabel}.md`);
@@ -1199,16 +983,8 @@ export function spawnAgent(prompt, opts = {}) {
1199
983
  resolve: resolve,
1200
984
  activeProcesses,
1201
985
  setActiveProcess: (v) => { activeProcess = v; },
1202
- retryState: {
1203
- timer: retryPendingTimer,
1204
- resolve: retryPendingResolve,
1205
- origin: retryPendingOrigin,
1206
- setTimer: (t) => { retryPendingTimer = t; },
1207
- setResolve: (r) => { retryPendingResolve = r; },
1208
- setOrigin: (o) => { retryPendingOrigin = o; },
1209
- setIsEmployee: (v) => { retryPendingIsEmployee = v; },
1210
- },
1211
- fallbackState,
986
+ retryState: queueCtrl.retryState,
987
+ fallbackState: queueCtrl.fallbackState,
1212
988
  fallbackMaxRetries: FALLBACK_MAX_RETRIES,
1213
989
  processQueue,
1214
990
  }).catch((err) => {
@@ -1217,11 +993,284 @@ export function spawnAgent(prompt, opts = {}) {
1217
993
  });
1218
994
  return { child, promise: resultPromise };
1219
995
  }
996
+ // ─── Codex AppServer branch ────────────────────
997
+ if (cli === 'codex-app') {
998
+ const appClient = new CodexAppClient({
999
+ binary: detected.path || 'codex',
1000
+ workDir: spawnCwd,
1001
+ env: spawnEnv,
1002
+ model,
1003
+ effort,
1004
+ });
1005
+ appClient.spawn();
1006
+ const child = appClient.proc;
1007
+ if (!child) {
1008
+ throw new Error('Codex AppServer process was not created');
1009
+ }
1010
+ if (mainManaged)
1011
+ activeProcess = child;
1012
+ if (activeProcesses.has(agentLabel)) {
1013
+ console.warn(`[spawn:dup] activeProcesses already has child for ${agentLabel} — orphaning previous reference`);
1014
+ }
1015
+ activeProcesses.set(agentLabel, child);
1016
+ if (!opts.internal)
1017
+ broadcast('agent_status', { running: true, agentId: agentLabel, cli, ...empTag });
1018
+ if (mainManaged && !opts.internal)
1019
+ beginLiveRun(liveScope, cli);
1020
+ let codexAppSettled = false;
1021
+ appClient.on('error', (err) => {
1022
+ if (codexAppSettled)
1023
+ return;
1024
+ codexAppSettled = true;
1025
+ appClient.cleanup();
1026
+ cleanupEmployeeTmpDir(spawnCwd, settings["workingDir"], agentLabel);
1027
+ opts.lifecycle?.onExit?.(null);
1028
+ const msg = `Codex AppServer spawn failed: ${err.message}`;
1029
+ console.error(`[codex-app:error] ${msg}`);
1030
+ activeProcesses.delete(agentLabel);
1031
+ if (mainManaged) {
1032
+ activeProcess = null;
1033
+ clearLiveRun(liveScope);
1034
+ broadcast('agent_status', { running: false, agentId: agentLabel });
1035
+ }
1036
+ broadcast('agent_done', { text: `❌ ${msg}`, error: true, origin, ...empTag }, isEmployee ? 'internal' : 'public');
1037
+ resolve({ text: '', code: 1 });
1038
+ if (mainManaged)
1039
+ processQueue();
1040
+ });
1041
+ if (mainManaged && !opts.internal && !opts._skipInsert) {
1042
+ insertMessage.run('user', prompt, cli, model, settings["workingDir"] || null);
1043
+ }
1044
+ if (!opts.internal)
1045
+ broadcast('agent_status', { status: 'running', cli, agentId: agentLabel, ...empTag }, traceAudience);
1046
+ const traceRunId = startTraceRun({ cli, model, workingDir: settings["workingDir"] || null, agentLabel, audience: traceAudience });
1047
+ const ctx = {
1048
+ fullText: '', traceLog: [], toolLog: [], seenToolKeys: new Set(),
1049
+ hasClaudeStreamEvents: false, sessionId: null, cost: null,
1050
+ turns: null, duration: null, tokens: null, stderrBuf: '',
1051
+ thinkingBuf: '',
1052
+ liveScope: effectiveLiveScope,
1053
+ parentLiveScope: parentLiveScopeForChild,
1054
+ traceRunId,
1055
+ traceAudience,
1056
+ };
1057
+ function flushCodexAppThinking() {
1058
+ if (!ctx.thinkingBuf)
1059
+ return;
1060
+ const merged = ctx.thinkingBuf.trim();
1061
+ if (merged) {
1062
+ const singleLine = merged.replace(/\s+/g, ' ').trim();
1063
+ const label = singleLine.length > 120 ? `${singleLine.slice(0, 119)}…` : singleLine;
1064
+ console.log(` 💭 ${label}`);
1065
+ const tool = { icon: '💭', label, toolType: 'thinking', detail: merged };
1066
+ stampTraceTool(tool, ctx, 'thinking');
1067
+ ctx.toolLog.push(tool);
1068
+ if (ctx.liveScope)
1069
+ replaceLiveRunTools(ctx.liveScope, ctx.toolLog);
1070
+ if (ctx.parentLiveScope)
1071
+ appendLiveRunTool(ctx.parentLiveScope, { ...tool, isEmployee: true });
1072
+ broadcast('agent_tool', { agentId: agentLabel, ...tool, ...empTag }, traceAudience);
1073
+ }
1074
+ ctx.thinkingBuf = '';
1075
+ }
1076
+ let lastVisibleBroadcastTs = Date.now();
1077
+ let heartbeatSent = false;
1078
+ appClient.on('notification', (method, params) => {
1079
+ if (method === 'turn/completed' || method === 'turn/started' || method === 'error') {
1080
+ console.log(`[codex-app:notify] ${method}`);
1081
+ }
1082
+ appendTraceEvent({ runId: ctx.traceRunId, source: 'codex_app_raw', eventType: method, raw: params });
1083
+ const parsed = extractFromCodexAppEvent(method, params, ctx);
1084
+ if (!parsed)
1085
+ return;
1086
+ if (parsed.flushThinking) {
1087
+ flushCodexAppThinking();
1088
+ }
1089
+ if (parsed.tool) {
1090
+ const parsedTool = parsed.tool;
1091
+ if (parsedTool.icon === '💭') {
1092
+ ctx.thinkingBuf += parsedTool.detail || parsedTool.label;
1093
+ return;
1094
+ }
1095
+ flushCodexAppThinking();
1096
+ const key = `${parsedTool.icon}:${parsedTool.label}:${parsedTool.stepRef || ''}:${parsedTool.status || ''}`;
1097
+ if (!ctx.seenToolKeys.has(key)) {
1098
+ ctx.seenToolKeys.add(key);
1099
+ stampTraceTool(parsedTool, ctx, parsedTool.toolType || 'tool');
1100
+ ctx.toolLog.push(parsedTool);
1101
+ if (ctx.liveScope)
1102
+ replaceLiveRunTools(ctx.liveScope, ctx.toolLog);
1103
+ if (ctx.parentLiveScope)
1104
+ appendLiveRunTool(ctx.parentLiveScope, { ...parsedTool, isEmployee: true });
1105
+ broadcast('agent_tool', { agentId: agentLabel, ...parsedTool, ...empTag }, traceAudience);
1106
+ lastVisibleBroadcastTs = Date.now();
1107
+ heartbeatSent = false;
1108
+ }
1109
+ }
1110
+ if (parsed.text) {
1111
+ flushCodexAppThinking();
1112
+ ctx.fullText += parsed.text;
1113
+ if (ctx.liveScope)
1114
+ appendLiveRunText(ctx.liveScope, parsed.text);
1115
+ }
1116
+ if (parsed.sessionId && !ctx.sessionId) {
1117
+ ctx.sessionId = parsed.sessionId;
1118
+ }
1119
+ if (parsed.tokens) {
1120
+ ctx.tokens = parsed.tokens;
1121
+ }
1122
+ if (parsed.turnStatus && parsed.turnStatus !== 'completed') {
1123
+ console.warn(`[codex-app:turn] final status: ${parsed.turnStatus}`);
1124
+ turnCompleted = false;
1125
+ }
1126
+ opts.lifecycle?.onActivity?.('codex-app');
1127
+ });
1128
+ appClient.on('stderr', (text) => {
1129
+ appendTraceEvent({ runId: ctx.traceRunId, source: 'stderr', eventType: 'stderr', raw: text });
1130
+ if (ctx.stderrBuf.length < 4000) {
1131
+ ctx.stderrBuf += text + '\n';
1132
+ }
1133
+ opts.lifecycle?.onActivity?.('stderr');
1134
+ if (shouldEmitHeartbeat(lastVisibleBroadcastTs, heartbeatSent)) {
1135
+ heartbeatSent = true;
1136
+ const elapsed = Math.round((Date.now() - lastVisibleBroadcastTs) / 1000);
1137
+ console.log(` ⏳ agent active (no visible event for ${elapsed}s)`);
1138
+ broadcast('agent_tool', {
1139
+ agentId: agentLabel,
1140
+ icon: '⏳',
1141
+ label: 'working... (no visible progress)',
1142
+ ...empTag,
1143
+ }, traceAudience);
1144
+ }
1145
+ });
1146
+ let turnCompleted = false;
1147
+ (async () => {
1148
+ try {
1149
+ const initResult = await appClient.initialize();
1150
+ if (process.env["DEBUG"])
1151
+ console.log('[codex-app:init]', JSON.stringify(initResult).slice(0, 200));
1152
+ if (isResume && resumeSessionId) {
1153
+ try {
1154
+ await appClient.resumeThread(resumeSessionId);
1155
+ console.log(`[codex-app:session] resumeThread OK: ${resumeSessionId.slice(0, 12)}...`);
1156
+ }
1157
+ catch (resumeErr) {
1158
+ console.warn(`[codex-app:session] resumeThread FAILED: ${resumeErr.message} — starting new thread`);
1159
+ if (empSid && opts.agentId) {
1160
+ clearEmployeeSession.run(opts.agentId);
1161
+ }
1162
+ await appClient.startThread({ instructions: sysPrompt, cwd: spawnCwd });
1163
+ }
1164
+ }
1165
+ else {
1166
+ await appClient.startThread({ instructions: sysPrompt, cwd: spawnCwd });
1167
+ }
1168
+ ctx.sessionId = appClient.threadId;
1169
+ const useNativeResume = isResume && Boolean(resumeSessionId);
1170
+ const codexAppPrompt = (!useNativeResume && historyBlock)
1171
+ ? `${historyBlock}\n\n[User Message]\n${prompt}`
1172
+ : prompt;
1173
+ const turnDone = new Promise((resolveTurn, rejectTurn) => {
1174
+ appClient.once('turn/completed', () => {
1175
+ appClient.removeListener('error', rejectTurn);
1176
+ resolveTurn();
1177
+ });
1178
+ appClient.once('error', rejectTurn);
1179
+ });
1180
+ await appClient.startTurn(codexAppPrompt);
1181
+ try {
1182
+ await turnDone;
1183
+ turnCompleted = true;
1184
+ }
1185
+ catch (turnErr) {
1186
+ console.warn(`[codex-app:turn] error during turn: ${turnErr.message}`);
1187
+ }
1188
+ flushCodexAppThinking();
1189
+ const persistedThreadId = appClient.threadId;
1190
+ if (persistedThreadId && persistMainSession(stripUndefined({
1191
+ ownerGeneration,
1192
+ forceNew,
1193
+ employeeSessionId: empSid,
1194
+ sessionId: persistedThreadId,
1195
+ isFallback: opts._isFallback,
1196
+ cli,
1197
+ model,
1198
+ resumeKey,
1199
+ effort: cfg.effort || '',
1200
+ skipSessionPersist: opts._skipSessionPersist === true,
1201
+ }))) {
1202
+ console.log(`[jaw:session] saved ${cli} session=${persistedThreadId.slice(0, 12)}... (pre-shutdown)`);
1203
+ }
1204
+ if (!codexAppSettled) {
1205
+ codexAppSettled = true;
1206
+ const smokeResult = detectSmokeResponse(ctx.fullText, ctx.toolLog, 0, cli);
1207
+ handleAgentExit({
1208
+ ctx, code: turnCompleted ? 0 : 1, cli, model, agentLabel, mainManaged, origin,
1209
+ resumeKey,
1210
+ prompt, opts, cfg, ownerGeneration, forceNew, empSid,
1211
+ isResume, wasKilled: false, wasSteer: false, smokeResult,
1212
+ effortDefault: '', costLine: '',
1213
+ resolve: resolve,
1214
+ activeProcesses,
1215
+ setActiveProcess: (v) => { activeProcess = v; },
1216
+ retryState: queueCtrl.retryState,
1217
+ fallbackState: queueCtrl.fallbackState,
1218
+ fallbackMaxRetries: FALLBACK_MAX_RETRIES,
1219
+ processQueue,
1220
+ }).catch((err) => {
1221
+ console.error(`[codex-app:handleAgentExit] ${err.message}`);
1222
+ });
1223
+ }
1224
+ await appClient.closeGracefully();
1225
+ }
1226
+ catch (err) {
1227
+ console.error(`[codex-app:error] ${err.message}`);
1228
+ ctx.stderrBuf += err.message;
1229
+ appClient.kill();
1230
+ }
1231
+ })();
1232
+ appClient.on('exit', (code, signal) => {
1233
+ if (codexAppSettled)
1234
+ return;
1235
+ codexAppSettled = true;
1236
+ appClient.cleanup();
1237
+ cleanupEmployeeTmpDir(spawnCwd, settings["workingDir"], agentLabel);
1238
+ opts.lifecycle?.onExit?.(code ?? null);
1239
+ const killReason = consumeKillReason(appClient.proc?.pid);
1240
+ if (code !== 0 && !killReason) {
1241
+ console.warn(`[codex-app:unexpected-exit] code=${code} signal=${signal} threadId=${ctx.sessionId || 'none'}`);
1242
+ }
1243
+ const wasKilled = !!killReason;
1244
+ const wasSteer = killReason === 'steer';
1245
+ flushCodexAppThinking();
1246
+ const smokeResult = detectSmokeResponse(ctx.fullText, ctx.toolLog, code, cli);
1247
+ const codexAppCode = turnCompleted ? 0 : (code ?? 1);
1248
+ handleAgentExit({
1249
+ ctx, code: codexAppCode, cli, model, agentLabel, mainManaged, origin,
1250
+ resumeKey,
1251
+ prompt, opts, cfg, ownerGeneration, forceNew, empSid,
1252
+ isResume, wasKilled, wasSteer, smokeResult,
1253
+ effortDefault: '', costLine: '',
1254
+ resolve: resolve,
1255
+ activeProcesses,
1256
+ setActiveProcess: (v) => { activeProcess = v; },
1257
+ retryState: queueCtrl.retryState,
1258
+ fallbackState: queueCtrl.fallbackState,
1259
+ fallbackMaxRetries: FALLBACK_MAX_RETRIES,
1260
+ processQueue,
1261
+ }).catch((err) => {
1262
+ console.error('[jaw:lifecycle] handleAgentExit failed (codex-app):', err.message);
1263
+ });
1264
+ });
1265
+ return { child, promise: resultPromise };
1266
+ }
1220
1267
  // ─── Standard CLI branch (claude/codex/gemini/opencode) ──────
1221
- // DIFF-B: Windows needs shell:true to resolve .cmd shims (npm global installs)
1268
+ // DIFF-B: Windows needs shell:true only when falling back to .cmd shims.
1222
1269
  const spawnCommand = cli === 'opencode' && process.platform !== 'win32'
1223
1270
  ? (resolvedOpencodeBinary || detected.path || cli)
1224
- : (process.platform === 'win32' ? cli : (detected.path || cli));
1271
+ : (detected.path || cli);
1272
+ const windowsSpawnUsesShell = process.platform === 'win32'
1273
+ && !spawnCommand.toLowerCase().endsWith('.exe');
1225
1274
  const opencodeSpawnAudit = cli === 'opencode'
1226
1275
  ? buildOpencodeSpawnAudit({ args, cwd: spawnCwd, env: spawnEnv, binary: spawnCommand })
1227
1276
  : undefined;
@@ -1232,7 +1281,7 @@ export function spawnAgent(prompt, opts = {}) {
1232
1281
  cwd: spawnCwd,
1233
1282
  env: spawnEnv,
1234
1283
  stdio: ['pipe', 'pipe', 'pipe'],
1235
- ...(process.platform === 'win32' ? { shell: true } : {}),
1284
+ ...(windowsSpawnUsesShell ? { shell: true } : {}),
1236
1285
  });
1237
1286
  if (mainManaged)
1238
1287
  activeProcess = child;
@@ -1242,7 +1291,7 @@ export function spawnAgent(prompt, opts = {}) {
1242
1291
  }
1243
1292
  activeProcesses.set(agentLabel, child);
1244
1293
  if (!opts.internal)
1245
- broadcast('agent_status', { running: true, agentId: agentLabel, cli, ...empTag });
1294
+ broadcast('agent_status', { running: true, agentId: agentLabel, cli, ...runtimeStatusMeta, ...empTag });
1246
1295
  if (mainManaged && !opts.internal)
1247
1296
  beginLiveRun(liveScope, cli);
1248
1297
  // ─── DIFF-A: error guard — prevent uncaught ENOENT crash ───
@@ -1285,6 +1334,9 @@ export function spawnAgent(prompt, opts = {}) {
1285
1334
  if (cli === 'claude') {
1286
1335
  child.stdin.write(withHistoryPrompt(prompt, historyBlock));
1287
1336
  }
1337
+ else if (cli === 'claude-e' || cli === 'ai-e') {
1338
+ child.stdin.write(isResume ? prompt : withHistoryPrompt(prompt, historyBlock));
1339
+ }
1288
1340
  else if (cli === 'codex' && !isResume) {
1289
1341
  const codexStdin = historyBlock
1290
1342
  ? `${historyBlock}\n\n[User Message]\n${prompt}`
@@ -1293,7 +1345,7 @@ export function spawnAgent(prompt, opts = {}) {
1293
1345
  }
1294
1346
  child.stdin.end();
1295
1347
  if (!opts.internal)
1296
- broadcast('agent_status', { status: 'running', cli, agentId: agentLabel, ...empTag }, traceAudience);
1348
+ broadcast('agent_status', { status: 'running', cli, agentId: agentLabel, ...runtimeStatusMeta, ...empTag }, traceAudience);
1297
1349
  const traceRunId = startTraceRun({ cli, model, workingDir: settings["workingDir"] || null, agentLabel, audience: traceAudience });
1298
1350
  const ctx = {
1299
1351
  fullText: '',
@@ -1310,6 +1362,7 @@ export function spawnAgent(prompt, opts = {}) {
1310
1362
  hasActiveSubAgent: false,
1311
1363
  showReasoning: settings["showReasoning"] === true,
1312
1364
  outputTextStarted: false,
1365
+ effectiveProvider,
1313
1366
  liveScope: effectiveLiveScope,
1314
1367
  parentLiveScope: parentLiveScopeForChild,
1315
1368
  traceRunId,
@@ -1367,10 +1420,29 @@ export function spawnAgent(prompt, opts = {}) {
1367
1420
  eventType: fieldString(asCliEventRecord(raw).type, '<no-type>'),
1368
1421
  raw,
1369
1422
  });
1370
- const event = discriminate(cli, raw);
1423
+ // claude-e / ai-e Claude: intercept jaw_runtime events BEFORE discriminator
1424
+ if ((cli === 'claude-e' || cli === 'ai-e') && isJawRuntimeEvent(raw)) {
1425
+ const rtEvt = raw;
1426
+ handleJawRuntimeEvent(rtEvt, agentLabel);
1427
+ // Extract sessionId from session_started or interrupted
1428
+ const evtName = rtEvt['event'];
1429
+ if ((evtName === 'session_started' || evtName === 'interrupted') && typeof rtEvt['sessionId'] === 'string') {
1430
+ ctx.sessionId = rtEvt['sessionId'];
1431
+ }
1432
+ if (evtName === 'error' && typeof rtEvt['message'] === 'string') {
1433
+ const message = `[jaw:${cli}:error] ${rtEvt['message']}`;
1434
+ ctx.stderrBuf = ctx.stderrBuf ? `${ctx.stderrBuf}\n${message}` : message;
1435
+ ctx.traceLog.push(message);
1436
+ }
1437
+ return;
1438
+ }
1439
+ const dispatchCli = cli === 'ai-e'
1440
+ ? (ctx.effectiveProvider === 'claude' ? 'claude-e' : (ctx.effectiveProvider || 'ai-e'))
1441
+ : cli;
1442
+ const event = discriminate(dispatchCli, raw);
1371
1443
  if (!event) {
1372
1444
  const type = fieldString(asCliEventRecord(raw).type, '<no-type>');
1373
- ctx.traceLog.push(`[cli:unknown-event] cli=${cli} type=${type} preview=${JSON.stringify(raw).slice(0, 200)}`);
1445
+ ctx.traceLog.push(`[cli:unknown-event] cli=${cli} provider=${dispatchCli} type=${type} preview=${JSON.stringify(raw).slice(0, 200)}`);
1374
1446
  return;
1375
1447
  }
1376
1448
  recordOpencodeEvent(line, event);
@@ -1378,10 +1450,10 @@ export function spawnAgent(prompt, opts = {}) {
1378
1450
  console.log(`[jaw:event:${agentLabel}] ${cli} type=${event.type}`);
1379
1451
  console.log(`[jaw:raw:${agentLabel}] ${line.slice(0, 300)}`);
1380
1452
  }
1381
- logEventSummary(agentLabel, cli, event, ctx);
1453
+ logEventSummary(agentLabel, dispatchCli, event, ctx);
1382
1454
  if (!ctx.sessionId)
1383
- ctx.sessionId = extractSessionId(cli, event);
1384
- extractFromEvent(cli, event, ctx, agentLabel, empTag);
1455
+ ctx.sessionId = extractSessionId(dispatchCli, event);
1456
+ extractFromEvent(dispatchCli, event, ctx, agentLabel, empTag);
1385
1457
  // Gemini watchdog: AFTER extractFromEvent sets geminiResultSeen
1386
1458
  if (cli === 'gemini' && ctx.geminiResultSeen && !geminiWatchdog) {
1387
1459
  geminiWatchdog = setTimeout(() => {
@@ -1396,7 +1468,7 @@ export function spawnAgent(prompt, opts = {}) {
1396
1468
  if (ctx.hasActiveSubAgent) {
1397
1469
  opts.lifecycle?.onActivity?.('heartbeat');
1398
1470
  }
1399
- const outputChunk = extractOutputChunk(cli, event, ctx);
1471
+ const outputChunk = extractOutputChunk(dispatchCli, event, ctx);
1400
1472
  if (outputChunk) {
1401
1473
  if (ctx.liveScope)
1402
1474
  appendLiveRunText(ctx.liveScope, outputChunk);
@@ -1478,24 +1550,16 @@ export function spawnAgent(prompt, opts = {}) {
1478
1550
  // - error: code !== 0 && !wasKilled → classifyExitError
1479
1551
  // - trace: if (traceText) traceText = `⏹️ [interrupted]…`
1480
1552
  handleAgentExit({
1481
- ctx, code, cli, model, agentLabel, mainManaged, origin,
1553
+ ctx, code, cli, model, effectiveProvider, agentLabel, mainManaged, origin,
1482
1554
  resumeKey,
1483
1555
  prompt, opts, cfg, ownerGeneration, forceNew, empSid,
1484
1556
  isResume, wasKilled, wasSteer, smokeResult,
1485
- effortDefault: 'medium', costLine,
1557
+ effortDefault: cli === 'grok' ? '' : 'medium', costLine,
1486
1558
  resolve: resolve,
1487
1559
  activeProcesses,
1488
1560
  setActiveProcess: (v) => { activeProcess = v; },
1489
- retryState: {
1490
- timer: retryPendingTimer,
1491
- resolve: retryPendingResolve,
1492
- origin: retryPendingOrigin,
1493
- setTimer: (t) => { retryPendingTimer = t; },
1494
- setResolve: (r) => { retryPendingResolve = r; },
1495
- setOrigin: (o) => { retryPendingOrigin = o; },
1496
- setIsEmployee: (v) => { retryPendingIsEmployee = v; },
1497
- },
1498
- fallbackState,
1561
+ retryState: queueCtrl.retryState,
1562
+ fallbackState: queueCtrl.fallbackState,
1499
1563
  fallbackMaxRetries: FALLBACK_MAX_RETRIES,
1500
1564
  processQueue,
1501
1565
  }).catch((err) => {