opendevbrowser 0.0.15 → 0.0.17

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 (646) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +262 -43
  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 +33 -0
  8. package/dist/browser/annotation-manager.d.ts.map +1 -0
  9. package/dist/browser/browser-manager.d.ts +402 -0
  10. package/dist/browser/browser-manager.d.ts.map +1 -0
  11. package/dist/browser/canvas-client.d.ts +53 -0
  12. package/dist/browser/canvas-client.d.ts.map +1 -0
  13. package/dist/browser/canvas-code-sync-manager.d.ts +79 -0
  14. package/dist/browser/canvas-code-sync-manager.d.ts.map +1 -0
  15. package/dist/browser/canvas-manager.d.ts +94 -0
  16. package/dist/browser/canvas-manager.d.ts.map +1 -0
  17. package/dist/browser/canvas-runtime-preview-bridge.d.ts +20 -0
  18. package/dist/browser/canvas-runtime-preview-bridge.d.ts.map +1 -0
  19. package/dist/browser/canvas-session-sync-manager.d.ts +21 -0
  20. package/dist/browser/canvas-session-sync-manager.d.ts.map +1 -0
  21. package/dist/browser/fingerprint/adapters.d.ts +26 -0
  22. package/dist/browser/fingerprint/adapters.d.ts.map +1 -0
  23. package/dist/browser/fingerprint/canary.d.ts +25 -0
  24. package/dist/browser/fingerprint/canary.d.ts.map +1 -0
  25. package/dist/browser/fingerprint/profiles.d.ts +16 -0
  26. package/dist/browser/fingerprint/profiles.d.ts.map +1 -0
  27. package/dist/browser/fingerprint/tier1-coherence.d.ts +36 -0
  28. package/dist/browser/fingerprint/tier1-coherence.d.ts.map +1 -0
  29. package/dist/browser/fingerprint/tier2-runtime.d.ts +40 -0
  30. package/dist/browser/fingerprint/tier2-runtime.d.ts.map +1 -0
  31. package/dist/browser/fingerprint/tier3-adaptive.d.ts +30 -0
  32. package/dist/browser/fingerprint/tier3-adaptive.d.ts.map +1 -0
  33. package/dist/browser/manager-types.d.ts +15 -0
  34. package/dist/browser/manager-types.d.ts.map +1 -0
  35. package/dist/browser/ops-browser-manager.d.ts +141 -0
  36. package/dist/browser/ops-browser-manager.d.ts.map +1 -0
  37. package/dist/browser/ops-client.d.ts +56 -0
  38. package/dist/browser/ops-client.d.ts.map +1 -0
  39. package/dist/browser/parallelism-governor.d.ts +31 -0
  40. package/dist/browser/parallelism-governor.d.ts.map +1 -0
  41. package/dist/browser/script-runner.d.ts +23 -0
  42. package/dist/browser/script-runner.d.ts.map +1 -0
  43. package/dist/browser/session-store.d.ts +63 -0
  44. package/dist/browser/session-store.d.ts.map +1 -0
  45. package/dist/browser/target-manager.d.ts +36 -0
  46. package/dist/browser/target-manager.d.ts.map +1 -0
  47. package/dist/cache/chrome-locator.d.ts +2 -0
  48. package/dist/cache/chrome-locator.d.ts.map +1 -0
  49. package/dist/cache/downloader.d.ts +6 -0
  50. package/dist/cache/downloader.d.ts.map +1 -0
  51. package/dist/cache/paths.d.ts +9 -0
  52. package/dist/cache/paths.d.ts.map +1 -0
  53. package/dist/canvas/code-sync/apply-tsx.d.ts +23 -0
  54. package/dist/canvas/code-sync/apply-tsx.d.ts.map +1 -0
  55. package/dist/canvas/code-sync/graph.d.ts +5 -0
  56. package/dist/canvas/code-sync/graph.d.ts.map +1 -0
  57. package/dist/canvas/code-sync/hash.d.ts +3 -0
  58. package/dist/canvas/code-sync/hash.d.ts.map +1 -0
  59. package/dist/canvas/code-sync/import.d.ts +18 -0
  60. package/dist/canvas/code-sync/import.d.ts.map +1 -0
  61. package/dist/canvas/code-sync/manifest.d.ts +5 -0
  62. package/dist/canvas/code-sync/manifest.d.ts.map +1 -0
  63. package/dist/canvas/code-sync/tsx-adapter.d.ts +8 -0
  64. package/dist/canvas/code-sync/tsx-adapter.d.ts.map +1 -0
  65. package/dist/canvas/code-sync/types.d.ts +152 -0
  66. package/dist/canvas/code-sync/types.d.ts.map +1 -0
  67. package/dist/canvas/code-sync/write.d.ts +9 -0
  68. package/dist/canvas/code-sync/write.d.ts.map +1 -0
  69. package/dist/canvas/document-store.d.ts +81 -0
  70. package/dist/canvas/document-store.d.ts.map +1 -0
  71. package/dist/canvas/export.d.ts +12 -0
  72. package/dist/canvas/export.d.ts.map +1 -0
  73. package/dist/canvas/repo-store.d.ts +10 -0
  74. package/dist/canvas/repo-store.d.ts.map +1 -0
  75. package/dist/canvas/surface-palette.d.ts +15 -0
  76. package/dist/canvas/surface-palette.d.ts.map +1 -0
  77. package/dist/canvas/types.d.ts +255 -0
  78. package/dist/canvas/types.d.ts.map +1 -0
  79. package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js +7 -0
  80. package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js.map +1 -0
  81. package/dist/chunk-5J3IFL3X.js +16706 -0
  82. package/dist/chunk-5J3IFL3X.js.map +1 -0
  83. package/dist/chunk-D633UO34.js +8149 -0
  84. package/dist/chunk-D633UO34.js.map +1 -0
  85. package/dist/chunk-FUSXMW3G.js +169 -0
  86. package/dist/chunk-FUSXMW3G.js.map +1 -0
  87. package/dist/chunk-TBUCZX4A.js +34 -0
  88. package/dist/chunk-TBUCZX4A.js.map +1 -0
  89. package/dist/chunk-V7KUDHDG.js +276 -0
  90. package/dist/chunk-V7KUDHDG.js.map +1 -0
  91. package/dist/chunk-Y2KL55OG.js +59 -0
  92. package/dist/chunk-Y2KL55OG.js.map +1 -0
  93. package/dist/cli/args.d.ts +25 -0
  94. package/dist/cli/args.d.ts.map +1 -0
  95. package/dist/cli/client.d.ts +2 -0
  96. package/dist/cli/client.d.ts.map +1 -0
  97. package/dist/cli/commands/annotate.d.ts +38 -0
  98. package/dist/cli/commands/annotate.d.ts.map +1 -0
  99. package/dist/cli/commands/artifacts.d.ts +24 -0
  100. package/dist/cli/commands/artifacts.d.ts.map +1 -0
  101. package/dist/cli/commands/canvas.d.ts +45 -0
  102. package/dist/cli/commands/canvas.d.ts.map +1 -0
  103. package/dist/cli/commands/daemon.d.ts +35 -0
  104. package/dist/cli/commands/daemon.d.ts.map +1 -0
  105. package/dist/cli/commands/devtools/console-poll.d.ts +7 -0
  106. package/dist/cli/commands/devtools/console-poll.d.ts.map +1 -0
  107. package/dist/cli/commands/devtools/debug-trace-snapshot.d.ts +20 -0
  108. package/dist/cli/commands/devtools/debug-trace-snapshot.d.ts.map +1 -0
  109. package/dist/cli/commands/devtools/network-poll.d.ts +7 -0
  110. package/dist/cli/commands/devtools/network-poll.d.ts.map +1 -0
  111. package/dist/cli/commands/devtools/perf.d.ts +7 -0
  112. package/dist/cli/commands/devtools/perf.d.ts.map +1 -0
  113. package/dist/cli/commands/devtools/screenshot.d.ts +18 -0
  114. package/dist/cli/commands/devtools/screenshot.d.ts.map +1 -0
  115. package/dist/cli/commands/dom/attr.d.ts +7 -0
  116. package/dist/cli/commands/dom/attr.d.ts.map +1 -0
  117. package/dist/cli/commands/dom/checked.d.ts +7 -0
  118. package/dist/cli/commands/dom/checked.d.ts.map +1 -0
  119. package/dist/cli/commands/dom/enabled.d.ts +7 -0
  120. package/dist/cli/commands/dom/enabled.d.ts.map +1 -0
  121. package/dist/cli/commands/dom/html.d.ts +7 -0
  122. package/dist/cli/commands/dom/html.d.ts.map +1 -0
  123. package/dist/cli/commands/dom/text.d.ts +7 -0
  124. package/dist/cli/commands/dom/text.d.ts.map +1 -0
  125. package/dist/cli/commands/dom/value.d.ts +7 -0
  126. package/dist/cli/commands/dom/value.d.ts.map +1 -0
  127. package/dist/cli/commands/dom/visible.d.ts +7 -0
  128. package/dist/cli/commands/dom/visible.d.ts.map +1 -0
  129. package/dist/cli/commands/export/clone-component.d.ts +16 -0
  130. package/dist/cli/commands/export/clone-component.d.ts.map +1 -0
  131. package/dist/cli/commands/export/clone-page.d.ts +15 -0
  132. package/dist/cli/commands/export/clone-page.d.ts.map +1 -0
  133. package/dist/cli/commands/interact/check.d.ts +7 -0
  134. package/dist/cli/commands/interact/check.d.ts.map +1 -0
  135. package/dist/cli/commands/interact/click.d.ts +7 -0
  136. package/dist/cli/commands/interact/click.d.ts.map +1 -0
  137. package/dist/cli/commands/interact/hover.d.ts +7 -0
  138. package/dist/cli/commands/interact/hover.d.ts.map +1 -0
  139. package/dist/cli/commands/interact/press.d.ts +7 -0
  140. package/dist/cli/commands/interact/press.d.ts.map +1 -0
  141. package/dist/cli/commands/interact/scroll-into-view.d.ts +7 -0
  142. package/dist/cli/commands/interact/scroll-into-view.d.ts.map +1 -0
  143. package/dist/cli/commands/interact/scroll.d.ts +7 -0
  144. package/dist/cli/commands/interact/scroll.d.ts.map +1 -0
  145. package/dist/cli/commands/interact/select.d.ts +7 -0
  146. package/dist/cli/commands/interact/select.d.ts.map +1 -0
  147. package/dist/cli/commands/interact/type.d.ts +7 -0
  148. package/dist/cli/commands/interact/type.d.ts.map +1 -0
  149. package/dist/cli/commands/interact/uncheck.d.ts +7 -0
  150. package/dist/cli/commands/interact/uncheck.d.ts.map +1 -0
  151. package/dist/cli/commands/macro-resolve.d.ts +18 -0
  152. package/dist/cli/commands/macro-resolve.d.ts.map +1 -0
  153. package/dist/cli/commands/native.d.ts +93 -0
  154. package/dist/cli/commands/native.d.ts.map +1 -0
  155. package/dist/cli/commands/nav/goto.d.ts +7 -0
  156. package/dist/cli/commands/nav/goto.d.ts.map +1 -0
  157. package/dist/cli/commands/nav/snapshot.d.ts +7 -0
  158. package/dist/cli/commands/nav/snapshot.d.ts.map +1 -0
  159. package/dist/cli/commands/nav/wait.d.ts +7 -0
  160. package/dist/cli/commands/nav/wait.d.ts.map +1 -0
  161. package/dist/cli/commands/pages/close.d.ts +6 -0
  162. package/dist/cli/commands/pages/close.d.ts.map +1 -0
  163. package/dist/cli/commands/pages/list.d.ts +7 -0
  164. package/dist/cli/commands/pages/list.d.ts.map +1 -0
  165. package/dist/cli/commands/pages/open.d.ts +7 -0
  166. package/dist/cli/commands/pages/open.d.ts.map +1 -0
  167. package/dist/cli/commands/product-video.d.ts +25 -0
  168. package/dist/cli/commands/product-video.d.ts.map +1 -0
  169. package/dist/cli/commands/registry.d.ts +5 -0
  170. package/dist/cli/commands/registry.d.ts.map +1 -0
  171. package/dist/cli/commands/research.d.ts +27 -0
  172. package/dist/cli/commands/research.d.ts.map +1 -0
  173. package/dist/cli/commands/rpc.d.ts +28 -0
  174. package/dist/cli/commands/rpc.d.ts.map +1 -0
  175. package/dist/cli/commands/run.d.ts +17 -0
  176. package/dist/cli/commands/run.d.ts.map +1 -0
  177. package/dist/cli/commands/serve.d.ts +64 -0
  178. package/dist/cli/commands/serve.d.ts.map +1 -0
  179. package/dist/cli/commands/session/connect.d.ts +9 -0
  180. package/dist/cli/commands/session/connect.d.ts.map +1 -0
  181. package/dist/cli/commands/session/cookie-import.d.ts +31 -0
  182. package/dist/cli/commands/session/cookie-import.d.ts.map +1 -0
  183. package/dist/cli/commands/session/cookie-list.d.ts +17 -0
  184. package/dist/cli/commands/session/cookie-list.d.ts.map +1 -0
  185. package/dist/cli/commands/session/disconnect.d.ts +6 -0
  186. package/dist/cli/commands/session/disconnect.d.ts.map +1 -0
  187. package/dist/cli/commands/session/launch.d.ts +29 -0
  188. package/dist/cli/commands/session/launch.d.ts.map +1 -0
  189. package/dist/cli/commands/session/status.d.ts +7 -0
  190. package/dist/cli/commands/session/status.d.ts.map +1 -0
  191. package/dist/cli/commands/shopping.d.ts +25 -0
  192. package/dist/cli/commands/shopping.d.ts.map +1 -0
  193. package/dist/cli/commands/status.d.ts +24 -0
  194. package/dist/cli/commands/status.d.ts.map +1 -0
  195. package/dist/cli/commands/targets/close.d.ts +6 -0
  196. package/dist/cli/commands/targets/close.d.ts.map +1 -0
  197. package/dist/cli/commands/targets/list.d.ts +7 -0
  198. package/dist/cli/commands/targets/list.d.ts.map +1 -0
  199. package/dist/cli/commands/targets/new.d.ts +7 -0
  200. package/dist/cli/commands/targets/new.d.ts.map +1 -0
  201. package/dist/cli/commands/targets/use.d.ts +7 -0
  202. package/dist/cli/commands/targets/use.d.ts.map +1 -0
  203. package/dist/cli/commands/types.d.ts +13 -0
  204. package/dist/cli/commands/types.d.ts.map +1 -0
  205. package/dist/cli/commands/uninstall.d.ts +14 -0
  206. package/dist/cli/commands/uninstall.d.ts.map +1 -0
  207. package/dist/cli/commands/update.d.ts +7 -0
  208. package/dist/cli/commands/update.d.ts.map +1 -0
  209. package/dist/cli/daemon-autostart.d.ts +46 -0
  210. package/dist/cli/daemon-autostart.d.ts.map +1 -0
  211. package/dist/cli/daemon-client.d.ts +33 -0
  212. package/dist/cli/daemon-client.d.ts.map +1 -0
  213. package/dist/cli/daemon-commands.d.ts +7 -0
  214. package/dist/cli/daemon-commands.d.ts.map +1 -0
  215. package/dist/cli/daemon-state.d.ts +56 -0
  216. package/dist/cli/daemon-state.d.ts.map +1 -0
  217. package/dist/cli/daemon-status.d.ts +19 -0
  218. package/dist/cli/daemon-status.d.ts.map +1 -0
  219. package/dist/cli/daemon.d.ts +29 -0
  220. package/dist/cli/daemon.d.ts.map +1 -0
  221. package/dist/cli/errors.d.ts +20 -0
  222. package/dist/cli/errors.d.ts.map +1 -0
  223. package/dist/cli/help.d.ts +33 -0
  224. package/dist/cli/help.d.ts.map +1 -0
  225. package/dist/cli/index.d.ts +2 -0
  226. package/dist/cli/index.d.ts.map +1 -0
  227. package/dist/cli/index.js +2825 -326
  228. package/dist/cli/index.js.map +1 -1
  229. package/dist/cli/installers/global.d.ts +9 -0
  230. package/dist/cli/installers/global.d.ts.map +1 -0
  231. package/dist/cli/installers/local.d.ts +9 -0
  232. package/dist/cli/installers/local.d.ts.map +1 -0
  233. package/dist/cli/installers/skills.d.ts +19 -0
  234. package/dist/cli/installers/skills.d.ts.map +1 -0
  235. package/dist/cli/output.d.ts +7 -0
  236. package/dist/cli/output.d.ts.map +1 -0
  237. package/dist/cli/remote-canvas-manager.d.ts +8 -0
  238. package/dist/cli/remote-canvas-manager.d.ts.map +1 -0
  239. package/dist/cli/remote-manager.d.ts +98 -0
  240. package/dist/cli/remote-manager.d.ts.map +1 -0
  241. package/dist/cli/remote-relay.d.ts +19 -0
  242. package/dist/cli/remote-relay.d.ts.map +1 -0
  243. package/dist/cli/templates/config.d.ts +7 -0
  244. package/dist/cli/templates/config.d.ts.map +1 -0
  245. package/dist/cli/utils/config.d.ts +20 -0
  246. package/dist/cli/utils/config.d.ts.map +1 -0
  247. package/dist/cli/utils/http.d.ts +5 -0
  248. package/dist/cli/utils/http.d.ts.map +1 -0
  249. package/dist/cli/utils/parse.d.ts +9 -0
  250. package/dist/cli/utils/parse.d.ts.map +1 -0
  251. package/dist/cli/utils/skills.d.ts +12 -0
  252. package/dist/cli/utils/skills.d.ts.map +1 -0
  253. package/dist/config.d.ts +208 -0
  254. package/dist/config.d.ts.map +1 -0
  255. package/dist/core/bootstrap.d.ts +3 -0
  256. package/dist/core/bootstrap.d.ts.map +1 -0
  257. package/dist/core/index.d.ts +3 -0
  258. package/dist/core/index.d.ts.map +1 -0
  259. package/dist/core/logging.d.ts +34 -0
  260. package/dist/core/logging.d.ts.map +1 -0
  261. package/dist/core/types.d.ts +36 -0
  262. package/dist/core/types.d.ts.map +1 -0
  263. package/dist/devtools/console-tracker.d.ts +44 -0
  264. package/dist/devtools/console-tracker.d.ts.map +1 -0
  265. package/dist/devtools/exception-tracker.d.ts +42 -0
  266. package/dist/devtools/exception-tracker.d.ts.map +1 -0
  267. package/dist/devtools/network-tracker.d.ts +34 -0
  268. package/dist/devtools/network-tracker.d.ts.map +1 -0
  269. package/dist/export/css-extract.d.ts +5 -0
  270. package/dist/export/css-extract.d.ts.map +1 -0
  271. package/dist/export/dom-capture.d.ts +15 -0
  272. package/dist/export/dom-capture.d.ts.map +1 -0
  273. package/dist/export/react-emitter.d.ts +11 -0
  274. package/dist/export/react-emitter.d.ts.map +1 -0
  275. package/dist/extension-extractor.d.ts +3 -0
  276. package/dist/extension-extractor.d.ts.map +1 -0
  277. package/dist/fs-UMRKOBNN.js +7 -0
  278. package/dist/fs-UMRKOBNN.js.map +1 -0
  279. package/dist/index.d.ts +3 -4
  280. package/dist/index.d.ts.map +1 -0
  281. package/dist/index.js +1028 -123
  282. package/dist/index.js.map +1 -1
  283. package/dist/macros/execute.d.ts +44 -0
  284. package/dist/macros/execute.d.ts.map +1 -0
  285. package/dist/macros/index.d.ts +9 -0
  286. package/dist/macros/index.d.ts.map +1 -0
  287. package/dist/macros/packs/core.d.ts +3 -0
  288. package/dist/macros/packs/core.d.ts.map +1 -0
  289. package/dist/macros/registry.d.ts +48 -0
  290. package/dist/macros/registry.d.ts.map +1 -0
  291. package/dist/macros-ND2M7LWU.js +399 -0
  292. package/dist/macros-ND2M7LWU.js.map +1 -0
  293. package/dist/opendevbrowser.d.ts +3 -4
  294. package/dist/opendevbrowser.d.ts.map +1 -0
  295. package/dist/opendevbrowser.js +1028 -123
  296. package/dist/opendevbrowser.js.map +1 -1
  297. package/dist/providers/adaptive-concurrency.d.ts +42 -0
  298. package/dist/providers/adaptive-concurrency.d.ts.map +1 -0
  299. package/dist/providers/artifacts.d.ts +34 -0
  300. package/dist/providers/artifacts.d.ts.map +1 -0
  301. package/dist/providers/blocker.d.ts +47 -0
  302. package/dist/providers/blocker.d.ts.map +1 -0
  303. package/dist/providers/community/index.d.ts +44 -0
  304. package/dist/providers/community/index.d.ts.map +1 -0
  305. package/dist/providers/enrichment.d.ts +33 -0
  306. package/dist/providers/enrichment.d.ts.map +1 -0
  307. package/dist/providers/errors.d.ts +41 -0
  308. package/dist/providers/errors.d.ts.map +1 -0
  309. package/dist/providers/index.d.ts +121 -0
  310. package/dist/providers/index.d.ts.map +1 -0
  311. package/dist/providers/normalize.d.ts +39 -0
  312. package/dist/providers/normalize.d.ts.map +1 -0
  313. package/dist/providers/policy.d.ts +5 -0
  314. package/dist/providers/policy.d.ts.map +1 -0
  315. package/dist/providers/registry.d.ts +22 -0
  316. package/dist/providers/registry.d.ts.map +1 -0
  317. package/dist/providers/renderer.d.ts +49 -0
  318. package/dist/providers/renderer.d.ts.map +1 -0
  319. package/dist/providers/runtime-factory.d.ts +20 -0
  320. package/dist/providers/runtime-factory.d.ts.map +1 -0
  321. package/dist/providers/safety/prompt-guard.d.ts +34 -0
  322. package/dist/providers/safety/prompt-guard.d.ts.map +1 -0
  323. package/dist/providers/shared/anti-bot-policy.d.ts +51 -0
  324. package/dist/providers/shared/anti-bot-policy.d.ts.map +1 -0
  325. package/dist/providers/shared/post-policy.d.ts +31 -0
  326. package/dist/providers/shared/post-policy.d.ts.map +1 -0
  327. package/dist/providers/shared/request-headers.d.ts +5 -0
  328. package/dist/providers/shared/request-headers.d.ts.map +1 -0
  329. package/dist/providers/shared/traversal-url.d.ts +2 -0
  330. package/dist/providers/shared/traversal-url.d.ts.map +1 -0
  331. package/dist/providers/shopping/index.d.ts +63 -0
  332. package/dist/providers/shopping/index.d.ts.map +1 -0
  333. package/dist/providers/social/bluesky.d.ts +3 -0
  334. package/dist/providers/social/bluesky.d.ts.map +1 -0
  335. package/dist/providers/social/facebook.d.ts +3 -0
  336. package/dist/providers/social/facebook.d.ts.map +1 -0
  337. package/dist/providers/social/index.d.ts +31 -0
  338. package/dist/providers/social/index.d.ts.map +1 -0
  339. package/dist/providers/social/instagram.d.ts +3 -0
  340. package/dist/providers/social/instagram.d.ts.map +1 -0
  341. package/dist/providers/social/linkedin.d.ts +3 -0
  342. package/dist/providers/social/linkedin.d.ts.map +1 -0
  343. package/dist/providers/social/platform.d.ts +40 -0
  344. package/dist/providers/social/platform.d.ts.map +1 -0
  345. package/dist/providers/social/reddit.d.ts +3 -0
  346. package/dist/providers/social/reddit.d.ts.map +1 -0
  347. package/dist/providers/social/threads.d.ts +3 -0
  348. package/dist/providers/social/threads.d.ts.map +1 -0
  349. package/dist/providers/social/tiktok.d.ts +3 -0
  350. package/dist/providers/social/tiktok.d.ts.map +1 -0
  351. package/dist/providers/social/x.d.ts +3 -0
  352. package/dist/providers/social/x.d.ts.map +1 -0
  353. package/dist/providers/social/youtube-resolver.d.ts +78 -0
  354. package/dist/providers/social/youtube-resolver.d.ts.map +1 -0
  355. package/dist/providers/social/youtube.d.ts +34 -0
  356. package/dist/providers/social/youtube.d.ts.map +1 -0
  357. package/dist/providers/tier-router.d.ts +30 -0
  358. package/dist/providers/tier-router.d.ts.map +1 -0
  359. package/dist/providers/timebox.d.ts +20 -0
  360. package/dist/providers/timebox.d.ts.map +1 -0
  361. package/dist/providers/types.d.ts +344 -0
  362. package/dist/providers/types.d.ts.map +1 -0
  363. package/dist/providers/web/crawl-worker.d.ts +36 -0
  364. package/dist/providers/web/crawl-worker.d.ts.map +1 -0
  365. package/dist/providers/web/crawler.d.ts +101 -0
  366. package/dist/providers/web/crawler.d.ts.map +1 -0
  367. package/dist/providers/web/extract.d.ts +11 -0
  368. package/dist/providers/web/extract.d.ts.map +1 -0
  369. package/dist/providers/web/index.d.ts +24 -0
  370. package/dist/providers/web/index.d.ts.map +1 -0
  371. package/dist/providers/web/policy.d.ts +14 -0
  372. package/dist/providers/web/policy.d.ts.map +1 -0
  373. package/dist/providers/workflows.d.ts +67 -0
  374. package/dist/providers/workflows.d.ts.map +1 -0
  375. package/dist/providers-G3LRHQXX.js +121 -0
  376. package/dist/providers-G3LRHQXX.js.map +1 -0
  377. package/dist/relay/protocol.d.ts +399 -0
  378. package/dist/relay/protocol.d.ts.map +1 -0
  379. package/dist/relay/relay-endpoints.d.ts +16 -0
  380. package/dist/relay/relay-endpoints.d.ts.map +1 -0
  381. package/dist/relay/relay-server.d.ts +124 -0
  382. package/dist/relay/relay-server.d.ts.map +1 -0
  383. package/dist/relay/relay-types.d.ts +12 -0
  384. package/dist/relay/relay-types.d.ts.map +1 -0
  385. package/dist/runtime-factory-BICHDPE7.js +13 -0
  386. package/dist/runtime-factory-BICHDPE7.js.map +1 -0
  387. package/dist/skills/continuity-nudge.d.ts +12 -0
  388. package/dist/skills/continuity-nudge.d.ts.map +1 -0
  389. package/dist/skills/skill-loader.d.ts +20 -0
  390. package/dist/skills/skill-loader.d.ts.map +1 -0
  391. package/dist/skills/skill-nudge.d.ts +18 -0
  392. package/dist/skills/skill-nudge.d.ts.map +1 -0
  393. package/dist/skills/types.d.ts +12 -0
  394. package/dist/skills/types.d.ts.map +1 -0
  395. package/dist/snapshot/ops-snapshot.d.ts +16 -0
  396. package/dist/snapshot/ops-snapshot.d.ts.map +1 -0
  397. package/dist/snapshot/refs.d.ts +23 -0
  398. package/dist/snapshot/refs.d.ts.map +1 -0
  399. package/dist/snapshot/snapshotter.d.ts +27 -0
  400. package/dist/snapshot/snapshotter.d.ts.map +1 -0
  401. package/dist/tools/annotate.d.ts +4 -0
  402. package/dist/tools/annotate.d.ts.map +1 -0
  403. package/dist/tools/canvas.d.ts +4 -0
  404. package/dist/tools/canvas.d.ts.map +1 -0
  405. package/dist/tools/check.d.ts +4 -0
  406. package/dist/tools/check.d.ts.map +1 -0
  407. package/dist/tools/click.d.ts +4 -0
  408. package/dist/tools/click.d.ts.map +1 -0
  409. package/dist/tools/clone_component.d.ts +4 -0
  410. package/dist/tools/clone_component.d.ts.map +1 -0
  411. package/dist/tools/clone_page.d.ts +4 -0
  412. package/dist/tools/clone_page.d.ts.map +1 -0
  413. package/dist/tools/close.d.ts +4 -0
  414. package/dist/tools/close.d.ts.map +1 -0
  415. package/dist/tools/connect.d.ts +4 -0
  416. package/dist/tools/connect.d.ts.map +1 -0
  417. package/dist/tools/console_poll.d.ts +4 -0
  418. package/dist/tools/console_poll.d.ts.map +1 -0
  419. package/dist/tools/cookie_import.d.ts +25 -0
  420. package/dist/tools/cookie_import.d.ts.map +1 -0
  421. package/dist/tools/cookie_list.d.ts +9 -0
  422. package/dist/tools/cookie_list.d.ts.map +1 -0
  423. package/dist/tools/debug_trace_snapshot.d.ts +4 -0
  424. package/dist/tools/debug_trace_snapshot.d.ts.map +1 -0
  425. package/dist/tools/deps.d.ts +28 -0
  426. package/dist/tools/deps.d.ts.map +1 -0
  427. package/dist/tools/disconnect.d.ts +4 -0
  428. package/dist/tools/disconnect.d.ts.map +1 -0
  429. package/dist/tools/dom_get_html.d.ts +4 -0
  430. package/dist/tools/dom_get_html.d.ts.map +1 -0
  431. package/dist/tools/dom_get_text.d.ts +4 -0
  432. package/dist/tools/dom_get_text.d.ts.map +1 -0
  433. package/dist/tools/get_attr.d.ts +4 -0
  434. package/dist/tools/get_attr.d.ts.map +1 -0
  435. package/dist/tools/get_value.d.ts +4 -0
  436. package/dist/tools/get_value.d.ts.map +1 -0
  437. package/dist/tools/goto.d.ts +4 -0
  438. package/dist/tools/goto.d.ts.map +1 -0
  439. package/dist/tools/hover.d.ts +4 -0
  440. package/dist/tools/hover.d.ts.map +1 -0
  441. package/dist/tools/index.d.ts +4 -0
  442. package/dist/tools/index.d.ts.map +1 -0
  443. package/dist/tools/is_checked.d.ts +4 -0
  444. package/dist/tools/is_checked.d.ts.map +1 -0
  445. package/dist/tools/is_enabled.d.ts +4 -0
  446. package/dist/tools/is_enabled.d.ts.map +1 -0
  447. package/dist/tools/is_visible.d.ts +4 -0
  448. package/dist/tools/is_visible.d.ts.map +1 -0
  449. package/dist/tools/launch.d.ts +4 -0
  450. package/dist/tools/launch.d.ts.map +1 -0
  451. package/dist/tools/list.d.ts +4 -0
  452. package/dist/tools/list.d.ts.map +1 -0
  453. package/dist/tools/macro_resolve.d.ts +25 -0
  454. package/dist/tools/macro_resolve.d.ts.map +1 -0
  455. package/dist/tools/network_poll.d.ts +4 -0
  456. package/dist/tools/network_poll.d.ts.map +1 -0
  457. package/dist/tools/page.d.ts +4 -0
  458. package/dist/tools/page.d.ts.map +1 -0
  459. package/dist/tools/perf.d.ts +4 -0
  460. package/dist/tools/perf.d.ts.map +1 -0
  461. package/dist/tools/press.d.ts +4 -0
  462. package/dist/tools/press.d.ts.map +1 -0
  463. package/dist/tools/product_video_run.d.ts +4 -0
  464. package/dist/tools/product_video_run.d.ts.map +1 -0
  465. package/dist/tools/prompting_guide.d.ts +4 -0
  466. package/dist/tools/prompting_guide.d.ts.map +1 -0
  467. package/dist/tools/research_run.d.ts +4 -0
  468. package/dist/tools/research_run.d.ts.map +1 -0
  469. package/dist/tools/response.d.ts +19 -0
  470. package/dist/tools/response.d.ts.map +1 -0
  471. package/dist/tools/run.d.ts +4 -0
  472. package/dist/tools/run.d.ts.map +1 -0
  473. package/dist/tools/screenshot.d.ts +4 -0
  474. package/dist/tools/screenshot.d.ts.map +1 -0
  475. package/dist/tools/scroll.d.ts +4 -0
  476. package/dist/tools/scroll.d.ts.map +1 -0
  477. package/dist/tools/scroll_into_view.d.ts +4 -0
  478. package/dist/tools/scroll_into_view.d.ts.map +1 -0
  479. package/dist/tools/select.d.ts +4 -0
  480. package/dist/tools/select.d.ts.map +1 -0
  481. package/dist/tools/shopping_run.d.ts +4 -0
  482. package/dist/tools/shopping_run.d.ts.map +1 -0
  483. package/dist/tools/skill_list.d.ts +4 -0
  484. package/dist/tools/skill_list.d.ts.map +1 -0
  485. package/dist/tools/skill_load.d.ts +4 -0
  486. package/dist/tools/skill_load.d.ts.map +1 -0
  487. package/dist/tools/snapshot.d.ts +4 -0
  488. package/dist/tools/snapshot.d.ts.map +1 -0
  489. package/dist/tools/status.d.ts +4 -0
  490. package/dist/tools/status.d.ts.map +1 -0
  491. package/dist/tools/target_close.d.ts +4 -0
  492. package/dist/tools/target_close.d.ts.map +1 -0
  493. package/dist/tools/target_new.d.ts +4 -0
  494. package/dist/tools/target_new.d.ts.map +1 -0
  495. package/dist/tools/target_use.d.ts +4 -0
  496. package/dist/tools/target_use.d.ts.map +1 -0
  497. package/dist/tools/targets_list.d.ts +4 -0
  498. package/dist/tools/targets_list.d.ts.map +1 -0
  499. package/dist/tools/type.d.ts +4 -0
  500. package/dist/tools/type.d.ts.map +1 -0
  501. package/dist/tools/uncheck.d.ts +4 -0
  502. package/dist/tools/uncheck.d.ts.map +1 -0
  503. package/dist/tools/wait.d.ts +4 -0
  504. package/dist/tools/wait.d.ts.map +1 -0
  505. package/dist/tools/workflow-runtime.d.ts +3 -0
  506. package/dist/tools/workflow-runtime.d.ts.map +1 -0
  507. package/dist/utils/crypto.d.ts +2 -0
  508. package/dist/utils/crypto.d.ts.map +1 -0
  509. package/dist/utils/endpoint-validation.d.ts +2 -0
  510. package/dist/utils/endpoint-validation.d.ts.map +1 -0
  511. package/dist/utils/fs.d.ts +5 -0
  512. package/dist/utils/fs.d.ts.map +1 -0
  513. package/dist/utils/hub-enabled.d.ts +3 -0
  514. package/dist/utils/hub-enabled.d.ts.map +1 -0
  515. package/extension/canvas.html +636 -0
  516. package/extension/dist/annotate-content.css +15 -6
  517. package/extension/dist/annotate-content.js +119 -9
  518. package/extension/dist/annotation-payload.js +163 -0
  519. package/extension/dist/background.js +158 -22
  520. package/extension/dist/canvas/canvas-runtime.js +1061 -0
  521. package/extension/dist/canvas/model.js +213 -0
  522. package/extension/dist/canvas/viewport-fit.js +67 -0
  523. package/extension/dist/canvas-page.js +1801 -0
  524. package/extension/dist/ops/dom-bridge.js +116 -3
  525. package/extension/dist/ops/ops-runtime.js +1014 -48
  526. package/extension/dist/ops/ops-session-store.js +37 -116
  527. package/extension/dist/ops/parallelism-governor.js +117 -0
  528. package/extension/dist/ops/snapshot-shared.js +21 -5
  529. package/extension/dist/ops/target-session-coordinator.js +157 -0
  530. package/extension/dist/popup.js +155 -31
  531. package/extension/dist/services/CDPRouter.js +70 -5
  532. package/extension/dist/services/ConnectionManager.js +22 -3
  533. package/extension/dist/services/RelayClient.js +9 -0
  534. package/extension/dist/services/TabManager.js +35 -12
  535. package/extension/dist/types.js +2 -0
  536. package/extension/icons/icon128.png +0 -0
  537. package/extension/icons/icon16.png +0 -0
  538. package/extension/icons/icon32.png +0 -0
  539. package/extension/icons/icon48.png +0 -0
  540. package/extension/manifest.json +1 -1
  541. package/extension/popup.html +52 -0
  542. package/package.json +30 -19
  543. package/scripts/native/host.cjs +230 -0
  544. package/scripts/native/install.ps1 +73 -0
  545. package/scripts/native/install.sh +66 -0
  546. package/scripts/native/uninstall.ps1 +25 -0
  547. package/scripts/native/uninstall.sh +26 -0
  548. package/skills/AGENTS.md +20 -8
  549. package/skills/opendevbrowser-best-practices/SKILL.md +248 -74
  550. package/skills/opendevbrowser-best-practices/artifacts/browser-agent-known-issues-matrix.md +44 -0
  551. package/skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md +141 -0
  552. package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +191 -0
  553. package/skills/opendevbrowser-best-practices/artifacts/debug-trace-playbook.md +36 -0
  554. package/skills/opendevbrowser-best-practices/artifacts/fingerprint-tiers.md +36 -0
  555. package/skills/opendevbrowser-best-practices/artifacts/macro-workflows.md +43 -0
  556. package/skills/opendevbrowser-best-practices/artifacts/parity-gates.md +36 -0
  557. package/skills/opendevbrowser-best-practices/artifacts/provider-workflows.md +89 -0
  558. package/skills/opendevbrowser-best-practices/assets/templates/canvas-blocker-checklist.json +70 -0
  559. package/skills/opendevbrowser-best-practices/assets/templates/canvas-feedback-eval.json +73 -0
  560. package/skills/opendevbrowser-best-practices/assets/templates/canvas-generation-plan.v1.json +67 -0
  561. package/skills/opendevbrowser-best-practices/assets/templates/canvas-handshake-example.json +126 -0
  562. package/skills/opendevbrowser-best-practices/assets/templates/cdp-forward-envelope.json +11 -0
  563. package/skills/opendevbrowser-best-practices/assets/templates/mode-flag-matrix.json +56 -0
  564. package/skills/opendevbrowser-best-practices/assets/templates/ops-request-envelope.json +9 -0
  565. package/skills/opendevbrowser-best-practices/assets/templates/robustness-checklist.json +136 -0
  566. package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +28 -0
  567. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +170 -0
  568. package/skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh +164 -0
  569. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +234 -0
  570. package/skills/opendevbrowser-continuity-ledger/SKILL.md +10 -0
  571. package/skills/opendevbrowser-data-extraction/SKILL.md +126 -0
  572. package/skills/opendevbrowser-data-extraction/artifacts/extraction-workflows.md +31 -0
  573. package/skills/opendevbrowser-data-extraction/assets/templates/compliance-checklist.md +7 -0
  574. package/skills/opendevbrowser-data-extraction/assets/templates/extraction-schema.json +17 -0
  575. package/skills/opendevbrowser-data-extraction/assets/templates/pagination-state.json +11 -0
  576. package/skills/opendevbrowser-data-extraction/assets/templates/quality-gates.json +10 -0
  577. package/skills/opendevbrowser-data-extraction/examples/sample-schema.json +19 -0
  578. package/skills/opendevbrowser-data-extraction/scripts/run-extraction-workflow.sh +83 -0
  579. package/skills/opendevbrowser-data-extraction/scripts/validate-skill-assets.sh +49 -0
  580. package/skills/opendevbrowser-form-testing/SKILL.md +143 -0
  581. package/skills/opendevbrowser-form-testing/artifacts/form-workflows.md +37 -0
  582. package/skills/opendevbrowser-form-testing/assets/templates/a11y-assertions.md +7 -0
  583. package/skills/opendevbrowser-form-testing/assets/templates/challenge-decision-tree.json +16 -0
  584. package/skills/opendevbrowser-form-testing/assets/templates/multi-step-state.json +11 -0
  585. package/skills/opendevbrowser-form-testing/assets/templates/validation-matrix.json +24 -0
  586. package/skills/opendevbrowser-form-testing/examples/sample-validation-matrix.json +29 -0
  587. package/skills/opendevbrowser-form-testing/scripts/run-form-workflow.sh +82 -0
  588. package/skills/opendevbrowser-form-testing/scripts/validate-skill-assets.sh +49 -0
  589. package/skills/opendevbrowser-login-automation/SKILL.md +159 -0
  590. package/skills/opendevbrowser-login-automation/artifacts/login-workflows.md +39 -0
  591. package/skills/opendevbrowser-login-automation/assets/templates/auth-signals.json +21 -0
  592. package/skills/opendevbrowser-login-automation/assets/templates/challenge-checkpoint.md +10 -0
  593. package/skills/opendevbrowser-login-automation/assets/templates/login-scenario-matrix.json +26 -0
  594. package/skills/opendevbrowser-login-automation/examples/sample-auth-signals.json +14 -0
  595. package/skills/opendevbrowser-login-automation/scripts/record-auth-signals.sh +18 -0
  596. package/skills/opendevbrowser-login-automation/scripts/run-login-workflow.sh +99 -0
  597. package/skills/opendevbrowser-login-automation/scripts/validate-skill-assets.sh +50 -0
  598. package/skills/opendevbrowser-product-presentation-asset/SKILL.md +98 -0
  599. package/skills/opendevbrowser-product-presentation-asset/artifacts/asset-pack-assembly.md +23 -0
  600. package/skills/opendevbrowser-product-presentation-asset/artifacts/ugc-creative-guide.md +21 -0
  601. package/skills/opendevbrowser-product-presentation-asset/assets/templates/claims-evidence-map.md +5 -0
  602. package/skills/opendevbrowser-product-presentation-asset/assets/templates/copy.md +5 -0
  603. package/skills/opendevbrowser-product-presentation-asset/assets/templates/features.md +4 -0
  604. package/skills/opendevbrowser-product-presentation-asset/assets/templates/manifest.schema.json +14 -0
  605. package/skills/opendevbrowser-product-presentation-asset/assets/templates/shot-list.md +7 -0
  606. package/skills/opendevbrowser-product-presentation-asset/assets/templates/ugc-concepts.md +17 -0
  607. package/skills/opendevbrowser-product-presentation-asset/assets/templates/user-actions.md +7 -0
  608. package/skills/opendevbrowser-product-presentation-asset/assets/templates/video-assembly.md +18 -0
  609. package/skills/opendevbrowser-product-presentation-asset/examples/sample-input.json +6 -0
  610. package/skills/opendevbrowser-product-presentation-asset/examples/sample-manifest.json +18 -0
  611. package/skills/opendevbrowser-product-presentation-asset/scripts/capture-screenshots.sh +9 -0
  612. package/skills/opendevbrowser-product-presentation-asset/scripts/collect-product.sh +14 -0
  613. package/skills/opendevbrowser-product-presentation-asset/scripts/download-images.sh +9 -0
  614. package/skills/opendevbrowser-product-presentation-asset/scripts/render-video-brief.sh +96 -0
  615. package/skills/opendevbrowser-product-presentation-asset/scripts/validate-skill-assets.sh +56 -0
  616. package/skills/opendevbrowser-product-presentation-asset/scripts/write-manifest.sh +43 -0
  617. package/skills/opendevbrowser-research/SKILL.md +73 -0
  618. package/skills/opendevbrowser-research/artifacts/research-workflows.md +29 -0
  619. package/skills/opendevbrowser-research/assets/templates/compact.md +7 -0
  620. package/skills/opendevbrowser-research/assets/templates/context.json +18 -0
  621. package/skills/opendevbrowser-research/assets/templates/report.md +9 -0
  622. package/skills/opendevbrowser-research/examples/sample-input.json +6 -0
  623. package/skills/opendevbrowser-research/examples/sample-output.md +4 -0
  624. package/skills/opendevbrowser-research/scripts/render-output.sh +12 -0
  625. package/skills/opendevbrowser-research/scripts/run-research.sh +23 -0
  626. package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +48 -0
  627. package/skills/opendevbrowser-research/scripts/write-artifacts.sh +29 -0
  628. package/skills/opendevbrowser-shopping/SKILL.md +118 -0
  629. package/skills/opendevbrowser-shopping/artifacts/deal-hunting-workflows.md +37 -0
  630. package/skills/opendevbrowser-shopping/assets/templates/deal-thresholds.json +8 -0
  631. package/skills/opendevbrowser-shopping/assets/templates/deals-context.json +9 -0
  632. package/skills/opendevbrowser-shopping/assets/templates/deals-table.md +4 -0
  633. package/skills/opendevbrowser-shopping/assets/templates/market-analysis.json +30 -0
  634. package/skills/opendevbrowser-shopping/examples/sample-deals.md +4 -0
  635. package/skills/opendevbrowser-shopping/examples/sample-query.json +5 -0
  636. package/skills/opendevbrowser-shopping/scripts/analyze-market.sh +307 -0
  637. package/skills/opendevbrowser-shopping/scripts/normalize-offers.sh +28 -0
  638. package/skills/opendevbrowser-shopping/scripts/render-deals.sh +13 -0
  639. package/skills/opendevbrowser-shopping/scripts/run-deal-hunt.sh +32 -0
  640. package/skills/opendevbrowser-shopping/scripts/run-shopping.sh +19 -0
  641. package/skills/opendevbrowser-shopping/scripts/validate-skill-assets.sh +53 -0
  642. package/dist/chunk-JVBMT2O5.js +0 -7173
  643. package/dist/chunk-JVBMT2O5.js.map +0 -1
  644. package/skills/data-extraction/SKILL.md +0 -128
  645. package/skills/form-testing/SKILL.md +0 -106
  646. package/skills/login-automation/SKILL.md +0 -108
