cli-jaw 2.0.1 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (607) hide show
  1. package/README.ko.md +3 -2
  2. package/README.md +41 -12
  3. package/dist/bin/_http-client.js +34 -0
  4. package/dist/bin/_http-client.js.map +1 -0
  5. package/dist/bin/cli-jaw.js +10 -5
  6. package/dist/bin/cli-jaw.js.map +1 -1
  7. package/dist/bin/commands/browser-web-ai.js +155 -38
  8. package/dist/bin/commands/browser-web-ai.js.map +1 -1
  9. package/dist/bin/commands/browser.js +265 -37
  10. package/dist/bin/commands/browser.js.map +1 -1
  11. package/dist/bin/commands/chat.js +18 -14
  12. package/dist/bin/commands/chat.js.map +1 -1
  13. package/dist/bin/commands/clone.js +3 -2
  14. package/dist/bin/commands/clone.js.map +1 -1
  15. package/dist/bin/commands/dashboard.js +22 -18
  16. package/dist/bin/commands/dashboard.js.map +1 -1
  17. package/dist/bin/commands/dispatch.js +9 -11
  18. package/dist/bin/commands/dispatch.js.map +1 -1
  19. package/dist/bin/commands/doctor.js +26 -14
  20. package/dist/bin/commands/doctor.js.map +1 -1
  21. package/dist/bin/commands/employee.js +12 -7
  22. package/dist/bin/commands/employee.js.map +1 -1
  23. package/dist/bin/commands/init.js +9 -9
  24. package/dist/bin/commands/init.js.map +1 -1
  25. package/dist/bin/commands/launchd.js +17 -7
  26. package/dist/bin/commands/launchd.js.map +1 -1
  27. package/dist/bin/commands/mcp.js +7 -4
  28. package/dist/bin/commands/mcp.js.map +1 -1
  29. package/dist/bin/commands/memory.js +7 -5
  30. package/dist/bin/commands/memory.js.map +1 -1
  31. package/dist/bin/commands/orchestrate.js +6 -3
  32. package/dist/bin/commands/orchestrate.js.map +1 -1
  33. package/dist/bin/commands/reset.js +4 -3
  34. package/dist/bin/commands/reset.js.map +1 -1
  35. package/dist/bin/commands/serve.js +3 -2
  36. package/dist/bin/commands/serve.js.map +1 -1
  37. package/dist/bin/commands/service.js +2 -2
  38. package/dist/bin/commands/service.js.map +1 -1
  39. package/dist/bin/commands/status.js +10 -9
  40. package/dist/bin/commands/status.js.map +1 -1
  41. package/dist/bin/commands/tui/api.js +26 -18
  42. package/dist/bin/commands/tui/api.js.map +1 -1
  43. package/dist/bin/commands/tui/overlays.js +3 -1
  44. package/dist/bin/commands/tui/overlays.js.map +1 -1
  45. package/dist/bin/commands/tui/simple-mode.js +1 -1
  46. package/dist/bin/commands/tui/simple-mode.js.map +1 -1
  47. package/dist/bin/commands/tui/types.js.map +1 -1
  48. package/dist/bin/postinstall.js +153 -65
  49. package/dist/bin/postinstall.js.map +1 -1
  50. package/dist/bin/star-prompt.js +4 -3
  51. package/dist/bin/star-prompt.js.map +1 -1
  52. package/dist/lib/mcp/format-converters.js +15 -10
  53. package/dist/lib/mcp/format-converters.js.map +1 -1
  54. package/dist/lib/mcp/mcp-install.js +2 -2
  55. package/dist/lib/mcp/mcp-install.js.map +1 -1
  56. package/dist/lib/mcp/skills-distribution.js +2 -2
  57. package/dist/lib/mcp/skills-distribution.js.map +1 -1
  58. package/dist/lib/mcp/skills-reset.js +5 -4
  59. package/dist/lib/mcp/skills-reset.js.map +1 -1
  60. package/dist/lib/mcp/skills-symlinks.js +9 -9
  61. package/dist/lib/mcp/skills-symlinks.js.map +1 -1
  62. package/dist/lib/mcp/skills-utils.js +5 -4
  63. package/dist/lib/mcp/skills-utils.js.map +1 -1
  64. package/dist/lib/mcp/unified-config.js +3 -2
  65. package/dist/lib/mcp/unified-config.js.map +1 -1
  66. package/dist/lib/mime-detect.js +65 -0
  67. package/dist/lib/mime-detect.js.map +1 -0
  68. package/dist/lib/quota-copilot.js +12 -10
  69. package/dist/lib/quota-copilot.js.map +1 -1
  70. package/dist/lib/stt.js +3 -3
  71. package/dist/lib/stt.js.map +1 -1
  72. package/dist/lib/upload.js +14 -5
  73. package/dist/lib/upload.js.map +1 -1
  74. package/dist/scripts/i18n-registry.js +4 -4
  75. package/dist/scripts/i18n-registry.js.map +1 -1
  76. package/dist/server.js +61 -57
  77. package/dist/server.js.map +1 -1
  78. package/dist/src/agent/alert-escalation.js +61 -0
  79. package/dist/src/agent/alert-escalation.js.map +1 -0
  80. package/dist/src/agent/args.js +71 -2
  81. package/dist/src/agent/args.js.map +1 -1
  82. package/dist/src/agent/error-classifier.js +9 -4
  83. package/dist/src/agent/error-classifier.js.map +1 -1
  84. package/dist/src/agent/events.js +130 -101
  85. package/dist/src/agent/events.js.map +1 -1
  86. package/dist/src/agent/lifecycle-handler.js +44 -19
  87. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  88. package/dist/src/agent/live-run-state.js +7 -3
  89. package/dist/src/agent/live-run-state.js.map +1 -1
  90. package/dist/src/agent/memory-flush-controller.js +6 -4
  91. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  92. package/dist/src/agent/opencode-diagnostics.js +7 -6
  93. package/dist/src/agent/opencode-diagnostics.js.map +1 -1
  94. package/dist/src/agent/session-persistence.js +1 -1
  95. package/dist/src/agent/session-persistence.js.map +1 -1
  96. package/dist/src/agent/spawn-env.js +33 -16
  97. package/dist/src/agent/spawn-env.js.map +1 -1
  98. package/dist/src/agent/spawn.js +176 -110
  99. package/dist/src/agent/spawn.js.map +1 -1
  100. package/dist/src/agent/watchdog.js +56 -0
  101. package/dist/src/agent/watchdog.js.map +1 -0
  102. package/dist/src/browser/actions.js +179 -70
  103. package/dist/src/browser/actions.js.map +1 -1
  104. package/dist/src/browser/connection.js +296 -19
  105. package/dist/src/browser/connection.js.map +1 -1
  106. package/dist/src/browser/index.js +4 -1
  107. package/dist/src/browser/index.js.map +1 -1
  108. package/dist/src/browser/launch-policy.js +1 -1
  109. package/dist/src/browser/launch-policy.js.map +1 -1
  110. package/dist/src/browser/primitives.js +11 -7
  111. package/dist/src/browser/primitives.js.map +1 -1
  112. package/dist/src/browser/runtime-diagnostics.js +45 -0
  113. package/dist/src/browser/runtime-diagnostics.js.map +1 -0
  114. package/dist/src/browser/runtime-orphans.js +127 -0
  115. package/dist/src/browser/runtime-orphans.js.map +1 -0
  116. package/dist/src/browser/runtime-owner-store.js +51 -0
  117. package/dist/src/browser/runtime-owner-store.js.map +1 -0
  118. package/dist/src/browser/runtime-owner.js +2 -2
  119. package/dist/src/browser/runtime-owner.js.map +1 -1
  120. package/dist/src/browser/tab-lifecycle.js +157 -0
  121. package/dist/src/browser/tab-lifecycle.js.map +1 -0
  122. package/dist/src/browser/vision.js +35 -11
  123. package/dist/src/browser/vision.js.map +1 -1
  124. package/dist/src/browser/web-ai/action-breadth.js +56 -0
  125. package/dist/src/browser/web-ai/action-breadth.js.map +1 -0
  126. package/dist/src/browser/web-ai/action-cache.js +9 -8
  127. package/dist/src/browser/web-ai/action-cache.js.map +1 -1
  128. package/dist/src/browser/web-ai/action-intent.js +64 -0
  129. package/dist/src/browser/web-ai/action-intent.js.map +1 -0
  130. package/dist/src/browser/web-ai/action-memory.js +82 -0
  131. package/dist/src/browser/web-ai/action-memory.js.map +1 -0
  132. package/dist/src/browser/web-ai/action-trace.js +11 -6
  133. package/dist/src/browser/web-ai/action-trace.js.map +1 -1
  134. package/dist/src/browser/web-ai/annotated-screenshot.js +2 -1
  135. package/dist/src/browser/web-ai/annotated-screenshot.js.map +1 -1
  136. package/dist/src/browser/web-ai/answer-artifact.js +97 -0
  137. package/dist/src/browser/web-ai/answer-artifact.js.map +1 -0
  138. package/dist/src/browser/web-ai/ax-snapshot.js +3 -2
  139. package/dist/src/browser/web-ai/ax-snapshot.js.map +1 -1
  140. package/dist/src/browser/web-ai/browser-primitives.js +10 -7
  141. package/dist/src/browser/web-ai/browser-primitives.js.map +1 -1
  142. package/dist/src/browser/web-ai/capability-registry.js +1 -1
  143. package/dist/src/browser/web-ai/capability-registry.js.map +1 -1
  144. package/dist/src/browser/web-ai/chatgpt-composer.js +12 -12
  145. package/dist/src/browser/web-ai/chatgpt-composer.js.map +1 -1
  146. package/dist/src/browser/web-ai/chatgpt-model.js +469 -50
  147. package/dist/src/browser/web-ai/chatgpt-model.js.map +1 -1
  148. package/dist/src/browser/web-ai/chatgpt-response.js +82 -10
  149. package/dist/src/browser/web-ai/chatgpt-response.js.map +1 -1
  150. package/dist/src/browser/web-ai/chatgpt.js +325 -49
  151. package/dist/src/browser/web-ai/chatgpt.js.map +1 -1
  152. package/dist/src/browser/web-ai/churn-log.js +1 -1
  153. package/dist/src/browser/web-ai/churn-log.js.map +1 -1
  154. package/dist/src/browser/web-ai/cli-sessions.js +42 -26
  155. package/dist/src/browser/web-ai/cli-sessions.js.map +1 -1
  156. package/dist/src/browser/web-ai/context-pack/builder.js +1 -1
  157. package/dist/src/browser/web-ai/context-pack/builder.js.map +1 -1
  158. package/dist/src/browser/web-ai/context-pack/file-selector.js +2 -2
  159. package/dist/src/browser/web-ai/context-pack/file-selector.js.map +1 -1
  160. package/dist/src/browser/web-ai/context-pack/report.js +1 -1
  161. package/dist/src/browser/web-ai/context-pack/report.js.map +1 -1
  162. package/dist/src/browser/web-ai/copy-markdown.js +25 -5
  163. package/dist/src/browser/web-ai/copy-markdown.js.map +1 -1
  164. package/dist/src/browser/web-ai/diagnostics.js +17 -14
  165. package/dist/src/browser/web-ai/diagnostics.js.map +1 -1
  166. package/dist/src/browser/web-ai/doctor.js +10 -6
  167. package/dist/src/browser/web-ai/doctor.js.map +1 -1
  168. package/dist/src/browser/web-ai/dom-hash.js.map +1 -1
  169. package/dist/src/browser/web-ai/errors.js +5 -22
  170. package/dist/src/browser/web-ai/errors.js.map +1 -1
  171. package/dist/src/browser/web-ai/gemini-live.js +7 -6
  172. package/dist/src/browser/web-ai/gemini-live.js.map +1 -1
  173. package/dist/src/browser/web-ai/grok-live.js +9 -5
  174. package/dist/src/browser/web-ai/grok-live.js.map +1 -1
  175. package/dist/src/browser/web-ai/index.js +5 -0
  176. package/dist/src/browser/web-ai/index.js.map +1 -1
  177. package/dist/src/browser/web-ai/observation-bundle.js +90 -0
  178. package/dist/src/browser/web-ai/observation-bundle.js.map +1 -0
  179. package/dist/src/browser/web-ai/observe-actions.js +186 -0
  180. package/dist/src/browser/web-ai/observe-actions.js.map +1 -0
  181. package/dist/src/browser/web-ai/observe-targets.js +6 -1
  182. package/dist/src/browser/web-ai/observe-targets.js.map +1 -1
  183. package/dist/src/browser/web-ai/planner-contract.js +18 -0
  184. package/dist/src/browser/web-ai/planner-contract.js.map +1 -0
  185. package/dist/src/browser/web-ai/post-action-assert.js +8 -7
  186. package/dist/src/browser/web-ai/post-action-assert.js.map +1 -1
  187. package/dist/src/browser/web-ai/product-surfaces.js +2 -1
  188. package/dist/src/browser/web-ai/product-surfaces.js.map +1 -1
  189. package/dist/src/browser/web-ai/provider-adapter.js.map +1 -1
  190. package/dist/src/browser/web-ai/question.js +14 -7
  191. package/dist/src/browser/web-ai/question.js.map +1 -1
  192. package/dist/src/browser/web-ai/ref-registry.js.map +1 -1
  193. package/dist/src/browser/web-ai/self-heal.js +20 -14
  194. package/dist/src/browser/web-ai/self-heal.js.map +1 -1
  195. package/dist/src/browser/web-ai/session-store.js +61 -1
  196. package/dist/src/browser/web-ai/session-store.js.map +1 -1
  197. package/dist/src/browser/web-ai/session.js +43 -2
  198. package/dist/src/browser/web-ai/session.js.map +1 -1
  199. package/dist/src/browser/web-ai/source-audit.js +116 -0
  200. package/dist/src/browser/web-ai/source-audit.js.map +1 -0
  201. package/dist/src/browser/web-ai/tab-finalizer.js +18 -0
  202. package/dist/src/browser/web-ai/tab-finalizer.js.map +1 -0
  203. package/dist/src/browser/web-ai/tab-lease-store.js +390 -0
  204. package/dist/src/browser/web-ai/tab-lease-store.js.map +1 -0
  205. package/dist/src/browser/web-ai/tab-pool.js +44 -0
  206. package/dist/src/browser/web-ai/tab-pool.js.map +1 -0
  207. package/dist/src/browser/web-ai/target-resolver.js +31 -0
  208. package/dist/src/browser/web-ai/target-resolver.js.map +1 -0
  209. package/dist/src/browser/web-ai/trace-persistence.js +4 -2
  210. package/dist/src/browser/web-ai/trace-persistence.js.map +1 -1
  211. package/dist/src/browser/web-ai/vendor-editor-contract.js.map +1 -1
  212. package/dist/src/browser/web-ai/watcher.js +8 -7
  213. package/dist/src/browser/web-ai/watcher.js.map +1 -1
  214. package/dist/src/cli/acp-client.js +40 -26
  215. package/dist/src/cli/acp-client.js.map +1 -1
  216. package/dist/src/cli/command-context.js +3 -3
  217. package/dist/src/cli/command-context.js.map +1 -1
  218. package/dist/src/cli/commands.js +25 -16
  219. package/dist/src/cli/commands.js.map +1 -1
  220. package/dist/src/cli/compact.js.map +1 -1
  221. package/dist/src/cli/handlers-completions.js +6 -4
  222. package/dist/src/cli/handlers-completions.js.map +1 -1
  223. package/dist/src/cli/handlers-runtime.js +45 -38
  224. package/dist/src/cli/handlers-runtime.js.map +1 -1
  225. package/dist/src/cli/handlers.js +44 -36
  226. package/dist/src/cli/handlers.js.map +1 -1
  227. package/dist/src/cli/readiness.js +3 -1
  228. package/dist/src/cli/readiness.js.map +1 -1
  229. package/dist/src/cli/registry.js +1 -1
  230. package/dist/src/cli/registry.js.map +1 -1
  231. package/dist/src/cli/tui/overlay.js +4 -1
  232. package/dist/src/cli/tui/overlay.js.map +1 -1
  233. package/dist/src/cli/types.js +4 -0
  234. package/dist/src/cli/types.js.map +1 -0
  235. package/dist/src/command-contract/catalog.js +1 -1
  236. package/dist/src/command-contract/catalog.js.map +1 -1
  237. package/dist/src/command-contract/help-renderer.js +1 -1
  238. package/dist/src/command-contract/help-renderer.js.map +1 -1
  239. package/dist/src/core/browser-open-default.js +13 -0
  240. package/dist/src/core/browser-open-default.js.map +1 -0
  241. package/dist/src/core/browser-open.js +41 -0
  242. package/dist/src/core/browser-open.js.map +1 -0
  243. package/dist/src/core/bus.js +13 -2
  244. package/dist/src/core/bus.js.map +1 -1
  245. package/dist/src/core/compact.js +5 -4
  246. package/dist/src/core/compact.js.map +1 -1
  247. package/dist/src/core/config.js +51 -52
  248. package/dist/src/core/config.js.map +1 -1
  249. package/dist/src/core/db.js +48 -6
  250. package/dist/src/core/db.js.map +1 -1
  251. package/dist/src/core/employees.js +9 -8
  252. package/dist/src/core/employees.js.map +1 -1
  253. package/dist/src/core/instance.js +7 -6
  254. package/dist/src/core/instance.js.map +1 -1
  255. package/dist/src/core/logger.js +1 -1
  256. package/dist/src/core/logger.js.map +1 -1
  257. package/dist/src/core/main-session.js +7 -7
  258. package/dist/src/core/main-session.js.map +1 -1
  259. package/dist/src/core/path-expand.js +10 -0
  260. package/dist/src/core/path-expand.js.map +1 -0
  261. package/dist/src/core/runtime-path.js +1 -1
  262. package/dist/src/core/runtime-path.js.map +1 -1
  263. package/dist/src/core/runtime-settings.js +13 -13
  264. package/dist/src/core/runtime-settings.js.map +1 -1
  265. package/dist/src/core/settings-merge.js +14 -14
  266. package/dist/src/core/settings-merge.js.map +1 -1
  267. package/dist/src/core/strip-undefined.js +13 -0
  268. package/dist/src/core/strip-undefined.js.map +1 -0
  269. package/dist/src/core/tcc.js +1 -1
  270. package/dist/src/core/tcc.js.map +1 -1
  271. package/dist/src/discord/bot.js +19 -18
  272. package/dist/src/discord/bot.js.map +1 -1
  273. package/dist/src/discord/channel-types.js +14 -0
  274. package/dist/src/discord/channel-types.js.map +1 -0
  275. package/dist/src/discord/commands.js +7 -6
  276. package/dist/src/discord/commands.js.map +1 -1
  277. package/dist/src/discord/discord-file.js.map +1 -1
  278. package/dist/src/discord/forwarder.js +3 -3
  279. package/dist/src/discord/forwarder.js.map +1 -1
  280. package/dist/src/http/error-middleware.js +3 -3
  281. package/dist/src/http/error-middleware.js.map +1 -1
  282. package/dist/src/http/response.js +2 -2
  283. package/dist/src/http/response.js.map +1 -1
  284. package/dist/src/ide/diff.js +7 -7
  285. package/dist/src/ide/diff.js.map +1 -1
  286. package/dist/src/manager/board/routes.js +28 -27
  287. package/dist/src/manager/board/routes.js.map +1 -1
  288. package/dist/src/manager/dashboard-home.js +3 -5
  289. package/dist/src/manager/dashboard-home.js.map +1 -1
  290. package/dist/src/manager/dashboard-service.js +2 -2
  291. package/dist/src/manager/dashboard-service.js.map +1 -1
  292. package/dist/src/manager/health-history.js +10 -9
  293. package/dist/src/manager/health-history.js.map +1 -1
  294. package/dist/src/manager/launchd-service.js +2 -2
  295. package/dist/src/manager/launchd-service.js.map +1 -1
  296. package/dist/src/manager/lifecycle-helpers.js +7 -6
  297. package/dist/src/manager/lifecycle-helpers.js.map +1 -1
  298. package/dist/src/manager/lifecycle.js +7 -6
  299. package/dist/src/manager/lifecycle.js.map +1 -1
  300. package/dist/src/manager/logs.js +18 -18
  301. package/dist/src/manager/logs.js.map +1 -1
  302. package/dist/src/manager/metadata.js +10 -2
  303. package/dist/src/manager/metadata.js.map +1 -1
  304. package/dist/src/manager/notes/assets.js +216 -0
  305. package/dist/src/manager/notes/assets.js.map +1 -0
  306. package/dist/src/manager/notes/capabilities.js +56 -0
  307. package/dist/src/manager/notes/capabilities.js.map +1 -0
  308. package/dist/src/manager/notes/constants.js +11 -0
  309. package/dist/src/manager/notes/constants.js.map +1 -0
  310. package/dist/src/manager/notes/frontmatter.js +120 -0
  311. package/dist/src/manager/notes/frontmatter.js.map +1 -0
  312. package/dist/src/manager/notes/link-resolver.js +96 -0
  313. package/dist/src/manager/notes/link-resolver.js.map +1 -0
  314. package/dist/src/manager/notes/path-guards.js +4 -0
  315. package/dist/src/manager/notes/path-guards.js.map +1 -1
  316. package/dist/src/manager/notes/remote-assets.js +128 -0
  317. package/dist/src/manager/notes/remote-assets.js.map +1 -0
  318. package/dist/src/manager/notes/routes.js +63 -13
  319. package/dist/src/manager/notes/routes.js.map +1 -1
  320. package/dist/src/manager/notes/store.js +3 -2
  321. package/dist/src/manager/notes/store.js.map +1 -1
  322. package/dist/src/manager/notes/system-trash.js +3 -3
  323. package/dist/src/manager/notes/system-trash.js.map +1 -1
  324. package/dist/src/manager/notes/vault-index.js +220 -0
  325. package/dist/src/manager/notes/vault-index.js.map +1 -0
  326. package/dist/src/manager/notes/watcher.js +27 -0
  327. package/dist/src/manager/notes/watcher.js.map +1 -0
  328. package/dist/src/manager/notes/wiki-links.js +109 -0
  329. package/dist/src/manager/notes/wiki-links.js.map +1 -0
  330. package/dist/src/manager/process-verify.js +29 -0
  331. package/dist/src/manager/process-verify.js.map +1 -1
  332. package/dist/src/manager/profiles.js +3 -2
  333. package/dist/src/manager/profiles.js.map +1 -1
  334. package/dist/src/manager/registry.js +60 -58
  335. package/dist/src/manager/registry.js.map +1 -1
  336. package/dist/src/manager/routes/electron-metrics.js +22 -22
  337. package/dist/src/manager/routes/electron-metrics.js.map +1 -1
  338. package/dist/src/manager/scan.js +2 -2
  339. package/dist/src/manager/scan.js.map +1 -1
  340. package/dist/src/manager/schedule/routes.js +24 -23
  341. package/dist/src/manager/schedule/routes.js.map +1 -1
  342. package/dist/src/manager/server.js +28 -28
  343. package/dist/src/manager/server.js.map +1 -1
  344. package/dist/src/manager/systemd-service.js +1 -1
  345. package/dist/src/manager/systemd-service.js.map +1 -1
  346. package/dist/src/memory/bootstrap.js +5 -4
  347. package/dist/src/memory/bootstrap.js.map +1 -1
  348. package/dist/src/memory/heartbeat-schedule.js +10 -10
  349. package/dist/src/memory/heartbeat-schedule.js.map +1 -1
  350. package/dist/src/memory/heartbeat.js +23 -22
  351. package/dist/src/memory/heartbeat.js.map +1 -1
  352. package/dist/src/memory/indexing.js.map +1 -1
  353. package/dist/src/memory/keyword-expand.js +1 -1
  354. package/dist/src/memory/keyword-expand.js.map +1 -1
  355. package/dist/src/memory/memory.js +2 -2
  356. package/dist/src/memory/memory.js.map +1 -1
  357. package/dist/src/memory/runtime.js +6 -5
  358. package/dist/src/memory/runtime.js.map +1 -1
  359. package/dist/src/memory/shared.js +2 -1
  360. package/dist/src/memory/shared.js.map +1 -1
  361. package/dist/src/memory/worklog.js +1 -1
  362. package/dist/src/memory/worklog.js.map +1 -1
  363. package/dist/src/messaging/runtime.js +13 -10
  364. package/dist/src/messaging/runtime.js.map +1 -1
  365. package/dist/src/messaging/send.js +16 -15
  366. package/dist/src/messaging/send.js.map +1 -1
  367. package/dist/src/orchestrator/collect.js +6 -6
  368. package/dist/src/orchestrator/collect.js.map +1 -1
  369. package/dist/src/orchestrator/distribute.js +112 -77
  370. package/dist/src/orchestrator/distribute.js.map +1 -1
  371. package/dist/src/orchestrator/gateway.js +6 -5
  372. package/dist/src/orchestrator/gateway.js.map +1 -1
  373. package/dist/src/orchestrator/pipeline.js +42 -42
  374. package/dist/src/orchestrator/pipeline.js.map +1 -1
  375. package/dist/src/orchestrator/state-machine.js +3 -3
  376. package/dist/src/orchestrator/state-machine.js.map +1 -1
  377. package/dist/src/orchestrator/worker-registry.js +4 -3
  378. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  379. package/dist/src/prompt/builder.js +24 -19
  380. package/dist/src/prompt/builder.js.map +1 -1
  381. package/dist/src/prompt/templates/a1-system.md +15 -10
  382. package/dist/src/prompt/templates/control-system.md +9 -7
  383. package/dist/src/prompt/templates/employee.md +5 -4
  384. package/dist/src/prompt/templates/vision-click.md +1 -1
  385. package/dist/src/routes/_http-error.js +15 -0
  386. package/dist/src/routes/_http-error.js.map +1 -0
  387. package/dist/src/routes/avatar.js +6 -5
  388. package/dist/src/routes/avatar.js.map +1 -1
  389. package/dist/src/routes/browser.js +132 -45
  390. package/dist/src/routes/browser.js.map +1 -1
  391. package/dist/src/routes/employees.js +28 -21
  392. package/dist/src/routes/employees.js.map +1 -1
  393. package/dist/src/routes/heartbeat.js +12 -9
  394. package/dist/src/routes/heartbeat.js.map +1 -1
  395. package/dist/src/routes/i18n.js +13 -7
  396. package/dist/src/routes/i18n.js.map +1 -1
  397. package/dist/src/routes/jaw-memory.js +15 -11
  398. package/dist/src/routes/jaw-memory.js.map +1 -1
  399. package/dist/src/routes/memory.js +25 -20
  400. package/dist/src/routes/memory.js.map +1 -1
  401. package/dist/src/routes/messaging.js +50 -29
  402. package/dist/src/routes/messaging.js.map +1 -1
  403. package/dist/src/routes/orchestrate.js +38 -24
  404. package/dist/src/routes/orchestrate.js.map +1 -1
  405. package/dist/src/routes/quota.js +81 -17
  406. package/dist/src/routes/quota.js.map +1 -1
  407. package/dist/src/routes/settings.js +28 -18
  408. package/dist/src/routes/settings.js.map +1 -1
  409. package/dist/src/routes/skills.js +22 -13
  410. package/dist/src/routes/skills.js.map +1 -1
  411. package/dist/src/routes/traces.js +77 -0
  412. package/dist/src/routes/traces.js.map +1 -0
  413. package/dist/src/security/path-guards.js +2 -1
  414. package/dist/src/security/path-guards.js.map +1 -1
  415. package/dist/src/shared/tool-log-sanitize.js +191 -0
  416. package/dist/src/shared/tool-log-sanitize.js.map +1 -0
  417. package/dist/src/telegram/bot.js +65 -55
  418. package/dist/src/telegram/bot.js.map +1 -1
  419. package/dist/src/telegram/forwarder.js +5 -9
  420. package/dist/src/telegram/forwarder.js.map +1 -1
  421. package/dist/src/telegram/telegram-file.js +28 -24
  422. package/dist/src/telegram/telegram-file.js.map +1 -1
  423. package/dist/src/telegram/voice.js +4 -3
  424. package/dist/src/telegram/voice.js.map +1 -1
  425. package/dist/src/trace/redact.js +50 -0
  426. package/dist/src/trace/redact.js.map +1 -0
  427. package/dist/src/trace/store.js +162 -0
  428. package/dist/src/trace/store.js.map +1 -0
  429. package/dist/src/trace/types.js +2 -0
  430. package/dist/src/trace/types.js.map +1 -0
  431. package/dist/src/types/cli-engine.js +34 -0
  432. package/dist/src/types/cli-engine.js.map +1 -0
  433. package/dist/src/types/cli-events.js +31 -0
  434. package/dist/src/types/cli-events.js.map +1 -0
  435. package/package.json +22 -2
  436. package/public/css/tool-ui.css +3 -1
  437. package/public/css/trace-drawer.css +48 -0
  438. package/public/dist/assets/{AdvancedExport-3WAYIabE.js → AdvancedExport-DJZ2VmBR.js} +1 -1
  439. package/public/dist/assets/Agent-CgpLT8IY.js +1 -0
  440. package/public/dist/assets/Browser-CrkiQoB8.js +1 -0
  441. package/public/dist/assets/{ChannelsDiscord-UzFPlWT4.js → ChannelsDiscord-CVUC22D4.js} +1 -1
  442. package/public/dist/assets/{ChannelsTelegram-DNWtPX0w.js → ChannelsTelegram-DEatIQNM.js} +1 -1
  443. package/public/dist/assets/{DashboardMeta-Y_6nVeJO.js → DashboardMeta-BKoxRc7i.js} +1 -1
  444. package/public/dist/assets/{Display-D8vGOl4s.js → Display-DnNGV9Km.js} +1 -1
  445. package/public/dist/assets/{Employees-YR_sIRK4.js → Employees-DZ2iJYKy.js} +1 -1
  446. package/public/dist/assets/{HealthBadge-CPePajyU.js → HealthBadge-Cq2c7G9s.js} +1 -1
  447. package/public/dist/assets/{Heartbeat-DTpAULQR.js → Heartbeat-BML6eTXZ.js} +1 -1
  448. package/public/dist/assets/{Mcp-DM-PgG6z.js → Mcp-BlEviQ3h.js} +1 -1
  449. package/public/dist/assets/{Memory-C_LvJnkn.js → Memory-BRyH80He.js} +1 -1
  450. package/public/dist/assets/MilkdownWysiwygEditor-Cm3uXfWf.js +52 -0
  451. package/public/dist/assets/ModelProvider-DxyR7EL9.js +1 -0
  452. package/public/dist/assets/Network-DDOOESh1.js +1 -0
  453. package/public/dist/assets/{Permissions-B1naJjjw.js → Permissions-Br0eSbKb.js} +1 -1
  454. package/public/dist/assets/{Permissions-BKffrMJD.js → Permissions-QHkzStqQ.js} +1 -1
  455. package/public/dist/assets/{Profile-DIqjSe2C.js → Profile-C79NKumk.js} +1 -1
  456. package/public/dist/assets/{Prompts-BMfbV6Y4.js → Prompts-BmiIDiXW.js} +1 -1
  457. package/public/dist/assets/{SpeechKeys-DjiQTzSL.js → SpeechKeys-B8304XJK.js} +1 -1
  458. package/public/dist/assets/app-Be58Cs3Y.js +32 -0
  459. package/public/dist/assets/{app-BzvwJJiv.css → app-CphocJzo.css} +1 -1
  460. package/public/dist/assets/{dist-DTvxN3ux.js → dist-BD0UXfgF2.js} +1 -1
  461. package/public/dist/assets/{dist-CASeq-Tl.js → dist-BNfXO3Yr.js} +1 -1
  462. package/public/dist/assets/{dist-BMPiaUzF.js → dist-BUnPYbK3.js} +1 -1
  463. package/public/dist/assets/{dist-CT_X3hVT.js → dist-BZosRD2u.js} +1 -1
  464. package/public/dist/assets/{dist-4J6YbNXv.js → dist-Bd9PlnQm.js} +1 -1
  465. package/public/dist/assets/{dist-BcZjyn5g.js → dist-BsT5UdNP.js} +1 -1
  466. package/public/dist/assets/{dist-BfBhOPR-.js → dist-CIuXW-sc.js} +1 -1
  467. package/public/dist/assets/{dist-BMiCig3A2.js → dist-CL4PTYWf.js} +1 -1
  468. package/public/dist/assets/{dist-VyP6-HLb.js → dist-Ch5VAlV9.js} +1 -1
  469. package/public/dist/assets/dist-ClqO40BE.js +1 -0
  470. package/public/dist/assets/{dist-c98Tp7bP.js → dist-Cp42cMcI.js} +1 -1
  471. package/public/dist/assets/{dist-CIlYL1qe.js → dist-CpUK8ypo.js} +1 -1
  472. package/public/dist/assets/dist-CxeLAw2Y.js +1 -0
  473. package/public/dist/assets/dist-D2SH8nxa.js +1 -0
  474. package/public/dist/assets/{dist-84fwQ7bO.js → dist-D6cUXP7K.js} +1 -1
  475. package/public/dist/assets/{dist-BOCcQAyF.js → dist-D7bCuS3f.js} +1 -1
  476. package/public/dist/assets/{dist-DMmpfLVP.js → dist-DFYRUAjN.js} +1 -1
  477. package/public/dist/assets/{dist-DdY6pTJr.js → dist-DZsFVYF4.js} +1 -1
  478. package/public/dist/assets/{dist-B0p3Eyme.js → dist-Db16ogVk.js} +1 -1
  479. package/public/dist/assets/{dist-DlnNtr6L.js → dist-DfodGES_.js} +1 -1
  480. package/public/dist/assets/{dist-DO9so2a2.js → dist-SU-YTAIg.js} +1 -1
  481. package/public/dist/assets/{dist-DUjXiMLP.js → dist-UYn7T-GH.js} +1 -1
  482. package/public/dist/assets/{dist-BW1409rz.js → dist-W51oDoeA.js} +1 -1
  483. package/public/dist/assets/{dist-BimBQZx1.js → dist-eU7TyC86.js} +1 -1
  484. package/public/dist/assets/dist-l9HH00ip.js +1 -0
  485. package/public/dist/assets/{dist-BrOPNxdH.js → dist-urPTQzXL.js} +1 -1
  486. package/public/dist/assets/{dist-AloEV3J52.js → dist-yHP6L0Ty.js} +1 -1
  487. package/public/dist/assets/{employees-Bbabvbyx.js → employees-CxdghzoD.js} +7 -7
  488. package/public/dist/assets/{error-normalize-DdvKGLt_.js → error-normalize-5n-zlEQ3.js} +1 -1
  489. package/public/dist/assets/insert-image-markdown-DIEa-zjk.js +22 -0
  490. package/public/dist/assets/{manager-DyB2ZUr9.css → manager-DEiyrWDP.css} +1 -1
  491. package/public/dist/assets/manager-UEXd1_9T.js +25 -0
  492. package/public/dist/assets/{memory-B_plvcuQ.js → memory-CsMNkYtv.js} +9 -9
  493. package/public/dist/assets/memory-DXad_DPO.js +1 -0
  494. package/public/dist/assets/{page-shell-DML_HneX.js → page-shell-D5tbivHH.js} +1 -1
  495. package/public/dist/assets/{render-DEhbfUAW.js → render-DGQX46ei.js} +2 -2
  496. package/public/dist/assets/{settings-D7F-_kYG.js → settings-BH213Yv3.js} +14 -14
  497. package/public/dist/assets/settings-DXT87G2U.js +1 -0
  498. package/public/dist/assets/settings-client-ajlwI-oK.js +1 -0
  499. package/public/dist/assets/skills-5o_1v0nz.js +1 -0
  500. package/public/dist/assets/{skills-DoGJOc0D.js → skills-CQtCtHPA.js} +6 -6
  501. package/public/dist/assets/slash-commands-D4-hrrmh.js +1 -0
  502. package/public/dist/assets/{slash-commands-khNFPOyF.js → slash-commands-Dzk1xHWS.js} +1 -1
  503. package/public/dist/assets/trace-drawer-SRKcfm2S.js +15 -0
  504. package/public/dist/assets/ui-CdRKN2S6.js +141 -0
  505. package/public/dist/assets/ui-n43jmg_f.js +1 -0
  506. package/public/dist/assets/{ws-B2aJ-nD2.js → ws-CTHQFzM1.js} +8 -8
  507. package/public/dist/index.html +2 -2
  508. package/public/dist/manager/index.html +2 -2
  509. package/public/index.html +1 -0
  510. package/public/js/constants.ts +5 -5
  511. package/public/js/diagram/iframe-renderer.ts +11 -11
  512. package/public/js/features/chat.ts +1 -1
  513. package/public/js/features/memory.ts +10 -10
  514. package/public/js/features/pending-queue.ts +2 -2
  515. package/public/js/features/process-block.ts +257 -29
  516. package/public/js/features/process-step-match.ts +18 -0
  517. package/public/js/features/settings-cli-status.ts +1 -1
  518. package/public/js/features/settings-stt.ts +37 -11
  519. package/public/js/features/settings-templates.ts +2 -2
  520. package/public/js/features/slash-commands.ts +1 -1
  521. package/public/js/features/tool-ui.ts +13 -7
  522. package/public/js/features/trace-drawer.ts +122 -0
  523. package/public/js/icons.ts +1 -1
  524. package/public/js/main.ts +28 -28
  525. package/public/js/provider-icons.ts +1 -1
  526. package/public/js/render.ts +29 -27
  527. package/public/js/sanitizer.ts +4 -0
  528. package/public/js/ui.ts +234 -68
  529. package/public/js/virtual-scroll.ts +19 -33
  530. package/public/js/ws.ts +22 -10
  531. package/public/manager/src/App.tsx +34 -6
  532. package/public/manager/src/api.ts +55 -1
  533. package/public/manager/src/components/ActivityTimeline.tsx +1 -1
  534. package/public/manager/src/components/InstanceDetailPanel.tsx +2 -2
  535. package/public/manager/src/components/InstanceGroups.tsx +5 -5
  536. package/public/manager/src/components/InstanceListContent.tsx +1 -1
  537. package/public/manager/src/dashboard-features.ts +1 -1
  538. package/public/manager/src/manager-notes.css +49 -2
  539. package/public/manager/src/notes/MarkdownEditor.tsx +7 -3
  540. package/public/manager/src/notes/NotesFileTree.tsx +45 -6
  541. package/public/manager/src/notes/NotesSidebar.tsx +24 -55
  542. package/public/manager/src/notes/NotesWorkspace.tsx +50 -3
  543. package/public/manager/src/notes/image-assets/clipboard-images.ts +100 -0
  544. package/public/manager/src/notes/image-assets/insert-image-markdown.ts +85 -0
  545. package/public/manager/src/notes/notes-api.ts +2 -0
  546. package/public/manager/src/notes/notes-types.ts +8 -1
  547. package/public/manager/src/notes/rendering/MarkdownRenderer.tsx +6 -0
  548. package/public/manager/src/notes/rendering/markdown-render-security.ts +19 -1
  549. package/public/manager/src/notes/rich-markdown/paste-policy.ts +6 -2
  550. package/public/manager/src/notes/rich-markdown/rich-markdown-extension.ts +5 -5
  551. package/public/manager/src/notes/rich-markdown/rich-widget.ts +8 -8
  552. package/public/manager/src/notes/useNotesExternalSync.ts +37 -0
  553. package/public/manager/src/notes/useNotesModel.ts +91 -0
  554. package/public/manager/src/notes/wysiwyg/MilkdownWysiwygEditor.tsx +157 -17
  555. package/public/manager/src/notes/wysiwyg/milkdown-block-keymap.ts +14 -2
  556. package/public/manager/src/notes/wysiwyg/milkdown-code-block-view.ts +20 -20
  557. package/public/manager/src/notes/wysiwyg/milkdown-heading-source-view.ts +8 -8
  558. package/public/manager/src/notes/wysiwyg/milkdown-math.ts +25 -25
  559. package/public/manager/src/settings/pages/Browser.tsx +38 -20
  560. package/public/manager/src/settings/pages/ModelProvider.tsx +11 -9
  561. package/public/manager/src/settings/pages/Network.tsx +10 -10
  562. package/public/manager/src/settings/pages/components/HealthBadge.tsx +12 -12
  563. package/public/manager/src/settings/pages/components/agent/runtime-employees-helpers.ts +12 -10
  564. package/public/manager/src/settings/pages/components/employees-helpers.ts +9 -9
  565. package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +13 -13
  566. package/public/manager/src/settings/pages/components/memory-helpers.ts +4 -4
  567. package/public/manager/src/settings/pages/mcp-helpers.ts +7 -7
  568. package/public/manager/src/settings/settings-client.ts +4 -3
  569. package/public/manager/src/sync/IframeBridge.tsx +29 -0
  570. package/public/manager/src/sync/VisibilityBridge.tsx +24 -0
  571. package/public/manager/src/sync/invalidation-bus.ts +30 -0
  572. package/public/manager/src/sync/useInvalidationSubscription.ts +19 -0
  573. package/public/manager/src/types.ts +101 -0
  574. package/scripts/check-strict-baseline.mjs +255 -0
  575. package/scripts/claim-audit.mjs +159 -0
  576. package/scripts/i18n-registry.ts +4 -4
  577. package/scripts/install-officecli.sh +2 -2
  578. package/scripts/install-wsl.sh +2 -1
  579. package/scripts/release-gates.mjs +347 -0
  580. package/scripts/release-preview.sh +3 -0
  581. package/scripts/release.sh +4 -0
  582. package/scripts/smoke/opencode-external-dir-smoke.ts +14 -5
  583. package/public/dist/assets/Agent-BYdzZwD0.js +0 -1
  584. package/public/dist/assets/Browser-CkGeczuN.js +0 -1
  585. package/public/dist/assets/MilkdownWysiwygEditor-B7k9bAey.js +0 -52
  586. package/public/dist/assets/ModelProvider-CX3Qhowu.js +0 -1
  587. package/public/dist/assets/Network-DfPLFAvw.js +0 -1
  588. package/public/dist/assets/app-DLYoRkU9.js +0 -32
  589. package/public/dist/assets/dist-8zNAQAIa.js +0 -1
  590. package/public/dist/assets/dist-BgeY6nvK.js +0 -1
  591. package/public/dist/assets/dist-BzDGGxHQ.js +0 -1
  592. package/public/dist/assets/dist-D3YKbVi-.js +0 -1
  593. package/public/dist/assets/manager-CUSgFbMO.js +0 -25
  594. package/public/dist/assets/markdown-render-security-DJfJPWO-.js +0 -22
  595. package/public/dist/assets/memory-DQ6dU0qs.js +0 -1
  596. package/public/dist/assets/settings-DxLPUbpj.js +0 -1
  597. package/public/dist/assets/settings-client-CGf3uPPf.js +0 -1
  598. package/public/dist/assets/skills-yMfNYJ8m.js +0 -1
  599. package/public/dist/assets/slash-commands-CZcwr1W6.js +0 -1
  600. package/public/dist/assets/ui-04YlOMgn.js +0 -136
  601. package/public/dist/assets/ui-D6hlMjRq.js +0 -1
  602. /package/public/dist/assets/{InlineWarn-CqgWEC41.js → InlineWarn-BooBRm7o.js} +0 -0
  603. /package/public/dist/assets/{agent-meta-puNn13DV.js → agent-meta-DHddpWHQ.js} +0 -0
  604. /package/public/dist/assets/{fields-DH9JS3mb.js → fields-BtncIZYA.js} +0 -0
  605. /package/public/dist/assets/{mermaid-loader-6XC0y10y.js → mermaid-loader-BEFIOoJn.js} +0 -0
  606. /package/public/dist/assets/{path-utils-CtsDDGZg.js → path-utils-BuEEtj9w.js} +0 -0
  607. /package/public/dist/assets/{w3c-keyname-VSld09PZ.js → w3c-keyname-IiiZScED.js} +0 -0
