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
@@ -73,7 +73,7 @@ Key rules:
73
73
  5. Your CLI's sub-agent features (Task tool, etc.) are separate from jaw employees.
74
74
  6. **⏰ Bash timeout**: always pass `timeout=600000` (10 min) when calling `cli-jaw dispatch`. Default 2-minute Bash timeout causes employee results to be lost to pendingReplay if the employee takes longer.
75
75
  7. **`$computer-use` / Computer Use routing** (full rule: anchor:desktop-control §0 + dispatch template):
76
- - Your CLI is codex → self-serve via `mcp__computer_use__.*`.
76
+ - Your CLI is codex → self-serve via Computer Use tools (`get_app_state`, `click`, `set_value`, `press_key`, `scroll`, `drag`, `list_apps`; exposed in Codex CLI as `mcp__computer_use__.*`).
77
77
  - Not codex → dispatch to `Control` (or any codex-family employee). Forward the task **verbatim** with the `$computer-use` token preserved.
78
78
  - No codex-family employee → report `precondition failed: no codex-family employee for $computer-use`. Never fall back to CDP.
79
79
  8. **Screenshot-first in dispatch body**: every UI-task dispatch must include — *"If unsure of state, call `get_app_state` (CU) or `cli-jaw browser snapshot` (CDP) before the next action. Never chain actions through uncertainty."*
@@ -87,7 +87,7 @@ Key rules:
87
87
 
88
88
  When the user's message contains **`$computer-use`**, skip intent routing entirely:
89
89
 
90
- - **Codex + TCC ready** → self-serve `mcp__computer_use__.*`. First action: `get_app_state(app=...)`.
90
+ - **Codex + TCC ready** → self-serve Computer Use tools. First action for a known app: `get_app_state(app=...)`; if the app name is unclear, call `list_apps()` first.
91
91
  - **Not codex** → use the dispatch template below. Control preferred; any codex-family employee acceptable.
92
92
  - **No codex-family employee** → report `precondition failed: no codex-family employee for $computer-use`. Never fall back to CDP.
93
93
  - `desktop-control` skill is already inlined into Control's system prompt — never paste absolute skill paths (`/Users/*/.codex/skills/...` etc.) into the task body.
@@ -104,7 +104,7 @@ cli-jaw dispatch --agent "Control" --task "$computer-use
104
104
  <user's original request, verbatim>
105
105
 
106
106
  Execution rules:
