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
@@ -1,14 +1,23 @@
1
- import { getActivePage, getCdpSession } from '../connection.js';
1
+ import { getActivePage, getCdpSession, createTab, waitForPageByTargetId, getPageByTargetId, listTabs } from '../connection.js';
2
2
  import { getActiveTab } from '../connection.js';
3
+ import { cleanupIdleTabs, isPinned } from '../tab-lifecycle.js';
4
+ import { stripUndefined } from '../../core/strip-undefined.js';
5
+ import { cleanupPoolTabs, getPooledTab } from './tab-pool.js';
6
+ import { finalizeProviderTab } from './tab-finalizer.js';
7
+ import { listLeases, recordActiveLease } from './tab-lease-store.js';
8
+ import { withSessionCommandLock } from './session-store.js';
3
9
  import { basename } from 'node:path';
4
10
  import { statSync } from 'node:fs';
5
11
  import { countConversationTurns } from './chatgpt-composer.js';
6
12
  import { attachLocalFileLive, verifySentTurnAttachmentLive, } from './chatgpt-attachments.js';
7
13
  import { createChatGptEditorAdapter } from './vendor-editor-contract.js';
8
14
  import { normalizeEnvelope, renderQuestionEnvelope, renderQuestionEnvelopeWithContext } from './question.js';
9
- import { assertSameTarget, createSession, findSessionByTarget, getBaseline, getSession, listSessions, pruneSessions, saveBaseline, updateSessionResult, updateSessionStatus, } from './session.js';
15
+ import { assertSameTarget, bindSessionToTab, createSession, findSessionByTarget, getBaseline, getSession, listSessions, pruneSessions, saveBaseline, updateSessionResult, updateSessionStatus, } from './session.js';
10
16
  import { captureAssistantResponse } from './chatgpt-response.js';
11
17
  import { selectChatGptModel } from './chatgpt-model.js';
18
+ import { withAnswerArtifact } from './answer-artifact.js';
19
+ import { auditSources } from './source-audit.js';
20
+ import { resolveTargetForIntent } from './target-resolver.js';
12
21
  import { listActiveWebAiWatchers, resumeStoredWebAiWatchers, startWebAiWatcher } from './watcher.js';
13
22
  import { captureWebAiDiagnostics, } from './diagnostics.js';
14
23
  import { geminiSend, geminiPoll, geminiStop, geminiStatus } from './gemini-live.js';
@@ -17,6 +26,7 @@ import { ProviderRuntimeDisabledError } from './provider-adapter.js';
17
26
  import { fromCliJawStructuredError, WebAiError } from './errors.js';
18
27
  import { listCapabilitySchemas } from './capability-registry.js';
19
28
  import { prepareContextForBrowser, summarizeContextPack } from './context-pack/index.js';
29
+ import { appendTraceToSession } from './trace-persistence.js';
20
30
  const CHATGPT_HOSTS = new Set(['chatgpt.com', 'chat.openai.com']);
21
31
  const ASSISTANT_SELECTORS = [
22
32
  '[data-message-author-role="assistant"]',
@@ -72,7 +82,7 @@ export async function status(port, input = {}) {
72
82
  const active = await requireVerifiedChatGptTab(port, vendor);
73
83
  inner = { ok: true, vendor: 'chatgpt', status: 'ready', url: active.url, warnings: [] };
74
84
  }
75
- const allRows = listCapabilitySchemas({ vendor: vendor });
85
+ const allRows = listCapabilitySchemas({ vendor });
76
86
  const rows = input.probe
77
87
  ? allRows.filter((row) => row.capabilityId === input.probe)
78
88
  : allRows;
@@ -81,6 +91,117 @@ export async function status(port, input = {}) {
81
91
  capabilities: rows,
82
92
  };
83
93
  }