package/dist/index.js CHANGED
@@ -3,10 +3,24 @@ import {
3
3
  ScriptRunner,
4
4
  buildAnnotateResult,
5
5
  createOpenDevBrowserCore,
6
+ executeMacroResolution,
6
7
  extractExtension,
7
8
  fetchDaemonStatusFromMetadata,
9
+ shapeExecutionPayload,
8
10
  startDaemon
9
- } from "./chunk-JVBMT2O5.js";
11
+ } from "./chunk-5J3IFL3X.js";
12
+ import "./chunk-Y2KL55OG.js";
13
+ import "./chunk-TBUCZX4A.js";
14
+ import {
15
+ createBrowserFallbackPort,
16
+ createConfiguredProviderRuntime
17
+ } from "./chunk-V7KUDHDG.js";
18
+ import {
19
+ buildBlockerArtifacts,
20
+ classifyBlockerSignal,
21
+ createRequestId
22
+ } from "./chunk-D633UO34.js";
23
+ import "./chunk-FUSXMW3G.js";
10
24
 
11
25
  // src/cli/remote-manager.ts
12
26
  function isLegacyRelayEndpoint(wsEndpoint) {
@@ -29,10 +43,18 @@ var RemoteManager = class {
29
43
  connect(options) {
30
44
  return this.client.call("session.connect", options);
31
45
  }
32
- connectRelay(wsEndpoint) {
46
+ connectRelay(wsEndpoint, options) {
47
+ const startUrl = typeof options?.startUrl === "string" && options.startUrl.trim().length > 0 ? options.startUrl.trim() : void 0;
33
48
  return this.client.call(
34
49
  "session.connect",
35
- isLegacyRelayEndpoint(wsEndpoint) ? { wsEndpoint, extensionLegacy: true } : { wsEndpoint }
50
+ isLegacyRelayEndpoint(wsEndpoint) ? {
51
+ wsEndpoint,
52
+ extensionLegacy: true,
53
+ ...startUrl ? { startUrl } : {}
54
+ } : {
55
+ wsEndpoint,
56
+ ...startUrl ? { startUrl } : {}
57
+ }
36
58
  );
37
59
  }
38
60
  disconnect(sessionId, closeBrowser = false) {
@@ -41,77 +63,202 @@ var RemoteManager = class {
41
63
  status(sessionId) {
42
64
  return this.client.call("session.status", { sessionId });
43
65
  }
44
- goto(sessionId, url, waitUntil = "load", timeoutMs = 3e4) {
45
- return this.client.call("nav.goto", { sessionId, url, waitUntil, timeoutMs });
66
+ cookieImport(sessionId, cookies, strict = true, requestId) {
67
+ return this.client.call("session.cookieImport", {
68
+ sessionId,
69
+ cookies,
70
+ strict,
71
+ requestId
72
+ });
46
73
  }
47
- waitForLoad(sessionId, until, timeoutMs = 3e4) {
48
- return this.client.call("nav.wait", { sessionId, until, timeoutMs });
74
+ cookieList(sessionId, urls, requestId) {
75
+ return this.client.call("session.cookieList", {
76
+ sessionId,
77
+ ...urls && urls.length > 0 ? { urls } : {},
78
+ requestId
79
+ });
49
80
  }
50
- waitForRef(sessionId, ref, state = "attached", timeoutMs = 3e4) {
51
- return this.client.call("nav.wait", { sessionId, ref, state, timeoutMs });
81
+ goto(sessionId, url, waitUntil = "load", timeoutMs = 3e4, _sessionOverride, targetId) {
82
+ return this.client.call("nav.goto", {
83
+ sessionId,
84
+ url,
85
+ waitUntil,
86
+ timeoutMs,
87
+ ...typeof targetId === "string" ? { targetId } : {}
88
+ });
52
89
  }
53
- snapshot(sessionId, mode, maxChars, cursor) {
54
- return this.client.call("nav.snapshot", { sessionId, mode, maxChars, cursor });
90
+ waitForLoad(sessionId, until, timeoutMs = 3e4, targetId) {
91
+ return this.client.call("nav.wait", {
92
+ sessionId,
93
+ until,
94
+ timeoutMs,
95
+ ...typeof targetId === "string" ? { targetId } : {}
96
+ });
55
97
  }
56
- click(sessionId, ref) {
57
- return this.client.call("interact.click", { sessionId, ref });
98
+ waitForRef(sessionId, ref, state = "attached", timeoutMs = 3e4, targetId) {
99
+ return this.client.call("nav.wait", {
100
+ sessionId,
101
+ ref,
102
+ state,
103
+ timeoutMs,
104
+ ...typeof targetId === "string" ? { targetId } : {}
105
+ });
58
106
  }
59
- hover(sessionId, ref) {
60
- return this.client.call("interact.hover", { sessionId, ref });
107
+ snapshot(sessionId, mode, maxChars, cursor, targetId) {
108
+ return this.client.call("nav.snapshot", {
109
+ sessionId,
110
+ mode,
111
+ maxChars,
112
+ cursor,
113
+ ...typeof targetId === "string" ? { targetId } : {}
114
+ });
61
115
  }
62
- press(sessionId, key, ref) {
63
- return this.client.call("interact.press", { sessionId, key, ref });
116
+ click(sessionId, ref, targetId) {
117
+ return this.client.call("interact.click", {
118
+ sessionId,
119
+ ref,
120
+ ...typeof targetId === "string" ? { targetId } : {}
121
+ });
64
122
  }
65
- check(sessionId, ref) {
66
- return this.client.call("interact.check", { sessionId, ref });
123
+ hover(sessionId, ref, targetId) {
124
+ return this.client.call("interact.hover", {
125
+ sessionId,
126
+ ref,
127
+ ...typeof targetId === "string" ? { targetId } : {}
128
+ });
67
129
  }
68
- uncheck(sessionId, ref) {
69
- return this.client.call("interact.uncheck", { sessionId, ref });
130
+ press(sessionId, key, ref, targetId) {
131
+ return this.client.call("interact.press", {
132
+ sessionId,
133
+ key,
134
+ ref,
135
+ ...typeof targetId === "string" ? { targetId } : {}
136
+ });
70
137
  }
71
- type(sessionId, ref, text, clear = false, submit = false) {
72
- return this.client.call("interact.type", { sessionId, ref, text, clear, submit });
138
+ check(sessionId, ref, targetId) {
139
+ return this.client.call("interact.check", {
140
+ sessionId,
141
+ ref,
142
+ ...typeof targetId === "string" ? { targetId } : {}
143
+ });
73
144
  }
74
- select(sessionId, ref, values) {
75
- return this.client.call("interact.select", { sessionId, ref, values });
145
+ uncheck(sessionId, ref, targetId) {
146
+ return this.client.call("interact.uncheck", {
147
+ sessionId,
148
+ ref,
149
+ ...typeof targetId === "string" ? { targetId } : {}
150
+ });
76
151
  }
77
- scroll(sessionId, dy, ref) {
78
- return this.client.call("interact.scroll", { sessionId, dy, ref });
152
+ type(sessionId, ref, text, clear = false, submit = false, targetId) {
153
+ return this.client.call("interact.type", {
154
+ sessionId,
155
+ ref,
156
+ text,
157
+ clear,
158
+ submit,
159
+ ...typeof targetId === "string" ? { targetId } : {}
160
+ });
79
161
  }
80
- scrollIntoView(sessionId, ref) {
81
- return this.client.call("interact.scrollIntoView", { sessionId, ref });
162
+ select(sessionId, ref, values, targetId) {
163
+ return this.client.call("interact.select", {
164
+ sessionId,
165
+ ref,
166
+ values,
167
+ ...typeof targetId === "string" ? { targetId } : {}
168
+ });
82
169
  }
83
- domGetHtml(sessionId, ref, maxChars = 8e3) {
84
- return this.client.call("dom.getHtml", { sessionId, ref, maxChars });
170
+ scroll(sessionId, dy, ref, targetId) {
171
+ return this.client.call("interact.scroll", {
172
+ sessionId,
173
+ dy,
174
+ ref,
175
+ ...typeof targetId === "string" ? { targetId } : {}
176
+ });
85
177
  }
86
- domGetText(sessionId, ref, maxChars = 8e3) {
87
- return this.client.call("dom.getText", { sessionId, ref, maxChars });
178
+ scrollIntoView(sessionId, ref, targetId) {
179
+ return this.client.call("interact.scrollIntoView", {
180
+ sessionId,
181
+ ref,
182
+ ...typeof targetId === "string" ? { targetId } : {}
183
+ });
88
184
  }
89
- domGetAttr(sessionId, ref, name) {
90
- return this.client.call("dom.getAttr", { sessionId, ref, name });
185
+ domGetHtml(sessionId, ref, maxChars = 8e3, targetId) {
186
+ return this.client.call("dom.getHtml", {
187
+ sessionId,
188
+ ref,
189
+ maxChars,
190
+ ...typeof targetId === "string" ? { targetId } : {}
191
+ });
91
192
  }
92
- domGetValue(sessionId, ref) {
93
- return this.client.call("dom.getValue", { sessionId, ref });
193
+ domGetText(sessionId, ref, maxChars = 8e3, targetId) {
194
+ return this.client.call("dom.getText", {
195
+ sessionId,
196
+ ref,
197
+ maxChars,
198
+ ...typeof targetId === "string" ? { targetId } : {}
199
+ });
94
200
  }
95
- domIsVisible(sessionId, ref) {
96
- return this.client.call("dom.isVisible", { sessionId, ref });
201
+ domGetAttr(sessionId, ref, name, targetId) {
202
+ return this.client.call("dom.getAttr", {
203
+ sessionId,
204
+ ref,
205
+ name,
206
+ ...typeof targetId === "string" ? { targetId } : {}
207
+ });
97
208
  }
98
- domIsEnabled(sessionId, ref) {
99
- return this.client.call("dom.isEnabled", { sessionId, ref });
209
+ domGetValue(sessionId, ref, targetId) {
210
+ return this.client.call("dom.getValue", {
211
+ sessionId,
212
+ ref,
213
+ ...typeof targetId === "string" ? { targetId } : {}
214
+ });
100
215
  }
101
- domIsChecked(sessionId, ref) {
102
- return this.client.call("dom.isChecked", { sessionId, ref });
216
+ domIsVisible(sessionId, ref, targetId) {
217
+ return this.client.call("dom.isVisible", {
218
+ sessionId,
219
+ ref,
220
+ ...typeof targetId === "string" ? { targetId } : {}
221
+ });
103
222
  }
104
- clonePage(sessionId) {
105
- return this.client.call("export.clonePage", { sessionId });
223
+ domIsEnabled(sessionId, ref, targetId) {
224
+ return this.client.call("dom.isEnabled", {
225
+ sessionId,
226
+ ref,
227
+ ...typeof targetId === "string" ? { targetId } : {}
228
+ });
106
229
  }
107
- cloneComponent(sessionId, ref) {
108
- return this.client.call("export.cloneComponent", { sessionId, ref });
230
+ domIsChecked(sessionId, ref, targetId) {
231
+ return this.client.call("dom.isChecked", {
232
+ sessionId,
233
+ ref,
234
+ ...typeof targetId === "string" ? { targetId } : {}
235
+ });
109
236
  }
110
- perfMetrics(sessionId) {
111
- return this.client.call("devtools.perf", { sessionId });
237
+ clonePage(sessionId, targetId) {
238
+ return this.client.call("export.clonePage", {
239
+ sessionId,
240
+ ...typeof targetId === "string" ? { targetId } : {}
241
+ });
112
242
  }
113
- screenshot(sessionId, path) {
114
- return this.client.call("page.screenshot", { sessionId, path });
243
+ cloneComponent(sessionId, ref, targetId) {
244
+ return this.client.call("export.cloneComponent", {
245
+ sessionId,
246
+ ref,
247
+ ...typeof targetId === "string" ? { targetId } : {}
248
+ });
249
+ }
250
+ perfMetrics(sessionId, targetId) {
251
+ return this.client.call("devtools.perf", {
252
+ sessionId,
253
+ ...typeof targetId === "string" ? { targetId } : {}
254
+ });
255
+ }
256
+ screenshot(sessionId, path, targetId) {
257
+ return this.client.call("page.screenshot", {
258
+ sessionId,
259
+ path,
260
+ ...typeof targetId === "string" ? { targetId } : {}
261
+ });
115
262
  }
116
263
  consolePoll(sessionId, sinceSeq, max = 50) {
117
264
  return this.client.call("devtools.consolePoll", { sessionId, sinceSeq, max });
@@ -145,6 +292,17 @@ var RemoteManager = class {
145
292
  }
146
293
  };
147
294
 
295
+ // src/cli/remote-canvas-manager.ts
296
+ var RemoteCanvasManager = class {
297
+ client;
298
+ constructor(client) {
299
+ this.client = client;
300
+ }
301
+ execute(command, params = {}) {
302
+ return this.client.call("canvas.execute", { command, params });
303
+ }
304
+ };
305
+
148
306
  // src/cli/remote-relay.ts
149
307
  var emptyStatus = {
150
308
  running: false,
@@ -153,6 +311,7 @@ var emptyStatus = {
153
311
  cdpConnected: false,
154
312
  annotationConnected: false,
155
313
  opsConnected: false,
314
+ canvasConnected: false,
156
315
  pairingRequired: false,
157
316
  instanceId: "",
158
317
  epoch: 0,
@@ -164,6 +323,7 @@ var emptyStatus = {
164
323
  cdpConnected: false,
165
324
  annotationConnected: false,
166
325
  opsConnected: false,
326
+ canvasConnected: false,
167
327
  pairingRequired: false
168
328
  }
169
329
  };
@@ -173,6 +333,7 @@ var RemoteRelay = class {
173
333
  lastCdpUrl = null;
174
334
  lastAnnotationUrl = null;
175
335
  lastOpsUrl = null;
336
+ lastCanvasUrl = null;
176
337
  constructor(client) {
177
338
  this.client = client;
178
339
  }
@@ -186,11 +347,14 @@ var RemoteRelay = class {
186
347
  this.lastAnnotationUrl = typeof annotationUrl === "string" ? annotationUrl : null;
187
348
  const opsUrl = await this.client.call("relay.opsUrl");
188
349
  this.lastOpsUrl = typeof opsUrl === "string" ? opsUrl : null;
350
+ const canvasUrl = await this.client.call("relay.canvasUrl");
351
+ this.lastCanvasUrl = typeof canvasUrl === "string" ? canvasUrl : null;
189
352
  } catch {
190
353
  this.lastStatus = emptyStatus;
191
354
  this.lastCdpUrl = null;
192
355
  this.lastAnnotationUrl = null;
193
356
  this.lastOpsUrl = null;
357
+ this.lastCanvasUrl = null;
194
358
  }
195
359
  }
196
360
  status() {
@@ -205,11 +369,14 @@ var RemoteRelay = class {
205
369
  getOpsUrl() {
206
370
  return this.lastOpsUrl;
207
371
  }
372
+ getCanvasUrl() {
373
+ return this.lastCanvasUrl;
374
+ }
208
375
  };
209
376
 
210
377
  // src/skills/skill-nudge.ts
211
378
  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.`;
379
+ 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
380
  function createSkillNudgeState() {
214
381
  return { pending: false, requestedAtMs: null };
215
382
  }
@@ -272,7 +439,7 @@ function consumeContinuityNudge(state, nowMs, maxAgeMs) {
272
439
  }
273
440
  function buildContinuityNudgeMessage(filePath) {
274
441
  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.`;
442
+ 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
443
  }
277
444
 
278
445
  // src/tools/launch.ts
@@ -282,18 +449,25 @@ import { tool } from "@opencode-ai/plugin";
282
449
  function ok(data) {
283
450
  return JSON.stringify({ ok: true, ...data });
284
451
  }
285
- function failure(message, code) {
452
+ function failure(message, code, details) {
286
453
  return JSON.stringify({
287
454
  ok: false,
288
455
  error: {
289
456
  message,
290
- code
457
+ code,
458
+ ...details ? { details } : {}
291
459
  }
292
460
  });
293
461
  }
294
462
  function serializeError(error) {
295
463
  if (error instanceof Error) {
296
- return { message: error.message };
464
+ const detailCarrier = error;
465
+ const details = detailCarrier.details && typeof detailCarrier.details === "object" && !Array.isArray(detailCarrier.details) ? detailCarrier.details : detailCarrier.blocker && typeof detailCarrier.blocker === "object" && !Array.isArray(detailCarrier.blocker) ? { blocker: detailCarrier.blocker } : void 0;
466
+ return {
467
+ message: error.message,
468
+ code: detailCarrier.code,
469
+ details
470
+ };
297
471
  }
298
472
  return { message: "Unknown error" };
299
473
  }
@@ -333,6 +507,12 @@ function createLaunchTool(deps) {
333
507
  const headlessExplicit = args.headless === true;
334
508
  const managedExplicit = Boolean(args.noExtension || headlessExplicit);
335
509
  const managedHeadless = headlessExplicit ? true : false;
510
+ if (headlessExplicit && !args.noExtension) {
511
+ return failure(
512
+ "Extension mode does not support headless launches. Use noExtension=true with headless=true for managed mode.",
513
+ "unsupported_mode"
514
+ );
515
+ }
336
516
  if (args.waitForExtension && !managedExplicit) {
337
517
  const observedPort2 = resolveObservedPort(relayStatus, config.relayPort);
338
518
  const connected = await waitForExtensionHandshake(deps.relay, observedPort2, waitTimeoutMs);
@@ -381,7 +561,7 @@ function createLaunchTool(deps) {
381
561
  return failure(buildExtensionMissingMessage(diagnostics.message), "extension_not_connected");
382
562
  }
383
563
  try {
384
- result = await deps.manager.connectRelay(relayUrl);
564
+ result = args.startUrl ? await deps.manager.connectRelay(relayUrl, { startUrl: args.startUrl }) : await deps.manager.connectRelay(relayUrl);
385
565
  usedRelay = true;
386
566
  } catch (error) {
387
567
  const errorMessage = serializeError(error).message;
@@ -419,9 +599,6 @@ function createLaunchTool(deps) {
419
599
  return failure(buildManagedFailureMessage(error), "launch_failed");
420
600
  }
421
601
  }
422
- if (usedRelay && args.startUrl && result.activeTargetId) {
423
- await deps.manager.goto(result.sessionId, args.startUrl, "load", 3e4);
424
- }
425
602
  const warnings = result.warnings ?? [];
426
603
  return ok({
427
604
  sessionId: result.sessionId,
@@ -628,6 +805,7 @@ function createConnectTool(deps) {
628
805
  wsEndpoint: z2.string().optional().describe("Full WebSocket endpoint to connect to"),
629
806
  host: z2.string().optional().describe("Host for /json/version lookup"),
630
807
  port: z2.number().int().optional().describe("Port for /json/version lookup"),
808
+ startUrl: z2.string().optional().describe("Open this URL immediately after connect"),
631
809
  extensionLegacy: z2.boolean().optional().describe("Use legacy extension relay (/cdp) instead of ops")
632
810
  },
633
811
  async execute(args) {
@@ -635,6 +813,7 @@ function createConnectTool(deps) {
635
813
  await deps.relay?.refresh?.();
636
814
  const wsEndpoint = args.wsEndpoint;
637
815
  const extensionLegacy = args.extensionLegacy === true;
816
+ const startUrl = typeof args.startUrl === "string" && args.startUrl.trim().length > 0 ? args.startUrl.trim() : void 0;
638
817
  const hasExplicitCdp = Boolean(wsEndpoint || args.host || args.port);
639
818
  const relayUrl = extensionLegacy ? deps.relay?.getCdpUrl() ?? null : deps.relay?.getOpsUrl?.() ?? null;
640
819
  const normalizedOpsEndpoint = normalizeRelayEndpoint(wsEndpoint, "ops", true);
@@ -645,7 +824,7 @@ function createConnectTool(deps) {
645
824
  const relayEndpoint = relayUrl && wsEndpoint === relayUrl ? relayUrl : extensionLegacy ? normalizedLegacyEndpoint ?? normalizedOpsEndpoint : normalizedOpsEndpoint;
646
825
  let result;
647
826
  if (relayEndpoint || !hasExplicitCdp && relayUrl) {
648
- result = await deps.manager.connectRelay(relayEndpoint ?? relayUrl ?? "");
827
+ result = startUrl ? await deps.manager.connectRelay(relayEndpoint ?? relayUrl ?? "", { startUrl }) : await deps.manager.connectRelay(relayEndpoint ?? relayUrl ?? "");
649
828
  } else {
650
829
  if (!hasExplicitCdp) {
651
830
  return failure("Extension relay not available. Connect the extension or pass wsEndpoint/host/port.", "extension_not_connected");
@@ -653,7 +832,8 @@ function createConnectTool(deps) {
653
832
  result = await deps.manager.connect({
654
833
  wsEndpoint,
655
834
  host: args.host,
656
- port: args.port
835
+ port: args.port,
836
+ startUrl
657
837
  });
658
838
  }
659
839
  return ok({
@@ -974,6 +1154,7 @@ function createGotoTool(deps) {
974
1154
  args: {
975
1155
  sessionId: z12.string().describe("Session id"),
976
1156
  url: z12.string().describe("URL to navigate to"),
1157
+ targetId: z12.string().optional().describe("Optional target id"),
977
1158
  waitUntil: waitUntilSchema.optional().describe("Load state to wait for"),
978
1159
  timeoutMs: z12.number().int().optional().describe("Timeout in milliseconds")
979
1160
  },
@@ -983,7 +1164,9 @@ function createGotoTool(deps) {
983
1164
  args.sessionId,
984
1165
  args.url,
985
1166
  args.waitUntil ?? "load",
986
- args.timeoutMs ?? 3e4
1167
+ args.timeoutMs ?? 3e4,
1168
+ void 0,
1169
+ args.targetId
987
1170
  );
988
1171
  return ok(result);
989
1172
  } catch (error) {
@@ -1003,6 +1186,7 @@ function createWaitTool(deps) {
1003
1186
  description: "Wait for a load state or a ref state.",
1004
1187
  args: {
1005
1188
  sessionId: z13.string().describe("Session id"),
1189
+ targetId: z13.string().optional().describe("Optional target id"),
1006
1190
  until: waitUntilSchema2.optional().describe("Load state to wait for"),
1007
1191
  ref: z13.string().optional().describe("Ref to wait for"),
1008
1192
  state: waitStateSchema.optional().describe("Ref state to wait for"),
@@ -1015,7 +1199,8 @@ function createWaitTool(deps) {
1015
1199
  args.sessionId,
1016
1200
  args.ref,
1017
1201
  args.state ?? "attached",
1018
- args.timeoutMs ?? 3e4
1202
+ args.timeoutMs ?? 3e4,
1203
+ args.targetId
1019
1204
  );
1020
1205
  return ok(result2);
1021
1206
  }
@@ -1025,7 +1210,8 @@ function createWaitTool(deps) {
1025
1210
  const result = await deps.manager.waitForLoad(
1026
1211
  args.sessionId,
1027
1212
  args.until,
1028
- args.timeoutMs ?? 3e4
1213
+ args.timeoutMs ?? 3e4,
1214
+ args.targetId
1029
1215
  );
1030
1216
  return ok(result);
1031
1217
  } catch (error) {
@@ -1044,6 +1230,7 @@ function createSnapshotTool(deps) {
1044
1230
  description: "Capture a snapshot of the current page and return refs.",
1045
1231
  args: {
1046
1232
  sessionId: z14.string().describe("Session id"),
1233
+ targetId: z14.string().optional().describe("Optional target id"),
1047
1234
  format: formatSchema.optional().describe("Snapshot format"),
1048
1235
  maxChars: z14.number().int().optional().describe("Max characters for snapshot output"),
1049
1236
  cursor: z14.string().optional().describe("Cursor for paging")
@@ -1055,7 +1242,8 @@ function createSnapshotTool(deps) {
1055
1242
  args.sessionId,
1056
1243
  args.format ?? "outline",
1057
1244
  args.maxChars ?? config.snapshot.maxChars,
1058
- args.cursor
1245
+ args.cursor,
1246
+ args.targetId
1059
1247
  );
1060
1248
  return ok(result);
1061
1249
  } catch (error) {
@@ -1073,11 +1261,12 @@ function createClickTool(deps) {
1073
1261
  description: "Click a referenced element.",
1074
1262
  args: {
1075
1263
  sessionId: z15.string().describe("Session id"),
1264
+ targetId: z15.string().optional().describe("Optional target id"),
1076
1265
  ref: z15.string().describe("Element ref")
1077
1266
  },
1078
1267
  async execute(args) {
1079
1268
  try {
1080
- const result = await deps.manager.click(args.sessionId, args.ref);
1269
+ const result = await deps.manager.click(args.sessionId, args.ref, args.targetId);
1081
1270
  return ok(result);
1082
1271
  } catch (error) {
1083
1272
  return failure(serializeError(error).message, "click_failed");
@@ -1094,11 +1283,12 @@ function createHoverTool(deps) {
1094
1283
  description: "Hover over an element by ref.",
1095
1284
  args: {
1096
1285
  sessionId: z16.string().describe("Active browser session id"),
1286
+ targetId: z16.string().optional().describe("Optional target id"),
1097
1287
  ref: z16.string().describe("Element ref from snapshot")
1098
1288
  },
1099
1289
  async execute(args) {
1100
1290
  try {
1101
- const result = await deps.manager.hover(args.sessionId, args.ref);
1291
+ const result = await deps.manager.hover(args.sessionId, args.ref, args.targetId);
1102
1292
  return ok(result);
1103
1293
  } catch (error) {
1104
1294
  return failure(serializeError(error).message, "hover_failed");
@@ -1115,12 +1305,13 @@ function createPressTool(deps) {
1115
1305
  description: "Press a keyboard key, optionally focusing a ref first.",
1116
1306
  args: {
1117
1307
  sessionId: z17.string().describe("Active browser session id"),
1308
+ targetId: z17.string().optional().describe("Optional target id"),
1118
1309
  key: z17.string().describe("Keyboard key to press, e.g. Enter or ArrowDown"),
1119
1310
  ref: z17.string().optional().describe("Optional element ref to focus first")
1120
1311
  },
1121
1312
  async execute(args) {
1122
1313
  try {
1123
- const result = await deps.manager.press(args.sessionId, args.key, args.ref);
1314
+ const result = await deps.manager.press(args.sessionId, args.key, args.ref, args.targetId);
1124
1315
  return ok(result);
1125
1316
  } catch (error) {
1126
1317
  return failure(serializeError(error).message, "press_failed");
@@ -1137,11 +1328,12 @@ function createCheckTool(deps) {
1137
1328
  description: "Check a checkbox or toggle by ref.",
1138
1329
  args: {
1139
1330
  sessionId: z18.string().describe("Active browser session id"),
1331
+ targetId: z18.string().optional().describe("Optional target id"),
1140
1332
  ref: z18.string().describe("Element ref from snapshot")
1141
1333
  },
1142
1334
  async execute(args) {
1143
1335
  try {
1144
- const result = await deps.manager.check(args.sessionId, args.ref);
1336
+ const result = await deps.manager.check(args.sessionId, args.ref, args.targetId);
1145
1337
  return ok(result);
1146
1338
  } catch (error) {
1147
1339
  return failure(serializeError(error).message, "check_failed");
@@ -1158,11 +1350,12 @@ function createUncheckTool(deps) {
1158
1350
  description: "Uncheck a checkbox or toggle by ref.",
1159
1351
  args: {
1160
1352
  sessionId: z19.string().describe("Active browser session id"),
1353
+ targetId: z19.string().optional().describe("Optional target id"),
1161
1354
  ref: z19.string().describe("Element ref from snapshot")
1162
1355
  },
1163
1356
  async execute(args) {
1164
1357
  try {
1165
- const result = await deps.manager.uncheck(args.sessionId, args.ref);
1358
+ const result = await deps.manager.uncheck(args.sessionId, args.ref, args.targetId);
1166
1359
  return ok(result);
1167
1360
  } catch (error) {
1168
1361
  return failure(serializeError(error).message, "uncheck_failed");
@@ -1179,6 +1372,7 @@ function createTypeTool(deps) {
1179
1372
  description: "Type text into a referenced input.",
1180
1373
  args: {
1181
1374
  sessionId: z20.string().describe("Session id"),
1375
+ targetId: z20.string().optional().describe("Optional target id"),
1182
1376
  ref: z20.string().describe("Element ref"),
1183
1377
  text: z20.string().describe("Text to type"),
1184
1378
  clear: z20.boolean().optional().describe("Clear before typing"),
@@ -1191,7 +1385,8 @@ function createTypeTool(deps) {
1191
1385
  args.ref,
1192
1386
  args.text,
1193
1387
  Boolean(args.clear),
1194
- Boolean(args.submit)
1388
+ Boolean(args.submit),
1389
+ args.targetId
1195
1390
  );
1196
1391
  return ok(result);
1197
1392
  } catch (error) {
@@ -1209,12 +1404,13 @@ function createSelectTool(deps) {
1209
1404
  description: "Select options in a referenced select element.",
1210
1405
  args: {
1211
1406
  sessionId: z21.string().describe("Session id"),
1407
+ targetId: z21.string().optional().describe("Optional target id"),
1212
1408
  ref: z21.string().describe("Element ref"),
1213
1409
  values: z21.array(z21.string()).describe("Values to select")
1214
1410
  },
1215
1411
  async execute(args) {
1216
1412
  try {
1217
- await deps.manager.select(args.sessionId, args.ref, args.values);
1413
+ await deps.manager.select(args.sessionId, args.ref, args.values, args.targetId);
1218
1414
  return ok({});
1219
1415
  } catch (error) {
1220
1416
  return failure(serializeError(error).message, "select_failed");
@@ -1231,12 +1427,13 @@ function createScrollTool(deps) {
1231
1427
  description: "Scroll the page or a referenced element.",
1232
1428
  args: {
1233
1429
  sessionId: z22.string().describe("Session id"),
1430
+ targetId: z22.string().optional().describe("Optional target id"),
1234
1431
  dy: z22.number().describe("Scroll delta in pixels"),
1235
1432
  ref: z22.string().optional().describe("Optional element ref to scroll")
1236
1433
  },
1237
1434
  async execute(args) {
1238
1435
  try {
1239
- await deps.manager.scroll(args.sessionId, args.dy, args.ref);
1436
+ await deps.manager.scroll(args.sessionId, args.dy, args.ref, args.targetId);
1240
1437
  return ok({});
1241
1438
  } catch (error) {
1242
1439
  return failure(serializeError(error).message, "scroll_failed");
@@ -1253,11 +1450,12 @@ function createScrollIntoViewTool(deps) {
1253
1450
  description: "Scroll an element into view by ref.",
1254
1451
  args: {
1255
1452
  sessionId: z23.string().describe("Active browser session id"),
1453
+ targetId: z23.string().optional().describe("Optional target id"),
1256
1454
  ref: z23.string().describe("Element ref from snapshot")
1257
1455
  },
1258
1456
  async execute(args) {
1259
1457
  try {
1260
- const result = await deps.manager.scrollIntoView(args.sessionId, args.ref);
1458
+ const result = await deps.manager.scrollIntoView(args.sessionId, args.ref, args.targetId);
1261
1459
  return ok(result);
1262
1460
  } catch (error) {
1263
1461
  return failure(serializeError(error).message, "scroll_into_view_failed");
@@ -1274,6 +1472,7 @@ function createDomGetHtmlTool(deps) {
1274
1472
  description: "Get outerHTML for a referenced element.",
1275
1473
  args: {
1276
1474
  sessionId: z24.string().describe("Session id"),
1475
+ targetId: z24.string().optional().describe("Optional target id"),
1277
1476
  ref: z24.string().describe("Element ref"),
1278
1477
  maxChars: z24.number().int().optional().describe("Max characters")
1279
1478
  },
@@ -1282,7 +1481,8 @@ function createDomGetHtmlTool(deps) {
1282
1481
  const result = await deps.manager.domGetHtml(
1283
1482
  args.sessionId,
1284
1483
  args.ref,
1285
- args.maxChars ?? 8e3
1484
+ args.maxChars ?? 8e3,
1485
+ args.targetId
1286
1486
  );
1287
1487
  return ok({
1288
1488
  ref: args.ref,
@@ -1304,6 +1504,7 @@ function createDomGetTextTool(deps) {
1304
1504
  description: "Get inner text for a referenced element.",
1305
1505
  args: {
1306
1506
  sessionId: z25.string().describe("Session id"),
1507
+ targetId: z25.string().optional().describe("Optional target id"),
1307
1508
  ref: z25.string().describe("Element ref"),
1308
1509
  maxChars: z25.number().int().optional().describe("Max characters")
1309
1510
  },
@@ -1312,7 +1513,8 @@ function createDomGetTextTool(deps) {
1312
1513
  const result = await deps.manager.domGetText(
1313
1514
  args.sessionId,
1314
1515
  args.ref,
1315
- args.maxChars ?? 8e3
1516
+ args.maxChars ?? 8e3,
1517
+ args.targetId
1316
1518
  );
1317
1519
  return ok({
1318
1520
  ref: args.ref,
@@ -1334,12 +1536,13 @@ function createGetAttrTool(deps) {
1334
1536
  description: "Get a DOM attribute value by ref.",
1335
1537
  args: {
1336
1538
  sessionId: z26.string().describe("Active browser session id"),
1539
+ targetId: z26.string().optional().describe("Optional target id"),
1337
1540
  ref: z26.string().describe("Element ref from snapshot"),
1338
1541
  name: z26.string().describe("Attribute name, e.g. href or aria-label")
1339
1542
  },
1340
1543
  async execute(args) {
1341
1544
  try {
1342
- const result = await deps.manager.domGetAttr(args.sessionId, args.ref, args.name);
1545
+ const result = await deps.manager.domGetAttr(args.sessionId, args.ref, args.name, args.targetId);
1343
1546
  return ok(result);
1344
1547
  } catch (error) {
1345
1548
  return failure(serializeError(error).message, "get_attr_failed");
@@ -1356,11 +1559,12 @@ function createGetValueTool(deps) {
1356
1559
  description: "Get the input value for an element by ref.",
1357
1560
  args: {
1358
1561
  sessionId: z27.string().describe("Active browser session id"),
1562
+ targetId: z27.string().optional().describe("Optional target id"),
1359
1563
  ref: z27.string().describe("Element ref from snapshot")
1360
1564
  },
1361
1565
  async execute(args) {
1362
1566
  try {
1363
- const result = await deps.manager.domGetValue(args.sessionId, args.ref);
1567
+ const result = await deps.manager.domGetValue(args.sessionId, args.ref, args.targetId);
1364
1568
  return ok(result);
1365
1569
  } catch (error) {
1366
1570
  return failure(serializeError(error).message, "get_value_failed");
@@ -1377,11 +1581,12 @@ function createIsVisibleTool(deps) {
1377
1581
  description: "Check if an element is visible by ref.",
1378
1582
  args: {
1379
1583
  sessionId: z28.string().describe("Active browser session id"),
1584
+ targetId: z28.string().optional().describe("Optional target id"),
1380
1585
  ref: z28.string().describe("Element ref from snapshot")
1381
1586
  },
1382
1587
  async execute(args) {
1383
1588
  try {
1384
- const result = await deps.manager.domIsVisible(args.sessionId, args.ref);
1589
+ const result = await deps.manager.domIsVisible(args.sessionId, args.ref, args.targetId);
1385
1590
  return ok(result);
1386
1591
  } catch (error) {
1387
1592
  return failure(serializeError(error).message, "is_visible_failed");
@@ -1398,11 +1603,12 @@ function createIsEnabledTool(deps) {
1398
1603
  description: "Check if an element is enabled by ref.",
1399
1604
  args: {
1400
1605
  sessionId: z29.string().describe("Active browser session id"),
1606
+ targetId: z29.string().optional().describe("Optional target id"),
1401
1607
  ref: z29.string().describe("Element ref from snapshot")
1402
1608
  },
1403
1609
  async execute(args) {
1404
1610
  try {
1405
- const result = await deps.manager.domIsEnabled(args.sessionId, args.ref);
1611
+ const result = await deps.manager.domIsEnabled(args.sessionId, args.ref, args.targetId);
1406
1612
  return ok(result);
1407
1613
  } catch (error) {
1408
1614
  return failure(serializeError(error).message, "is_enabled_failed");
@@ -1419,11 +1625,12 @@ function createIsCheckedTool(deps) {
1419
1625
  description: "Check if an element is checked by ref.",
1420
1626
  args: {
1421
1627
  sessionId: z30.string().describe("Active browser session id"),
1628
+ targetId: z30.string().optional().describe("Optional target id"),
1422
1629
  ref: z30.string().describe("Element ref from snapshot")
1423
1630
  },
1424
1631
  async execute(args) {
1425
1632
  try {
1426
- const result = await deps.manager.domIsChecked(args.sessionId, args.ref);
1633
+ const result = await deps.manager.domIsChecked(args.sessionId, args.ref, args.targetId);
1427
1634
  return ok(result);
1428
1635
  } catch (error) {
1429
1636
  return failure(serializeError(error).message, "is_checked_failed");
@@ -1550,18 +1757,468 @@ function createNetworkPollTool(deps) {
1550
1757
  });
1551
1758
  }
1552
1759
 
1553
- // src/tools/clone_page.ts
1760
+ // src/tools/debug_trace_snapshot.ts
1554
1761
  import { tool as tool35 } from "@opencode-ai/plugin";
1555
1762
  var z35 = tool35.schema;
1556
- function createClonePageTool(deps) {
1763
+ function createDebugTraceSnapshotTool(deps) {
1557
1764
  return tool35({
1765
+ description: "Capture a combined debug trace snapshot (page + console + network + exceptions).",
1766
+ args: {
1767
+ sessionId: z35.string().describe("Session id"),
1768
+ sinceConsoleSeq: z35.number().int().optional().describe("Resume cursor for console events"),
1769
+ sinceNetworkSeq: z35.number().int().optional().describe("Resume cursor for network events"),
1770
+ sinceExceptionSeq: z35.number().int().optional().describe("Resume cursor for exception events"),
1771
+ max: z35.number().int().optional().describe("Max events per channel"),
1772
+ requestId: z35.string().optional().describe("Optional trace request id")
1773
+ },
1774
+ async execute(args) {
1775
+ try {
1776
+ const manager = deps.manager;
1777
+ const options = {
1778
+ sinceConsoleSeq: args.sinceConsoleSeq,
1779
+ sinceNetworkSeq: args.sinceNetworkSeq,
1780
+ sinceExceptionSeq: args.sinceExceptionSeq,
1781
+ max: args.max,
1782
+ requestId: args.requestId
1783
+ };
1784
+ if (typeof manager.debugTraceSnapshot === "function") {
1785
+ const result = await manager.debugTraceSnapshot(args.sessionId, options);
1786
+ return ok(result);
1787
+ }
1788
+ const max = args.max ?? 500;
1789
+ const requestId = args.requestId ?? createRequestId();
1790
+ const [page, consoleChannel, networkChannel] = await Promise.all([
1791
+ deps.manager.status(args.sessionId),
1792
+ deps.manager.consolePoll(args.sessionId, args.sinceConsoleSeq, max),
1793
+ deps.manager.networkPoll(args.sessionId, args.sinceNetworkSeq, max)
1794
+ ]);
1795
+ const exceptionChannel = typeof manager.exceptionPoll === "function" ? await manager.exceptionPoll(args.sessionId, args.sinceExceptionSeq, max) : {
1796
+ events: [],
1797
+ nextSeq: args.sinceExceptionSeq ?? 0,
1798
+ truncated: false
1799
+ };
1800
+ const annotateTraceContext = (events) => events.map((event) => ({
1801
+ ...event,
1802
+ requestId,
1803
+ sessionId: args.sessionId
1804
+ }));
1805
+ const blocker = classifyBlockerSignal({
1806
+ source: "network",
1807
+ url: typeof page.url === "string" ? page.url : void 0,
1808
+ finalUrl: typeof page.url === "string" ? page.url : void 0,
1809
+ title: typeof page.title === "string" ? page.title : void 0,
1810
+ status: findLatestStatus(networkChannel.events),
1811
+ traceRequestId: requestId,
1812
+ networkHosts: extractHosts(networkChannel.events),
1813
+ threshold: deps.config.get().blockerDetectionThreshold,
1814
+ promptGuardEnabled: deps.config.get().security.promptInjectionGuard?.enabled ?? true
1815
+ });
1816
+ const blockerArtifacts = blocker ? buildBlockerArtifacts({
1817
+ networkEvents: networkChannel.events,
1818
+ consoleEvents: consoleChannel.events,
1819
+ exceptionEvents: exceptionChannel.events,
1820
+ promptGuardEnabled: deps.config.get().security.promptInjectionGuard?.enabled ?? true,
1821
+ caps: deps.config.get().blockerArtifactCaps
1822
+ }) : void 0;
1823
+ return ok({
1824
+ requestId,
1825
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
1826
+ page,
1827
+ channels: {
1828
+ console: {
1829
+ nextSeq: consoleChannel.nextSeq,
1830
+ truncated: consoleChannel.truncated,
1831
+ events: annotateTraceContext(consoleChannel.events)
1832
+ },
1833
+ network: {
1834
+ nextSeq: networkChannel.nextSeq,
1835
+ truncated: networkChannel.truncated,
1836
+ events: annotateTraceContext(networkChannel.events)
1837
+ },
1838
+ exception: {
1839
+ nextSeq: exceptionChannel.nextSeq,
1840
+ truncated: exceptionChannel.truncated,
1841
+ events: annotateTraceContext(exceptionChannel.events)
1842
+ }
1843
+ },
1844
+ meta: {
1845
+ blockerState: blocker ? "active" : "clear",
1846
+ ...blocker ? { blocker } : {},
1847
+ ...blockerArtifacts ? { blockerArtifacts } : {}
1848
+ }
1849
+ });
1850
+ } catch (error) {
1851
+ return failure(serializeError(error).message, "debug_trace_snapshot_failed");
1852
+ }
1853
+ }
1854
+ });
1855
+ }
1856
+ function findLatestStatus(events) {
1857
+ for (let index = events.length - 1; index >= 0; index -= 1) {
1858
+ const status = events[index]?.status;
1859
+ if (typeof status === "number") {
1860
+ return status;
1861
+ }
1862
+ }
1863
+ return void 0;
1864
+ }
1865
+ function extractHosts(events) {
1866
+ const hosts = [];
1867
+ const seen = /* @__PURE__ */ new Set();
1868
+ for (const event of events) {
1869
+ if (typeof event.url !== "string") continue;
1870
+ try {
1871
+ const host = new URL(event.url).hostname.toLowerCase();
1872
+ if (!host || seen.has(host)) continue;
1873
+ seen.add(host);
1874
+ hosts.push(host);
1875
+ } catch {
1876
+ }
1877
+ }
1878
+ return hosts;
1879
+ }
1880
+
1881
+ // src/tools/cookie_import.ts
1882
+ import { tool as tool36 } from "@opencode-ai/plugin";
1883
+ var z36 = tool36.schema;
1884
+ function validateCookieRecord(cookie) {
1885
+ const name = cookie.name?.trim();
1886
+ if (!name) {
1887
+ return { valid: false, reason: "Cookie name is required.", cookie };
1888
+ }
1889
+ if (!/^[^\s;=]+$/.test(name)) {
1890
+ return { valid: false, reason: `Invalid cookie name: ${cookie.name}.`, cookie };
1891
+ }
1892
+ if (typeof cookie.value !== "string") {
1893
+ return { valid: false, reason: `Invalid cookie value for ${name}.`, cookie };
1894
+ }
1895
+ const value = cookie.value;
1896
+ if (/\r|\n|;/.test(value)) {
1897
+ return { valid: false, reason: `Invalid cookie value for ${name}.`, cookie };
1898
+ }
1899
+ const hasUrl = typeof cookie.url === "string" && cookie.url.trim().length > 0;
1900
+ const hasDomain = typeof cookie.domain === "string" && cookie.domain.trim().length > 0;
1901
+ if (!hasUrl && !hasDomain) {
1902
+ return { valid: false, reason: `Cookie ${name} requires url or domain.`, cookie };
1903
+ }
1904
+ let normalizedUrl;
1905
+ if (hasUrl) {
1906
+ try {
1907
+ const parsedUrl = new URL(cookie.url);
1908
+ if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
1909
+ return { valid: false, reason: `Cookie ${name} url must be http(s).`, cookie };
1910
+ }
1911
+ normalizedUrl = parsedUrl.toString();
1912
+ } catch {
1913
+ return { valid: false, reason: `Cookie ${name} has invalid url.`, cookie };
1914
+ }
1915
+ }
1916
+ let normalizedDomain;
1917
+ if (hasDomain) {
1918
+ normalizedDomain = String(cookie.domain).trim().toLowerCase();
1919
+ if (!/^\.?[a-z0-9.-]+$/.test(normalizedDomain)) {
1920
+ return { valid: false, reason: `Cookie ${name} has invalid domain.`, cookie };
1921
+ }
1922
+ if (normalizedDomain.includes("..")) {
1923
+ return { valid: false, reason: `Cookie ${name} has invalid domain.`, cookie };
1924
+ }
1925
+ }
1926
+ const normalizedPath = typeof cookie.path === "string" ? cookie.path.trim() : void 0;
1927
+ if (typeof normalizedPath === "string" && !normalizedPath.startsWith("/")) {
1928
+ return { valid: false, reason: `Cookie ${name} path must start with '/'.`, cookie };
1929
+ }
1930
+ if (typeof cookie.expires !== "undefined") {
1931
+ if (!Number.isFinite(cookie.expires)) {
1932
+ return { valid: false, reason: `Cookie ${name} has invalid expires.`, cookie };
1933
+ }
1934
+ if (cookie.expires < -1) {
1935
+ return { valid: false, reason: `Cookie ${name} has invalid expires.`, cookie };
1936
+ }
1937
+ }
1938
+ if (cookie.sameSite === "None" && cookie.secure !== true) {
1939
+ return { valid: false, reason: `Cookie ${name} with SameSite=None must set secure=true.`, cookie };
1940
+ }
1941
+ const normalizedCookie = {
1942
+ name,
1943
+ value,
1944
+ ...typeof cookie.expires === "number" ? { expires: cookie.expires } : {},
1945
+ ...typeof cookie.httpOnly === "boolean" ? { httpOnly: cookie.httpOnly } : {},
1946
+ ...typeof cookie.secure === "boolean" ? { secure: cookie.secure } : {},
1947
+ ...cookie.sameSite ? { sameSite: cookie.sameSite } : {}
1948
+ };
1949
+ if (normalizedDomain) {
1950
+ normalizedCookie.domain = normalizedDomain;
1951
+ normalizedCookie.path = normalizedPath ?? "/";
1952
+ } else if (normalizedUrl) {
1953
+ normalizedCookie.url = normalizedUrl;
1954
+ }
1955
+ return {
1956
+ valid: true,
1957
+ reason: "",
1958
+ cookie: normalizedCookie
1959
+ };
1960
+ }
1961
+ function createCookieImportTool(deps) {
1962
+ return tool36({
1963
+ description: "Import validated cookies into the current session context.",
1964
+ args: {
1965
+ sessionId: z36.string().describe("Session id"),
1966
+ cookies: z36.array(z36.object({
1967
+ name: z36.string().min(1),
1968
+ value: z36.string(),
1969
+ url: z36.string().optional(),
1970
+ domain: z36.string().optional(),
1971
+ path: z36.string().optional(),
1972
+ expires: z36.number().optional(),
1973
+ httpOnly: z36.boolean().optional(),
1974
+ secure: z36.boolean().optional(),
1975
+ sameSite: z36.enum(["Strict", "Lax", "None"]).optional()
1976
+ })).min(1).describe("Cookies to import"),
1977
+ strict: z36.boolean().optional().describe("Reject on first invalid cookie (default true)"),
1978
+ requestId: z36.string().optional().describe("Optional trace request id")
1979
+ },
1980
+ async execute(args) {
1981
+ try {
1982
+ const strict = args.strict ?? true;
1983
+ const requestId = args.requestId ?? createRequestId();
1984
+ const manager = deps.manager;
1985
+ const normalized = [];
1986
+ const rejected = [];
1987
+ args.cookies.forEach((cookie, index) => {
1988
+ const validation = validateCookieRecord(cookie);
1989
+ if (!validation.valid) {
1990
+ rejected.push({ index, reason: validation.reason });
1991
+ return;
1992
+ }
1993
+ normalized.push(validation.cookie);
1994
+ });
1995
+ if (typeof manager.cookieImport === "function") {
1996
+ return ok(await manager.cookieImport(args.sessionId, normalized, strict, requestId));
1997
+ }
1998
+ if (strict && rejected.length > 0) {
1999
+ return failure(`Cookie import rejected ${rejected.length} entries.`, "cookie_import_failed");
2000
+ }
2001
+ if (normalized.length > 0) {
2002
+ await deps.manager.withPage(args.sessionId, null, async (page) => {
2003
+ await page.context().addCookies(normalized);
2004
+ return void 0;
2005
+ });
2006
+ }
2007
+ return ok({
2008
+ requestId,
2009
+ imported: normalized.length,
2010
+ rejected
2011
+ });
2012
+ } catch (error) {
2013
+ return failure(serializeError(error).message, "cookie_import_failed");
2014
+ }
2015
+ }
2016
+ });
2017
+ }
2018
+
2019
+ // src/tools/cookie_list.ts
2020
+ import { tool as tool37 } from "@opencode-ai/plugin";
2021
+ var z37 = tool37.schema;
2022
+ function normalizeCookieUrls(urls) {
2023
+ if (!urls || urls.length === 0) {
2024
+ return void 0;
2025
+ }
2026
+ const normalized = [];
2027
+ const seen = /* @__PURE__ */ new Set();
2028
+ for (const value of urls) {
2029
+ const trimmed = value.trim();
2030
+ if (!trimmed) {
2031
+ throw new Error("Cookie list urls must be non-empty strings.");
2032
+ }
2033
+ let parsedUrl;
2034
+ try {
2035
+ parsedUrl = new URL(trimmed);
2036
+ } catch {
2037
+ throw new Error(`Cookie list url is invalid: ${trimmed}`);
2038
+ }
2039
+ if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
2040
+ throw new Error(`Cookie list url must be http(s): ${trimmed}`);
2041
+ }
2042
+ const normalizedUrl = parsedUrl.toString();
2043
+ if (seen.has(normalizedUrl)) {
2044
+ continue;
2045
+ }
2046
+ seen.add(normalizedUrl);
2047
+ normalized.push(normalizedUrl);
2048
+ }
2049
+ return normalized;
2050
+ }
2051
+ function createCookieListTool(deps) {
2052
+ return tool37({
2053
+ description: "List cookies in the current session context with optional URL filtering.",
2054
+ args: {
2055
+ sessionId: z37.string().describe("Session id"),
2056
+ urls: z37.array(z37.string().min(1)).optional().describe("Optional URL filters for cookie scoping"),
2057
+ requestId: z37.string().optional().describe("Optional trace request id")
2058
+ },
2059
+ async execute(args) {
2060
+ try {
2061
+ const manager = deps.manager;
2062
+ const normalizedUrls = normalizeCookieUrls(args.urls);
2063
+ const requestId = args.requestId ?? createRequestId();
2064
+ if (typeof manager.cookieList === "function") {
2065
+ return ok(await manager.cookieList(args.sessionId, normalizedUrls, requestId));
2066
+ }
2067
+ const cookies = await deps.manager.withPage(
2068
+ args.sessionId,
2069
+ null,
2070
+ async (page) => {
2071
+ const listed = normalizedUrls ? await page.context().cookies(normalizedUrls) : await page.context().cookies();
2072
+ return listed.map((cookie) => ({
2073
+ name: cookie.name,
2074
+ value: cookie.value,
2075
+ domain: cookie.domain,
2076
+ path: cookie.path,
2077
+ expires: cookie.expires,
2078
+ httpOnly: cookie.httpOnly,
2079
+ secure: cookie.secure,
2080
+ ...cookie.sameSite ? { sameSite: cookie.sameSite } : {}
2081
+ }));
2082
+ }
2083
+ );
2084
+ return ok({
2085
+ requestId,
2086
+ cookies,
2087
+ count: cookies.length
2088
+ });
2089
+ } catch (error) {
2090
+ return failure(serializeError(error).message, "cookie_list_failed");
2091
+ }
2092
+ }
2093
+ });
2094
+ }
2095
+
2096
+ // src/tools/macro_resolve.ts
2097
+ import { tool as tool38 } from "@opencode-ai/plugin";
2098
+ var z38 = tool38.schema;
2099
+ async function loadMacroRuntime() {
2100
+ try {
2101
+ const module = await import("./macros-ND2M7LWU.js");
2102
+ return module;
2103
+ } catch {
2104
+ return null;
2105
+ }
2106
+ }
2107
+ async function resolveMacroProviderRuntime(deps) {
2108
+ if (deps.providerRuntime) {
2109
+ return deps.providerRuntime;
2110
+ }
2111
+ const { createConfiguredProviderRuntime: createConfiguredProviderRuntime2 } = await import("./runtime-factory-BICHDPE7.js");
2112
+ return createConfiguredProviderRuntime2({
2113
+ config: deps.config?.get?.(),
2114
+ manager: deps.manager,
2115
+ browserFallbackPort: deps.browserFallbackPort
2116
+ });
2117
+ }
2118
+ function parseFallbackMacro(expression, defaultProvider) {
2119
+ const raw = expression.trim();
2120
+ if (!raw.startsWith("@")) {
2121
+ throw new Error("Macro expressions must start with '@'");
2122
+ }
2123
+ const body = raw.slice(1).trim();
2124
+ if (!body) {
2125
+ throw new Error("Macro name is required");
2126
+ }
2127
+ const openParen = body.indexOf("(");
2128
+ const closeParen = body.endsWith(")") ? body.length - 1 : -1;
2129
+ const macroName = openParen >= 0 ? body.slice(0, openParen).trim() : body;
2130
+ const argsBody = openParen >= 0 && closeParen > openParen ? body.slice(openParen + 1, closeParen).trim() : "";
2131
+ const positional = argsBody ? argsBody.split(",").map((part) => part.trim().replace(/^['\"]|['\"]$/g, "")).filter(Boolean) : [];
2132
+ const query = positional[0] ?? macroName;
2133
+ const provider = defaultProvider ?? "web/default";
2134
+ return {
2135
+ action: {
2136
+ source: "web",
2137
+ operation: "search",
2138
+ input: {
2139
+ query,
2140
+ limit: 10,
2141
+ providerId: provider
2142
+ }
2143
+ },
2144
+ provenance: {
2145
+ macro: macroName,
2146
+ provider,
2147
+ resolvedQuery: query,
2148
+ pack: "fallback",
2149
+ args: {
2150
+ positional,
2151
+ named: {}
2152
+ }
2153
+ }
2154
+ };
2155
+ }
2156
+ function createMacroResolveTool(deps) {
2157
+ return tool38({
2158
+ description: "Resolve a macro expression to a provider action with provenance metadata.",
2159
+ args: {
2160
+ expression: z38.string().min(2).describe('Macro expression, e.g. @web.search("query")'),
2161
+ defaultProvider: z38.string().optional().describe("Default provider fallback"),
2162
+ includeCatalog: z38.boolean().optional().describe("Include available runtime macro names"),
2163
+ execute: z38.boolean().optional().describe("Execute the resolved provider action and include execution payload")
2164
+ },
2165
+ async execute(args) {
2166
+ try {
2167
+ const runtime = await loadMacroRuntime();
2168
+ const registry = runtime?.createDefaultMacroRegistry?.();
2169
+ let resolvedRuntime = "fallback";
2170
+ let resolution;
2171
+ let catalog;
2172
+ if (registry) {
2173
+ resolvedRuntime = "macros";
2174
+ resolution = await registry.resolve(args.expression, {
2175
+ defaultProvider: args.defaultProvider
2176
+ });
2177
+ catalog = args.includeCatalog ? registry.list().map((entry) => ({
2178
+ name: entry.name,
2179
+ pack: entry.pack,
2180
+ description: entry.description
2181
+ })) : void 0;
2182
+ } else {
2183
+ resolution = parseFallbackMacro(args.expression, args.defaultProvider);
2184
+ }
2185
+ if (!args.execute) {
2186
+ return ok({
2187
+ runtime: resolvedRuntime,
2188
+ resolution,
2189
+ ...catalog ? { catalog } : {}
2190
+ });
2191
+ }
2192
+ const providerRuntime = await resolveMacroProviderRuntime(deps);
2193
+ const execution = shapeExecutionPayload(
2194
+ await executeMacroResolution(resolution, providerRuntime)
2195
+ );
2196
+ return ok({
2197
+ runtime: resolvedRuntime,
2198
+ resolution,
2199
+ ...catalog ? { catalog } : {},
2200
+ execution
2201
+ });
2202
+ } catch (error) {
2203
+ return failure(serializeError(error).message, "macro_resolve_failed");
2204
+ }
2205
+ }
2206
+ });
2207
+ }
2208
+
2209
+ // src/tools/clone_page.ts
2210
+ import { tool as tool39 } from "@opencode-ai/plugin";
2211
+ var z39 = tool39.schema;
2212
+ function createClonePageTool(deps) {
2213
+ return tool39({
1558
2214
  description: "Export the active page as a React component and CSS bundle.",
1559
2215
  args: {
1560
- sessionId: z35.string().describe("Active browser session id")
2216
+ sessionId: z39.string().describe("Active browser session id"),
2217
+ targetId: z39.string().optional().describe("Optional target id")
1561
2218
  },
1562
2219
  async execute(args) {
1563
2220
  try {
1564
- const result = await deps.manager.clonePage(args.sessionId);
2221
+ const result = await deps.manager.clonePage(args.sessionId, args.targetId);
1565
2222
  return ok({ component: result.component, css: result.css, warnings: result.warnings });
1566
2223
  } catch (error) {
1567
2224
  return failure(serializeError(error).message, "clone_page_failed");
@@ -1571,18 +2228,19 @@ function createClonePageTool(deps) {
1571
2228
  }
1572
2229
 
1573
2230
  // src/tools/clone_component.ts
1574
- import { tool as tool36 } from "@opencode-ai/plugin";
1575
- var z36 = tool36.schema;
2231
+ import { tool as tool40 } from "@opencode-ai/plugin";
2232
+ var z40 = tool40.schema;
1576
2233
  function createCloneComponentTool(deps) {
1577
- return tool36({
2234
+ return tool40({
1578
2235
  description: "Export a selected element subtree as a React component and CSS bundle.",
1579
2236
  args: {
1580
- sessionId: z36.string().describe("Active browser session id"),
1581
- ref: z36.string().describe("Element ref from snapshot")
2237
+ sessionId: z40.string().describe("Active browser session id"),
2238
+ targetId: z40.string().optional().describe("Optional target id"),
2239
+ ref: z40.string().describe("Element ref from snapshot")
1582
2240
  },
1583
2241
  async execute(args) {
1584
2242
  try {
1585
- const result = await deps.manager.cloneComponent(args.sessionId, args.ref);
2243
+ const result = await deps.manager.cloneComponent(args.sessionId, args.ref, args.targetId);
1586
2244
  return ok({ component: result.component, css: result.css, warnings: result.warnings });
1587
2245
  } catch (error) {
1588
2246
  return failure(serializeError(error).message, "clone_component_failed");
@@ -1592,17 +2250,18 @@ function createCloneComponentTool(deps) {
1592
2250
  }
1593
2251
 
1594
2252
  // src/tools/perf.ts
1595
- import { tool as tool37 } from "@opencode-ai/plugin";
1596
- var z37 = tool37.schema;
2253
+ import { tool as tool41 } from "@opencode-ai/plugin";
2254
+ var z41 = tool41.schema;
1597
2255
  function createPerfTool(deps) {
1598
- return tool37({
2256
+ return tool41({
1599
2257
  description: "Fetch lightweight performance metrics from the active page.",
1600
2258
  args: {
1601
- sessionId: z37.string().describe("Active browser session id")
2259
+ sessionId: z41.string().describe("Active browser session id"),
2260
+ targetId: z41.string().optional().describe("Optional target id")
1602
2261
  },
1603
2262
  async execute(args) {
1604
2263
  try {
1605
- const result = await deps.manager.perfMetrics(args.sessionId);
2264
+ const result = await deps.manager.perfMetrics(args.sessionId, args.targetId);
1606
2265
  return ok({ metrics: result.metrics });
1607
2266
  } catch (error) {
1608
2267
  return failure(serializeError(error).message, "perf_failed");
@@ -1612,18 +2271,19 @@ function createPerfTool(deps) {
1612
2271
  }
1613
2272
 
1614
2273
  // src/tools/screenshot.ts
1615
- import { tool as tool38 } from "@opencode-ai/plugin";
1616
- var z38 = tool38.schema;
2274
+ import { tool as tool42 } from "@opencode-ai/plugin";
2275
+ var z42 = tool42.schema;
1617
2276
  function createScreenshotTool(deps) {
1618
- return tool38({
2277
+ return tool42({
1619
2278
  description: "Capture a screenshot of the active page.",
1620
2279
  args: {
1621
- sessionId: z38.string().describe("Active browser session id"),
1622
- path: z38.string().optional().describe("Optional output file path")
2280
+ sessionId: z42.string().describe("Active browser session id"),
2281
+ targetId: z42.string().optional().describe("Optional target id"),
2282
+ path: z42.string().optional().describe("Optional output file path")
1623
2283
  },
1624
2284
  async execute(args) {
1625
2285
  try {
1626
- const result = await deps.manager.screenshot(args.sessionId, args.path);
2286
+ const result = await deps.manager.screenshot(args.sessionId, args.path, args.targetId);
1627
2287
  return ok(result);
1628
2288
  } catch (error) {
1629
2289
  return failure(serializeError(error).message, "screenshot_failed");
@@ -1633,27 +2293,29 @@ function createScreenshotTool(deps) {
1633
2293
  }
1634
2294
 
1635
2295
  // 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"]);
2296
+ import { tool as tool43 } from "@opencode-ai/plugin";
2297
+ var z43 = tool43.schema;
2298
+ var screenshotModeSchema = z43.enum(["visible", "full", "none"]);
2299
+ var transportSchema = z43.enum(["auto", "direct", "relay"]);
1640
2300
  function createAnnotateTool(deps) {
1641
- return tool39({
2301
+ return tool43({
1642
2302
  description: "Request interactive annotations via direct (CDP) or relay transport.",
1643
2303
  args: {
1644
- sessionId: z39.string().describe("Session id"),
2304
+ sessionId: z43.string().describe("Session id"),
2305
+ stored: z43.boolean().optional().describe("Fetch the latest payload explicitly sent from popup/canvas surfaces"),
2306
+ includeScreenshots: z43.boolean().optional().describe("When fetching stored payloads, prefer screenshots if still available in memory"),
1645
2307
  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"),
2308
+ targetId: z43.string().optional().describe("Optional target id for direct mode"),
2309
+ tabId: z43.number().int().optional().describe("Optional Chrome tab id for relay mode"),
2310
+ url: z43.string().optional().describe("Optional URL to open before annotating"),
1649
2311
  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")
2312
+ debug: z43.boolean().optional().describe("Include debug metadata"),
2313
+ context: z43.string().optional().describe("Optional context for the annotator"),
2314
+ timeoutMs: z43.number().int().optional().describe("Timeout in milliseconds")
1653
2315
  },
1654
2316
  async execute(args) {
1655
2317
  try {
1656
- const transport = args.transport ?? "auto";
2318
+ const transport = args.stored ? "relay" : args.transport ?? "auto";
1657
2319
  if (transport === "relay") {
1658
2320
  const status = await deps.manager.status(args.sessionId);
1659
2321
  if (status.mode !== "extension") {
@@ -1663,6 +2325,8 @@ function createAnnotateTool(deps) {
1663
2325
  const response = await deps.annotationManager.requestAnnotation({
1664
2326
  sessionId: args.sessionId,
1665
2327
  transport,
2328
+ stored: args.stored ?? false,
2329
+ includeScreenshots: args.includeScreenshots ?? true,
1666
2330
  targetId: args.targetId,
1667
2331
  tabId: args.tabId,
1668
2332
  url: args.url,
@@ -1671,6 +2335,12 @@ function createAnnotateTool(deps) {
1671
2335
  context: args.context,
1672
2336
  timeoutMs: args.timeoutMs
1673
2337
  });
2338
+ if (response.status === "cancelled") {
2339
+ return ok({
2340
+ cancelled: true,
2341
+ message: response.error?.message ?? "Annotation cancelled."
2342
+ });
2343
+ }
1674
2344
  if (response.status !== "ok" || !response.payload) {
1675
2345
  const message2 = response.error?.message ?? "Annotation failed.";
1676
2346
  const code = response.error?.code ?? "annotate_failed";
@@ -1689,10 +2359,221 @@ function createAnnotateTool(deps) {
1689
2359
  });
1690
2360
  }
1691
2361
 
2362
+ // src/tools/research_run.ts
2363
+ import { tool as tool44 } from "@opencode-ai/plugin";
2364
+
2365
+ // src/tools/workflow-runtime.ts
2366
+ var resolveProviderRuntime = async (deps) => {
2367
+ if (deps.providerRuntime) {
2368
+ return deps.providerRuntime;
2369
+ }
2370
+ const { createConfiguredProviderRuntime: createConfiguredProviderRuntime2 } = await import("./runtime-factory-BICHDPE7.js");
2371
+ return createConfiguredProviderRuntime2({
2372
+ config: deps.config?.get?.(),
2373
+ manager: deps.manager,
2374
+ browserFallbackPort: deps.browserFallbackPort
2375
+ });
2376
+ };
2377
+
2378
+ // src/tools/research_run.ts
2379
+ var z44 = tool44.schema;
2380
+ var sourceSelectionSchema = z44.enum(["auto", "web", "community", "social", "shopping", "all"]);
2381
+ var sourceSchema = z44.enum(["web", "community", "social", "shopping"]);
2382
+ var modeSchema = z44.enum(["compact", "json", "md", "context", "path"]);
2383
+ var cookiePolicySchema = z44.enum(["off", "auto", "required"]);
2384
+ function createResearchRunTool(deps) {
2385
+ return tool44({
2386
+ description: "Run cross-source research with strict timebox and artifact outputs.",
2387
+ args: {
2388
+ topic: z44.string().min(1).describe("Research topic"),
2389
+ days: z44.number().int().positive().optional().describe("Timebox in days"),
2390
+ from: z44.string().optional().describe("ISO start date"),
2391
+ to: z44.string().optional().describe("ISO end date"),
2392
+ sourceSelection: sourceSelectionSchema.optional().describe("auto|web|community|social|shopping|all"),
2393
+ sources: z44.array(sourceSchema).optional().describe("Explicit source list"),
2394
+ mode: modeSchema.optional().describe("compact|json|md|context|path"),
2395
+ includeEngagement: z44.boolean().optional().describe("Include engagement enrichment"),
2396
+ limitPerSource: z44.number().int().positive().optional().describe("Result limit per source"),
2397
+ outputDir: z44.string().optional().describe("Optional artifact output directory"),
2398
+ ttlHours: z44.number().int().positive().optional().describe("Artifact retention TTL in hours"),
2399
+ useCookies: z44.boolean().optional().describe("Enable/disable provider cookie injection for this run"),
2400
+ cookiePolicyOverride: cookiePolicySchema.optional().describe("Override cookie policy: off|auto|required")
2401
+ },
2402
+ async execute(args) {
2403
+ try {
2404
+ const runtime = await resolveProviderRuntime(deps);
2405
+ const { runResearchWorkflow } = await import("./providers-G3LRHQXX.js");
2406
+ const result = await runResearchWorkflow(runtime, {
2407
+ topic: args.topic,
2408
+ days: args.days,
2409
+ from: args.from,
2410
+ to: args.to,
2411
+ sourceSelection: args.sourceSelection,
2412
+ sources: args.sources,
2413
+ mode: args.mode ?? "compact",
2414
+ includeEngagement: args.includeEngagement,
2415
+ limitPerSource: args.limitPerSource,
2416
+ outputDir: args.outputDir,
2417
+ ttlHours: args.ttlHours,
2418
+ useCookies: args.useCookies,
2419
+ cookiePolicyOverride: args.cookiePolicyOverride
2420
+ });
2421
+ return ok(result);
2422
+ } catch (error) {
2423
+ return failure(serializeError(error).message, "research_run_failed");
2424
+ }
2425
+ }
2426
+ });
2427
+ }
2428
+
2429
+ // src/tools/shopping_run.ts
2430
+ import { tool as tool45 } from "@opencode-ai/plugin";
2431
+ var z45 = tool45.schema;
2432
+ var sortSchema = z45.enum(["best_deal", "lowest_price", "highest_rating", "fastest_shipping"]);
2433
+ var modeSchema2 = z45.enum(["compact", "json", "md", "context", "path"]);
2434
+ var cookiePolicySchema2 = z45.enum(["off", "auto", "required"]);
2435
+ function createShoppingRunTool(deps) {
2436
+ return tool45({
2437
+ description: "Run shopping/deal intelligence across shopping providers.",
2438
+ args: {
2439
+ query: z45.string().min(1).describe("Shopping query"),
2440
+ providers: z45.array(z45.string()).optional().describe("Optional provider allow-list"),
2441
+ budget: z45.number().positive().optional().describe("Optional budget amount"),
2442
+ region: z45.string().optional().describe("Region hint"),
2443
+ sort: sortSchema.optional().describe("best_deal|lowest_price|highest_rating|fastest_shipping"),
2444
+ mode: modeSchema2.optional().describe("compact|json|md|context|path"),
2445
+ outputDir: z45.string().optional().describe("Optional artifact output directory"),
2446
+ ttlHours: z45.number().int().positive().optional().describe("Artifact retention TTL in hours"),
2447
+ useCookies: z45.boolean().optional().describe("Enable/disable provider cookie injection for this run"),
2448
+ cookiePolicyOverride: cookiePolicySchema2.optional().describe("Override cookie policy: off|auto|required")
2449
+ },
2450
+ async execute(args) {
2451
+ try {
2452
+ const runtime = await resolveProviderRuntime(deps);
2453
+ const { runShoppingWorkflow } = await import("./providers-G3LRHQXX.js");
2454
+ const result = await runShoppingWorkflow(runtime, {
2455
+ query: args.query,
2456
+ providers: args.providers,
2457
+ budget: args.budget,
2458
+ region: args.region,
2459
+ sort: args.sort,
2460
+ mode: args.mode ?? "compact",
2461
+ outputDir: args.outputDir,
2462
+ ttlHours: args.ttlHours,
2463
+ useCookies: args.useCookies,
2464
+ cookiePolicyOverride: args.cookiePolicyOverride
2465
+ });
2466
+ return ok(result);
2467
+ } catch (error) {
2468
+ return failure(serializeError(error).message, "shopping_run_failed");
2469
+ }
2470
+ }
2471
+ });
2472
+ }
2473
+
2474
+ // src/tools/product_video_run.ts
2475
+ import { tool as tool46 } from "@opencode-ai/plugin";
2476
+ var z46 = tool46.schema;
2477
+ var cookiePolicySchema3 = z46.enum(["off", "auto", "required"]);
2478
+ async function captureScreenshotBuffer(deps, url) {
2479
+ let sessionId = null;
2480
+ try {
2481
+ const launched = await deps.manager.launch({
2482
+ headless: true,
2483
+ startUrl: url
2484
+ });
2485
+ sessionId = launched.sessionId;
2486
+ const screenshot = await deps.manager.screenshot(sessionId);
2487
+ if (typeof screenshot.base64 === "string" && screenshot.base64.length > 0) {
2488
+ return Buffer.from(screenshot.base64, "base64");
2489
+ }
2490
+ return null;
2491
+ } catch {
2492
+ return null;
2493
+ } finally {
2494
+ if (sessionId) {
2495
+ await deps.manager.disconnect(sessionId, true).catch(() => {
2496
+ });
2497
+ }
2498
+ }
2499
+ }
2500
+ function createProductVideoRunTool(deps) {
2501
+ return tool46({
2502
+ description: "Collect a product presentation asset pack for video/UGC workflows.",
2503
+ args: {
2504
+ product_url: z46.string().optional().describe("Product URL"),
2505
+ product_name: z46.string().optional().describe("Product name"),
2506
+ provider_hint: z46.string().optional().describe("Optional provider hint"),
2507
+ include_screenshots: z46.boolean().optional().describe("Include screenshots (default true)"),
2508
+ include_all_images: z46.boolean().optional().describe("Include all discovered images (default true)"),
2509
+ include_copy: z46.boolean().optional().describe("Include product copy extraction (default true)"),
2510
+ output_dir: z46.string().optional().describe("Optional output directory"),
2511
+ ttl_hours: z46.number().int().positive().optional().describe("Artifact retention TTL in hours"),
2512
+ useCookies: z46.boolean().optional().describe("Enable/disable provider cookie injection for this run"),
2513
+ cookiePolicyOverride: cookiePolicySchema3.optional().describe("Override cookie policy: off|auto|required")
2514
+ },
2515
+ async execute(args) {
2516
+ try {
2517
+ const runtime = await resolveProviderRuntime(deps);
2518
+ const { runProductVideoWorkflow } = await import("./providers-G3LRHQXX.js");
2519
+ const includeScreenshots = args.include_screenshots ?? true;
2520
+ const result = await runProductVideoWorkflow(runtime, {
2521
+ product_url: args.product_url,
2522
+ product_name: args.product_name,
2523
+ provider_hint: args.provider_hint,
2524
+ include_screenshots: includeScreenshots,
2525
+ include_all_images: args.include_all_images,
2526
+ include_copy: args.include_copy,
2527
+ output_dir: args.output_dir,
2528
+ ttl_hours: args.ttl_hours,
2529
+ useCookies: args.useCookies,
2530
+ cookiePolicyOverride: args.cookiePolicyOverride
2531
+ }, {
2532
+ captureScreenshot: includeScreenshots ? async (url) => captureScreenshotBuffer(deps, url) : void 0
2533
+ });
2534
+ return ok(result);
2535
+ } catch (error) {
2536
+ return failure(serializeError(error).message, "product_video_run_failed");
2537
+ }
2538
+ }
2539
+ });
2540
+ }
2541
+
2542
+ // src/tools/canvas.ts
2543
+ import { tool as tool47 } from "@opencode-ai/plugin";
2544
+ var z47 = tool47.schema;
2545
+ function createCanvasTool(deps) {
2546
+ return tool47({
2547
+ description: "Execute a typed design-canvas command such as canvas.session.open or canvas.document.patch.",
2548
+ args: {
2549
+ command: z47.string().min(1).describe("Canvas command name"),
2550
+ params: z47.record(z47.string(), z47.unknown()).optional().describe("Canvas command payload")
2551
+ },
2552
+ async execute(args) {
2553
+ if (!deps.canvasManager) {
2554
+ return failure("Canvas manager unavailable.", "canvas_unavailable");
2555
+ }
2556
+ try {
2557
+ if (!args.command.startsWith("canvas.")) {
2558
+ return failure("Canvas commands must start with 'canvas.'.", "canvas_invalid_command");
2559
+ }
2560
+ const result = await deps.canvasManager.execute(args.command, args.params ?? {});
2561
+ if (result && typeof result === "object" && !Array.isArray(result)) {
2562
+ return ok(result);
2563
+ }
2564
+ return ok({ result });
2565
+ } catch (error) {
2566
+ const serialized = serializeError(error);
2567
+ return failure(serialized.message, serialized.code ?? "canvas_failed", serialized.details);
2568
+ }
2569
+ }
2570
+ });
2571
+ }
2572
+
1692
2573
  // src/tools/skill_list.ts
1693
- import { tool as tool40 } from "@opencode-ai/plugin";
2574
+ import { tool as tool48 } from "@opencode-ai/plugin";
1694
2575
  function createSkillListTool(deps) {
1695
- return tool40({
2576
+ return tool48({
1696
2577
  description: "List available skills from OpenCode skill directories (compatibility wrapper)",
1697
2578
  args: {},
1698
2579
  async execute() {
@@ -1708,14 +2589,14 @@ function createSkillListTool(deps) {
1708
2589
  }
1709
2590
 
1710
2591
  // src/tools/skill_load.ts
1711
- import { tool as tool41 } from "@opencode-ai/plugin";
1712
- var z40 = tool41.schema;
2592
+ import { tool as tool49 } from "@opencode-ai/plugin";
2593
+ var z48 = tool49.schema;
1713
2594
  function createSkillLoadTool(deps) {
1714
- return tool41({
2595
+ return tool49({
1715
2596
  description: "Load a specific skill by name from OpenCode skill directories (compatibility wrapper)",
1716
2597
  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")
2598
+ name: z48.string().describe("Name of the skill to load (e.g., 'opendevbrowser-login-automation', 'opendevbrowser-form-testing')"),
2599
+ topic: z48.string().optional().describe("Optional topic to filter the skill content")
1719
2600
  },
1720
2601
  async execute(args) {
1721
2602
  try {
@@ -1779,6 +2660,14 @@ function createTools(deps) {
1779
2660
  opendevbrowser_prompting_guide: wrap(createPromptingGuideTool(deps)),
1780
2661
  opendevbrowser_console_poll: wrap(createConsolePollTool(deps)),
1781
2662
  opendevbrowser_network_poll: wrap(createNetworkPollTool(deps)),
2663
+ opendevbrowser_debug_trace_snapshot: wrap(createDebugTraceSnapshotTool(deps)),
2664
+ opendevbrowser_cookie_import: wrap(createCookieImportTool(deps)),
2665
+ opendevbrowser_cookie_list: wrap(createCookieListTool(deps)),
2666
+ opendevbrowser_macro_resolve: wrap(createMacroResolveTool(deps)),
2667
+ opendevbrowser_research_run: wrap(createResearchRunTool(deps)),
2668
+ opendevbrowser_shopping_run: wrap(createShoppingRunTool(deps)),
2669
+ opendevbrowser_product_video_run: wrap(createProductVideoRunTool(deps)),
2670
+ opendevbrowser_canvas: wrap(createCanvasTool(deps)),
1782
2671
  opendevbrowser_clone_page: wrap(createClonePageTool(deps)),
1783
2672
  opendevbrowser_clone_component: wrap(createCloneComponentTool(deps)),
1784
2673
  opendevbrowser_perf: wrap(createPerfTool(deps)),
@@ -1795,8 +2684,11 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
1795
2684
  const { config, configStore, skills, ensureRelay, cleanup, getExtensionPath } = core;
1796
2685
  let relay = core.relay;
1797
2686
  let manager = core.manager;
2687
+ let canvasManager = core.canvasManager;
1798
2688
  let runner = core.runner;
1799
2689
  let annotationManager = core.annotationManager;
2690
+ let providerRuntime = core.providerRuntime;
2691
+ let browserFallbackPort = core.browserFallbackPort;
1800
2692
  let hubStop = null;
1801
2693
  let daemonClient = null;
1802
2694
  const skillNudgeState = createSkillNudgeState();
@@ -1811,10 +2703,13 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
1811
2703
  }
1812
2704
  const toolDeps = {
1813
2705
  manager,
2706
+ canvasManager,
1814
2707
  annotationManager,
1815
2708
  runner,
1816
2709
  config: configStore,
1817
2710
  skills,
2711
+ providerRuntime,
2712
+ browserFallbackPort,
1818
2713
  relay,
1819
2714
  getExtensionPath
1820
2715
  };
@@ -1823,13 +2718,23 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
1823
2718
  daemonClient = new DaemonClient({ autoRenew: true });
1824
2719
  }
1825
2720
  manager = new RemoteManager(daemonClient);
2721
+ canvasManager = new RemoteCanvasManager(daemonClient);
1826
2722
  relay = new RemoteRelay(daemonClient);
1827
2723
  annotationManager.setRelay(relay);
1828
2724
  annotationManager.setBrowserManager(manager);
1829
2725
  runner = new ScriptRunner(manager);
2726
+ browserFallbackPort = createBrowserFallbackPort(manager);
2727
+ providerRuntime = createConfiguredProviderRuntime({
2728
+ config: configStore.get(),
2729
+ manager,
2730
+ browserFallbackPort
2731
+ });
1830
2732
  toolDeps.manager = manager;
2733
+ toolDeps.canvasManager = canvasManager;
1831
2734
  toolDeps.relay = relay;
1832
2735
  toolDeps.runner = runner;
2736
+ toolDeps.providerRuntime = providerRuntime;
2737
+ toolDeps.browserFallbackPort = browserFallbackPort;
1833
2738
  };
1834
2739
  const ensureHub = async () => {
1835
2740
  const currentConfig = configStore.get();