opendevbrowser 0.0.15 → 0.0.16

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 (568) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +229 -34
  3. package/dist/annotate/direct-annotator.d.ts +22 -0
  4. package/dist/annotate/direct-annotator.d.ts.map +1 -0
  5. package/dist/annotate/output.d.ts +10 -0
  6. package/dist/annotate/output.d.ts.map +1 -0
  7. package/dist/browser/annotation-manager.d.ts +30 -0
  8. package/dist/browser/annotation-manager.d.ts.map +1 -0
  9. package/dist/browser/browser-manager.d.ts +397 -0
  10. package/dist/browser/browser-manager.d.ts.map +1 -0
  11. package/dist/browser/fingerprint/adapters.d.ts +26 -0
  12. package/dist/browser/fingerprint/adapters.d.ts.map +1 -0
  13. package/dist/browser/fingerprint/canary.d.ts +25 -0
  14. package/dist/browser/fingerprint/canary.d.ts.map +1 -0
  15. package/dist/browser/fingerprint/profiles.d.ts +16 -0
  16. package/dist/browser/fingerprint/profiles.d.ts.map +1 -0
  17. package/dist/browser/fingerprint/tier1-coherence.d.ts +36 -0
  18. package/dist/browser/fingerprint/tier1-coherence.d.ts.map +1 -0
  19. package/dist/browser/fingerprint/tier2-runtime.d.ts +40 -0
  20. package/dist/browser/fingerprint/tier2-runtime.d.ts.map +1 -0
  21. package/dist/browser/fingerprint/tier3-adaptive.d.ts +30 -0
  22. package/dist/browser/fingerprint/tier3-adaptive.d.ts.map +1 -0
  23. package/dist/browser/manager-types.d.ts +3 -0
  24. package/dist/browser/manager-types.d.ts.map +1 -0
  25. package/dist/browser/ops-browser-manager.d.ts +131 -0
  26. package/dist/browser/ops-browser-manager.d.ts.map +1 -0
  27. package/dist/browser/ops-client.d.ts +56 -0
  28. package/dist/browser/ops-client.d.ts.map +1 -0
  29. package/dist/browser/parallelism-governor.d.ts +31 -0
  30. package/dist/browser/parallelism-governor.d.ts.map +1 -0
  31. package/dist/browser/script-runner.d.ts +23 -0
  32. package/dist/browser/script-runner.d.ts.map +1 -0
  33. package/dist/browser/session-store.d.ts +63 -0
  34. package/dist/browser/session-store.d.ts.map +1 -0
  35. package/dist/browser/target-manager.d.ts +36 -0
  36. package/dist/browser/target-manager.d.ts.map +1 -0
  37. package/dist/cache/chrome-locator.d.ts +2 -0
  38. package/dist/cache/chrome-locator.d.ts.map +1 -0
  39. package/dist/cache/downloader.d.ts +6 -0
  40. package/dist/cache/downloader.d.ts.map +1 -0
  41. package/dist/cache/paths.d.ts +9 -0
  42. package/dist/cache/paths.d.ts.map +1 -0
  43. package/dist/chunk-7W3SPXIB.js +166 -0
  44. package/dist/chunk-7W3SPXIB.js.map +1 -0
  45. package/dist/chunk-ST7CO5FA.js +18668 -0
  46. package/dist/chunk-ST7CO5FA.js.map +1 -0
  47. package/dist/cli/args.d.ts +25 -0
  48. package/dist/cli/args.d.ts.map +1 -0
  49. package/dist/cli/client.d.ts +2 -0
  50. package/dist/cli/client.d.ts.map +1 -0
  51. package/dist/cli/commands/annotate.d.ts +27 -0
  52. package/dist/cli/commands/annotate.d.ts.map +1 -0
  53. package/dist/cli/commands/artifacts.d.ts +24 -0
  54. package/dist/cli/commands/artifacts.d.ts.map +1 -0
  55. package/dist/cli/commands/daemon.d.ts +35 -0
  56. package/dist/cli/commands/daemon.d.ts.map +1 -0
  57. package/dist/cli/commands/devtools/console-poll.d.ts +7 -0
  58. package/dist/cli/commands/devtools/console-poll.d.ts.map +1 -0
  59. package/dist/cli/commands/devtools/debug-trace-snapshot.d.ts +20 -0
  60. package/dist/cli/commands/devtools/debug-trace-snapshot.d.ts.map +1 -0
  61. package/dist/cli/commands/devtools/network-poll.d.ts +7 -0
  62. package/dist/cli/commands/devtools/network-poll.d.ts.map +1 -0
  63. package/dist/cli/commands/devtools/perf.d.ts +7 -0
  64. package/dist/cli/commands/devtools/perf.d.ts.map +1 -0
  65. package/dist/cli/commands/devtools/screenshot.d.ts +17 -0
  66. package/dist/cli/commands/devtools/screenshot.d.ts.map +1 -0
  67. package/dist/cli/commands/dom/attr.d.ts +7 -0
  68. package/dist/cli/commands/dom/attr.d.ts.map +1 -0
  69. package/dist/cli/commands/dom/checked.d.ts +7 -0
  70. package/dist/cli/commands/dom/checked.d.ts.map +1 -0
  71. package/dist/cli/commands/dom/enabled.d.ts +7 -0
  72. package/dist/cli/commands/dom/enabled.d.ts.map +1 -0
  73. package/dist/cli/commands/dom/html.d.ts +7 -0
  74. package/dist/cli/commands/dom/html.d.ts.map +1 -0
  75. package/dist/cli/commands/dom/text.d.ts +7 -0
  76. package/dist/cli/commands/dom/text.d.ts.map +1 -0
  77. package/dist/cli/commands/dom/value.d.ts +7 -0
  78. package/dist/cli/commands/dom/value.d.ts.map +1 -0
  79. package/dist/cli/commands/dom/visible.d.ts +7 -0
  80. package/dist/cli/commands/dom/visible.d.ts.map +1 -0
  81. package/dist/cli/commands/export/clone-component.d.ts +7 -0
  82. package/dist/cli/commands/export/clone-component.d.ts.map +1 -0
  83. package/dist/cli/commands/export/clone-page.d.ts +7 -0
  84. package/dist/cli/commands/export/clone-page.d.ts.map +1 -0
  85. package/dist/cli/commands/interact/check.d.ts +7 -0
  86. package/dist/cli/commands/interact/check.d.ts.map +1 -0
  87. package/dist/cli/commands/interact/click.d.ts +7 -0
  88. package/dist/cli/commands/interact/click.d.ts.map +1 -0
  89. package/dist/cli/commands/interact/hover.d.ts +7 -0
  90. package/dist/cli/commands/interact/hover.d.ts.map +1 -0
  91. package/dist/cli/commands/interact/press.d.ts +7 -0
  92. package/dist/cli/commands/interact/press.d.ts.map +1 -0
  93. package/dist/cli/commands/interact/scroll-into-view.d.ts +7 -0
  94. package/dist/cli/commands/interact/scroll-into-view.d.ts.map +1 -0
  95. package/dist/cli/commands/interact/scroll.d.ts +7 -0
  96. package/dist/cli/commands/interact/scroll.d.ts.map +1 -0
  97. package/dist/cli/commands/interact/select.d.ts +7 -0
  98. package/dist/cli/commands/interact/select.d.ts.map +1 -0
  99. package/dist/cli/commands/interact/type.d.ts +7 -0
  100. package/dist/cli/commands/interact/type.d.ts.map +1 -0
  101. package/dist/cli/commands/interact/uncheck.d.ts +7 -0
  102. package/dist/cli/commands/interact/uncheck.d.ts.map +1 -0
  103. package/dist/cli/commands/macro-resolve.d.ts +18 -0
  104. package/dist/cli/commands/macro-resolve.d.ts.map +1 -0
  105. package/dist/cli/commands/native.d.ts +82 -0
  106. package/dist/cli/commands/native.d.ts.map +1 -0
  107. package/dist/cli/commands/nav/goto.d.ts +7 -0
  108. package/dist/cli/commands/nav/goto.d.ts.map +1 -0
  109. package/dist/cli/commands/nav/snapshot.d.ts +7 -0
  110. package/dist/cli/commands/nav/snapshot.d.ts.map +1 -0
  111. package/dist/cli/commands/nav/wait.d.ts +7 -0
  112. package/dist/cli/commands/nav/wait.d.ts.map +1 -0
  113. package/dist/cli/commands/pages/close.d.ts +6 -0
  114. package/dist/cli/commands/pages/close.d.ts.map +1 -0
  115. package/dist/cli/commands/pages/list.d.ts +7 -0
  116. package/dist/cli/commands/pages/list.d.ts.map +1 -0
  117. package/dist/cli/commands/pages/open.d.ts +7 -0
  118. package/dist/cli/commands/pages/open.d.ts.map +1 -0
  119. package/dist/cli/commands/product-video.d.ts +25 -0
  120. package/dist/cli/commands/product-video.d.ts.map +1 -0
  121. package/dist/cli/commands/registry.d.ts +5 -0
  122. package/dist/cli/commands/registry.d.ts.map +1 -0
  123. package/dist/cli/commands/research.d.ts +27 -0
  124. package/dist/cli/commands/research.d.ts.map +1 -0
  125. package/dist/cli/commands/rpc.d.ts +28 -0
  126. package/dist/cli/commands/rpc.d.ts.map +1 -0
  127. package/dist/cli/commands/run.d.ts +17 -0
  128. package/dist/cli/commands/run.d.ts.map +1 -0
  129. package/dist/cli/commands/serve.d.ts +59 -0
  130. package/dist/cli/commands/serve.d.ts.map +1 -0
  131. package/dist/cli/commands/session/connect.d.ts +9 -0
  132. package/dist/cli/commands/session/connect.d.ts.map +1 -0
  133. package/dist/cli/commands/session/cookie-import.d.ts +31 -0
  134. package/dist/cli/commands/session/cookie-import.d.ts.map +1 -0
  135. package/dist/cli/commands/session/cookie-list.d.ts +17 -0
  136. package/dist/cli/commands/session/cookie-list.d.ts.map +1 -0
  137. package/dist/cli/commands/session/disconnect.d.ts +6 -0
  138. package/dist/cli/commands/session/disconnect.d.ts.map +1 -0
  139. package/dist/cli/commands/session/launch.d.ts +29 -0
  140. package/dist/cli/commands/session/launch.d.ts.map +1 -0
  141. package/dist/cli/commands/session/status.d.ts +7 -0
  142. package/dist/cli/commands/session/status.d.ts.map +1 -0
  143. package/dist/cli/commands/shopping.d.ts +25 -0
  144. package/dist/cli/commands/shopping.d.ts.map +1 -0
  145. package/dist/cli/commands/status.d.ts +19 -0
  146. package/dist/cli/commands/status.d.ts.map +1 -0
  147. package/dist/cli/commands/targets/close.d.ts +6 -0
  148. package/dist/cli/commands/targets/close.d.ts.map +1 -0
  149. package/dist/cli/commands/targets/list.d.ts +7 -0
  150. package/dist/cli/commands/targets/list.d.ts.map +1 -0
  151. package/dist/cli/commands/targets/new.d.ts +7 -0
  152. package/dist/cli/commands/targets/new.d.ts.map +1 -0
  153. package/dist/cli/commands/targets/use.d.ts +7 -0
  154. package/dist/cli/commands/targets/use.d.ts.map +1 -0
  155. package/dist/cli/commands/types.d.ts +13 -0
  156. package/dist/cli/commands/types.d.ts.map +1 -0
  157. package/dist/cli/commands/uninstall.d.ts +14 -0
  158. package/dist/cli/commands/uninstall.d.ts.map +1 -0
  159. package/dist/cli/commands/update.d.ts +7 -0
  160. package/dist/cli/commands/update.d.ts.map +1 -0
  161. package/dist/cli/daemon-autostart.d.ts +46 -0
  162. package/dist/cli/daemon-autostart.d.ts.map +1 -0
  163. package/dist/cli/daemon-client.d.ts +33 -0
  164. package/dist/cli/daemon-client.d.ts.map +1 -0
  165. package/dist/cli/daemon-commands.d.ts +7 -0
  166. package/dist/cli/daemon-commands.d.ts.map +1 -0
  167. package/dist/cli/daemon-state.d.ts +56 -0
  168. package/dist/cli/daemon-state.d.ts.map +1 -0
  169. package/dist/cli/daemon-status.d.ts +19 -0
  170. package/dist/cli/daemon-status.d.ts.map +1 -0
  171. package/dist/cli/daemon.d.ts +29 -0
  172. package/dist/cli/daemon.d.ts.map +1 -0
  173. package/dist/cli/errors.d.ts +20 -0
  174. package/dist/cli/errors.d.ts.map +1 -0
  175. package/dist/cli/help.d.ts +28 -0
  176. package/dist/cli/help.d.ts.map +1 -0
  177. package/dist/cli/index.d.ts +2 -0
  178. package/dist/cli/index.d.ts.map +1 -0
  179. package/dist/cli/index.js +2205 -267
  180. package/dist/cli/index.js.map +1 -1
  181. package/dist/cli/installers/global.d.ts +9 -0
  182. package/dist/cli/installers/global.d.ts.map +1 -0
  183. package/dist/cli/installers/local.d.ts +9 -0
  184. package/dist/cli/installers/local.d.ts.map +1 -0
  185. package/dist/cli/installers/skills.d.ts +19 -0
  186. package/dist/cli/installers/skills.d.ts.map +1 -0
  187. package/dist/cli/output.d.ts +7 -0
  188. package/dist/cli/output.d.ts.map +1 -0
  189. package/dist/cli/remote-manager.d.ts +96 -0
  190. package/dist/cli/remote-manager.d.ts.map +1 -0
  191. package/dist/cli/remote-relay.d.ts +17 -0
  192. package/dist/cli/remote-relay.d.ts.map +1 -0
  193. package/dist/cli/templates/config.d.ts +7 -0
  194. package/dist/cli/templates/config.d.ts.map +1 -0
  195. package/dist/cli/utils/config.d.ts +20 -0
  196. package/dist/cli/utils/config.d.ts.map +1 -0
  197. package/dist/cli/utils/http.d.ts +5 -0
  198. package/dist/cli/utils/http.d.ts.map +1 -0
  199. package/dist/cli/utils/parse.d.ts +8 -0
  200. package/dist/cli/utils/parse.d.ts.map +1 -0
  201. package/dist/cli/utils/skills.d.ts +12 -0
  202. package/dist/cli/utils/skills.d.ts.map +1 -0
  203. package/dist/config.d.ts +208 -0
  204. package/dist/config.d.ts.map +1 -0
  205. package/dist/core/bootstrap.d.ts +3 -0
  206. package/dist/core/bootstrap.d.ts.map +1 -0
  207. package/dist/core/index.d.ts +3 -0
  208. package/dist/core/index.d.ts.map +1 -0
  209. package/dist/core/logging.d.ts +34 -0
  210. package/dist/core/logging.d.ts.map +1 -0
  211. package/dist/core/types.d.ts +34 -0
  212. package/dist/core/types.d.ts.map +1 -0
  213. package/dist/devtools/console-tracker.d.ts +44 -0
  214. package/dist/devtools/console-tracker.d.ts.map +1 -0
  215. package/dist/devtools/exception-tracker.d.ts +42 -0
  216. package/dist/devtools/exception-tracker.d.ts.map +1 -0
  217. package/dist/devtools/network-tracker.d.ts +34 -0
  218. package/dist/devtools/network-tracker.d.ts.map +1 -0
  219. package/dist/export/css-extract.d.ts +5 -0
  220. package/dist/export/css-extract.d.ts.map +1 -0
  221. package/dist/export/dom-capture.d.ts +15 -0
  222. package/dist/export/dom-capture.d.ts.map +1 -0
  223. package/dist/export/react-emitter.d.ts +11 -0
  224. package/dist/export/react-emitter.d.ts.map +1 -0
  225. package/dist/extension-extractor.d.ts +3 -0
  226. package/dist/extension-extractor.d.ts.map +1 -0
  227. package/dist/index.d.ts +3 -4
  228. package/dist/index.d.ts.map +1 -0
  229. package/dist/index.js +867 -87
  230. package/dist/index.js.map +1 -1
  231. package/dist/macros/execute.d.ts +44 -0
  232. package/dist/macros/execute.d.ts.map +1 -0
  233. package/dist/macros/index.d.ts +9 -0
  234. package/dist/macros/index.d.ts.map +1 -0
  235. package/dist/macros/packs/core.d.ts +3 -0
  236. package/dist/macros/packs/core.d.ts.map +1 -0
  237. package/dist/macros/registry.d.ts +48 -0
  238. package/dist/macros/registry.d.ts.map +1 -0
  239. package/dist/macros-NUBRM44Y.js +399 -0
  240. package/dist/macros-NUBRM44Y.js.map +1 -0
  241. package/dist/opendevbrowser.d.ts +3 -4
  242. package/dist/opendevbrowser.d.ts.map +1 -0
  243. package/dist/opendevbrowser.js +867 -87
  244. package/dist/opendevbrowser.js.map +1 -1
  245. package/dist/providers/adaptive-concurrency.d.ts +42 -0
  246. package/dist/providers/adaptive-concurrency.d.ts.map +1 -0
  247. package/dist/providers/artifacts.d.ts +34 -0
  248. package/dist/providers/artifacts.d.ts.map +1 -0
  249. package/dist/providers/blocker.d.ts +47 -0
  250. package/dist/providers/blocker.d.ts.map +1 -0
  251. package/dist/providers/community/index.d.ts +44 -0
  252. package/dist/providers/community/index.d.ts.map +1 -0
  253. package/dist/providers/enrichment.d.ts +33 -0
  254. package/dist/providers/enrichment.d.ts.map +1 -0
  255. package/dist/providers/errors.d.ts +41 -0
  256. package/dist/providers/errors.d.ts.map +1 -0
  257. package/dist/providers/index.d.ts +121 -0
  258. package/dist/providers/index.d.ts.map +1 -0
  259. package/dist/providers/normalize.d.ts +39 -0
  260. package/dist/providers/normalize.d.ts.map +1 -0
  261. package/dist/providers/policy.d.ts +5 -0
  262. package/dist/providers/policy.d.ts.map +1 -0
  263. package/dist/providers/registry.d.ts +22 -0
  264. package/dist/providers/registry.d.ts.map +1 -0
  265. package/dist/providers/renderer.d.ts +49 -0
  266. package/dist/providers/renderer.d.ts.map +1 -0
  267. package/dist/providers/runtime-factory.d.ts +20 -0
  268. package/dist/providers/runtime-factory.d.ts.map +1 -0
  269. package/dist/providers/safety/prompt-guard.d.ts +34 -0
  270. package/dist/providers/safety/prompt-guard.d.ts.map +1 -0
  271. package/dist/providers/shared/anti-bot-policy.d.ts +51 -0
  272. package/dist/providers/shared/anti-bot-policy.d.ts.map +1 -0
  273. package/dist/providers/shared/post-policy.d.ts +31 -0
  274. package/dist/providers/shared/post-policy.d.ts.map +1 -0
  275. package/dist/providers/shared/request-headers.d.ts +5 -0
  276. package/dist/providers/shared/request-headers.d.ts.map +1 -0
  277. package/dist/providers/shared/traversal-url.d.ts +2 -0
  278. package/dist/providers/shared/traversal-url.d.ts.map +1 -0
  279. package/dist/providers/shopping/index.d.ts +63 -0
  280. package/dist/providers/shopping/index.d.ts.map +1 -0
  281. package/dist/providers/social/bluesky.d.ts +3 -0
  282. package/dist/providers/social/bluesky.d.ts.map +1 -0
  283. package/dist/providers/social/facebook.d.ts +3 -0
  284. package/dist/providers/social/facebook.d.ts.map +1 -0
  285. package/dist/providers/social/index.d.ts +31 -0
  286. package/dist/providers/social/index.d.ts.map +1 -0
  287. package/dist/providers/social/instagram.d.ts +3 -0
  288. package/dist/providers/social/instagram.d.ts.map +1 -0
  289. package/dist/providers/social/linkedin.d.ts +3 -0
  290. package/dist/providers/social/linkedin.d.ts.map +1 -0
  291. package/dist/providers/social/platform.d.ts +40 -0
  292. package/dist/providers/social/platform.d.ts.map +1 -0
  293. package/dist/providers/social/reddit.d.ts +3 -0
  294. package/dist/providers/social/reddit.d.ts.map +1 -0
  295. package/dist/providers/social/threads.d.ts +3 -0
  296. package/dist/providers/social/threads.d.ts.map +1 -0
  297. package/dist/providers/social/tiktok.d.ts +3 -0
  298. package/dist/providers/social/tiktok.d.ts.map +1 -0
  299. package/dist/providers/social/x.d.ts +3 -0
  300. package/dist/providers/social/x.d.ts.map +1 -0
  301. package/dist/providers/social/youtube-resolver.d.ts +78 -0
  302. package/dist/providers/social/youtube-resolver.d.ts.map +1 -0
  303. package/dist/providers/social/youtube.d.ts +34 -0
  304. package/dist/providers/social/youtube.d.ts.map +1 -0
  305. package/dist/providers/tier-router.d.ts +30 -0
  306. package/dist/providers/tier-router.d.ts.map +1 -0
  307. package/dist/providers/timebox.d.ts +20 -0
  308. package/dist/providers/timebox.d.ts.map +1 -0
  309. package/dist/providers/types.d.ts +344 -0
  310. package/dist/providers/types.d.ts.map +1 -0
  311. package/dist/providers/web/crawl-worker.d.ts +36 -0
  312. package/dist/providers/web/crawl-worker.d.ts.map +1 -0
  313. package/dist/providers/web/crawler.d.ts +101 -0
  314. package/dist/providers/web/crawler.d.ts.map +1 -0
  315. package/dist/providers/web/extract.d.ts +11 -0
  316. package/dist/providers/web/extract.d.ts.map +1 -0
  317. package/dist/providers/web/index.d.ts +24 -0
  318. package/dist/providers/web/index.d.ts.map +1 -0
  319. package/dist/providers/web/policy.d.ts +14 -0
  320. package/dist/providers/web/policy.d.ts.map +1 -0
  321. package/dist/providers/workflows.d.ts +67 -0
  322. package/dist/providers/workflows.d.ts.map +1 -0
  323. package/dist/relay/protocol.d.ts +317 -0
  324. package/dist/relay/protocol.d.ts.map +1 -0
  325. package/dist/relay/relay-endpoints.d.ts +16 -0
  326. package/dist/relay/relay-endpoints.d.ts.map +1 -0
  327. package/dist/relay/relay-server.d.ts +111 -0
  328. package/dist/relay/relay-server.d.ts.map +1 -0
  329. package/dist/relay/relay-types.d.ts +9 -0
  330. package/dist/relay/relay-types.d.ts.map +1 -0
  331. package/dist/skills/continuity-nudge.d.ts +12 -0
  332. package/dist/skills/continuity-nudge.d.ts.map +1 -0
  333. package/dist/skills/skill-loader.d.ts +20 -0
  334. package/dist/skills/skill-loader.d.ts.map +1 -0
  335. package/dist/skills/skill-nudge.d.ts +18 -0
  336. package/dist/skills/skill-nudge.d.ts.map +1 -0
  337. package/dist/skills/types.d.ts +12 -0
  338. package/dist/skills/types.d.ts.map +1 -0
  339. package/dist/snapshot/ops-snapshot.d.ts +16 -0
  340. package/dist/snapshot/ops-snapshot.d.ts.map +1 -0
  341. package/dist/snapshot/refs.d.ts +23 -0
  342. package/dist/snapshot/refs.d.ts.map +1 -0
  343. package/dist/snapshot/snapshotter.d.ts +27 -0
  344. package/dist/snapshot/snapshotter.d.ts.map +1 -0
  345. package/dist/tools/annotate.d.ts +4 -0
  346. package/dist/tools/annotate.d.ts.map +1 -0
  347. package/dist/tools/check.d.ts +4 -0
  348. package/dist/tools/check.d.ts.map +1 -0
  349. package/dist/tools/click.d.ts +4 -0
  350. package/dist/tools/click.d.ts.map +1 -0
  351. package/dist/tools/clone_component.d.ts +4 -0
  352. package/dist/tools/clone_component.d.ts.map +1 -0
  353. package/dist/tools/clone_page.d.ts +4 -0
  354. package/dist/tools/clone_page.d.ts.map +1 -0
  355. package/dist/tools/close.d.ts +4 -0
  356. package/dist/tools/close.d.ts.map +1 -0
  357. package/dist/tools/connect.d.ts +4 -0
  358. package/dist/tools/connect.d.ts.map +1 -0
  359. package/dist/tools/console_poll.d.ts +4 -0
  360. package/dist/tools/console_poll.d.ts.map +1 -0
  361. package/dist/tools/cookie_import.d.ts +25 -0
  362. package/dist/tools/cookie_import.d.ts.map +1 -0
  363. package/dist/tools/cookie_list.d.ts +9 -0
  364. package/dist/tools/cookie_list.d.ts.map +1 -0
  365. package/dist/tools/debug_trace_snapshot.d.ts +4 -0
  366. package/dist/tools/debug_trace_snapshot.d.ts.map +1 -0
  367. package/dist/tools/deps.d.ts +26 -0
  368. package/dist/tools/deps.d.ts.map +1 -0
  369. package/dist/tools/disconnect.d.ts +4 -0
  370. package/dist/tools/disconnect.d.ts.map +1 -0
  371. package/dist/tools/dom_get_html.d.ts +4 -0
  372. package/dist/tools/dom_get_html.d.ts.map +1 -0
  373. package/dist/tools/dom_get_text.d.ts +4 -0
  374. package/dist/tools/dom_get_text.d.ts.map +1 -0
  375. package/dist/tools/get_attr.d.ts +4 -0
  376. package/dist/tools/get_attr.d.ts.map +1 -0
  377. package/dist/tools/get_value.d.ts +4 -0
  378. package/dist/tools/get_value.d.ts.map +1 -0
  379. package/dist/tools/goto.d.ts +4 -0
  380. package/dist/tools/goto.d.ts.map +1 -0
  381. package/dist/tools/hover.d.ts +4 -0
  382. package/dist/tools/hover.d.ts.map +1 -0
  383. package/dist/tools/index.d.ts +4 -0
  384. package/dist/tools/index.d.ts.map +1 -0
  385. package/dist/tools/is_checked.d.ts +4 -0
  386. package/dist/tools/is_checked.d.ts.map +1 -0
  387. package/dist/tools/is_enabled.d.ts +4 -0
  388. package/dist/tools/is_enabled.d.ts.map +1 -0
  389. package/dist/tools/is_visible.d.ts +4 -0
  390. package/dist/tools/is_visible.d.ts.map +1 -0
  391. package/dist/tools/launch.d.ts +4 -0
  392. package/dist/tools/launch.d.ts.map +1 -0
  393. package/dist/tools/list.d.ts +4 -0
  394. package/dist/tools/list.d.ts.map +1 -0
  395. package/dist/tools/macro_resolve.d.ts +25 -0
  396. package/dist/tools/macro_resolve.d.ts.map +1 -0
  397. package/dist/tools/network_poll.d.ts +4 -0
  398. package/dist/tools/network_poll.d.ts.map +1 -0
  399. package/dist/tools/page.d.ts +4 -0
  400. package/dist/tools/page.d.ts.map +1 -0
  401. package/dist/tools/perf.d.ts +4 -0
  402. package/dist/tools/perf.d.ts.map +1 -0
  403. package/dist/tools/press.d.ts +4 -0
  404. package/dist/tools/press.d.ts.map +1 -0
  405. package/dist/tools/product_video_run.d.ts +4 -0
  406. package/dist/tools/product_video_run.d.ts.map +1 -0
  407. package/dist/tools/prompting_guide.d.ts +4 -0
  408. package/dist/tools/prompting_guide.d.ts.map +1 -0
  409. package/dist/tools/research_run.d.ts +4 -0
  410. package/dist/tools/research_run.d.ts.map +1 -0
  411. package/dist/tools/response.d.ts +16 -0
  412. package/dist/tools/response.d.ts.map +1 -0
  413. package/dist/tools/run.d.ts +4 -0
  414. package/dist/tools/run.d.ts.map +1 -0
  415. package/dist/tools/screenshot.d.ts +4 -0
  416. package/dist/tools/screenshot.d.ts.map +1 -0
  417. package/dist/tools/scroll.d.ts +4 -0
  418. package/dist/tools/scroll.d.ts.map +1 -0
  419. package/dist/tools/scroll_into_view.d.ts +4 -0
  420. package/dist/tools/scroll_into_view.d.ts.map +1 -0
  421. package/dist/tools/select.d.ts +4 -0
  422. package/dist/tools/select.d.ts.map +1 -0
  423. package/dist/tools/shopping_run.d.ts +4 -0
  424. package/dist/tools/shopping_run.d.ts.map +1 -0
  425. package/dist/tools/skill_list.d.ts +4 -0
  426. package/dist/tools/skill_list.d.ts.map +1 -0
  427. package/dist/tools/skill_load.d.ts +4 -0
  428. package/dist/tools/skill_load.d.ts.map +1 -0
  429. package/dist/tools/snapshot.d.ts +4 -0
  430. package/dist/tools/snapshot.d.ts.map +1 -0
  431. package/dist/tools/status.d.ts +4 -0
  432. package/dist/tools/status.d.ts.map +1 -0
  433. package/dist/tools/target_close.d.ts +4 -0
  434. package/dist/tools/target_close.d.ts.map +1 -0
  435. package/dist/tools/target_new.d.ts +4 -0
  436. package/dist/tools/target_new.d.ts.map +1 -0
  437. package/dist/tools/target_use.d.ts +4 -0
  438. package/dist/tools/target_use.d.ts.map +1 -0
  439. package/dist/tools/targets_list.d.ts +4 -0
  440. package/dist/tools/targets_list.d.ts.map +1 -0
  441. package/dist/tools/type.d.ts +4 -0
  442. package/dist/tools/type.d.ts.map +1 -0
  443. package/dist/tools/uncheck.d.ts +4 -0
  444. package/dist/tools/uncheck.d.ts.map +1 -0
  445. package/dist/tools/wait.d.ts +4 -0
  446. package/dist/tools/wait.d.ts.map +1 -0
  447. package/dist/tools/workflow-runtime.d.ts +4 -0
  448. package/dist/tools/workflow-runtime.d.ts.map +1 -0
  449. package/dist/utils/crypto.d.ts +2 -0
  450. package/dist/utils/crypto.d.ts.map +1 -0
  451. package/dist/utils/endpoint-validation.d.ts +2 -0
  452. package/dist/utils/endpoint-validation.d.ts.map +1 -0
  453. package/dist/utils/fs.d.ts +5 -0
  454. package/dist/utils/fs.d.ts.map +1 -0
  455. package/dist/utils/hub-enabled.d.ts +3 -0
  456. package/dist/utils/hub-enabled.d.ts.map +1 -0
  457. package/extension/dist/background.js +10 -4
  458. package/extension/dist/ops/ops-runtime.js +506 -4
  459. package/extension/dist/ops/ops-session-store.js +16 -2
  460. package/extension/dist/ops/parallelism-governor.js +117 -0
  461. package/extension/dist/ops/snapshot-shared.js +21 -5
  462. package/extension/dist/services/CDPRouter.js +70 -5
  463. package/extension/dist/services/ConnectionManager.js +5 -3
  464. package/extension/icons/icon128.png +0 -0
  465. package/extension/icons/icon16.png +0 -0
  466. package/extension/icons/icon32.png +0 -0
  467. package/extension/icons/icon48.png +0 -0
  468. package/extension/manifest.json +1 -1
  469. package/package.json +25 -16
  470. package/scripts/native/host.cjs +230 -0
  471. package/scripts/native/install.ps1 +73 -0
  472. package/scripts/native/install.sh +66 -0
  473. package/scripts/native/uninstall.ps1 +25 -0
  474. package/scripts/native/uninstall.sh +26 -0
  475. package/skills/AGENTS.md +17 -8
  476. package/skills/opendevbrowser-best-practices/SKILL.md +178 -72
  477. package/skills/opendevbrowser-best-practices/artifacts/browser-agent-known-issues-matrix.md +44 -0
  478. package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +95 -0
  479. package/skills/opendevbrowser-best-practices/artifacts/debug-trace-playbook.md +36 -0
  480. package/skills/opendevbrowser-best-practices/artifacts/fingerprint-tiers.md +36 -0
  481. package/skills/opendevbrowser-best-practices/artifacts/macro-workflows.md +43 -0
  482. package/skills/opendevbrowser-best-practices/artifacts/parity-gates.md +36 -0
  483. package/skills/opendevbrowser-best-practices/artifacts/provider-workflows.md +89 -0
  484. package/skills/opendevbrowser-best-practices/assets/templates/cdp-forward-envelope.json +11 -0
  485. package/skills/opendevbrowser-best-practices/assets/templates/mode-flag-matrix.json +56 -0
  486. package/skills/opendevbrowser-best-practices/assets/templates/ops-request-envelope.json +9 -0
  487. package/skills/opendevbrowser-best-practices/assets/templates/robustness-checklist.json +79 -0
  488. package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +24 -0
  489. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +144 -0
  490. package/skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh +83 -0
  491. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +93 -0
  492. package/skills/opendevbrowser-continuity-ledger/SKILL.md +10 -0
  493. package/skills/opendevbrowser-data-extraction/SKILL.md +126 -0
  494. package/skills/opendevbrowser-data-extraction/artifacts/extraction-workflows.md +31 -0
  495. package/skills/opendevbrowser-data-extraction/assets/templates/compliance-checklist.md +7 -0
  496. package/skills/opendevbrowser-data-extraction/assets/templates/extraction-schema.json +17 -0
  497. package/skills/opendevbrowser-data-extraction/assets/templates/pagination-state.json +11 -0
  498. package/skills/opendevbrowser-data-extraction/assets/templates/quality-gates.json +10 -0
  499. package/skills/opendevbrowser-data-extraction/examples/sample-schema.json +19 -0
  500. package/skills/opendevbrowser-data-extraction/scripts/run-extraction-workflow.sh +83 -0
  501. package/skills/opendevbrowser-data-extraction/scripts/validate-skill-assets.sh +49 -0
  502. package/skills/opendevbrowser-form-testing/SKILL.md +143 -0
  503. package/skills/opendevbrowser-form-testing/artifacts/form-workflows.md +37 -0
  504. package/skills/opendevbrowser-form-testing/assets/templates/a11y-assertions.md +7 -0
  505. package/skills/opendevbrowser-form-testing/assets/templates/challenge-decision-tree.json +16 -0
  506. package/skills/opendevbrowser-form-testing/assets/templates/multi-step-state.json +11 -0
  507. package/skills/opendevbrowser-form-testing/assets/templates/validation-matrix.json +24 -0
  508. package/skills/opendevbrowser-form-testing/examples/sample-validation-matrix.json +29 -0
  509. package/skills/opendevbrowser-form-testing/scripts/run-form-workflow.sh +82 -0
  510. package/skills/opendevbrowser-form-testing/scripts/validate-skill-assets.sh +49 -0
  511. package/skills/opendevbrowser-login-automation/SKILL.md +159 -0
  512. package/skills/opendevbrowser-login-automation/artifacts/login-workflows.md +39 -0
  513. package/skills/opendevbrowser-login-automation/assets/templates/auth-signals.json +21 -0
  514. package/skills/opendevbrowser-login-automation/assets/templates/challenge-checkpoint.md +10 -0
  515. package/skills/opendevbrowser-login-automation/assets/templates/login-scenario-matrix.json +26 -0
  516. package/skills/opendevbrowser-login-automation/examples/sample-auth-signals.json +14 -0
  517. package/skills/opendevbrowser-login-automation/scripts/record-auth-signals.sh +18 -0
  518. package/skills/opendevbrowser-login-automation/scripts/run-login-workflow.sh +99 -0
  519. package/skills/opendevbrowser-login-automation/scripts/validate-skill-assets.sh +50 -0
  520. package/skills/opendevbrowser-product-presentation-asset/SKILL.md +98 -0
  521. package/skills/opendevbrowser-product-presentation-asset/artifacts/asset-pack-assembly.md +23 -0
  522. package/skills/opendevbrowser-product-presentation-asset/artifacts/ugc-creative-guide.md +21 -0
  523. package/skills/opendevbrowser-product-presentation-asset/assets/templates/claims-evidence-map.md +5 -0
  524. package/skills/opendevbrowser-product-presentation-asset/assets/templates/copy.md +5 -0
  525. package/skills/opendevbrowser-product-presentation-asset/assets/templates/features.md +4 -0
  526. package/skills/opendevbrowser-product-presentation-asset/assets/templates/manifest.schema.json +14 -0
  527. package/skills/opendevbrowser-product-presentation-asset/assets/templates/shot-list.md +7 -0
  528. package/skills/opendevbrowser-product-presentation-asset/assets/templates/ugc-concepts.md +17 -0
  529. package/skills/opendevbrowser-product-presentation-asset/assets/templates/user-actions.md +7 -0
  530. package/skills/opendevbrowser-product-presentation-asset/assets/templates/video-assembly.md +18 -0
  531. package/skills/opendevbrowser-product-presentation-asset/examples/sample-input.json +6 -0
  532. package/skills/opendevbrowser-product-presentation-asset/examples/sample-manifest.json +18 -0
  533. package/skills/opendevbrowser-product-presentation-asset/scripts/capture-screenshots.sh +9 -0
  534. package/skills/opendevbrowser-product-presentation-asset/scripts/collect-product.sh +14 -0
  535. package/skills/opendevbrowser-product-presentation-asset/scripts/download-images.sh +9 -0
  536. package/skills/opendevbrowser-product-presentation-asset/scripts/render-video-brief.sh +96 -0
  537. package/skills/opendevbrowser-product-presentation-asset/scripts/validate-skill-assets.sh +56 -0
  538. package/skills/opendevbrowser-product-presentation-asset/scripts/write-manifest.sh +43 -0
  539. package/skills/opendevbrowser-research/SKILL.md +73 -0
  540. package/skills/opendevbrowser-research/artifacts/research-workflows.md +29 -0
  541. package/skills/opendevbrowser-research/assets/templates/compact.md +7 -0
  542. package/skills/opendevbrowser-research/assets/templates/context.json +18 -0
  543. package/skills/opendevbrowser-research/assets/templates/report.md +9 -0
  544. package/skills/opendevbrowser-research/examples/sample-input.json +6 -0
  545. package/skills/opendevbrowser-research/examples/sample-output.md +4 -0
  546. package/skills/opendevbrowser-research/scripts/render-output.sh +12 -0
  547. package/skills/opendevbrowser-research/scripts/run-research.sh +23 -0
  548. package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +48 -0
  549. package/skills/opendevbrowser-research/scripts/write-artifacts.sh +29 -0
  550. package/skills/opendevbrowser-shopping/SKILL.md +118 -0
  551. package/skills/opendevbrowser-shopping/artifacts/deal-hunting-workflows.md +37 -0
  552. package/skills/opendevbrowser-shopping/assets/templates/deal-thresholds.json +8 -0
  553. package/skills/opendevbrowser-shopping/assets/templates/deals-context.json +9 -0
  554. package/skills/opendevbrowser-shopping/assets/templates/deals-table.md +4 -0
  555. package/skills/opendevbrowser-shopping/assets/templates/market-analysis.json +30 -0
  556. package/skills/opendevbrowser-shopping/examples/sample-deals.md +4 -0
  557. package/skills/opendevbrowser-shopping/examples/sample-query.json +5 -0
  558. package/skills/opendevbrowser-shopping/scripts/analyze-market.sh +307 -0
  559. package/skills/opendevbrowser-shopping/scripts/normalize-offers.sh +28 -0
  560. package/skills/opendevbrowser-shopping/scripts/render-deals.sh +13 -0
  561. package/skills/opendevbrowser-shopping/scripts/run-deal-hunt.sh +32 -0
  562. package/skills/opendevbrowser-shopping/scripts/run-shopping.sh +19 -0
  563. package/skills/opendevbrowser-shopping/scripts/validate-skill-assets.sh +53 -0
  564. package/dist/chunk-JVBMT2O5.js +0 -7173
  565. package/dist/chunk-JVBMT2O5.js.map +0 -1
  566. package/skills/data-extraction/SKILL.md +0 -128
  567. package/skills/form-testing/SKILL.md +0 -106
  568. package/skills/login-automation/SKILL.md +0 -108