94
+ async function ensureProviderTab(port, input) {
95
+ const reuseTab = input.reuseTab === true || process.env["JAW_REUSE_TAB"] === '1';
96
+ if (reuseTab) {
97
+ const active = await requireVerifiedChatGptTab(port, input.vendor);
98
+ const page = await requireActivePage(port);
99
+ return { page, targetId: active.targetId };
100
+ }
101
+ const vendor = (input.vendor || 'chatgpt');
102
+ const vendorUrl = input.url || 'https://chatgpt.com';
103
+ await cleanupPoolTabs(port);
104
+ await cleanupIdleTabs(port, { maxTabs: Number.POSITIVE_INFINITY });
105
+ if (input.newTab !== true) {
106
+ const pooled = await getPooledTab(port, vendor, {
107
+ owner: 'cli-jaw',
108
+ sessionType: 'jaw',
109
+ url: vendorUrl,
110
+ });
111
+ if (pooled) {
112
+ const page = await waitForPageByTargetId(port, pooled.targetId);
113
+ if (page.url?.() !== vendorUrl) {
114
+ await page.goto(vendorUrl, { waitUntil: 'domcontentloaded', timeout: 30_000 });
115
+ }
116
+ return { page, targetId: pooled.targetId };
117
+ }
118
+ const reusable = await findReusableChatGptTab(port);
119
+ if (reusable?.targetId) {
120
+ const page = await waitForPageByTargetId(port, reusable.targetId);
121
+ if (page.url?.() !== vendorUrl) {
122
+ await page.goto(vendorUrl, { waitUntil: 'domcontentloaded', timeout: 30_000 });
123
+ }
124
+ return { page, targetId: reusable.targetId };
125
+ }
126
+ }
127
+ const tab = await createTab(port, vendorUrl, { activate: false });
128
+ const page = await waitForPageByTargetId(port, tab.targetId);
129
+ return { page, targetId: tab.targetId };
130
+ }
131
+ async function findReusableChatGptTab(port) {
132
+ const activeSessions = new Set();
133
+ for (const session of [...listSessions({ status: 'sent' }), ...listSessions({ status: 'streaming' })]) {
134
+ if (session.targetId)
135
+ activeSessions.add(session.targetId);
136
+ }
137
+ const leases = await listLeases();
138
+ const leaseByTargetId = new Map(leases.map(lease => [lease.targetId, lease]));
139
+ const tabs = await listTabs(port);
140
+ return tabs
141
+ .filter(tab => tab.targetId && tab.type === 'page')
142
+ .filter(tab => !activeSessions.has(tab.targetId))
143
+ .filter(tab => !isPinned(tab.targetId))
144
+ .filter(tab => isReusableByLease(tab.targetId, leaseByTargetId))
145
+ .filter(tab => isChatGptUrl(tab.url || ''))
146
+ .sort((a, b) => (Number(b.lastActiveAt) || 0) - (Number(a.lastActiveAt) || 0))[0] || null;
147
+ }
148
+ function isReusableByLease(targetId, leaseByTargetId) {
149
+ const lease = leaseByTargetId.get(targetId);
150
+ if (!lease)
151
+ return true;
152
+ return ['cli-jaw', 'web-ai'].includes(lease.owner) &&
153
+ ['pooled', 'completed-session'].includes(lease.state);
154
+ }
155
+ async function withSessionPage(port, sessionId, fn) {
156
+ const session = getSession(sessionId);
157
+ if (!session)
158
+ throw new Error(`Session not found: ${sessionId}`);
159
+ async function resolvePage(forceRecover = false) {
160
+ const current = getSession(sessionId);
161
+ if (!current)
162
+ throw new Error(`Session not found: ${sessionId}`);
163
+ const alive = current.targetId ? !!(await getPageByTargetId(port, current.targetId).catch(() => null)) : false;
164
+ if (!alive || forceRecover) {
165
+ const tab = await createTab(port, current.conversationUrl || current.url || 'https://chatgpt.com', { activate: false });
166
+ const page = await waitForPageByTargetId(port, tab.targetId);
167
+ updateSessionResult({ sessionId, status: current.status, tabState: { createdAt: current.tabState?.createdAt || new Date().toISOString(), lastActiveAt: new Date().toISOString(), recoveryCount: (current.tabState?.recoveryCount || 0) + 1, closeCount: current.tabState?.closeCount || 0 } });
168
+ const recovered = getSession(sessionId);
169
+ return { page, targetId: tab.targetId, session: recovered || current };
170
+ }
171
+ const page = await getPageByTargetId(port, current.targetId);
172
+ if (!page)
173
+ throw new Error(`Session ${sessionId} page not found for targetId ${current.targetId}`);
174
+ return { page, targetId: current.targetId, session: current };
175
+ }
176
+ const first = await resolvePage();
177
+ try {
178
+ return await fn(first);
179
+ }
180
+ catch (err) {
181
+ const msg = errorMessage(err).toLowerCase();
182
+ const isPageDeath = msg.includes('target closed') || msg.includes('page closed') || msg.includes('browser has been closed') || msg.includes('crash');
183
+ if (!isPageDeath)
184
+ throw err;
185
+ const recovered = await resolvePage(true);
186
+ return fn(recovered);
187
+ }
188
+ }
189
+ async function runBoundCommand(port, command, input, pollFn, stopFn) {
190
+ if (['poll', 'stop'].includes(command) && input.session) {
191
+ const sessionId = input.session;
192
+ return withSessionCommandLock(sessionId, async () => {
193
+ return withSessionPage(port, sessionId, async ({ session }) => {
194
+ const boundInput = { ...input, vendor: session.vendor, session: session.sessionId };
195
+ return command === 'poll' ? pollFn(port, boundInput) : stopFn(port, boundInput);
196
+ });
197
+ });
198
+ }
199
+ if (command === 'poll')
200
+ return pollFn(port, input);
201
+ if (command === 'stop')
202
+ return stopFn(port, input);
203
+ throw new Error(`runBoundCommand: unsupported command ${command}`);
204
+ }
84
205
  export async function send(port, input = {}) {
85
206
  const requestedVendor = parseVendor(input.vendor);
86
207
  if (requestedVendor === 'gemini') {
@@ -99,39 +220,49 @@ export async function send(port, input = {}) {
99
220
  throw stageError(e, 'send-click');
100
221
  }
101
222
  }
102
- await navigateRequestedConversation(port, input.url, 'chatgpt');
103
223
  const envelope = normalizeEnvelope(input);
104
- const active = await requireVerifiedChatGptTab(port, envelope.vendor);
105
- const page = await requireActivePage(port);
224
+ const { page, targetId } = await ensureProviderTab(port, input);
106
225
  const contextPack = await prepareContextForBrowser(input);
107
226
  const rendered = contextPack
108
227
  ? contextPack.transport === 'inline'
109
228
  ? renderQuestionEnvelopeWithContext(envelope, contextPack.composerText)
110
229
  : renderQuestionEnvelope(envelope)
111
230
  : renderQuestionEnvelope(envelope);
112
- const selectedModel = await selectChatGptModel(page, input.model);
231
+ const selectedModel = await selectChatGptModel(page, input.model, stripUndefined({ effort: input.reasoningEffort }));
113
232
  await waitForStableAssistantCount(page);
114
233
  const assistantCount = await countAssistantMessages(page);
115
234
  const baseline = saveBaseline({
116
235
  vendor: envelope.vendor,
117
- targetId: active.targetId,
118
- url: active.url,
236
+ targetId,
237
+ url: page.url(),
119
238
  envelope,
120
239
  assistantCount,
121
240
  textHash: String((await page.innerText('body').catch(() => '')).length),
122
241
  });
123
242
  const session = createSession({
124
243
  vendor: envelope.vendor,
125
- targetId: active.targetId,
126
- url: active.url,
127
- conversationUrl: active.url,
244
+ targetId,
245
+ url: page.url(),
246
+ conversationUrl: page.url(),
128
247
  envelope,
129
248
  assistantCount,
130
249
  timeoutMs: 600_000,
131
250
  });
251
+ bindSessionToTab(session.sessionId, targetId);
252
+ await recordActiveLease({
253
+ owner: 'cli-jaw',
254
+ vendor: envelope.vendor,
255
+ sessionType: 'jaw',
256
+ port,
257
+ targetId,
258
+ sessionId: session.sessionId,
259
+ url: page.url(),
260
+ });
132
261
  const adapter = createChatGptEditorAdapter(page, {
133
262
  insertText: async (text) => {
134
263
  const cdp = await getCdpSession(port);
264
+ if (!cdp)
265
+ throw new Error('No CDP session available for text insertion');
135
266
  try {
136
267
  await cdp.send('Input.insertText', { text });
137
268
  }
@@ -141,6 +272,13 @@ export async function send(port, input = {}) {
141
272
  },
142
273
  });
143
274
  try {
275
+ const composerTarget = await resolveTargetForIntent(page, {
276
+ provider: envelope.vendor,
277
+ intentId: 'composer.fill',
278
+ });
279
+ if (!composerTarget.ok && composerTarget.required) {
280
+ throw new Error(`composer target unresolved: ${composerTarget.errorCode || 'unknown'}`);
281
+ }
144
282
  await adapter.waitForReady();
145
283
  const commitBaseline = { turnsCount: await countConversationTurns(page).catch(() => assistantCount) };
146
284
  await adapter.insertPrompt(rendered.composerText);
@@ -150,11 +288,22 @@ export async function send(port, input = {}) {
150
288
  }
151
289
  const uploadPath = input.filePath || contextAttachmentPath;
152
290
  if (uploadPath) {
291
+ await resolveTargetForIntent(page, {
292
+ provider: envelope.vendor,
293
+ intentId: 'upload.attach',
294
+ }).catch(() => null);
153
295
  const info = localFileInfo(uploadPath);
154
296
  const uploaded = await attachLocalFileLive(page, info);
155
297
  if (!uploaded.ok)
156
298
  throw new Error(uploaded.error);
157
299
  }
300
+ const sendTarget = await resolveTargetForIntent(page, {
301
+ provider: envelope.vendor,
302
+ intentId: 'send.click',
303
+ });
304
+ if (!sendTarget.ok && sendTarget.required) {
305
+ throw new Error(`send target unresolved: ${sendTarget.errorCode || 'unknown'}`);
306
+ }
158
307
  await adapter.submitPrompt();
159
308
  await adapter.verifyPromptCommitted(rendered.composerText, commitBaseline);
160
309
  if (uploadPath) {
@@ -168,11 +317,11 @@ export async function send(port, input = {}) {
168
317
  updateSessionStatus(session.sessionId, 'error');
169
318
  throw stageError(e, 'send-click');
170
319
  }
171
- return {
320
+ return stripUndefined({
172
321
  ok: true,
173
322
  vendor: envelope.vendor,
174
323
  status: 'sent',
175
- url: active.url,
324
+ url: page.url(),
176
325
  baseline,
177
326
  sessionId: session.sessionId,
178
327
  ...(contextPack ? { contextPack: summarizeContextPack(contextPack) } : {}),
@@ -182,8 +331,9 @@ export async function send(port, input = {}) {
182
331
  ...(contextPack?.warnings || []),
183
332
  ...(contextPack?.attachments?.[0] ? [`context package attached: ${contextPack.attachments[0].displayPath}`] : []),
184
333
  ...(selectedModel ? [`model selected: ${selectedModel.selected}${selectedModel.alreadySelected ? ' (already selected)' : ''}`] : []),
334
+ ...(selectedModel?.effort ? [`reasoning effort selected: ${selectedModel.effort}`] : []),
185
335
  ],
186
- };
336
+ });
187
337
  }
188
338
  function localFileInfo(filePath) {
189
339
  const stat = statSync(filePath);
@@ -195,11 +345,11 @@ export async function poll(port, input = {}) {
195
345
  const vendor = parseVendor(input.vendor);
196
346
  if (vendor === 'gemini') {
197
347
  try {
198
- return await geminiPoll(port, {
348
+ return decorateCompletedOutput(await geminiPoll(port, stripUndefined({
199
349
  timeout: input.timeout,
200
350
  session: input.session,
201
351
  allowCopyMarkdownFallback: input.allowCopyMarkdownFallback === true,
202
- });
352
+ })), input, 'poll');
203
353
  }
204
354
  catch (e) {
205
355
  throw stageError(e, 'poll-timeout');
@@ -207,19 +357,31 @@ export async function poll(port, input = {}) {
207
357
  }
208
358
  if (vendor === 'grok') {
209
359
  try {
210
- return await grokPoll(port, {
360
+ return decorateCompletedOutput(await grokPoll(port, stripUndefined({
211
361
  timeout: input.timeout,
212
362
  session: input.session,
213
363
  allowCopyMarkdownFallback: input.allowCopyMarkdownFallback === true,
214
- });
364
+ })), input, 'poll');
215
365
  }
216
366
  catch (e) {
217
367
  throw stageError(e, 'poll-timeout');
218
368
  }
219
369
  }
220
- const active = await requireVerifiedChatGptTab(port, vendor);
221
- let session = input.session ? getSession(input.session) : findSessionByTarget(vendor, active.targetId);
222
- const baseline = getBaseline(vendor, active.targetId);
370
+ let page;
371
+ let targetId;
372
+ let session = input.session ? getSession(input.session) : null;
373
+ if (session) {
374
+ const ctx = await withSessionPage(port, session.sessionId, async (c) => c);
375
+ page = ctx.page;
376
+ targetId = ctx.targetId;
377
+ }
378
+ else {
379
+ const active = await requireVerifiedChatGptTab(port, vendor);
380
+ targetId = active.targetId;
381
+ page = await requireActivePage(port);
382
+ session = findSessionByTarget(vendor, targetId);
383
+ }
384
+ const baseline = getBaseline(vendor, targetId);
223
385
  if (!baseline)
224
386
  throw new WebAiError({
225
387
  errorCode: 'provider.poll-timeout',
@@ -229,8 +391,8 @@ export async function poll(port, input = {}) {
229
391
  message: 'baseline required. Run web-ai send or query first.',
230
392
  });
231
393
  if (session)
232
- assertSameTarget(session, active.targetId);
233
- const page = await requireActivePage(port);
394
+ assertSameTarget(session, targetId);
395
+ const currentUrl = page.url?.() || session?.url || 'https://chatgpt.com';
234
396
  const timeoutMs = Math.max(1, Number(input.timeout || 1200)) * 1000;
235
397
  const result = await captureAssistantResponse(page, {
236
398
  minTurnIndex: baseline.assistantCount,
@@ -242,57 +404,150 @@ export async function poll(port, input = {}) {
242
404
  updateSessionStatus(session.sessionId, 'complete');
243
405
  if (session && !result.ok)
244
406
  updateSessionStatus(session.sessionId, 'timeout');
407
+ const traceSummary = session
408
+ ? appendTraceToSession(session.sessionId, (result.resolverTrace || []))
409
+ : null;
245
410
  if (result.canvas) {
246
- if (session)
247
- updateSessionResult({ sessionId: session.sessionId, status: 'complete', url: active.url, conversationUrl: active.url, answerText: result.answerText });
248
- return {
411
+ if (session) {
412
+ await finalizeProviderTab({ vendor, session, port, url: currentUrl, answerText: result.answerText || '' });
413
+ }
414
+ const output = decorateCompletedOutput(stripUndefined({
249
415
  ok: true,
250
416
  vendor,
251
417
  status: 'complete',
252
- url: active.url,
418
+ url: currentUrl,
253
419
  answerText: result.answerText,
254
420
  canvas: result.canvas,
255
421
  baseline,
256
422
  ...(session ? { sessionId: session.sessionId } : {}),
423
+ ...(traceSummary ? { traceSummary } : {}),
257
424
  usedFallbacks: result.usedFallbacks,
258
425
  warnings: result.warnings,
259
- };
426
+ }), input, 'poll');
427
+ if (session)
428
+ updateSessionResult(stripUndefined({
429
+ sessionId: session.sessionId,
430
+ status: 'complete',
431
+ answerText: output.answerText,
432
+ answerArtifact: output.answerArtifact,
433
+ sourceAudit: output.sourceAudit,
434
+ }));
435
+ return output;
260
436
  }
261
437
  if (result.ok) {
262
- if (session)
263
- updateSessionResult({ sessionId: session.sessionId, status: 'complete', url: active.url, conversationUrl: active.url, answerText: result.answerText });
264
- return {
438
+ if (session) {
439
+ await finalizeProviderTab({ vendor, session, port, url: currentUrl, answerText: result.answerText || '' });
440
+ }
441
+ const output = decorateCompletedOutput(stripUndefined({
265
442
  ok: true,
266
443
  vendor,
267
444
  status: 'complete',
268
- url: active.url,
445
+ url: currentUrl,
269
446
  answerText: result.answerText,
270
447
  baseline,
271
448
  ...(session ? { sessionId: session.sessionId } : {}),
449
+ ...(traceSummary ? { traceSummary } : {}),
272
450
  usedFallbacks: result.usedFallbacks,
273
451
  warnings: result.warnings,
274
- };
452
+ }), input, 'poll');
453
+ if (session)
454
+ updateSessionResult(stripUndefined({
455
+ sessionId: session.sessionId,
456
+ status: 'complete',
457
+ answerText: output.answerText,
458
+ answerArtifact: output.answerArtifact,
459
+ sourceAudit: output.sourceAudit,
460
+ }));
461
+ return output;
275
462
  }
276
463
  return {
277
464
  ok: false,
278
465
  vendor,
279
466
  status: 'timeout',
280
- url: active.url,
467
+ url: currentUrl,
281
468
  baseline,
282
469
  ...(session ? { sessionId: session.sessionId, next: 'poll' } : {}),
470
+ ...(traceSummary ? { traceSummary } : {}),
283
471
  usedFallbacks: result.usedFallbacks,
284
472
  warnings: result.warnings,
285
473
  error: 'timed out waiting for answer',
286
474
  };
287
475
  }
476
+ function decorateCompletedOutput(result, input, command) {
477
+ const withArtifact = withAnswerArtifact(result, {
478
+ provider: result.vendor || input.vendor,
479
+ sessionId: result.sessionId,
480
+ conversationUrl: result.url,
481
+ });
482
+ if (input.requireSourceAudit !== true)
483
+ return withArtifact;
484
+ const answerText = withArtifact.answerText || withArtifact.answerArtifact?.text || withArtifact.answerArtifact?.markdown || '';
485
+ if (!answerText && withArtifact.ok === false)
486
+ return withArtifact;
487
+ if (!answerText) {
488
+ throw new WebAiError({
489
+ errorCode: 'source-audit.answer-missing',
490
+ stage: 'source-audit',
491
+ vendor: result.vendor || parseVendor(input.vendor),
492
+ retryHint: 'poll-or-disable-audit',
493
+ message: `source audit requires completed answer text for web-ai ${command}`,
494
+ mutationAllowed: false,
495
+ evidence: { status: result.status || null },
496
+ });
497
+ }
498
+ const sourceAudit = auditSources(answerText, {
499
+ requiredSourceRatio: parseSourceAuditRatio(input.sourceAuditRatio),
500
+ checkedScope: input.sourceAuditScope || null,
501
+ checkedDate: input.sourceAuditDate || null,
502
+ });
503
+ withArtifact.sourceAudit = sourceAudit;
504
+ if (!sourceAudit.ok) {
505
+ throw new WebAiError({
506
+ errorCode: 'source-audit.failed',
507
+ stage: 'source-audit',
508
+ vendor: result.vendor || parseVendor(input.vendor),
509
+ retryHint: 'add-inline-sources-or-disable-audit',
510
+ message: `source audit failed: ${sourceAudit.gaps.map(gap => gap.code).join(', ')}`,
511
+ mutationAllowed: false,
512
+ evidence: {
513
+ gaps: sourceAudit.gaps,
514
+ claimCount: sourceAudit.claims.length,
515
+ unsourcedClaimCount: sourceAudit.unsourcedClaims.length,
516
+ checkedScope: sourceAudit.checkedScope,
517
+ checkedDate: sourceAudit.checkedDate,
518
+ },
519
+ });
520
+ }
521
+ return withArtifact;
522
+ }
523
+ function parseSourceAuditRatio(value) {
524
+ if (value === undefined || value === null || value === '')
525
+ return 1;
526
+ const parsed = Number(value);
527
+ if (!Number.isFinite(parsed) || parsed < 0 || parsed > 1) {
528
+ throw new WebAiError({
529
+ errorCode: 'source-audit.invalid-ratio',
530
+ stage: 'source-audit',
531
+ retryHint: 'fix-source-audit-ratio',
532
+ message: '--source-audit-ratio must be a number between 0 and 1',
533
+ mutationAllowed: false,
534
+ evidence: { value },
535
+ });
536
+ }
537
+ return parsed;
538
+ }
288
539
  export async function query(port, input = {}) {
289
540
  const sent = await send(port, input);
290
- const result = await poll(port, {
541
+ const result = await poll(port, stripUndefined({
291
542
  vendor: sent.vendor,
292
543
  timeout: input.timeout,
293
544
  session: sent.sessionId,
294
545
  allowCopyMarkdownFallback: input.allowCopyMarkdownFallback,
295
- });
546
+ requireSourceAudit: input.requireSourceAudit,
547
+ sourceAuditRatio: input.sourceAuditRatio,
548
+ sourceAuditScope: input.sourceAuditScope,
549
+ sourceAuditDate: input.sourceAuditDate,
550
+ }));
296
551
  return {
297
552
  ...result,
298
553
  usedFallbacks: [...(sent.usedFallbacks || []), ...(result.usedFallbacks || [])],
@@ -310,7 +565,7 @@ export async function watch(port, input = {}) {
310
565
  sessionId: input.session,
311
566
  timeoutMs: Math.max(1, Number(input.timeout || 1200)) * 1000,
312
567
  pollIntervalSeconds: Number(input.pollIntervalSeconds || 30),
313
- allowCopyMarkdownFallback: input.allowCopyMarkdownFallback,
568
+ ...(input.allowCopyMarkdownFallback !== undefined ? { allowCopyMarkdownFallback: input.allowCopyMarkdownFallback } : {}),
314
569
  pollOnce: (pollInput) => poll(port, pollInput),
315
570
  });
316
571
  return {
@@ -337,7 +592,7 @@ export function resumeStoredWatchers(port, input = {}) {
337
592
  const vendor = input.vendor ? parseVendor(input.vendor) : undefined;
338
593
  const resumed = resumeStoredWebAiWatchers({
339
594
  port,
340
- vendor,
595
+ ...(vendor ? { vendor } : {}),
341
596
  pollIntervalSeconds: Number(input.pollIntervalSeconds || 30),
342
597
  pollOnce: (pollInput) => poll(port, pollInput),
343
598
  });
@@ -351,22 +606,22 @@ export function resumeStoredWatchers(port, input = {}) {
351
606
  }
352
607
  export async function sessions(input = {}) {
353
608
  const vendor = input.vendor ? parseVendor(input.vendor) : undefined;
354
- const status = input.status;
609
+ const status = parseSessionStatus(input.status);
355
610
  return {
356
611
  ok: true,
357
612
  vendor: vendor || 'chatgpt',
358
613
  status: 'ready',
359
- sessions: listSessions({ vendor, status }),
614
+ sessions: listSessions(stripUndefined({ vendor, status })),
360
615
  warnings: [],
361
616
  };
362
617
  }
363
618
  export async function sessionsPrune(input = {}) {
364
619
  const ms = typeof input.olderThanMs === 'string' ? Number(input.olderThanMs) : input.olderThanMs;
365
- const result = pruneSessions({
620
+ const result = pruneSessions(stripUndefined({
366
621
  ...(typeof ms === 'number' && Number.isFinite(ms) ? { olderThanMs: ms } : {}),
367
622
  ...(input.before ? { before: input.before } : {}),
368
- ...(input.status ? { status: input.status } : {}),
369
- });
623
+ ...(parseSessionStatus(input.status) ? { status: parseSessionStatus(input.status) } : {}),
624
+ }));
370
625
  return {
371
626
  ok: true,
372
627
  vendor: 'chatgpt',
@@ -393,15 +648,27 @@ export async function stop(port, input = {}) {
393
648
  throw stageError(e, 'send-click');
394
649
  }
395
650
  }
396
- const active = await requireVerifiedChatGptTab(port, vendor);
397
- const page = await requireActivePage(port);
398
- const session = findSessionByTarget(vendor, active.targetId);
651
+ let page;
652
+ let targetId;
653
+ let session = input.session ? getSession(input.session) : null;
654
+ if (session) {
655
+ const ctx = await withSessionPage(port, session.sessionId, async (c) => c);
656
+ page = ctx.page;
657
+ targetId = ctx.targetId;
658
+ }
659
+ else {
660
+ const active = await requireVerifiedChatGptTab(port, vendor);
661
+ targetId = active.targetId;
662
+ page = await requireActivePage(port);
663
+ session = findSessionByTarget(vendor, targetId);
664
+ }
399
665
  if (session)
400
- assertSameTarget(session, active.targetId);
666
+ assertSameTarget(session, targetId);
401
667
  await page.keyboard.press('Escape');
402
668
  if (session)
403
669
  updateSessionStatus(session.sessionId, 'complete');
404
- return { ok: true, vendor: 'chatgpt', status: 'blocked', url: active.url, warnings: ['sent Escape to stop generation'] };
670
+ const currentUrl = page.url?.() || session?.url || 'https://chatgpt.com';
671
+ return { ok: true, vendor: 'chatgpt', status: 'blocked', url: currentUrl, warnings: ['sent Escape to stop generation'] };
405
672
  }
406
673
  export async function diagnose(port, input = {}) {
407
674
  const vendor = parseVendor(input.vendor);
@@ -445,6 +712,15 @@ function parseVendor(vendor) {
445
712
  evidence: { vendor },
446
713
  });
447
714
  }
715
+ function parseSessionStatus(status) {
716
+ if (status === 'sent' || status === 'streaming' || status === 'complete' || status === 'timeout' || status === 'error') {
717
+ return status;
718
+ }
719
+ return undefined;
720
+ }
721
+ function errorMessage(error) {
722
+ return error instanceof Error ? error.message : String(error ?? '');
723
+ }
448
724
  async function requireVerifiedChatGptTab(port, vendor) {
449
725
  const parsed = parseVendor(vendor);
450
726
  if (parsed === 'gemini') {