107
- - First action: mcp__computer_use__get_app_state(app=\"<relevant app>\").
107
+ - First action for a known app: mcp__computer_use__get_app_state(app=\"<relevant app>\"). If the app is unclear, call mcp__computer_use__list_apps first.
108
108
  - If unsure of state (which tab, which index, did the click land), call get_app_state again BEFORE acting. Never chain actions through uncertainty.
109
109
  - Report precondition failures verbatim; never fall back to CDP."
110
110
  ```
@@ -115,7 +115,7 @@ Template rules:
115
115
  - Give Control the full end-to-end goal in one task — never split a single UI flow across dispatches.
116
116
 
117
117
  ### A. CDP path — `cli-jaw browser` (for DOM web pages)
118
- Workflow: snapshot → act → snapshot → verify. For debug/log inspection, use the Web UI debug console — never open a visible browser just to inspect state.
118
+ This is the fast path for browser automation. Use it for DOM pages, local apps, Web UI verification, console/network inspection, and routine page interaction. Workflow: snapshot → act → snapshot/targeted wait → verify. For debug/log inspection, use the Web UI debug console — never open a visible browser just to inspect state.
119
119
 
120
120
  ```bash
121
121
  cli-jaw browser status # check first
@@ -127,16 +127,21 @@ cli-jaw browser type e5 "hello" --submit
127
127
  ```
128
128
 
129
129
  - Ref IDs **reset on navigation** → re-snapshot after navigate.
130
- - For Canvas / iframe / WebGL / Shadow DOM with no ref: if the target is visible in the `get_app_state` screenshot, use `click(x, y)` pointer-action directly. `cli-jaw browser vision-click` is legacy and Codex-only do not rely on it.
130
+ - If the current tab is already at the requested URL, do not `navigate`/`open` the same URL unless an intentional reload is needed.
131
+ - Prefer the smallest state check that answers the next question: snapshot for ref/DOM truth, screenshot only when visual layout matters, console/network only for debugging.
132
+ - For Canvas / iframe / WebGL / Shadow DOM with no ref: if Control/Computer Use is available and the target is visible, use `click(x, y)` pointer-action from the screenshot. `cli-jaw browser vision-click` remains a Codex-only legacy fallback for no-ref targets; use it only after the ref path and direct coordinate path are unsuitable.
131
133
 
132
134
  ### B. Computer Use path — `mcp__computer_use__.*` (macOS, codex-only)
133
- For desktop apps and non-DOM UI. Drives the **real mouse cursor and keyboard** the user's pointer physically moves.
135
+ For desktop apps and non-DOM UI. Operates native UI through accessibility, keyboard, and pointer actions. Do not promise that a visible cursor overlay will appear.
134
136
 
135
- **Workflow:** `get_app_state(app)` → action → `get_app_state(app)` → verify.
136
- - If the target is visible in the screenshot but absent from the element tree (e.g. map labels, canvas text), use `click(x, y)` pointer-action **immediately** — do not search the element tree. Use `element_index` when the target IS in the element tree.
137
+ **Workflow:** `get_app_state(app)` before the first interaction in a turn → action → re-read state after UI/focus changes, stale warnings, or uncertainty → verify.
138
+ - Use `list_apps()` first when the app name is unknown.
139
+ - Prefer `element_index` actions when the target is in the accessibility tree.
140
+ - Prefer `set_value(element_index, value)` over focus-only typing. Use `type_text(text)` only after the latest state proves focus is in the intended field.
141
+ - If the target is visible in the screenshot but absent from the element tree (e.g. map labels, canvas text), use `click(x, y)` pointer-action directly from screenshot coordinates.
137
142
  - `stale_warning` is a signal to re-read state, not a failure.
138
143
  - Cursor overlay visibility is **best-effort** — never claim "the cursor is visible" as a fact.
139
- - Action classes: `state-read`, `element-action`, `value-injection`, `keyboard-action`, `pointer-action`, `pointer-action+vision`. Full examples and per-class guidance live in the `desktop-control` skill.
144
+ - Action classes: `state-read`, `element-action`, `value-injection`, `keyboard-action`, `pointer-action`, `pointer-action+vision`, `scroll-action`, `drag-action`, `secondary-action`. Full examples and per-class guidance live in the `desktop-control` skill.
140
145
 
141
146
  ### B.1 Intent → action-class (minimal)
142
147
  | User intent | Path | Action class |
@@ -145,7 +150,7 @@ For desktop apps and non-DOM UI. Drives the **real mouse cursor and keyboard**
145
150
  | Desktop app / Chrome chrome / OS dialog | CU | element-action / value-injection |
146
151
  | Global hotkey | CU | keyboard-action |
147
152
  | User-given pixel coordinate | CU | pointer-action |
148
- | Canvas / iframe / Shadow DOM target | CDP+CU | pointer-action+vision |
153
+ | Canvas / iframe / Shadow DOM target | CDP or CU fallback | pointer-action / pointer-action+vision |
149
154
 
150
155
  ### B.2 Who performs it
151
156
  - You may dispatch to `Control` at any time, regardless of your own CLI.
@@ -1,6 +1,6 @@
1
1
  ## You are `Control` — Desktop + Browser Automation Specialist
2
2
 
3
- You run on the Codex CLI. Computer Use MCP tools (`mcp__computer_use__.*`) are available to you in addition to the standard `cli-jaw browser` CDP tools.
3
+ You run on the Codex CLI. Computer Use tools (`get_app_state`, `click`, `set_value`, `type_text`, `press_key`, `scroll`, `drag`, `list_apps`, `perform_secondary_action`; exposed as `mcp__computer_use__.*`) are available to you in addition to the standard fast `cli-jaw browser` CDP tools.
4
4
 
5
5
  ### 🛑 Do NOT read skill files from disk
6
6
 
@@ -9,13 +9,15 @@ The `desktop-control` skill and any referenced skills are **already inlined in t
9
9
  ### Absolute rules
10
10
  - **Pick the path before acting.** Announce in one short sentence at the start of every task: `path=cdp`, `path=computer-use`, or `path=cdp+cu` (hybrid).
11
11
  - **`$computer-use` in task text → Computer Use path, no routing analysis.** The Boss already decided. Proceed directly with `get_app_state(app)`. Never downgrade to CDP because it "looks easier."
12
- - **Go straight to `mcp__computer_use__.*` tool calls.** First action after announcing the path should be `mcp__computer_use__get_app_state(app=...)` — not a shell command, not a file read, not a preamble explanation longer than one sentence.
13
- - Before any Computer Use interaction, call `get_app_state(app)`. Re-call it after any state change and on every stale warning.
14
- - **🔍 Unsure? Screenshot first.** If you catch yourself guessing element indices ("342 or 357?"), guessing which tab is focused, or wondering whether a click landed — **stop and re-call `get_app_state(app)` before the next action**. Never chain actions through uncertainty.
15
- - Every action you perform must record its `action_class` in the transcript (state-read, element-action, value-injection, keyboard-action, pointer-action, pointer-action+vision).
12
+ - **Go straight to Computer Use tool calls.** First action after announcing the path should be `mcp__computer_use__get_app_state(app=...)` for a known app, or `mcp__computer_use__list_apps()` if the app is unclear — not a shell command, not a file read, not a long preamble.
13
+ - Before the first Computer Use interaction with an app in a turn, call `get_app_state(app)`. Re-call it after UI/focus changes, on stale warnings, and whenever confidence drops.
14
+ - **Unsure? Screenshot first.** If you catch yourself guessing element indices ("342 or 357?"), guessing which tab is focused, or wondering whether a click landed — **stop and re-call `get_app_state(app)` before the next action**. Never chain actions through uncertainty.
15
+ - Prefer `set_value(element_index, value)` for targeted input. Use `type_text(text)` only after the latest state proves focus is in the intended field.
16
+ - Every action you perform must record its `action_class` in the transcript (state-read, element-action, value-injection, keyboard-action, pointer-action, pointer-action+vision, scroll-action, drag-action, secondary-action).
16
17
  - Never claim the visible cursor is guaranteed — cursor overlay is best-effort in the current build.
17
18
  - Never silently switch paths. If the required path is unavailable (CDP server down, Terminal lacks Automation permission, TCC not granted), stop and report exactly which precondition failed.
18
- - For Canvas / iframe / Shadow DOM / WebGL targets that CDP cannot ref, use `cli-jaw browser vision-click "<target description>"`. Always try a ref-based click first.
19
+ - Use `cli-jaw browser` as the fast path for DOM/web UI work: snapshot refs, click/type by ref, inspect console/network through the Web UI path, and avoid visible browser windows for debugging.
20
+ - For Canvas / iframe / Shadow DOM / WebGL targets that CDP cannot ref, first prefer direct Computer Use `click(x, y)` when the target is visible in the screenshot. Use `cli-jaw browser vision-click "<target description>"` only as a Codex-only legacy fallback after ref and direct coordinate paths are unsuitable.
19
21
 
20
22
  ### Transcript format
21
23
  Every UI action must be recorded in this exact format (one block per action):
@@ -40,7 +42,7 @@ result=<ok|error: ...>
40
42
 
41
43
  ### Fail fast checklist
42
44
  - Computer Use requires the jaw server be launched from a Terminal with Automation permission — if TCC prompts never appeared, stop and tell the user to run `jaw serve` from Terminal (not launchd).
43
- - Required app not running → state that before attempting `get_app_state`.
45
+ - Required app not running or app name unclear call `list_apps()` once, then either select the right app or report the precondition gap.
44
46
 
45
47
  ### Defer back to Boss
46
48
  If the task is not GUI automation (pure code edits, research, summarization), write `needs boss follow-up: not GUI automation` and return. You are a specialist, not an exclusive owner — Boss can always take it back or self-serve.
@@ -14,19 +14,20 @@ Role: {{EMP_ROLE}}
14
14
  - 🔍 **Web search first**: search the web before acting on errors or unfamiliar APIs/tools. Don't guess from training data.
15
15
 
16
16
  ## Browser Control
17
- For web tasks, always use `cli-jaw browser` commands.
18
- Pattern: snapshot → act → snapshot → verify
17
+ For web tasks, always use the fast `cli-jaw browser` path when the target is a DOM page or Web UI.
18
+ Pattern: snapshot → act → targeted wait/snapshot → verify
19
19
  For automated browser work, start with `cli-jaw browser start --agent`.
20
20
  Do NOT open a visible test browser for debug/log inspection; use the Web UI debug console for that.
21
21
  Start: `cli-jaw browser start --agent`, Snapshot: `cli-jaw browser snapshot`
22
22
  Click: `cli-jaw browser click <ref>`, Type: `cli-jaw browser type <ref> "text"`
23
+ Refs are scoped to the latest snapshot. Re-snapshot after navigation, reload, tab switch, menu/modal changes, or any major page mutation. Do not navigate to the same URL if the tab is already there unless an intentional reload is needed.
23
24
 
24
25
  ## `$computer-use` trigger token
25
26
  If the task text contains **`$computer-use`**, the user explicitly requested the Computer Use (macOS desktop) path:
26
- - Your CLI is **codex** → `desktop-control` skill is already in your system prompt (do NOT `cat`/`Read` any skill file). First action must be `mcp__computer_use__get_app_state(app=...)`. Proceed via `mcp__computer_use__.*` only.
27
+ - Your CLI is **codex** → `desktop-control` skill is already in your system prompt (do NOT `cat`/`Read` any skill file). First action for a known app must be `mcp__computer_use__get_app_state(app=...)`; if the app is unclear, call `mcp__computer_use__list_apps()` first. Proceed via Computer Use only.
27
28
  - Your CLI is **not codex** → stop and report `precondition failed: not codex — $computer-use requires Computer Use MCP`. Do NOT try `cli-jaw browser` as a substitute and do NOT re-dispatch.
28
29
 
29
- ### 🔍 Screenshot-first when uncertain (GUI tasks, any path)
30
+ ### Screenshot-first when uncertain (GUI tasks, any path)
30
31
  Whenever you are handling a GUI task (CDP **or** Computer Use) and catch yourself guessing — which element_index is correct, whether a click landed, which tab/window is focused, whether the page changed — **STOP and re-read state before the next action**:
31
32
  - Computer Use → `mcp__computer_use__get_app_state(app=...)`
32
33
  - CDP → `cli-jaw browser snapshot --interactive`
@@ -1,3 +1,3 @@
1
1
  ### Vision Click (Active)
2
- - If browser snapshot shows no ref for target, use vision-click: screenshot → `codex exec -i` → `mouse-click <x> <y>`.
2
+ - Codex-only legacy fallback. If browser snapshot shows no ref for a visible target and direct coordinate clicking is not suitable, use vision-click: screenshot → `codex exec -i` → `mouse-click <x> <y>`.
3
3
  - See vision-click skill SKILL.md for full workflow.
@@ -0,0 +1,15 @@
1
+ export function isHttpishError(e) {
2
+ return typeof e === 'object' && e !== null
3
+ && ('statusCode' in e || 'code' in e || 'message' in e);
4
+ }
5
+ export function httpStatus(e, fallback) {
6
+ if (isHttpishError(e) && typeof e.statusCode === 'number')
7
+ return e.statusCode;
8
+ return fallback;
9
+ }
10
+ export function httpCode(e) {
11
+ if (isHttpishError(e))
12
+ return e.code;
13
+ return undefined;
14
+ }
15
+ //# sourceMappingURL=_http-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_http-error.js","sourceRoot":"","sources":["../../../src/routes/_http-error.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,CAAU;IACrC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;WACnC,CAAC,YAAY,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAU,EAAE,QAAgB;IACnD,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,UAAU,CAAC;IAC/E,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAU;IAC/B,IAAI,cAAc,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IACrC,OAAO,SAAS,CAAC;AACrB,CAAC"}
@@ -4,6 +4,7 @@ import { basename, extname } from 'path';
4
4
  import express from 'express';
5
5
  import { ok, fail } from '../http/response.js';
6
6
  import { saveUpload } from '../agent/spawn.js';
7
+ import { IMAGE_MIMES } from '../../lib/mime-detect.js';
7
8
  import { settings, saveSettings, UPLOADS_DIR } from '../core/config.js';
8
9
  import { safeResolveUnder } from '../security/path-guards.js';
9
10
  import { decodeFilenameSafe } from '../security/decode.js';
@@ -13,7 +14,7 @@ function isAvatarTarget(value) {
13
14
  return AVATAR_TARGETS.has(value);
14
15
  }
15
16
  function ensureAvatarSettings() {
16
- const current = settings.avatar || {};
17
+ const current = settings["avatar"] || {};
17
18
  const next = {
18
19
  agent: {
19
20
  imagePath: String(current.agent?.imagePath || ''),
@@ -24,7 +25,7 @@ function ensureAvatarSettings() {
24
25
  updatedAt: current.user?.updatedAt == null ? null : Number(current.user.updatedAt),
25
26
  },
26
27
  };
27
- settings.avatar = next;
28
+ settings["avatar"] = next;
28
29
  return next;
29
30
  }
30
31
  function serializeAvatar(target) {
@@ -86,7 +87,7 @@ export function registerAvatarRoutes(app, requireAuth) {
86
87
  });
87
88
  });
88
89
  app.post('/api/avatar/:target/upload', requireAuth, express.raw({ type: ['image/*', 'application/octet-stream'], limit: '5mb' }), (req, res) => {
89
- const target = parseTarget(String(req.params.target || ''));
90
+ const target = parseTarget(String(req.params["target"] || ''));
90
91
  if (!target)
91
92
  return fail(res, 400, 'invalid_avatar_target');
92
93
  try {
@@ -95,7 +96,7 @@ export function registerAvatarRoutes(app, requireAuth) {
95
96
  const bodyLen = Buffer.isBuffer(req.body) ? req.body.length : 0;
96
97
  console.log(`[avatar:upload] target=${target} ct=${contentType} file=${filename} bodyLen=${bodyLen}`);
97
98
  validateUpload(contentType, filename, req.body);
98
- const filePath = saveUpload(req.body, filename);
99
+ const filePath = saveUpload(req.body, filename, { allowedMimes: IMAGE_MIMES });
99
100
  saveAvatarImage(target, filePath);
100
101
  return ok(res, serializeAvatar(target));
101
102
  }
@@ -106,7 +107,7 @@ export function registerAvatarRoutes(app, requireAuth) {
106
107
  }
107
108
  });
108
109
  app.delete('/api/avatar/:target/image', requireAuth, (req, res) => {
109
- const target = parseTarget(String(req.params.target || ''));
110
+ const target = parseTarget(String(req.params["target"] || ''));
110
111
  if (!target)
111
112
  return fail(res, 400, 'invalid_avatar_target');
112
113
  resetAvatarImage(target);
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../src/routes/avatar.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../src/routes/avatar.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,11 @@
1
1
  import * as browser from '../browser/index.js';
2
+ import { cleanupPoolTabs } from '../browser/web-ai/tab-pool.js';
3
+ import { stripUndefined } from '../core/strip-undefined.js';
2
4
  import { ok } from '../http/response.js';
3
5
  import { DEBUG_CONSOLE_ONLY_MESSAGE, normalizeBrowserStartMode } from '../browser/launch-policy.js';
4
6
  /** Port priority: req param > activePort > settings.browser.cdpPort > deriveCdpPort() */
5
7
  const cdpPort = (req) => {
6
- const p = Number(req.query?.port || req.body?.port);
8
+ const p = Number(req.query?.["port"] || req.body?.port);
7
9
  if (Number.isInteger(p) && p > 0 && p <= 65535)
8
10
  return p;
9
11
  return browser.getActivePort();
@@ -52,7 +54,8 @@ export function registerBrowserRoutes(app, requireAuth) {
52
54
  try {
53
55
  const start = resolveBrowserStartOptions(req);
54
56
  if (start.mode === 'debug') {
55
- return res.status(400).json({ error: DEBUG_CONSOLE_ONLY_MESSAGE });
57
+ res.status(400).json({ error: DEBUG_CONSOLE_ONLY_MESSAGE });
58
+ return;
56
59
  }
57
60
  await browser.launchChrome(start.port, { mode: start.mode, headless: start.headless });
58
61
  res.json(await browser.getBrowserStatus(start.port));
@@ -78,12 +81,36 @@ export function registerBrowserRoutes(app, requireAuth) {
78
81
  res.status(500).json({ error: e.message });
79
82
  }
80
83
  });
84
+ app.get('/api/browser/doctor', requireAuth, async (req, res) => {
85
+ try {
86
+ res.json(await browser.getBrowserDiagnostics(cdpPort(req)));
87
+ }
88
+ catch (e) {
89
+ res.status(500).json({ error: e.message });
90
+ }
91
+ });
92
+ app.post('/api/browser/cleanup-runtimes', requireAuth, async (req, res) => {
93
+ try {
94
+ if (req.body.close === true && req.body.force !== true) {
95
+ res.status(400).json({ error: 'cleanup-runtimes close requires force=true' });
96
+ return;
97
+ }
98
+ res.json(await browser.cleanupBrowserRuntimeOrphans({
99
+ close: req.body.close === true,
100
+ force: req.body.force === true,
101
+ currentRuntime: browser.getBrowserRuntimeStatus(),
102
+ }));
103
+ }
104
+ catch (e) {
105
+ res.status(500).json({ error: e.message });
106
+ }
107
+ });
81
108
  app.get('/api/browser/snapshot', requireAuth, async (req, res) => {
82
109
  try {
83
110
  const result = await browser.snapshot(cdpPort(req), {
84
- interactive: req.query.interactive === 'true',
85
- maxNodes: req.query.maxNodes || req.query['max-nodes'],
86
- json: req.query.json === 'true',
111
+ interactive: req.query["interactive"] === 'true',
112
+ maxNodes: req.query["maxNodes"] || req.query['max-nodes'],
113
+ json: req.query["json"] === 'true',
87
114
  });
88
115
  if (Array.isArray(result))
89
116
  res.json({ nodes: result });
@@ -140,7 +167,9 @@ export function registerBrowserRoutes(app, requireAuth) {
140
167
  case 'drag':
141
168
  result = await browser.drag(cdpPort(req), fromRef, toRef);
142
169
  break;
143
- default: return res.status(400).json({ error: `unknown action: ${kind}` });
170
+ default:
171
+ res.status(400).json({ error: `unknown action: ${kind}` });
172
+ return;
144
173
  }
145
174
  res.json(result);
146
175
  }
@@ -151,8 +180,10 @@ export function registerBrowserRoutes(app, requireAuth) {
151
180
  app.post('/api/browser/vision-click', requireAuth, async (req, res) => {
152
181
  try {
153
182
  const { target, provider, doubleClick, prepareStable, region, clip, verifyBeforeClick } = req.body;
154
- if (!target)
155
- return res.status(400).json({ error: 'target required' });
183
+ if (!target) {
184
+ res.status(400).json({ error: 'target required' });
185
+ return;
186
+ }
156
187
  const result = await browser.visionClick(cdpPort(req), target, {
157
188
  provider,
158
189
  doubleClick,
@@ -169,7 +200,12 @@ export function registerBrowserRoutes(app, requireAuth) {
169
200
  });
170
201
  app.post('/api/browser/navigate', requireAuth, async (req, res) => {
171
202
  try {
172
- res.json(await browser.navigate(cdpPort(req), req.body.url));
203
+ const opts = {};
204
+ if (req.body?.waitUntil)
205
+ opts.waitUntil = req.body.waitUntil;
206
+ if (Number.isFinite(req.body?.timeout))
207
+ opts.timeout = Number(req.body.timeout);
208
+ res.json(await browser.navigate(cdpPort(req), req.body.url, opts));
173
209
  }
174
210
  catch (e) {
175
211
  res.status(500).json({ error: e.message });
@@ -217,6 +253,49 @@ export function registerBrowserRoutes(app, requireAuth) {
217
253
  res.status(500).json({ error: e.message });
218
254
  }
219
255
  });
256
+ app.post('/api/browser/tab-new', requireAuth, async (req, res) => {
257
+ try {
258
+ res.json(await browser.createTab(cdpPort(req), String(req.body.url || 'about:blank'), {
259
+ activate: req.body.activate !== false,
260
+ }));
261
+ }
262
+ catch (e) {
263
+ res.status(500).json({ error: e.message });
264
+ }
265
+ });
266
+ app.post('/api/browser/tab-close', requireAuth, async (req, res) => {
267
+ try {
268
+ res.json(await browser.closeTab(cdpPort(req), String(req.body.targetId || req.body.target || '')));
269
+ }
270
+ catch (e) {
271
+ res.status(500).json({ error: e.message });
272
+ }
273
+ });
274
+ app.post('/api/browser/tab-cleanup', requireAuth, async (req, res) => {
275
+ try {
276
+ if (req.body.includeUntracked === true && req.body.force !== true) {
277
+ res.status(400).json({ error: 'tab-cleanup includeUntracked requires force=true' });
278
+ return;
279
+ }
280
+ const leaseResult = await cleanupPoolTabs(cdpPort(req));
281
+ const idleResult = await browser.cleanupIdleTabs(cdpPort(req), stripUndefined({
282
+ idleTimeoutMs: req.body.idleAfter ? browser.parseTabDuration(String(req.body.idleAfter)) : undefined,
283
+ maxTabs: req.body.maxTabs ? Number(req.body.maxTabs) : undefined,
284
+ includeUntracked: req.body.includeUntracked === true,
285
+ provider: req.body.provider ? String(req.body.provider) : undefined,
286
+ keepProviderTabs: req.body.keepProviderTabs ? Number(req.body.keepProviderTabs) : undefined,
287
+ }));
288
+ res.json({
289
+ ...idleResult,
290
+ closed: idleResult.closed + (leaseResult.closed || 0),
291
+ leaseClosed: leaseResult.closed || 0,
292
+ leaseClosedTabs: leaseResult.closedTabs || [],
293
+ });
294
+ }
295
+ catch (e) {
296
+ res.status(500).json({ error: e.message });
297
+ }
298
+ });
220
299
  app.post('/api/browser/evaluate', requireAuth, async (req, res) => {
221
300
  try {
222
301
  res.json(await browser.evaluate(cdpPort(req), req.body.expression));
@@ -227,7 +306,7 @@ export function registerBrowserRoutes(app, requireAuth) {
227
306
  });
228
307
  app.get('/api/browser/text', requireAuth, async (req, res) => {
229
308
  try {
230
- res.json(await browser.getPageText(cdpPort(req), req.query.format));
309
+ res.json(await browser.getPageText(cdpPort(req), req.query["format"]));
231
310
  }
232
311
  catch (e) {
233
312
  res.status(500).json({ error: e.message });
@@ -300,8 +379,8 @@ export function registerBrowserRoutes(app, requireAuth) {
300
379
  app.get('/api/browser/web-ai/status', requireAuth, async (req, res) => {
301
380
  try {
302
381
  res.json(await browser.webAi.status(cdpPort(req), {
303
- vendor: String(req.query.vendor || 'chatgpt'),
304
- ...(req.query.probe ? { probe: String(req.query.probe) } : {}),
382
+ vendor: String(req.query["vendor"] || 'chatgpt'),
383
+ ...(req.query["probe"] ? { probe: String(req.query["probe"]) } : {}),
305
384
  }));
306
385
  }
307
386
  catch (e) {
@@ -319,10 +398,14 @@ export function registerBrowserRoutes(app, requireAuth) {
319
398
  app.get('/api/browser/web-ai/poll', requireAuth, async (req, res) => {
320
399
  try {
321
400
  res.json(await browser.webAi.poll(cdpPort(req), {
322
- vendor: String(req.query.vendor || 'chatgpt'),
323
- timeout: String(req.query.timeout || '600'),
324
- ...(req.query.session ? { session: String(req.query.session) } : {}),
325
- ...(req.query.allowCopyMarkdownFallback === 'true' ? { allowCopyMarkdownFallback: true } : {}),
401
+ vendor: String(req.query["vendor"] || 'chatgpt'),
402
+ timeout: String(req.query["timeout"] || '600'),
403
+ ...(req.query["session"] ? { session: String(req.query["session"]) } : {}),
404
+ ...(req.query["allowCopyMarkdownFallback"] === 'true' ? { allowCopyMarkdownFallback: true } : {}),
405
+ ...(req.query["requireSourceAudit"] === 'true' ? { requireSourceAudit: true } : {}),
406
+ ...(req.query["sourceAuditRatio"] ? { sourceAuditRatio: String(req.query["sourceAuditRatio"]) } : {}),
407
+ ...(req.query["sourceAuditScope"] ? { sourceAuditScope: String(req.query["sourceAuditScope"]) } : {}),
408
+ ...(req.query["sourceAuditDate"] ? { sourceAuditDate: String(req.query["sourceAuditDate"]) } : {}),
326
409
  }));
327
410
  }
328
411
  catch (e) {
@@ -332,13 +415,17 @@ export function registerBrowserRoutes(app, requireAuth) {
332
415
  app.get('/api/browser/web-ai/watch', requireAuth, async (req, res) => {
333
416
  try {
334
417
  res.json(await browser.webAi.watch(cdpPort(req), {
335
- vendor: String(req.query.vendor || 'chatgpt'),
336
- timeout: String(req.query.timeout || '600'),
337
- ...(req.query.session ? { session: String(req.query.session) } : {}),
338
- ...(req.query.url ? { url: String(req.query.url) } : {}),
339
- ...(req.query.notify !== undefined ? { notify: String(req.query.notify) !== 'false' } : {}),
340
- ...(req.query.pollIntervalSeconds ? { pollIntervalSeconds: String(req.query.pollIntervalSeconds) } : {}),
341
- ...(req.query.allowCopyMarkdownFallback === 'true' ? { allowCopyMarkdownFallback: true } : {}),
418
+ vendor: String(req.query["vendor"] || 'chatgpt'),
419
+ timeout: String(req.query["timeout"] || '600'),
420
+ ...(req.query["session"] ? { session: String(req.query["session"]) } : {}),
421
+ ...(req.query["url"] ? { url: String(req.query["url"]) } : {}),
422
+ ...(req.query["notify"] !== undefined ? { notify: String(req.query["notify"]) !== 'false' } : {}),
423
+ ...(req.query["pollIntervalSeconds"] ? { pollIntervalSeconds: String(req.query["pollIntervalSeconds"]) } : {}),
424
+ ...(req.query["allowCopyMarkdownFallback"] === 'true' ? { allowCopyMarkdownFallback: true } : {}),
425
+ ...(req.query["requireSourceAudit"] === 'true' ? { requireSourceAudit: true } : {}),
426
+ ...(req.query["sourceAuditRatio"] ? { sourceAuditRatio: String(req.query["sourceAuditRatio"]) } : {}),
427
+ ...(req.query["sourceAuditScope"] ? { sourceAuditScope: String(req.query["sourceAuditScope"]) } : {}),
428
+ ...(req.query["sourceAuditDate"] ? { sourceAuditDate: String(req.query["sourceAuditDate"]) } : {}),
342
429
  }));
343
430
  }
344
431
  catch (e) {
@@ -356,8 +443,8 @@ export function registerBrowserRoutes(app, requireAuth) {
356
443
  app.get('/api/browser/web-ai/sessions', requireAuth, async (req, res) => {
357
444
  try {
358
445
  res.json(await browser.webAi.sessions({
359
- ...(req.query.vendor ? { vendor: String(req.query.vendor) } : {}),
360
- ...(req.query.status ? { status: String(req.query.status) } : {}),
446
+ ...(req.query["vendor"] ? { vendor: String(req.query["vendor"]) } : {}),
447
+ ...(req.query["status"] ? { status: String(req.query["status"]) } : {}),
361
448
  }));
362
449
  }
363
450
  catch (e) {
@@ -380,12 +467,12 @@ export function registerBrowserRoutes(app, requireAuth) {
380
467
  try {
381
468
  res.json({
382
469
  ok: true,
383
- vendor: String(req.query.vendor || 'chatgpt'),
470
+ vendor: String(req.query["vendor"] || 'chatgpt'),
384
471
  status: 'ready',
385
472
  notifications: browser.webAi.listNotifications({
386
- ...(req.query.vendor ? { vendor: String(req.query.vendor) } : {}),
387
- ...(req.query.status ? { status: String(req.query.status) } : {}),
388
- ...(req.query.session ? { sessionId: String(req.query.session) } : {}),
473
+ ...(req.query["vendor"] ? { vendor: String(req.query["vendor"]) } : {}),
474
+ ...(req.query["status"] ? { status: String(req.query["status"]) } : {}),
475
+ ...(req.query["session"] ? { sessionId: String(req.query["session"]) } : {}),
389
476
  }),
390
477
  warnings: [],
391
478
  });
@@ -398,12 +485,12 @@ export function registerBrowserRoutes(app, requireAuth) {
398
485
  try {
399
486
  res.json({
400
487
  ok: true,
401
- vendor: String(req.query.vendor || 'chatgpt'),
488
+ vendor: String(req.query["vendor"] || 'chatgpt'),
402
489
  status: 'ready',
403
490
  capabilities: browser.webAi.listCapabilitySchemas({
404
- ...(req.query.vendor ? { vendor: String(req.query.vendor) } : {}),
405
- ...(req.query.family ? { family: String(req.query.family) } : {}),
406
- ...(req.query.frontendStatus ? { frontendStatus: String(req.query.frontendStatus) } : {}),
491
+ ...(req.query["vendor"] ? { vendor: String(req.query["vendor"]) } : {}),
492
+ ...(req.query["family"] ? { family: String(req.query["family"]) } : {}),
493
+ ...(req.query["frontendStatus"] ? { frontendStatus: String(req.query["frontendStatus"]) } : {}),
407
494
  }),
408
495
  warnings: [],
409
496
  });
@@ -431,8 +518,8 @@ export function registerBrowserRoutes(app, requireAuth) {
431
518
  app.get('/api/browser/web-ai/diagnose', requireAuth, async (req, res) => {
432
519
  try {
433
520
  res.json(await browser.webAi.diagnose(cdpPort(req), {
434
- vendor: String(req.query.vendor || 'chatgpt'),
435
- stage: String(req.query.stage || 'unknown'),
521
+ vendor: String(req.query["vendor"] || 'chatgpt'),
522
+ stage: String(req.query["stage"] || 'unknown'),
436
523
  }));
437
524
  }
438
525
  catch (e) {
@@ -444,17 +531,17 @@ function toWebAiHttpError(e) {
444
531
  if (isWebAiErrorLike(e)) {
445
532
  const json = e.toJSON?.();
446
533
  if (json && typeof json === 'object') {
447
- return {
534
+ return stripUndefined({
448
535
  ok: false,
449
- error: String(json.message ?? ''),
450
- stage: String(json.stage ?? 'unknown'),
451
- errorCode: json.errorCode,
452
- retryHint: json.retryHint,
453
- vendor: json.vendor,
454
- mutationAllowed: json.mutationAllowed,
455
- selectorsTried: json.selectorsTried,
456
- evidence: json.evidence,
457
- };
536
+ error: String(json["message"] ?? ''),
537
+ stage: String(json["stage"] ?? 'unknown'),
538
+ errorCode: json["errorCode"],
539
+ retryHint: json["retryHint"],
540
+ vendor: json["vendor"],
541
+ mutationAllowed: json["mutationAllowed"],
542
+ selectorsTried: json["selectorsTried"],
543
+ evidence: json["evidence"],
544
+ });
458
545
  }
459
546
  }
460
547
  const err = e;