package/dist/index.js CHANGED
@@ -2,11 +2,22 @@ import {
2
2
  DaemonClient,
3
3
  ScriptRunner,
4
4
  buildAnnotateResult,
5
+ buildBlockerArtifacts,
6
+ classifyBlockerSignal,
7
+ createBrowserFallbackPort,
8
+ createConfiguredProviderRuntime,
5
9
  createOpenDevBrowserCore,
10
+ createRequestId,
11
+ executeMacroResolution,
6
12
  extractExtension,
7
13
  fetchDaemonStatusFromMetadata,
14
+ runProductVideoWorkflow,
15
+ runResearchWorkflow,
16
+ runShoppingWorkflow,
17
+ shapeExecutionPayload,
8
18
  startDaemon
9
- } from "./chunk-JVBMT2O5.js";
19
+ } from "./chunk-ST7CO5FA.js";
20
+ import "./chunk-7W3SPXIB.js";
10
21
 
11
22
  // src/cli/remote-manager.ts
12
23
  function isLegacyRelayEndpoint(wsEndpoint) {
@@ -41,77 +52,202 @@ var RemoteManager = class {
41
52
  status(sessionId) {
42
53
  return this.client.call("session.status", { sessionId });
43
54
  }
44
- goto(sessionId, url, waitUntil = "load", timeoutMs = 3e4) {
45
- return this.client.call("nav.goto", { sessionId, url, waitUntil, timeoutMs });
55
+ cookieImport(sessionId, cookies, strict = true, requestId) {
56
+ return this.client.call("session.cookieImport", {
57
+ sessionId,
58
+ cookies,
59
+ strict,
60
+ requestId
61
+ });
46
62
  }
47
- waitForLoad(sessionId, until, timeoutMs = 3e4) {
48
- return this.client.call("nav.wait", { sessionId, until, timeoutMs });
63
+ cookieList(sessionId, urls, requestId) {
64
+ return this.client.call("session.cookieList", {
65
+ sessionId,
66
+ ...urls && urls.length > 0 ? { urls } : {},
67
+ requestId
68
+ });
49
69
  }
50
- waitForRef(sessionId, ref, state = "attached", timeoutMs = 3e4) {
51
- return this.client.call("nav.wait", { sessionId, ref, state, timeoutMs });
70
+ goto(sessionId, url, waitUntil = "load", timeoutMs = 3e4, _sessionOverride, targetId) {
71
+ return this.client.call("nav.goto", {
72
+ sessionId,
73
+ url,
74
+ waitUntil,
75
+ timeoutMs,
76
+ ...typeof targetId === "string" ? { targetId } : {}
77
+ });
52
78
  }
53
- snapshot(sessionId, mode, maxChars, cursor) {
54
- return this.client.call("nav.snapshot", { sessionId, mode, maxChars, cursor });
79
+ waitForLoad(sessionId, until, timeoutMs = 3e4, targetId) {
80
+ return this.client.call("nav.wait", {
81
+ sessionId,
82
+ until,
83
+ timeoutMs,
84
+ ...typeof targetId === "string" ? { targetId } : {}
85
+ });
55
86
  }
56
- click(sessionId, ref) {
57
- return this.client.call("interact.click", { sessionId, ref });
87
+ waitForRef(sessionId, ref, state = "attached", timeoutMs = 3e4, targetId) {
88
+ return this.client.call("nav.wait", {
89
+ sessionId,
90
+ ref,
91
+ state,
92
+ timeoutMs,
93
+ ...typeof targetId === "string" ? { targetId } : {}
94
+ });
58
95
  }
59
- hover(sessionId, ref) {
60
- return this.client.call("interact.hover", { sessionId, ref });
96
+ snapshot(sessionId, mode, maxChars, cursor, targetId) {
97
+ return this.client.call("nav.snapshot", {
98
+ sessionId,
99
+ mode,
100
+ maxChars,
101
+ cursor,
102
+ ...typeof targetId === "string" ? { targetId } : {}
103
+ });
61
104
  }
62
- press(sessionId, key, ref) {
63
- return this.client.call("interact.press", { sessionId, key, ref });
105
+ click(sessionId, ref, targetId) {
106
+ return this.client.call("interact.click", {
107
+ sessionId,
108
+ ref,
109
+ ...typeof targetId === "string" ? { targetId } : {}
110
+ });
64
111
  }
65
- check(sessionId, ref) {
66
- return this.client.call("interact.check", { sessionId, ref });
112
+ hover(sessionId, ref, targetId) {
113
+ return this.client.call("interact.hover", {
114
+ sessionId,
115
+ ref,
116
+ ...typeof targetId === "string" ? { targetId } : {}
117
+ });
67
118
  }
68
- uncheck(sessionId, ref) {
69
- return this.client.call("interact.uncheck", { sessionId, ref });
119
+ press(sessionId, key, ref, targetId) {
120
+ return this.client.call("interact.press", {
121
+ sessionId,
122
+ key,
123
+ ref,
124
+ ...typeof targetId === "string" ? { targetId } : {}
125
+ });
70
126
  }
71
- type(sessionId, ref, text, clear = false, submit = false) {
72
- return this.client.call("interact.type", { sessionId, ref, text, clear, submit });
127
+ check(sessionId, ref, targetId) {
128
+ return this.client.call("interact.check", {
129
+ sessionId,
130
+ ref,
131
+ ...typeof targetId === "string" ? { targetId } : {}
132
+ });
73
133
  }
74
- select(sessionId, ref, values) {
75
- return this.client.call("interact.select", { sessionId, ref, values });
134
+ uncheck(sessionId, ref, targetId) {
135
+ return this.client.call("interact.uncheck", {
136
+ sessionId,
137
+ ref,
138
+ ...typeof targetId === "string" ? { targetId } : {}
139
+ });
76
140
  }
77
- scroll(sessionId, dy, ref) {
78
- return this.client.call("interact.scroll", { sessionId, dy, ref });
141
+ type(sessionId, ref, text, clear = false, submit = false, targetId) {
142
+ return this.client.call("interact.type", {
143
+ sessionId,
144
+ ref,
145
+ text,
146
+ clear,
147
+ submit,
148
+ ...typeof targetId === "string" ? { targetId } : {}
149
+ });
79
150
  }
80
- scrollIntoView(sessionId, ref) {
81
- return this.client.call("interact.scrollIntoView", { sessionId, ref });
151
+ select(sessionId, ref, values, targetId) {
152
+ return this.client.call("interact.select", {
153
+ sessionId,
154
+ ref,
155
+ values,
156
+ ...typeof targetId === "string" ? { targetId } : {}
157
+ });
82
158
  }
83
- domGetHtml(sessionId, ref, maxChars = 8e3) {
84
- return this.client.call("dom.getHtml", { sessionId, ref, maxChars });
159
+ scroll(sessionId, dy, ref, targetId) {
160
+ return this.client.call("interact.scroll", {
161
+ sessionId,
162
+ dy,
163
+ ref,
164
+ ...typeof targetId === "string" ? { targetId } : {}
165
+ });
85
166
  }
86
- domGetText(sessionId, ref, maxChars = 8e3) {
87
- return this.client.call("dom.getText", { sessionId, ref, maxChars });
167
+ scrollIntoView(sessionId, ref, targetId) {
168
+ return this.client.call("interact.scrollIntoView", {
169
+ sessionId,
170
+ ref,
171
+ ...typeof targetId === "string" ? { targetId } : {}
172
+ });
88
173
  }
89
- domGetAttr(sessionId, ref, name) {
90
- return this.client.call("dom.getAttr", { sessionId, ref, name });
174
+ domGetHtml(sessionId, ref, maxChars = 8e3, targetId) {
175
+ return this.client.call("dom.getHtml", {
176
+ sessionId,
177
+ ref,
178
+ maxChars,
179
+ ...typeof targetId === "string" ? { targetId } : {}
180
+ });
91
181
  }
92
- domGetValue(sessionId, ref) {
93
- return this.client.call("dom.getValue", { sessionId, ref });
182
+ domGetText(sessionId, ref, maxChars = 8e3, targetId) {
183
+ return this.client.call("dom.getText", {
184
+ sessionId,
185
+ ref,
186
+ maxChars,
187
+ ...typeof targetId === "string" ? { targetId } : {}
188
+ });
94
189
  }
95
- domIsVisible(sessionId, ref) {
96
- return this.client.call("dom.isVisible", { sessionId, ref });
190
+ domGetAttr(sessionId, ref, name, targetId) {
191
+ return this.client.call("dom.getAttr", {
192
+ sessionId,
193
+ ref,
194
+ name,
195
+ ...typeof targetId === "string" ? { targetId } : {}
196
+ });
97
197
  }
98
- domIsEnabled(sessionId, ref) {
99
- return this.client.call("dom.isEnabled", { sessionId, ref });
198
+ domGetValue(sessionId, ref, targetId) {
199
+ return this.client.call("dom.getValue", {
200
+ sessionId,
201
+ ref,
202
+ ...typeof targetId === "string" ? { targetId } : {}
203
+ });
100
204
  }
101
- domIsChecked(sessionId, ref) {
102
- return this.client.call("dom.isChecked", { sessionId, ref });
205
+ domIsVisible(sessionId, ref, targetId) {
206
+ return this.client.call("dom.isVisible", {
207
+ sessionId,
208
+ ref,
209
+ ...typeof targetId === "string" ? { targetId } : {}
210
+ });
103
211
  }
104
- clonePage(sessionId) {
105
- return this.client.call("export.clonePage", { sessionId });
212
+ domIsEnabled(sessionId, ref, targetId) {
213
+ return this.client.call("dom.isEnabled", {
214
+ sessionId,
215
+ ref,
216
+ ...typeof targetId === "string" ? { targetId } : {}
217
+ });
106
218
  }
107
- cloneComponent(sessionId, ref) {
108
- return this.client.call("export.cloneComponent", { sessionId, ref });
219
+ domIsChecked(sessionId, ref, targetId) {
220
+ return this.client.call("dom.isChecked", {
221
+ sessionId,
222
+ ref,
223
+ ...typeof targetId === "string" ? { targetId } : {}
224
+ });
109
225
  }
110
- perfMetrics(sessionId) {
111
- return this.client.call("devtools.perf", { sessionId });
226
+ clonePage(sessionId, targetId) {
227
+ return this.client.call("export.clonePage", {
228
+ sessionId,
229
+ ...typeof targetId === "string" ? { targetId } : {}
230
+ });
112
231
  }
113
- screenshot(sessionId, path) {
114
- return this.client.call("page.screenshot", { sessionId, path });
232
+ cloneComponent(sessionId, ref, targetId) {
233
+ return this.client.call("export.cloneComponent", {
234
+ sessionId,
235
+ ref,
236
+ ...typeof targetId === "string" ? { targetId } : {}
237
+ });
238
+ }
239
+ perfMetrics(sessionId, targetId) {
240
+ return this.client.call("devtools.perf", {
241
+ sessionId,
242
+ ...typeof targetId === "string" ? { targetId } : {}
243
+ });
244
+ }
245
+ screenshot(sessionId, path, targetId) {
246
+ return this.client.call("page.screenshot", {
247
+ sessionId,
248
+ path,
249
+ ...typeof targetId === "string" ? { targetId } : {}
250
+ });
115
251
  }
116
252
  consolePoll(sessionId, sinceSeq, max = 50) {
117
253
  return this.client.call("devtools.consolePoll", { sessionId, sinceSeq, max });
@@ -209,7 +345,7 @@ var RemoteRelay = class {
209
345
 
210
346
  // src/skills/skill-nudge.ts
211
347
  var SKILL_NUDGE_MARKER = "[opendevbrowser:skill-nudge]";
212
- var SKILL_NUDGE_MESSAGE = `${SKILL_NUDGE_MARKER} If this task likely matches a skill, call the OpenCode skill tool early (skill("<skill-name>", topic?)) and load only the most relevant skill before using browser tools. If unsure which skill applies, check the available skills first.`;
348
+ var SKILL_NUDGE_MESSAGE = `${SKILL_NUDGE_MARKER} If this task likely matches a skill, start with skill("opendevbrowser-best-practices", "quick start"). Use another skill only when it is more relevant.`;
213
349
  function createSkillNudgeState() {
214
350
  return { pending: false, requestedAtMs: null };
215
351
  }
@@ -272,7 +408,7 @@ function consumeContinuityNudge(state, nowMs, maxAgeMs) {
272
408
  }
273
409
  function buildContinuityNudgeMessage(filePath) {
274
410
  const target = filePath?.trim() || DEFAULT_FILE_PATH;
275
- return `${CONTINUITY_NUDGE_MARKER} For long-running tasks, create or update ${target} at the repo root with Goal, Constraints/Assumptions, Key decisions, State (Done/Now/Next), Open questions, and Working set. Keep it brief.`;
411
+ return `${CONTINUITY_NUDGE_MARKER} For long-running tasks, load skill("opendevbrowser-continuity-ledger") and create or update ${target} at the repo root with Goal, Constraints/Assumptions, Key decisions, State (Done/Now/Next), Open questions, and Working set. Keep it brief.`;
276
412
  }
277
413
 
278
414
  // src/tools/launch.ts
@@ -333,6 +469,12 @@ function createLaunchTool(deps) {
333
469
  const headlessExplicit = args.headless === true;
334
470
  const managedExplicit = Boolean(args.noExtension || headlessExplicit);
335
471
  const managedHeadless = headlessExplicit ? true : false;
472
+ if (headlessExplicit && !args.noExtension) {
473
+ return failure(
474
+ "Extension mode does not support headless launches. Use noExtension=true with headless=true for managed mode.",
475
+ "unsupported_mode"
476
+ );
477
+ }
336
478
  if (args.waitForExtension && !managedExplicit) {
337
479
  const observedPort2 = resolveObservedPort(relayStatus, config.relayPort);
338
480
  const connected = await waitForExtensionHandshake(deps.relay, observedPort2, waitTimeoutMs);
@@ -1550,14 +1692,457 @@ function createNetworkPollTool(deps) {
1550
1692
  });
1551
1693
  }
1552
1694
 
1553
- // src/tools/clone_page.ts
1695
+ // src/tools/debug_trace_snapshot.ts
1554
1696
  import { tool as tool35 } from "@opencode-ai/plugin";
1555
1697
  var z35 = tool35.schema;
1556
- function createClonePageTool(deps) {
1698
+ function createDebugTraceSnapshotTool(deps) {
1557
1699
  return tool35({
1700
+ description: "Capture a combined debug trace snapshot (page + console + network + exceptions).",
1701
+ args: {
1702
+ sessionId: z35.string().describe("Session id"),
1703
+ sinceConsoleSeq: z35.number().int().optional().describe("Resume cursor for console events"),
1704
+ sinceNetworkSeq: z35.number().int().optional().describe("Resume cursor for network events"),
1705
+ sinceExceptionSeq: z35.number().int().optional().describe("Resume cursor for exception events"),
1706
+ max: z35.number().int().optional().describe("Max events per channel"),
1707
+ requestId: z35.string().optional().describe("Optional trace request id")
1708
+ },
1709
+ async execute(args) {
1710
+ try {
1711
+ const manager = deps.manager;
1712
+ const options = {
1713
+ sinceConsoleSeq: args.sinceConsoleSeq,
1714
+ sinceNetworkSeq: args.sinceNetworkSeq,
1715
+ sinceExceptionSeq: args.sinceExceptionSeq,
1716
+ max: args.max,
1717
+ requestId: args.requestId
1718
+ };
1719
+ if (typeof manager.debugTraceSnapshot === "function") {
1720
+ const result = await manager.debugTraceSnapshot(args.sessionId, options);
1721
+ return ok(result);
1722
+ }
1723
+ const max = args.max ?? 500;
1724
+ const requestId = args.requestId ?? createRequestId();
1725
+ const [page, consoleChannel, networkChannel] = await Promise.all([
1726
+ deps.manager.status(args.sessionId),
1727
+ deps.manager.consolePoll(args.sessionId, args.sinceConsoleSeq, max),
1728
+ deps.manager.networkPoll(args.sessionId, args.sinceNetworkSeq, max)
1729
+ ]);
1730
+ const exceptionChannel = typeof manager.exceptionPoll === "function" ? await manager.exceptionPoll(args.sessionId, args.sinceExceptionSeq, max) : {
1731
+ events: [],
1732
+ nextSeq: args.sinceExceptionSeq ?? 0,
1733
+ truncated: false
1734
+ };
1735
+ const annotateTraceContext = (events) => events.map((event) => ({
1736
+ ...event,
1737
+ requestId,
1738
+ sessionId: args.sessionId
1739
+ }));
1740
+ const blocker = classifyBlockerSignal({
1741
+ source: "network",
1742
+ url: typeof page.url === "string" ? page.url : void 0,
1743
+ finalUrl: typeof page.url === "string" ? page.url : void 0,
1744
+ title: typeof page.title === "string" ? page.title : void 0,
1745
+ status: findLatestStatus(networkChannel.events),
1746
+ traceRequestId: requestId,
1747
+ networkHosts: extractHosts(networkChannel.events),
1748
+ threshold: deps.config.get().blockerDetectionThreshold,
1749
+ promptGuardEnabled: deps.config.get().security.promptInjectionGuard?.enabled ?? true
1750
+ });
1751
+ const blockerArtifacts = blocker ? buildBlockerArtifacts({
1752
+ networkEvents: networkChannel.events,
1753
+ consoleEvents: consoleChannel.events,
1754
+ exceptionEvents: exceptionChannel.events,
1755
+ promptGuardEnabled: deps.config.get().security.promptInjectionGuard?.enabled ?? true,
1756
+ caps: deps.config.get().blockerArtifactCaps
1757
+ }) : void 0;
1758
+ return ok({
1759
+ requestId,
1760
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
1761
+ page,
1762
+ channels: {
1763
+ console: {
1764
+ nextSeq: consoleChannel.nextSeq,
1765
+ truncated: consoleChannel.truncated,
1766
+ events: annotateTraceContext(consoleChannel.events)
1767
+ },
1768
+ network: {
1769
+ nextSeq: networkChannel.nextSeq,
1770
+ truncated: networkChannel.truncated,
1771
+ events: annotateTraceContext(networkChannel.events)
1772
+ },
1773
+ exception: {
1774
+ nextSeq: exceptionChannel.nextSeq,
1775
+ truncated: exceptionChannel.truncated,
1776
+ events: annotateTraceContext(exceptionChannel.events)
1777
+ }
1778
+ },
1779
+ meta: {
1780
+ blockerState: blocker ? "active" : "clear",
1781
+ ...blocker ? { blocker } : {},
1782
+ ...blockerArtifacts ? { blockerArtifacts } : {}
1783
+ }
1784
+ });
1785
+ } catch (error) {
1786
+ return failure(serializeError(error).message, "debug_trace_snapshot_failed");
1787
+ }
1788
+ }
1789
+ });
1790
+ }
1791
+ function findLatestStatus(events) {
1792
+ for (let index = events.length - 1; index >= 0; index -= 1) {
1793
+ const status = events[index]?.status;
1794
+ if (typeof status === "number") {
1795
+ return status;
1796
+ }
1797
+ }
1798
+ return void 0;
1799
+ }
1800
+ function extractHosts(events) {
1801
+ const hosts = [];
1802
+ const seen = /* @__PURE__ */ new Set();
1803
+ for (const event of events) {
1804
+ if (typeof event.url !== "string") continue;
1805
+ try {
1806
+ const host = new URL(event.url).hostname.toLowerCase();
1807
+ if (!host || seen.has(host)) continue;
1808
+ seen.add(host);
1809
+ hosts.push(host);
1810
+ } catch {
1811
+ }
1812
+ }
1813
+ return hosts;
1814
+ }
1815
+
1816
+ // src/tools/cookie_import.ts
1817
+ import { tool as tool36 } from "@opencode-ai/plugin";
1818
+ var z36 = tool36.schema;
1819
+ function validateCookieRecord(cookie) {
1820
+ const name = cookie.name?.trim();
1821
+ if (!name) {
1822
+ return { valid: false, reason: "Cookie name is required.", cookie };
1823
+ }
1824
+ if (!/^[^\s;=]+$/.test(name)) {
1825
+ return { valid: false, reason: `Invalid cookie name: ${cookie.name}.`, cookie };
1826
+ }
1827
+ if (typeof cookie.value !== "string") {
1828
+ return { valid: false, reason: `Invalid cookie value for ${name}.`, cookie };
1829
+ }
1830
+ const value = cookie.value;
1831
+ if (/\r|\n|;/.test(value)) {
1832
+ return { valid: false, reason: `Invalid cookie value for ${name}.`, cookie };
1833
+ }
1834
+ const hasUrl = typeof cookie.url === "string" && cookie.url.trim().length > 0;
1835
+ const hasDomain = typeof cookie.domain === "string" && cookie.domain.trim().length > 0;
1836
+ if (!hasUrl && !hasDomain) {
1837
+ return { valid: false, reason: `Cookie ${name} requires url or domain.`, cookie };
1838
+ }
1839
+ let normalizedUrl;
1840
+ if (hasUrl) {
1841
+ try {
1842
+ const parsedUrl = new URL(cookie.url);
1843
+ if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
1844
+ return { valid: false, reason: `Cookie ${name} url must be http(s).`, cookie };
1845
+ }
1846
+ normalizedUrl = parsedUrl.toString();
1847
+ } catch {
1848
+ return { valid: false, reason: `Cookie ${name} has invalid url.`, cookie };
1849
+ }
1850
+ }
1851
+ let normalizedDomain;
1852
+ if (hasDomain) {
1853
+ normalizedDomain = String(cookie.domain).trim().toLowerCase();
1854
+ if (!/^\.?[a-z0-9.-]+$/.test(normalizedDomain)) {
1855
+ return { valid: false, reason: `Cookie ${name} has invalid domain.`, cookie };
1856
+ }
1857
+ if (normalizedDomain.includes("..")) {
1858
+ return { valid: false, reason: `Cookie ${name} has invalid domain.`, cookie };
1859
+ }
1860
+ }
1861
+ const normalizedPath = typeof cookie.path === "string" ? cookie.path.trim() : void 0;
1862
+ if (typeof normalizedPath === "string" && !normalizedPath.startsWith("/")) {
1863
+ return { valid: false, reason: `Cookie ${name} path must start with '/'.`, cookie };
1864
+ }
1865
+ if (typeof cookie.expires !== "undefined") {
1866
+ if (!Number.isFinite(cookie.expires)) {
1867
+ return { valid: false, reason: `Cookie ${name} has invalid expires.`, cookie };
1868
+ }
1869
+ if (cookie.expires < -1) {
1870
+ return { valid: false, reason: `Cookie ${name} has invalid expires.`, cookie };
1871
+ }
1872
+ }
1873
+ if (cookie.sameSite === "None" && cookie.secure !== true) {
1874
+ return { valid: false, reason: `Cookie ${name} with SameSite=None must set secure=true.`, cookie };
1875
+ }
1876
+ const normalizedCookie = {
1877
+ name,
1878
+ value,
1879
+ ...typeof cookie.expires === "number" ? { expires: cookie.expires } : {},
1880
+ ...typeof cookie.httpOnly === "boolean" ? { httpOnly: cookie.httpOnly } : {},
1881
+ ...typeof cookie.secure === "boolean" ? { secure: cookie.secure } : {},
1882
+ ...cookie.sameSite ? { sameSite: cookie.sameSite } : {}
1883
+ };
1884
+ if (normalizedDomain) {
1885
+ normalizedCookie.domain = normalizedDomain;
1886
+ normalizedCookie.path = normalizedPath ?? "/";
1887
+ } else if (normalizedUrl) {
1888
+ normalizedCookie.url = normalizedUrl;
1889
+ }
1890
+ return {
1891
+ valid: true,
1892
+ reason: "",
1893
+ cookie: normalizedCookie
1894
+ };
1895
+ }
1896
+ function createCookieImportTool(deps) {
1897
+ return tool36({
1898
+ description: "Import validated cookies into the current session context.",
1899
+ args: {
1900
+ sessionId: z36.string().describe("Session id"),
1901
+ cookies: z36.array(z36.object({
1902
+ name: z36.string().min(1),
1903
+ value: z36.string(),
1904
+ url: z36.string().optional(),
1905
+ domain: z36.string().optional(),
1906
+ path: z36.string().optional(),
1907
+ expires: z36.number().optional(),
1908
+ httpOnly: z36.boolean().optional(),
1909
+ secure: z36.boolean().optional(),
1910
+ sameSite: z36.enum(["Strict", "Lax", "None"]).optional()
1911
+ })).min(1).describe("Cookies to import"),
1912
+ strict: z36.boolean().optional().describe("Reject on first invalid cookie (default true)"),
1913
+ requestId: z36.string().optional().describe("Optional trace request id")
1914
+ },
1915
+ async execute(args) {
1916
+ try {
1917
+ const strict = args.strict ?? true;
1918
+ const requestId = args.requestId ?? createRequestId();
1919
+ const manager = deps.manager;
1920
+ const normalized = [];
1921
+ const rejected = [];
1922
+ args.cookies.forEach((cookie, index) => {
1923
+ const validation = validateCookieRecord(cookie);
1924
+ if (!validation.valid) {
1925
+ rejected.push({ index, reason: validation.reason });
1926
+ return;
1927
+ }
1928
+ normalized.push(validation.cookie);
1929
+ });
1930
+ if (typeof manager.cookieImport === "function") {
1931
+ return ok(await manager.cookieImport(args.sessionId, normalized, strict, requestId));
1932
+ }
1933
+ if (strict && rejected.length > 0) {
1934
+ return failure(`Cookie import rejected ${rejected.length} entries.`, "cookie_import_failed");
1935
+ }
1936
+ if (normalized.length > 0) {
1937
+ await deps.manager.withPage(args.sessionId, null, async (page) => {
1938
+ await page.context().addCookies(normalized);
1939
+ return void 0;
1940
+ });
1941
+ }
1942
+ return ok({
1943
+ requestId,
1944
+ imported: normalized.length,
1945
+ rejected
1946
+ });
1947
+ } catch (error) {
1948
+ return failure(serializeError(error).message, "cookie_import_failed");
1949
+ }
1950
+ }
1951
+ });
1952
+ }
1953
+
1954
+ // src/tools/cookie_list.ts
1955
+ import { tool as tool37 } from "@opencode-ai/plugin";
1956
+ var z37 = tool37.schema;
1957
+ function normalizeCookieUrls(urls) {
1958
+ if (!urls || urls.length === 0) {
1959
+ return void 0;
1960
+ }
1961
+ const normalized = [];
1962
+ const seen = /* @__PURE__ */ new Set();
1963
+ for (const value of urls) {
1964
+ const trimmed = value.trim();
1965
+ if (!trimmed) {
1966
+ throw new Error("Cookie list urls must be non-empty strings.");
1967
+ }
1968
+ let parsedUrl;
1969
+ try {
1970
+ parsedUrl = new URL(trimmed);
1971
+ } catch {
1972
+ throw new Error(`Cookie list url is invalid: ${trimmed}`);
1973
+ }
1974
+ if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
1975
+ throw new Error(`Cookie list url must be http(s): ${trimmed}`);
1976
+ }
1977
+ const normalizedUrl = parsedUrl.toString();
1978
+ if (seen.has(normalizedUrl)) {
1979
+ continue;
1980
+ }
1981
+ seen.add(normalizedUrl);
1982
+ normalized.push(normalizedUrl);
1983
+ }
1984
+ return normalized;
1985
+ }
1986
+ function createCookieListTool(deps) {
1987
+ return tool37({
1988
+ description: "List cookies in the current session context with optional URL filtering.",
1989
+ args: {
1990
+ sessionId: z37.string().describe("Session id"),
1991
+ urls: z37.array(z37.string().min(1)).optional().describe("Optional URL filters for cookie scoping"),
1992
+ requestId: z37.string().optional().describe("Optional trace request id")
1993
+ },
1994
+ async execute(args) {
1995
+ try {
1996
+ const manager = deps.manager;
1997
+ const normalizedUrls = normalizeCookieUrls(args.urls);
1998
+ const requestId = args.requestId ?? createRequestId();
1999
+ if (typeof manager.cookieList === "function") {
2000
+ return ok(await manager.cookieList(args.sessionId, normalizedUrls, requestId));
2001
+ }
2002
+ const cookies = await deps.manager.withPage(
2003
+ args.sessionId,
2004
+ null,
2005
+ async (page) => {
2006
+ const listed = normalizedUrls ? await page.context().cookies(normalizedUrls) : await page.context().cookies();
2007
+ return listed.map((cookie) => ({
2008
+ name: cookie.name,
2009
+ value: cookie.value,
2010
+ domain: cookie.domain,
2011
+ path: cookie.path,
2012
+ expires: cookie.expires,
2013
+ httpOnly: cookie.httpOnly,
2014
+ secure: cookie.secure,
2015
+ ...cookie.sameSite ? { sameSite: cookie.sameSite } : {}
2016
+ }));
2017
+ }
2018
+ );
2019
+ return ok({
2020
+ requestId,
2021
+ cookies,
2022
+ count: cookies.length
2023
+ });
2024
+ } catch (error) {
2025
+ return failure(serializeError(error).message, "cookie_list_failed");
2026
+ }
2027
+ }
2028
+ });
2029
+ }
2030
+
2031
+ // src/tools/macro_resolve.ts
2032
+ import { tool as tool38 } from "@opencode-ai/plugin";
2033
+ var z38 = tool38.schema;
2034
+ async function loadMacroRuntime() {
2035
+ try {
2036
+ const module = await import("./macros-NUBRM44Y.js");
2037
+ return module;
2038
+ } catch {
2039
+ return null;
2040
+ }
2041
+ }
2042
+ function parseFallbackMacro(expression, defaultProvider) {
2043
+ const raw = expression.trim();
2044
+ if (!raw.startsWith("@")) {
2045
+ throw new Error("Macro expressions must start with '@'");
2046
+ }
2047
+ const body = raw.slice(1).trim();
2048
+ if (!body) {
2049
+ throw new Error("Macro name is required");
2050
+ }
2051
+ const openParen = body.indexOf("(");
2052
+ const closeParen = body.endsWith(")") ? body.length - 1 : -1;
2053
+ const macroName = openParen >= 0 ? body.slice(0, openParen).trim() : body;
2054
+ const argsBody = openParen >= 0 && closeParen > openParen ? body.slice(openParen + 1, closeParen).trim() : "";
2055
+ const positional = argsBody ? argsBody.split(",").map((part) => part.trim().replace(/^['\"]|['\"]$/g, "")).filter(Boolean) : [];
2056
+ const query = positional[0] ?? macroName;
2057
+ const provider = defaultProvider ?? "web/default";
2058
+ return {
2059
+ action: {
2060
+ source: "web",
2061
+ operation: "search",
2062
+ input: {
2063
+ query,
2064
+ limit: 10,
2065
+ providerId: provider
2066
+ }
2067
+ },
2068
+ provenance: {
2069
+ macro: macroName,
2070
+ provider,
2071
+ resolvedQuery: query,
2072
+ pack: "fallback",
2073
+ args: {
2074
+ positional,
2075
+ named: {}
2076
+ }
2077
+ }
2078
+ };
2079
+ }
2080
+ function createMacroResolveTool(deps) {
2081
+ return tool38({
2082
+ description: "Resolve a macro expression to a provider action with provenance metadata.",
2083
+ args: {
2084
+ expression: z38.string().min(2).describe('Macro expression, e.g. @web.search("query")'),
2085
+ defaultProvider: z38.string().optional().describe("Default provider fallback"),
2086
+ includeCatalog: z38.boolean().optional().describe("Include available runtime macro names"),
2087
+ execute: z38.boolean().optional().describe("Execute the resolved provider action and include execution payload")
2088
+ },
2089
+ async execute(args) {
2090
+ try {
2091
+ const runtime = await loadMacroRuntime();
2092
+ const registry = runtime?.createDefaultMacroRegistry?.();
2093
+ let resolvedRuntime = "fallback";
2094
+ let resolution;
2095
+ let catalog;
2096
+ if (registry) {
2097
+ resolvedRuntime = "macros";
2098
+ resolution = await registry.resolve(args.expression, {
2099
+ defaultProvider: args.defaultProvider
2100
+ });
2101
+ catalog = args.includeCatalog ? registry.list().map((entry) => ({
2102
+ name: entry.name,
2103
+ pack: entry.pack,
2104
+ description: entry.description
2105
+ })) : void 0;
2106
+ } else {
2107
+ resolution = parseFallbackMacro(args.expression, args.defaultProvider);
2108
+ }
2109
+ if (!args.execute) {
2110
+ return ok({
2111
+ runtime: resolvedRuntime,
2112
+ resolution,
2113
+ ...catalog ? { catalog } : {}
2114
+ });
2115
+ }
2116
+ const runtimeConfig = deps.config?.get?.();
2117
+ const providerRuntime = deps.providerRuntime ?? createConfiguredProviderRuntime({
2118
+ config: runtimeConfig,
2119
+ manager: deps.manager,
2120
+ browserFallbackPort: deps.browserFallbackPort
2121
+ });
2122
+ const execution = shapeExecutionPayload(
2123
+ await executeMacroResolution(resolution, providerRuntime)
2124
+ );
2125
+ return ok({
2126
+ runtime: resolvedRuntime,
2127
+ resolution,
2128
+ ...catalog ? { catalog } : {},
2129
+ execution
2130
+ });
2131
+ } catch (error) {
2132
+ return failure(serializeError(error).message, "macro_resolve_failed");
2133
+ }
2134
+ }
2135
+ });
2136
+ }
2137
+
2138
+ // src/tools/clone_page.ts
2139
+ import { tool as tool39 } from "@opencode-ai/plugin";
2140
+ var z39 = tool39.schema;
2141
+ function createClonePageTool(deps) {
2142
+ return tool39({
1558
2143
  description: "Export the active page as a React component and CSS bundle.",
1559
2144
  args: {
1560
- sessionId: z35.string().describe("Active browser session id")
2145
+ sessionId: z39.string().describe("Active browser session id")
1561
2146
  },
1562
2147
  async execute(args) {
1563
2148
  try {
@@ -1571,14 +2156,14 @@ function createClonePageTool(deps) {
1571
2156
  }
1572
2157
 
1573
2158
  // src/tools/clone_component.ts
1574
- import { tool as tool36 } from "@opencode-ai/plugin";
1575
- var z36 = tool36.schema;
2159
+ import { tool as tool40 } from "@opencode-ai/plugin";
2160
+ var z40 = tool40.schema;
1576
2161
  function createCloneComponentTool(deps) {
1577
- return tool36({
2162
+ return tool40({
1578
2163
  description: "Export a selected element subtree as a React component and CSS bundle.",
1579
2164
  args: {
1580
- sessionId: z36.string().describe("Active browser session id"),
1581
- ref: z36.string().describe("Element ref from snapshot")
2165
+ sessionId: z40.string().describe("Active browser session id"),
2166
+ ref: z40.string().describe("Element ref from snapshot")
1582
2167
  },
1583
2168
  async execute(args) {
1584
2169
  try {
@@ -1592,13 +2177,13 @@ function createCloneComponentTool(deps) {
1592
2177
  }
1593
2178
 
1594
2179
  // src/tools/perf.ts
1595
- import { tool as tool37 } from "@opencode-ai/plugin";
1596
- var z37 = tool37.schema;
2180
+ import { tool as tool41 } from "@opencode-ai/plugin";
2181
+ var z41 = tool41.schema;
1597
2182
  function createPerfTool(deps) {
1598
- return tool37({
2183
+ return tool41({
1599
2184
  description: "Fetch lightweight performance metrics from the active page.",
1600
2185
  args: {
1601
- sessionId: z37.string().describe("Active browser session id")
2186
+ sessionId: z41.string().describe("Active browser session id")
1602
2187
  },
1603
2188
  async execute(args) {
1604
2189
  try {
@@ -1612,14 +2197,14 @@ function createPerfTool(deps) {
1612
2197
  }
1613
2198
 
1614
2199
  // src/tools/screenshot.ts
1615
- import { tool as tool38 } from "@opencode-ai/plugin";
1616
- var z38 = tool38.schema;
2200
+ import { tool as tool42 } from "@opencode-ai/plugin";
2201
+ var z42 = tool42.schema;
1617
2202
  function createScreenshotTool(deps) {
1618
- return tool38({
2203
+ return tool42({
1619
2204
  description: "Capture a screenshot of the active page.",
1620
2205
  args: {
1621
- sessionId: z38.string().describe("Active browser session id"),
1622
- path: z38.string().optional().describe("Optional output file path")
2206
+ sessionId: z42.string().describe("Active browser session id"),
2207
+ path: z42.string().optional().describe("Optional output file path")
1623
2208
  },
1624
2209
  async execute(args) {
1625
2210
  try {
@@ -1633,23 +2218,23 @@ function createScreenshotTool(deps) {
1633
2218
  }
1634
2219
 
1635
2220
  // src/tools/annotate.ts
1636
- import { tool as tool39 } from "@opencode-ai/plugin";
1637
- var z39 = tool39.schema;
1638
- var screenshotModeSchema = z39.enum(["visible", "full", "none"]);
1639
- var transportSchema = z39.enum(["auto", "direct", "relay"]);
2221
+ import { tool as tool43 } from "@opencode-ai/plugin";
2222
+ var z43 = tool43.schema;
2223
+ var screenshotModeSchema = z43.enum(["visible", "full", "none"]);
2224
+ var transportSchema = z43.enum(["auto", "direct", "relay"]);
1640
2225
  function createAnnotateTool(deps) {
1641
- return tool39({
2226
+ return tool43({
1642
2227
  description: "Request interactive annotations via direct (CDP) or relay transport.",
1643
2228
  args: {
1644
- sessionId: z39.string().describe("Session id"),
2229
+ sessionId: z43.string().describe("Session id"),
1645
2230
  transport: transportSchema.optional().describe("auto | direct | relay (default: auto)"),
1646
- targetId: z39.string().optional().describe("Optional target id for direct mode"),
1647
- tabId: z39.number().int().optional().describe("Optional Chrome tab id for relay mode"),
1648
- url: z39.string().optional().describe("Optional URL to open before annotating"),
2231
+ targetId: z43.string().optional().describe("Optional target id for direct mode"),
2232
+ tabId: z43.number().int().optional().describe("Optional Chrome tab id for relay mode"),
2233
+ url: z43.string().optional().describe("Optional URL to open before annotating"),
1649
2234
  screenshotMode: screenshotModeSchema.optional().describe("visible | full | none (default: visible)"),
1650
- debug: z39.boolean().optional().describe("Include debug metadata"),
1651
- context: z39.string().optional().describe("Optional context for the annotator"),
1652
- timeoutMs: z39.number().int().optional().describe("Timeout in milliseconds")
2235
+ debug: z43.boolean().optional().describe("Include debug metadata"),
2236
+ context: z43.string().optional().describe("Optional context for the annotator"),
2237
+ timeoutMs: z43.number().int().optional().describe("Timeout in milliseconds")
1653
2238
  },
1654
2239
  async execute(args) {
1655
2240
  try {
@@ -1689,10 +2274,186 @@ function createAnnotateTool(deps) {
1689
2274
  });
1690
2275
  }
1691
2276
 
2277
+ // src/tools/research_run.ts
2278
+ import { tool as tool44 } from "@opencode-ai/plugin";
2279
+
2280
+ // src/tools/workflow-runtime.ts
2281
+ var resolveProviderRuntime = (deps) => {
2282
+ if (deps.providerRuntime) {
2283
+ return deps.providerRuntime;
2284
+ }
2285
+ return createConfiguredProviderRuntime({
2286
+ config: deps.config?.get?.(),
2287
+ manager: deps.manager,
2288
+ browserFallbackPort: deps.browserFallbackPort
2289
+ });
2290
+ };
2291
+
2292
+ // src/tools/research_run.ts
2293
+ var z44 = tool44.schema;
2294
+ var sourceSelectionSchema = z44.enum(["auto", "web", "community", "social", "shopping", "all"]);
2295
+ var sourceSchema = z44.enum(["web", "community", "social", "shopping"]);
2296
+ var modeSchema = z44.enum(["compact", "json", "md", "context", "path"]);
2297
+ var cookiePolicySchema = z44.enum(["off", "auto", "required"]);
2298
+ function createResearchRunTool(deps) {
2299
+ return tool44({
2300
+ description: "Run cross-source research with strict timebox and artifact outputs.",
2301
+ args: {
2302
+ topic: z44.string().min(1).describe("Research topic"),
2303
+ days: z44.number().int().positive().optional().describe("Timebox in days"),
2304
+ from: z44.string().optional().describe("ISO start date"),
2305
+ to: z44.string().optional().describe("ISO end date"),
2306
+ sourceSelection: sourceSelectionSchema.optional().describe("auto|web|community|social|shopping|all"),
2307
+ sources: z44.array(sourceSchema).optional().describe("Explicit source list"),
2308
+ mode: modeSchema.optional().describe("compact|json|md|context|path"),
2309
+ includeEngagement: z44.boolean().optional().describe("Include engagement enrichment"),
2310
+ limitPerSource: z44.number().int().positive().optional().describe("Result limit per source"),
2311
+ outputDir: z44.string().optional().describe("Optional artifact output directory"),
2312
+ ttlHours: z44.number().int().positive().optional().describe("Artifact retention TTL in hours"),
2313
+ useCookies: z44.boolean().optional().describe("Enable/disable provider cookie injection for this run"),
2314
+ cookiePolicyOverride: cookiePolicySchema.optional().describe("Override cookie policy: off|auto|required")
2315
+ },
2316
+ async execute(args) {
2317
+ try {
2318
+ const runtime = resolveProviderRuntime(deps);
2319
+ const result = await runResearchWorkflow(runtime, {
2320
+ topic: args.topic,
2321
+ days: args.days,
2322
+ from: args.from,
2323
+ to: args.to,
2324
+ sourceSelection: args.sourceSelection,
2325
+ sources: args.sources,
2326
+ mode: args.mode ?? "compact",
2327
+ includeEngagement: args.includeEngagement,
2328
+ limitPerSource: args.limitPerSource,
2329
+ outputDir: args.outputDir,
2330
+ ttlHours: args.ttlHours,
2331
+ useCookies: args.useCookies,
2332
+ cookiePolicyOverride: args.cookiePolicyOverride
2333
+ });
2334
+ return ok(result);
2335
+ } catch (error) {
2336
+ return failure(serializeError(error).message, "research_run_failed");
2337
+ }
2338
+ }
2339
+ });
2340
+ }
2341
+
2342
+ // src/tools/shopping_run.ts
2343
+ import { tool as tool45 } from "@opencode-ai/plugin";
2344
+ var z45 = tool45.schema;
2345
+ var sortSchema = z45.enum(["best_deal", "lowest_price", "highest_rating", "fastest_shipping"]);
2346
+ var modeSchema2 = z45.enum(["compact", "json", "md", "context", "path"]);
2347
+ var cookiePolicySchema2 = z45.enum(["off", "auto", "required"]);
2348
+ function createShoppingRunTool(deps) {
2349
+ return tool45({
2350
+ description: "Run shopping/deal intelligence across shopping providers.",
2351
+ args: {
2352
+ query: z45.string().min(1).describe("Shopping query"),
2353
+ providers: z45.array(z45.string()).optional().describe("Optional provider allow-list"),
2354
+ budget: z45.number().positive().optional().describe("Optional budget amount"),
2355
+ region: z45.string().optional().describe("Region hint"),
2356
+ sort: sortSchema.optional().describe("best_deal|lowest_price|highest_rating|fastest_shipping"),
2357
+ mode: modeSchema2.optional().describe("compact|json|md|context|path"),
2358
+ outputDir: z45.string().optional().describe("Optional artifact output directory"),
2359
+ ttlHours: z45.number().int().positive().optional().describe("Artifact retention TTL in hours"),
2360
+ useCookies: z45.boolean().optional().describe("Enable/disable provider cookie injection for this run"),
2361
+ cookiePolicyOverride: cookiePolicySchema2.optional().describe("Override cookie policy: off|auto|required")
2362
+ },
2363
+ async execute(args) {
2364
+ try {
2365
+ const runtime = resolveProviderRuntime(deps);
2366
+ const result = await runShoppingWorkflow(runtime, {
2367
+ query: args.query,
2368
+ providers: args.providers,
2369
+ budget: args.budget,
2370
+ region: args.region,
2371
+ sort: args.sort,
2372
+ mode: args.mode ?? "compact",
2373
+ outputDir: args.outputDir,
2374
+ ttlHours: args.ttlHours,
2375
+ useCookies: args.useCookies,
2376
+ cookiePolicyOverride: args.cookiePolicyOverride
2377
+ });
2378
+ return ok(result);
2379
+ } catch (error) {
2380
+ return failure(serializeError(error).message, "shopping_run_failed");
2381
+ }
2382
+ }
2383
+ });
2384
+ }
2385
+
2386
+ // src/tools/product_video_run.ts
2387
+ import { tool as tool46 } from "@opencode-ai/plugin";
2388
+ var z46 = tool46.schema;
2389
+ var cookiePolicySchema3 = z46.enum(["off", "auto", "required"]);
2390
+ async function captureScreenshotBuffer(deps, url) {
2391
+ let sessionId = null;
2392
+ try {
2393
+ const launched = await deps.manager.launch({
2394
+ headless: true,
2395
+ startUrl: url
2396
+ });
2397
+ sessionId = launched.sessionId;
2398
+ const screenshot = await deps.manager.screenshot(sessionId);
2399
+ if (typeof screenshot.base64 === "string" && screenshot.base64.length > 0) {
2400
+ return Buffer.from(screenshot.base64, "base64");
2401
+ }
2402
+ return null;
2403
+ } catch {
2404
+ return null;
2405
+ } finally {
2406
+ if (sessionId) {
2407
+ await deps.manager.disconnect(sessionId, true).catch(() => {
2408
+ });
2409
+ }
2410
+ }
2411
+ }
2412
+ function createProductVideoRunTool(deps) {
2413
+ return tool46({
2414
+ description: "Collect a product presentation asset pack for video/UGC workflows.",
2415
+ args: {
2416
+ product_url: z46.string().optional().describe("Product URL"),
2417
+ product_name: z46.string().optional().describe("Product name"),
2418
+ provider_hint: z46.string().optional().describe("Optional provider hint"),
2419
+ include_screenshots: z46.boolean().optional().describe("Include screenshots (default true)"),
2420
+ include_all_images: z46.boolean().optional().describe("Include all discovered images (default true)"),
2421
+ include_copy: z46.boolean().optional().describe("Include product copy extraction (default true)"),
2422
+ output_dir: z46.string().optional().describe("Optional output directory"),
2423
+ ttl_hours: z46.number().int().positive().optional().describe("Artifact retention TTL in hours"),
2424
+ useCookies: z46.boolean().optional().describe("Enable/disable provider cookie injection for this run"),
2425
+ cookiePolicyOverride: cookiePolicySchema3.optional().describe("Override cookie policy: off|auto|required")
2426
+ },
2427
+ async execute(args) {
2428
+ try {
2429
+ const runtime = resolveProviderRuntime(deps);
2430
+ const includeScreenshots = args.include_screenshots ?? true;
2431
+ const result = await runProductVideoWorkflow(runtime, {
2432
+ product_url: args.product_url,
2433
+ product_name: args.product_name,
2434
+ provider_hint: args.provider_hint,
2435
+ include_screenshots: includeScreenshots,
2436
+ include_all_images: args.include_all_images,
2437
+ include_copy: args.include_copy,
2438
+ output_dir: args.output_dir,
2439
+ ttl_hours: args.ttl_hours,
2440
+ useCookies: args.useCookies,
2441
+ cookiePolicyOverride: args.cookiePolicyOverride
2442
+ }, {
2443
+ captureScreenshot: includeScreenshots ? async (url) => captureScreenshotBuffer(deps, url) : void 0
2444
+ });
2445
+ return ok(result);
2446
+ } catch (error) {
2447
+ return failure(serializeError(error).message, "product_video_run_failed");
2448
+ }
2449
+ }
2450
+ });
2451
+ }
2452
+
1692
2453
  // src/tools/skill_list.ts
1693
- import { tool as tool40 } from "@opencode-ai/plugin";
2454
+ import { tool as tool47 } from "@opencode-ai/plugin";
1694
2455
  function createSkillListTool(deps) {
1695
- return tool40({
2456
+ return tool47({
1696
2457
  description: "List available skills from OpenCode skill directories (compatibility wrapper)",
1697
2458
  args: {},
1698
2459
  async execute() {
@@ -1708,14 +2469,14 @@ function createSkillListTool(deps) {
1708
2469
  }
1709
2470
 
1710
2471
  // src/tools/skill_load.ts
1711
- import { tool as tool41 } from "@opencode-ai/plugin";
1712
- var z40 = tool41.schema;
2472
+ import { tool as tool48 } from "@opencode-ai/plugin";
2473
+ var z47 = tool48.schema;
1713
2474
  function createSkillLoadTool(deps) {
1714
- return tool41({
2475
+ return tool48({
1715
2476
  description: "Load a specific skill by name from OpenCode skill directories (compatibility wrapper)",
1716
2477
  args: {
1717
- name: z40.string().describe("Name of the skill to load (e.g., 'login-automation', 'form-testing')"),
1718
- topic: z40.string().optional().describe("Optional topic to filter the skill content")
2478
+ name: z47.string().describe("Name of the skill to load (e.g., 'opendevbrowser-login-automation', 'opendevbrowser-form-testing')"),
2479
+ topic: z47.string().optional().describe("Optional topic to filter the skill content")
1719
2480
  },
1720
2481
  async execute(args) {
1721
2482
  try {
@@ -1779,6 +2540,13 @@ function createTools(deps) {
1779
2540
  opendevbrowser_prompting_guide: wrap(createPromptingGuideTool(deps)),
1780
2541
  opendevbrowser_console_poll: wrap(createConsolePollTool(deps)),
1781
2542
  opendevbrowser_network_poll: wrap(createNetworkPollTool(deps)),
2543
+ opendevbrowser_debug_trace_snapshot: wrap(createDebugTraceSnapshotTool(deps)),
2544
+ opendevbrowser_cookie_import: wrap(createCookieImportTool(deps)),
2545
+ opendevbrowser_cookie_list: wrap(createCookieListTool(deps)),
2546
+ opendevbrowser_macro_resolve: wrap(createMacroResolveTool(deps)),
2547
+ opendevbrowser_research_run: wrap(createResearchRunTool(deps)),
2548
+ opendevbrowser_shopping_run: wrap(createShoppingRunTool(deps)),
2549
+ opendevbrowser_product_video_run: wrap(createProductVideoRunTool(deps)),
1782
2550
  opendevbrowser_clone_page: wrap(createClonePageTool(deps)),
1783
2551
  opendevbrowser_clone_component: wrap(createCloneComponentTool(deps)),
1784
2552
  opendevbrowser_perf: wrap(createPerfTool(deps)),
@@ -1797,6 +2565,8 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
1797
2565
  let manager = core.manager;
1798
2566
  let runner = core.runner;
1799
2567
  let annotationManager = core.annotationManager;
2568
+ let providerRuntime = core.providerRuntime;
2569
+ let browserFallbackPort = core.browserFallbackPort;
1800
2570
  let hubStop = null;
1801
2571
  let daemonClient = null;
1802
2572
  const skillNudgeState = createSkillNudgeState();
@@ -1815,6 +2585,8 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
1815
2585
  runner,
1816
2586
  config: configStore,
1817
2587
  skills,
2588
+ providerRuntime,
2589
+ browserFallbackPort,
1818
2590
  relay,
1819
2591
  getExtensionPath
1820
2592
  };
@@ -1827,9 +2599,17 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
1827
2599
  annotationManager.setRelay(relay);
1828
2600
  annotationManager.setBrowserManager(manager);
1829
2601
  runner = new ScriptRunner(manager);
2602
+ browserFallbackPort = createBrowserFallbackPort(manager);
2603
+ providerRuntime = createConfiguredProviderRuntime({
2604
+ config: configStore.get(),
2605
+ manager,
2606
+ browserFallbackPort
2607
+ });
1830
2608
  toolDeps.manager = manager;
1831
2609
  toolDeps.relay = relay;
1832
2610
  toolDeps.runner = runner;
2611
+ toolDeps.providerRuntime = providerRuntime;
2612
+ toolDeps.browserFallbackPort = browserFallbackPort;
1833
2613
  };
1834
2614
  const ensureHub = async () => {
1835
2615
  const currentConfig = configStore.get();