package/public/js/ui.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  // ── UI Utilities ──
2
2
  import { state } from './state.js';
3
- import { renderMarkdown, escapeHtml, stripOrchestration, linkifyFilePaths } from './render.js';
3
+ import { renderMarkdown, escapeHtml, sanitizeHtml, stripOrchestration, linkifyFilePaths } from './render.js';
4
4
  import { renderMermaidBlocks } from './render.js';
5
5
  import { generateId } from './uuid.js';
6
6
  import { getAppName } from './features/appname.js';
@@ -15,6 +15,13 @@ import { activateWidgets } from './diagram/iframe-renderer.js';
15
15
  import { renderLiveToolActivity, cleanupToolElements, bindToolItemInteractions, type ToolLogEntry } from './features/tool-ui.js';
16
16
  import { ICONS, emojiToIcon, emojiToStatus, isCompletionEmoji } from './icons.js';
17
17
  import { providerIcon } from './provider-icons.js';
18
+ import { findRunningProcessStepMatch } from './features/process-step-match.js';
19
+ import {
20
+ parseToolLogBounded,
21
+ sanitizeToolLogForDurableStorage,
22
+ serializeSanitizedToolLog,
23
+ type SanitizedToolLogEntry,
24
+ } from '../../src/shared/tool-log-sanitize.js';
18
25
  import {
19
26
  createProcessBlock,
20
27
  addStep,
@@ -24,10 +31,14 @@ import {
24
31
  stopBlockTicker,
25
32
  buildProcessBlockHtml,
26
33
  bindProcessBlockInteractions,
34
+ getStoredProcessStepDetail,
35
+ mergeStoredProcessStepDetail,
36
+ processStepMetaFromStore,
37
+ releaseProcessBlockDetails,
27
38
  type ProcessStep,
28
39
  type ProcessBlockState,
29
40
  } from './features/process-block.js';
30
- interface MessageItem { role: string; content: string; tool_log?: string | null; cli?: string | null; }
41
+ interface MessageItem { role: string; content: string; tool_log?: string | null; trace_run_id?: string | null; cli?: string | null; }
31
42
  interface QueuedOverlayItem { id: string; prompt: string; source?: string; ts?: number; }
32
43
  interface ActiveRunSnapshot { running?: boolean; cli?: string; text?: string; toolLog?: ToolLogEntry[]; startedAt?: number; }
33
44
 
@@ -37,14 +48,27 @@ function processStepType(toolType?: string): ProcessStep['type'] {
37
48
  : 'tool';
38
49
  }
39
50
 
51
+ function processStepStatus(status?: string): ProcessStep['status'] {
52
+ return status === 'running' || status === 'done' || status === 'error' ? status : 'done';
53
+ }
54
+
55
+ function fallbackToolLabel(tool: ToolLogEntry): string {
56
+ if (tool.label) return tool.label;
57
+ const named = tool as ToolLogEntry & { name?: unknown };
58
+ return typeof named.name === 'string' && named.name ? named.name : 'tool';
59
+ }
60
+
40
61
  function parseToolLog(toolLog?: string | null): ToolLogEntry[] {
41
- if (!toolLog) return [];
42
- try {
43
- const parsed = JSON.parse(toolLog);
44
- return Array.isArray(parsed) ? parsed : [];
45
- } catch {
46
- return [];
47
- }
62
+ return parseToolLogBounded(toolLog) as ToolLogEntry[];
63
+ }
64
+
65
+ function sanitizedToolLogJson(toolLog?: string | null): string | null {
66
+ return serializeSanitizedToolLog(parseToolLog(toolLog));
67
+ }
68
+
69
+ function normalizeMessageToolLog<T extends MessageItem>(message: T): T {
70
+ if (message.role !== 'assistant' || !message.tool_log) return { ...message, tool_log: null };
71
+ return { ...message, tool_log: sanitizedToolLogJson(message.tool_log) };
48
72
  }
49
73
 
50
74
  function getAgentIcon(_cli?: string | null): string {
@@ -53,15 +77,20 @@ function getAgentIcon(_cli?: string | null): string {
53
77
 
54
78
  function toProcessSteps(tools: ToolLogEntry[], runStartedAt?: number): ProcessStep[] {
55
79
  const baseTime = runStartedAt && runStartedAt > 0 ? runStartedAt : Date.now();
56
- return tools.map((tool: any) => ({
80
+ return tools.map((tool) => ({
57
81
  id: generateId(),
58
82
  icon: tool.icon ? emojiToIcon(tool.icon) : ICONS.tool,
59
83
  rawIcon: tool.rawIcon || tool.icon || '',
60
- label: tool.label || tool.name || 'tool',
84
+ label: fallbackToolLabel(tool),
61
85
  type: processStepType(tool.toolType),
62
86
  detail: tool.detail || '',
63
87
  stepRef: tool.stepRef || '',
64
- status: tool.status || 'done',
88
+ traceRunId: tool.traceRunId || '',
89
+ traceSeq: tool.traceSeq,
90
+ detailAvailable: tool.detailAvailable,
91
+ detailBytes: tool.detailBytes,
92
+ rawRetentionStatus: tool.rawRetentionStatus,
93
+ status: processStepStatus(tool.status),
65
94
  startTime: baseTime,
66
95
  }));
67
96
  }
@@ -102,7 +131,10 @@ function normalizeAgentToolBlocks(agentMsg: HTMLElement): void {
102
131
  }
103
132
 
104
133
  for (const block of blocks) {
105
- if (block !== keep) block.remove();
134
+ if (block !== keep) {
135
+ releaseProcessBlockDetails(block);
136
+ block.remove();
137
+ }
106
138
  }
107
139
  }
108
140
 
@@ -121,21 +153,34 @@ function processStepStatusFromDom(status?: string): ProcessStep['status'] {
121
153
  }
122
154
 
123
155
  function processStepFromDom(row: HTMLElement): ProcessStep | null {
124
- const id = row.dataset.stepId || '';
156
+ const id = row.dataset['stepId'] || '';
125
157
  if (!id) return null;
158
+ const storedMeta = processStepMetaFromStore(id);
126
159
  const label = row.querySelector('.process-step-label')?.textContent?.trim() || '';
127
- const detail = row.querySelector('.process-step-full')?.textContent || '';
160
+ const pre = row.querySelector('.process-step-full') as HTMLElement | null;
161
+ const detail = pre?.dataset['detailLazy'] === 'true'
162
+ ? getStoredProcessStepDetail(id) || storedMeta?.preview || ''
163
+ : pre?.textContent || getStoredProcessStepDetail(id) || storedMeta?.preview || '';
128
164
  const iconEl = row.querySelector('.process-step-icon') as HTMLElement | null;
129
165
  const icon = iconEl?.innerHTML || ICONS.tool;
130
- const startTime = Number(row.dataset.startTime || '');
166
+ const startTime = Number(row.dataset['startTime'] || '');
131
167
  return {
132
168
  id,
133
- type: processStepTypeFromDom(row.dataset.type),
134
- icon,
135
- label,
169
+ type: storedMeta?.type || processStepTypeFromDom(row.dataset['type']),
170
+ icon: storedMeta?.icon || icon,
171
+ rawIcon: storedMeta?.rawIcon,
172
+ label: storedMeta?.label || label,
136
173
  detail,
137
- stepRef: row.dataset.stepRef || '',
138
- status: processStepStatusFromDom(row.dataset.status),
174
+ detailPreview: storedMeta?.preview,
175
+ detailLength: storedMeta?.detailLength,
176
+ detailTruncated: storedMeta?.detailTruncated,
177
+ stepRef: storedMeta?.stepRef || row.dataset['stepRef'] || '',
178
+ traceRunId: storedMeta?.traceRunId || row.dataset['traceRunId'] || '',
179
+ traceSeq: storedMeta?.traceSeq || Number(row.dataset['traceSeq'] || 0) || undefined,
180
+ detailAvailable: storedMeta?.detailAvailable,
181
+ detailBytes: storedMeta?.detailBytes,
182
+ rawRetentionStatus: storedMeta?.rawRetentionStatus,
183
+ status: storedMeta?.status || processStepStatusFromDom(row.dataset['status']),
139
184
  startTime: Number.isFinite(startTime) && startTime > 0 ? startTime : Date.now(),
140
185
  };
141
186
  }
@@ -153,25 +198,118 @@ function currentProcessBlockFromDom(agentMsg: HTMLElement): ProcessBlockState |
153
198
  };
154
199
  }
155
200
 
156
- function findLegacyRunningMatch(steps: ProcessStep[], step: ProcessStep): ProcessStep | null {
157
- const matches = steps.filter(s => s.status === 'running'
158
- && !s.stepRef
159
- && s.label === step.label
160
- && s.type === step.type);
161
- return matches.length === 1 ? matches[0] : null;
201
+ function processStepToToolLog(step: ProcessStep, finalize = false): ToolLogEntry {
202
+ const detail = getStoredProcessStepDetail(step.id) || step.detail || step.detailPreview || '';
203
+ const status = finalize && step.status === 'running' ? 'done' : step.status;
204
+ return {
205
+ icon: step.rawIcon || step.icon || ICONS.tool,
206
+ rawIcon: step.rawIcon || step.icon || '',
207
+ label: step.label || 'tool',
208
+ detail,
209
+ toolType: step.type,
210
+ stepRef: step.stepRef || '',
211
+ status,
212
+ traceRunId: step.traceRunId || '',
213
+ traceSeq: step.traceSeq,
214
+ detailAvailable: step.detailAvailable,
215
+ detailBytes: step.detailBytes,
216
+ rawRetentionStatus: step.rawRetentionStatus,
217
+ };
162
218
  }
163
219
 
164
- function findRunningProcessStepMatch(steps: ProcessStep[], step: ProcessStep): ProcessStep | null {
165
- const running = [...steps].reverse().filter(s => s.status === 'running');
166
- if (step.stepRef) {
167
- return running.find(s => s.stepRef === step.stepRef)
168
- ?? findLegacyRunningMatch(running, step);
169
- }
170
- return findLegacyRunningMatch(running, step);
220
+ function processStepFromMeta(stepId: string, finalize = false): ToolLogEntry | null {
221
+ const meta = processStepMetaFromStore(stepId);
222
+ if (!meta) return null;
223
+ const status = finalize && meta.status === 'running' ? 'done' : meta.status;
224
+ return {
225
+ icon: meta.rawIcon || meta.icon || ICONS.tool,
226
+ rawIcon: meta.rawIcon || meta.icon || '',
227
+ label: meta.label || 'tool',
228
+ detail: getStoredProcessStepDetail(stepId) || meta.preview || '',
229
+ toolType: meta.type,
230
+ stepRef: meta.stepRef || '',
231
+ status,
232
+ traceRunId: meta.traceRunId || '',
233
+ traceSeq: meta.traceSeq,
234
+ detailAvailable: meta.detailAvailable,
235
+ detailBytes: meta.detailBytes,
236
+ rawRetentionStatus: meta.rawRetentionStatus,
237
+ };
171
238
  }
172
239
 
240
+ function serializeProcessStepsForToolLog(source: ProcessBlockState | HTMLElement | null, finalize = false): ToolLogEntry[] {
241
+ if (!source) return [];
242
+ if ('steps' in source) return source.steps.map(step => processStepToToolLog(step, finalize));
243
+
244
+ const ids = new Set<string>();
245
+ source.querySelectorAll<HTMLElement>('.process-block[data-process-step-ids]').forEach(block => {
246
+ (block.dataset['processStepIds'] || '').split(/\s+/).filter(Boolean).forEach(id => ids.add(id));
247
+ });
248
+ source.querySelectorAll<HTMLElement>('.process-step[data-step-id]').forEach(row => {
249
+ const id = row.dataset['stepId'];
250
+ if (id) ids.add(id);
251
+ });
252
+ const entries: ToolLogEntry[] = [];
253
+ ids.forEach(id => {
254
+ const fromMeta = processStepFromMeta(id, finalize);
255
+ if (fromMeta) {
256
+ entries.push(fromMeta);
257
+ return;
258
+ }
259
+ const row = source.querySelector<HTMLElement>(`.process-step[data-step-id="${CSS.escape(id)}"]`);
260
+ const step = row ? processStepFromDom(row) : null;
261
+ if (step) entries.push(processStepToToolLog(step, finalize));
262
+ });
263
+ return entries;
264
+ }
265
+
266
+ function identityKey(entry: ToolLogEntry, ordinal: number): string {
267
+ const stepRef = String(entry.stepRef || '').trim();
268
+ if (stepRef) return `ref:${stepRef}`;
269
+ return `ord:${entry.toolType || 'tool'}:${entry.label || 'tool'}:${ordinal}`;
270
+ }
271
+
272
+ function mergeExplicitAndLiveToolLogs(explicit: ToolLogEntry[], live: ToolLogEntry[]): ToolLogEntry[] {
273
+ if (explicit.length === 0) return live;
274
+ const merged = new Map<string, ToolLogEntry>();
275
+ const ordinalCounts = new Map<string, number>();
276
+ const keyFor = (entry: ToolLogEntry): string => {
277
+ const base = `${entry.toolType || 'tool'}:${entry.label || 'tool'}`;
278
+ const next = (ordinalCounts.get(base) || 0) + 1;
279
+ ordinalCounts.set(base, next);
280
+ return identityKey(entry, next);
281
+ };
282
+ live.forEach(entry => merged.set(keyFor(entry), entry));
283
+ ordinalCounts.clear();
284
+ explicit.forEach(entry => {
285
+ const key = keyFor(entry);
286
+ const liveEntry = merged.get(key);
287
+ const liveDetail = liveEntry?.detail || '';
288
+ const explicitDetail = entry.detail || '';
289
+ merged.set(key, {
290
+ ...(liveEntry || {}),
291
+ ...entry,
292
+ detail: explicitDetail.length >= liveDetail.length ? explicitDetail : liveDetail,
293
+ status: entry.status || liveEntry?.status || 'done',
294
+ });
295
+ });
296
+ return Array.from(merged.values());
297
+ }
298
+
299
+ function sanitizedToolLogEntries(entries: ToolLogEntry[]): ToolLogEntry[] {
300
+ return sanitizeToolLogForDurableStorage(entries) as ToolLogEntry[];
301
+ }
302
+
303
+ function sanitizedToolLogJsonFromEntries(entries: ToolLogEntry[]): string | null {
304
+ return serializeSanitizedToolLog(entries);
305
+ }
306
+
307
+
173
308
  function removeAgentToolBlocks(agentMsg: HTMLElement): void {
174
- for (const block of agentToolBlocks(agentMsg)) block.remove();
309
+ for (const block of agentToolBlocks(agentMsg)) {
310
+ releaseProcessBlockDetails(block);
311
+ block.remove();
312
+ }
175
313
  }
176
314
 
177
315
  export function setStatus(s: string): void {
@@ -240,7 +378,7 @@ export function addSystemMsg(text: string, extraClass?: string, type?: string):
240
378
  const div = document.createElement('div');
241
379
  const typeClass = type ? ` msg-type-${type}` : '';
242
380
  div.className = 'msg msg-system' + typeClass + (extraClass ? ' ' + extraClass : '');
243
- div.innerHTML = text;
381
+ div.innerHTML = sanitizeHtml(text);
244
382
  if (vs.active) {
245
383
  vs.appendLiveItem(div);
246
384
  } else {
@@ -250,6 +388,8 @@ export function addSystemMsg(text: string, extraClass?: string, type?: string):
250
388
  }
251
389
 
252
390
  export function cleanupToolActivity(): void {
391
+ if (state.currentProcessBlock) releaseProcessBlockDetails(state.currentProcessBlock);
392
+ if (state.currentAgentDiv instanceof HTMLElement) releaseProcessBlockDetails(state.currentAgentDiv);
253
393
  cleanupToolElements();
254
394
  stopBlockTicker();
255
395
  state.currentAgentDiv = null;
@@ -295,15 +435,14 @@ export function showProcessStep(step: ProcessStep): void {
295
435
  const match = findRunningProcessStepMatch(state.currentProcessBlock.steps, step);
296
436
  if (match) {
297
437
  step.icon = emojiToIcon(step.icon);
298
- const mergedDetail = step.detail
299
- ? (match.detail ? `${match.detail}\n${step.detail}` : step.detail)
300
- : match.detail;
438
+ const mergedPreview = mergeStoredProcessStepDetail(match.id, step.detail);
301
439
  replaceStep(state.currentProcessBlock, match.id, {
302
440
  ...match,
303
441
  ...step,
304
442
  id: match.id,
305
443
  rawIcon,
306
- detail: mergedDetail,
444
+ detail: mergedPreview,
445
+ detailPreview: mergedPreview,
307
446
  label: step.label || match.label,
308
447
  status: resolvedStatus,
309
448
  });
@@ -321,7 +460,7 @@ export function showProcessStep(step: ProcessStep): void {
321
460
  id: existingDone.id,
322
461
  rawIcon,
323
462
  status: resolvedStatus,
324
- detail: step.detail,
463
+ detail: mergeStoredProcessStepDetail(existingDone.id, step.detail),
325
464
  });
326
465
  scrollToBottom();
327
466
  return;
@@ -391,11 +530,12 @@ export function hydrateActiveRun(snapshot?: ActiveRunSnapshot | null): void {
391
530
  state.currentAgentDiv = ensureActiveRunMessage(snapshot.cli || null);
392
531
  state.currentProcessBlock = null;
393
532
  const body = state.currentAgentDiv.querySelector('.agent-body') as HTMLElement | null;
394
- if (body && snapshot.toolLog?.length) {
533
+ const snapshotToolLog = sanitizedToolLogEntries(snapshot.toolLog || []);
534
+ if (body && snapshotToolLog.length) {
395
535
  normalizeAgentToolBlocks(state.currentAgentDiv);
396
536
  removeAgentToolBlocks(state.currentAgentDiv);
397
537
  const pb = createProcessBlock(body);
398
- for (const tool of toProcessSteps(snapshot.toolLog, snapshot.startedAt)) addStep(pb, tool);
538
+ for (const tool of toProcessSteps(snapshotToolLog, snapshot.startedAt)) addStep(pb, tool);
399
539
  state.currentProcessBlock = pb;
400
540
  } else {
401
541
  normalizeAgentToolBlocks(state.currentAgentDiv);
@@ -426,8 +566,8 @@ let lastFinalizeTs = 0;
426
566
 
427
567
  function clearMermaidTransientState(root: HTMLElement): void {
428
568
  root.querySelectorAll<HTMLElement>('.mermaid-pending').forEach(el => {
429
- delete el.dataset.mermaidQueued;
430
- delete el.dataset.mermaidQueuedAt;
569
+ delete el.dataset['mermaidQueued'];
570
+ delete el.dataset['mermaidQueuedAt'];
431
571
  });
432
572
  }
433
573
 
@@ -439,6 +579,15 @@ export function finalizeAgent(text: string, toolLog?: ToolLogEntry[]): void {
439
579
  cleanupToolElements();
440
580
  removeSkeleton();
441
581
  if (state.currentAgentDiv) normalizeAgentToolBlocks(state.currentAgentDiv);
582
+ const liveToolLog = serializeProcessStepsForToolLog(
583
+ state.currentProcessBlock ?? state.currentAgentDiv,
584
+ true,
585
+ );
586
+ const explicitToolLog = Array.isArray(toolLog) ? toolLog : [];
587
+ const durableToolLog = sanitizedToolLogEntries(
588
+ mergeExplicitAndLiveToolLogs(explicitToolLog, liveToolLog),
589
+ );
590
+ const durableToolLogJson = sanitizedToolLogJsonFromEntries(durableToolLog);
442
591
  const hadProcessBlock =
443
592
  Boolean(state.currentProcessBlock) ||
444
593
  Boolean(state.currentAgentDiv && hasAgentToolBlock(state.currentAgentDiv));
@@ -446,7 +595,7 @@ export function finalizeAgent(text: string, toolLog?: ToolLogEntry[]): void {
446
595
  collapseBlock(state.currentProcessBlock);
447
596
  state.currentProcessBlock = null;
448
597
  }
449
- const hasTools = toolLog && toolLog.length > 0;
598
+ const hasTools = durableToolLog.length > 0;
450
599
  if (text || hasTools) {
451
600
  if (!state.currentAgentDiv || !state.currentAgentDiv.isConnected) {
452
601
  state.currentAgentDiv = addMessage('agent', '');
@@ -463,7 +612,7 @@ export function finalizeAgent(text: string, toolLog?: ToolLogEntry[]): void {
463
612
  if (contentEl) {
464
613
  contentEl.insertAdjacentHTML(
465
614
  'beforebegin',
466
- buildProcessBlockHtml(toProcessSteps(toolLog!), true),
615
+ buildProcessBlockHtml(toProcessSteps(durableToolLog), true),
467
616
  );
468
617
  }
469
618
  }
@@ -490,14 +639,24 @@ export function finalizeAgent(text: string, toolLog?: ToolLogEntry[]): void {
490
639
  const div = state.currentAgentDiv;
491
640
  clearMermaidTransientState(div);
492
641
  div.querySelectorAll('.diagram-widget').forEach(widget => {
493
- const encoded = (widget as HTMLElement).dataset.widgetHtml;
642
+ const encoded = (widget as HTMLElement).dataset['widgetHtml'];
494
643
  if (!encoded) return;
495
644
  const pending = document.createElement('div');
496
645
  pending.className = 'diagram-widget-pending';
497
- pending.dataset.diagramHtml = encoded;
646
+ pending.dataset['diagramHtml'] = encoded;
498
647
  widget.replaceWith(pending);
499
648
  });
500
- vs.appendLiveItem(div);
649
+ if (durableToolLogJson) {
650
+ vs.appendItem(buildLazyVirtualMessageItem({
651
+ role: 'assistant',
652
+ content: finalText,
653
+ cli: null,
654
+ tool_log: durableToolLogJson,
655
+ }));
656
+ releaseProcessBlockDetails(div);
657
+ } else {
658
+ vs.appendLiveItem(div);
659
+ }
501
660
  div.remove();
502
661
  }
503
662
 
@@ -505,7 +664,7 @@ export function finalizeAgent(text: string, toolLog?: ToolLogEntry[]): void {
505
664
  if (finalText) upsertMessage({
506
665
  role: 'assistant',
507
666
  content: finalText,
508
- tool_log: toolLog ? JSON.stringify(toolLog) : null,
667
+ tool_log: durableToolLogJson,
509
668
  timestamp: Date.now(),
510
669
  }).catch(() => {});
511
670
  }
@@ -663,7 +822,7 @@ export function showChatRestoreIndicator(reason: string): void {
663
822
  indicator.innerHTML = '<span class="chat-restore-dot"></span><span class="chat-restore-text">Restoring</span>';
664
823
  host.appendChild(indicator);
665
824
  }
666
- indicator.dataset.restoreReason = reason;
825
+ indicator.dataset['restoreReason'] = reason;
667
826
  }
668
827
 
669
828
  export function hideChatRestoreIndicator(): void {
@@ -768,21 +927,26 @@ export async function loadStats(): Promise<void> {
768
927
 
769
928
  // ── Virtual scroll bootstrap helpers ──
770
929
 
771
- function buildVirtualHistoryItems(msgs: MessageItem[]): VirtualItem[] {
772
- return msgs.map((m) => {
930
+ function buildLazyVirtualMessageItem(m: MessageItem): VirtualItem {
773
931
  const role = m.role === 'assistant' ? 'agent' : m.role;
774
932
  const rawContent = stripOrchestration(
775
933
  role === 'user' ? formatUserPrompt(m.content) : m.content,
776
934
  );
777
935
  const label = escapeHtml(role === 'user' ? t('msg.you') : getAppName());
778
- const rawToolLog = m.role === 'assistant' && m.tool_log ? escapeHtml(m.tool_log) : '';
936
+ const sanitizedToolLog = m.role === 'assistant' && m.tool_log
937
+ ? sanitizedToolLogJson(m.tool_log)
938
+ : null;
939
+ const rawToolLog = sanitizedToolLog ? escapeHtml(sanitizedToolLog) : '';
779
940
  const toolAttr = rawToolLog ? ` data-tool-log="${rawToolLog}"` : '';
780
941
  const contentHtml = `<div class="msg-content lazy-pending" data-raw="${escapeHtml(rawContent)}"></div>`;
781
942
  const html = role === 'agent'
782
943
  ? `<div class="msg msg-agent"><div class="agent-icon" aria-hidden="true">${getAgentIcon(m.cli)}</div><div class="agent-body"${toolAttr}>${contentHtml}<button class="msg-copy" title="Copy" aria-label="Copy message"></button></div></div>`
783
944
  : `<div class="msg msg-${role}"><div class="user-body"><div class="msg-label">${label}</div>${contentHtml}<button class="msg-copy" title="Copy" aria-label="Copy message"></button></div><div class="user-icon" aria-hidden="true">${getUserAvatarMarkup()}</div></div>`;
784
- return { id: generateId(), html, height: 80 };
785
- });
945
+ return { id: generateId(), html, height: 80, rehydratesProcessDetails: Boolean(rawToolLog) };
946
+ }
947
+
948
+ function buildVirtualHistoryItems(msgs: MessageItem[]): VirtualItem[] {
949
+ return msgs.map((m) => buildLazyVirtualMessageItem(normalizeMessageToolLog(m)));
786
950
  }
787
951
 
788
952
  function registerVirtualScrollCallbacks(vs: ReturnType<typeof getVirtualScroll>): void {
@@ -792,7 +956,7 @@ function registerVirtualScrollCallbacks(vs: ReturnType<typeof getVirtualScroll>)
792
956
  const raw = el.getAttribute('data-raw') || '';
793
957
  const msgEl = el.closest('.msg-agent') as HTMLElement | null;
794
958
  const body = msgEl?.querySelector('.agent-body') as HTMLElement | null;
795
- const rawToolLog = body?.dataset.toolLog || '';
959
+ const rawToolLog = body?.dataset['toolLog'] || '';
796
960
  if (msgEl && body && rawToolLog && !hasAgentToolBlock(msgEl)) {
797
961
  const tools = parseToolLog(rawToolLog);
798
962
  if (tools.length > 0) {
@@ -801,7 +965,7 @@ function registerVirtualScrollCallbacks(vs: ReturnType<typeof getVirtualScroll>)
801
965
  buildProcessBlockHtml(toProcessSteps(tools), true),
802
966
  );
803
967
  }
804
- delete body.dataset.toolLog;
968
+ delete body.dataset['toolLog'];
805
969
  normalizeAgentToolBlocks(msgEl);
806
970
  }
807
971
  el.innerHTML = raw ? renderMarkdown(raw) : '';
@@ -845,15 +1009,16 @@ export async function loadMessages(): Promise<void> {
845
1009
  const msgs = await api<MessageItem[]>('/api/messages');
846
1010
 
847
1011
  if (msgs !== null) {
1012
+ const safeMsgs = msgs.map(normalizeMessageToolLog);
848
1013
  // Successful fetch — clear DOM and render (even if empty array after /clear)
849
1014
  vs.clear();
850
1015
  if (chatEl) chatEl.innerHTML = '';
851
1016
 
852
- if (msgs.length >= VS_THRESHOLD) {
853
- const vsItems = buildVirtualHistoryItems(msgs);
1017
+ if (safeMsgs.length >= VS_THRESHOLD) {
1018
+ const vsItems = buildVirtualHistoryItems(safeMsgs);
854
1019
  bootstrapVirtualHistory(vsItems, makeBootstrapDeps(vs));
855
1020
  } else {
856
- msgs.forEach(m => {
1021
+ safeMsgs.forEach(m => {
857
1022
  const div = addMessage(m.role === 'assistant' ? 'agent' : m.role, m.content, m.cli);
858
1023
  if (m.role === 'assistant') {
859
1024
  const tools = parseToolLog(m.tool_log);
@@ -869,10 +1034,10 @@ export async function loadMessages(): Promise<void> {
869
1034
  });
870
1035
  }
871
1036
  // Sync to IndexedDB (full replace — server is source of truth)
872
- cacheMessages(msgs.map(m => ({
1037
+ cacheMessages(safeMsgs.map(m => ({
873
1038
  role: m.role, content: m.content, cli: m.cli ?? null, tool_log: m.tool_log ?? null, timestamp: Date.now(),
874
1039
  }))).catch(() => {});
875
- updateStatMsgs(msgs.length);
1040
+ updateStatMsgs(safeMsgs.length);
876
1041
  showEmptyState();
877
1042
  return;
878
1043
  }
@@ -885,11 +1050,12 @@ export async function loadMessages(): Promise<void> {
885
1050
  // DOM empty + server down — try IndexedDB cache
886
1051
  const cached = await getScopedMessages();
887
1052
  if (cached.length > 0) {
888
- if (cached.length >= VS_THRESHOLD) {
889
- const vsItems = buildVirtualHistoryItems(cached as MessageItem[]);
1053
+ const safeCached = (cached as MessageItem[]).map(normalizeMessageToolLog);
1054
+ if (safeCached.length >= VS_THRESHOLD) {
1055
+ const vsItems = buildVirtualHistoryItems(safeCached);
890
1056
  bootstrapVirtualHistory(vsItems, makeBootstrapDeps(vs));
891
1057
  } else {
892
- cached.forEach(m => {
1058
+ safeCached.forEach(m => {
893
1059
  const div = addMessage(m.role === 'assistant' ? 'agent' : m.role, m.content, m.cli);
894
1060
  if (m.role === 'assistant' && m.tool_log) {
895
1061
  const tools = parseToolLog(m.tool_log);
@@ -905,7 +1071,7 @@ export async function loadMessages(): Promise<void> {
905
1071
  });
906
1072
  }
907
1073
  addSystemMsg(`${ICONS.warning} ${t('ui.offline.banner')}`);
908
- updateStatMsgs(cached.length);
1074
+ updateStatMsgs(safeCached.length);
909
1075
  }
910
1076
  showEmptyState();
911
1077
  }