opendevbrowser 0.0.16 → 0.0.18

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 (616) hide show
  1. package/README.md +201 -79
  2. package/dist/annotate/agent-inbox-store.d.ts +58 -0
  3. package/dist/annotate/agent-inbox-store.d.ts.map +1 -0
  4. package/dist/annotate/agent-inbox.d.ts +25 -0
  5. package/dist/annotate/agent-inbox.d.ts.map +1 -0
  6. package/dist/annotate/direct-annotator.d.ts.map +1 -1
  7. package/dist/annotate/timeout-messages.d.ts +4 -0
  8. package/dist/annotate/timeout-messages.d.ts.map +1 -0
  9. package/dist/automation/coordinator.d.ts +55 -0
  10. package/dist/automation/coordinator.d.ts.map +1 -0
  11. package/dist/browser/annotation-manager.d.ts +7 -1
  12. package/dist/browser/annotation-manager.d.ts.map +1 -1
  13. package/dist/browser/browser-manager.d.ts +153 -48
  14. package/dist/browser/browser-manager.d.ts.map +1 -1
  15. package/dist/browser/canvas-client.d.ts +54 -0
  16. package/dist/browser/canvas-client.d.ts.map +1 -0
  17. package/dist/browser/canvas-code-sync-manager.d.ts +87 -0
  18. package/dist/browser/canvas-code-sync-manager.d.ts.map +1 -0
  19. package/dist/browser/canvas-manager.d.ts +122 -0
  20. package/dist/browser/canvas-manager.d.ts.map +1 -0
  21. package/dist/browser/canvas-runtime-preview-bridge.d.ts +20 -0
  22. package/dist/browser/canvas-runtime-preview-bridge.d.ts.map +1 -0
  23. package/dist/browser/canvas-session-sync-manager.d.ts +21 -0
  24. package/dist/browser/canvas-session-sync-manager.d.ts.map +1 -0
  25. package/dist/browser/global-challenge-coordinator.d.ts +27 -0
  26. package/dist/browser/global-challenge-coordinator.d.ts.map +1 -0
  27. package/dist/browser/manager-types.d.ts +179 -1
  28. package/dist/browser/manager-types.d.ts.map +1 -1
  29. package/dist/browser/ops-browser-manager.d.ts +114 -4
  30. package/dist/browser/ops-browser-manager.d.ts.map +1 -1
  31. package/dist/browser/ops-client.d.ts +17 -1
  32. package/dist/browser/ops-client.d.ts.map +1 -1
  33. package/dist/browser/playwright-runtime.d.ts +4 -0
  34. package/dist/browser/playwright-runtime.d.ts.map +1 -0
  35. package/dist/browser/review-surface.d.ts +9 -0
  36. package/dist/browser/review-surface.d.ts.map +1 -0
  37. package/dist/browser/screencast-recorder.d.ts +57 -0
  38. package/dist/browser/screencast-recorder.d.ts.map +1 -0
  39. package/dist/browser/session-inspector.d.ts +71 -0
  40. package/dist/browser/session-inspector.d.ts.map +1 -0
  41. package/dist/browser/session-store.d.ts +5 -1
  42. package/dist/browser/session-store.d.ts.map +1 -1
  43. package/dist/browser/system-chrome-cookies.d.ts +46 -0
  44. package/dist/browser/system-chrome-cookies.d.ts.map +1 -0
  45. package/dist/browser/target-manager.d.ts +1 -0
  46. package/dist/browser/target-manager.d.ts.map +1 -1
  47. package/dist/cache/chrome-locator.d.ts.map +1 -1
  48. package/dist/cache/chrome-user-data.d.ts +17 -0
  49. package/dist/cache/chrome-user-data.d.ts.map +1 -0
  50. package/dist/canvas/adapter-plugins/loader.d.ts +13 -0
  51. package/dist/canvas/adapter-plugins/loader.d.ts.map +1 -0
  52. package/dist/canvas/adapter-plugins/manifest.d.ts +146 -0
  53. package/dist/canvas/adapter-plugins/manifest.d.ts.map +1 -0
  54. package/dist/canvas/adapter-plugins/types.d.ts +83 -0
  55. package/dist/canvas/adapter-plugins/types.d.ts.map +1 -0
  56. package/dist/canvas/adapter-plugins/validator.d.ts +10 -0
  57. package/dist/canvas/adapter-plugins/validator.d.ts.map +1 -0
  58. package/dist/canvas/code-sync/apply-tsx.d.ts +25 -0
  59. package/dist/canvas/code-sync/apply-tsx.d.ts.map +1 -0
  60. package/dist/canvas/code-sync/graph.d.ts +5 -0
  61. package/dist/canvas/code-sync/graph.d.ts.map +1 -0
  62. package/dist/canvas/code-sync/hash.d.ts +3 -0
  63. package/dist/canvas/code-sync/hash.d.ts.map +1 -0
  64. package/dist/canvas/code-sync/import.d.ts +19 -0
  65. package/dist/canvas/code-sync/import.d.ts.map +1 -0
  66. package/dist/canvas/code-sync/manifest.d.ts +6 -0
  67. package/dist/canvas/code-sync/manifest.d.ts.map +1 -0
  68. package/dist/canvas/code-sync/tsx-adapter.d.ts +8 -0
  69. package/dist/canvas/code-sync/tsx-adapter.d.ts.map +1 -0
  70. package/dist/canvas/code-sync/types.d.ts +244 -0
  71. package/dist/canvas/code-sync/types.d.ts.map +1 -0
  72. package/dist/canvas/code-sync/write.d.ts +9 -0
  73. package/dist/canvas/code-sync/write.d.ts.map +1 -0
  74. package/dist/canvas/document-store.d.ts +91 -0
  75. package/dist/canvas/document-store.d.ts.map +1 -0
  76. package/dist/canvas/export.d.ts +12 -0
  77. package/dist/canvas/export.d.ts.map +1 -0
  78. package/dist/canvas/framework-adapters/custom-elements-v1.d.ts +3 -0
  79. package/dist/canvas/framework-adapters/custom-elements-v1.d.ts.map +1 -0
  80. package/dist/canvas/framework-adapters/html-static-v1.d.ts +3 -0
  81. package/dist/canvas/framework-adapters/html-static-v1.d.ts.map +1 -0
  82. package/dist/canvas/framework-adapters/markup.d.ts +9 -0
  83. package/dist/canvas/framework-adapters/markup.d.ts.map +1 -0
  84. package/dist/canvas/framework-adapters/react-tsx-v2.d.ts +3 -0
  85. package/dist/canvas/framework-adapters/react-tsx-v2.d.ts.map +1 -0
  86. package/dist/canvas/framework-adapters/registry.d.ts +12 -0
  87. package/dist/canvas/framework-adapters/registry.d.ts.map +1 -0
  88. package/dist/canvas/framework-adapters/svelte-sfc-v1.d.ts +3 -0
  89. package/dist/canvas/framework-adapters/svelte-sfc-v1.d.ts.map +1 -0
  90. package/dist/canvas/framework-adapters/types.d.ts +57 -0
  91. package/dist/canvas/framework-adapters/types.d.ts.map +1 -0
  92. package/dist/canvas/framework-adapters/vue-sfc-v1.d.ts +3 -0
  93. package/dist/canvas/framework-adapters/vue-sfc-v1.d.ts.map +1 -0
  94. package/dist/canvas/kits/catalog.d.ts +5 -0
  95. package/dist/canvas/kits/catalog.d.ts.map +1 -0
  96. package/dist/canvas/library-adapters/react/index.d.ts +3 -0
  97. package/dist/canvas/library-adapters/react/index.d.ts.map +1 -0
  98. package/dist/canvas/library-adapters/registry.d.ts +11 -0
  99. package/dist/canvas/library-adapters/registry.d.ts.map +1 -0
  100. package/dist/canvas/library-adapters/types.d.ts +43 -0
  101. package/dist/canvas/library-adapters/types.d.ts.map +1 -0
  102. package/dist/canvas/repo-store.d.ts +12 -0
  103. package/dist/canvas/repo-store.d.ts.map +1 -0
  104. package/dist/canvas/starters/catalog.d.ts +34 -0
  105. package/dist/canvas/starters/catalog.d.ts.map +1 -0
  106. package/dist/canvas/surface-palette.d.ts +15 -0
  107. package/dist/canvas/surface-palette.d.ts.map +1 -0
  108. package/dist/canvas/token-references.d.ts +22 -0
  109. package/dist/canvas/token-references.d.ts.map +1 -0
  110. package/dist/canvas/types.d.ts +594 -0
  111. package/dist/canvas/types.d.ts.map +1 -0
  112. package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js +7 -0
  113. package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js.map +1 -0
  114. package/dist/challenges/action-loop.d.ts +13 -0
  115. package/dist/challenges/action-loop.d.ts.map +1 -0
  116. package/dist/challenges/capability-matrix.d.ts +3 -0
  117. package/dist/challenges/capability-matrix.d.ts.map +1 -0
  118. package/dist/challenges/evidence-bundle.d.ts +48 -0
  119. package/dist/challenges/evidence-bundle.d.ts.map +1 -0
  120. package/dist/challenges/governed-adapter-gateway.d.ts +4 -0
  121. package/dist/challenges/governed-adapter-gateway.d.ts.map +1 -0
  122. package/dist/challenges/human-yield-gate.d.ts +20 -0
  123. package/dist/challenges/human-yield-gate.d.ts.map +1 -0
  124. package/dist/challenges/index.d.ts +15 -0
  125. package/dist/challenges/index.d.ts.map +1 -0
  126. package/dist/challenges/interpreter.d.ts +3 -0
  127. package/dist/challenges/interpreter.d.ts.map +1 -0
  128. package/dist/challenges/optional-computer-use-bridge.d.ts +9 -0
  129. package/dist/challenges/optional-computer-use-bridge.d.ts.map +1 -0
  130. package/dist/challenges/orchestrator.d.ts +32 -0
  131. package/dist/challenges/orchestrator.d.ts.map +1 -0
  132. package/dist/challenges/outcome-recorder.d.ts +8 -0
  133. package/dist/challenges/outcome-recorder.d.ts.map +1 -0
  134. package/dist/challenges/owned-environment-lane.d.ts +3 -0
  135. package/dist/challenges/owned-environment-lane.d.ts.map +1 -0
  136. package/dist/challenges/policy-gate.d.ts +9 -0
  137. package/dist/challenges/policy-gate.d.ts.map +1 -0
  138. package/dist/challenges/sanctioned-identity-lane.d.ts +3 -0
  139. package/dist/challenges/sanctioned-identity-lane.d.ts.map +1 -0
  140. package/dist/challenges/service-adapter-lane.d.ts +3 -0
  141. package/dist/challenges/service-adapter-lane.d.ts.map +1 -0
  142. package/dist/challenges/strategy-selector.d.ts +10 -0
  143. package/dist/challenges/strategy-selector.d.ts.map +1 -0
  144. package/dist/challenges/types.d.ts +277 -0
  145. package/dist/challenges/types.d.ts.map +1 -0
  146. package/dist/challenges/verification-gate.d.ts +15 -0
  147. package/dist/challenges/verification-gate.d.ts.map +1 -0
  148. package/dist/chunk-5FZQJRBQ.js +15256 -0
  149. package/dist/chunk-5FZQJRBQ.js.map +1 -0
  150. package/dist/{chunk-7W3SPXIB.js → chunk-FUSXMW3G.js} +4 -1
  151. package/dist/chunk-L57D35TB.js +33513 -0
  152. package/dist/chunk-L57D35TB.js.map +1 -0
  153. package/dist/chunk-TBUCZX4A.js +34 -0
  154. package/dist/chunk-TBUCZX4A.js.map +1 -0
  155. package/dist/chunk-Y2KL55OG.js +59 -0
  156. package/dist/chunk-Y2KL55OG.js.map +1 -0
  157. package/dist/chunk-YBQECXZX.js +409 -0
  158. package/dist/chunk-YBQECXZX.js.map +1 -0
  159. package/dist/cli/args.d.ts +4 -4
  160. package/dist/cli/args.d.ts.map +1 -1
  161. package/dist/cli/commands/annotate.d.ts +11 -0
  162. package/dist/cli/commands/annotate.d.ts.map +1 -1
  163. package/dist/cli/commands/artifacts.d.ts.map +1 -1
  164. package/dist/cli/commands/canvas.d.ts +45 -0
  165. package/dist/cli/commands/canvas.d.ts.map +1 -0
  166. package/dist/cli/commands/daemon.d.ts +7 -0
  167. package/dist/cli/commands/daemon.d.ts.map +1 -1
  168. package/dist/cli/commands/desktop/accessibility-snapshot.d.ts +3 -0
  169. package/dist/cli/commands/desktop/accessibility-snapshot.d.ts.map +1 -0
  170. package/dist/cli/commands/desktop/active-window.d.ts +3 -0
  171. package/dist/cli/commands/desktop/active-window.d.ts.map +1 -0
  172. package/dist/cli/commands/desktop/capture-desktop.d.ts +3 -0
  173. package/dist/cli/commands/desktop/capture-desktop.d.ts.map +1 -0
  174. package/dist/cli/commands/desktop/capture-window.d.ts +3 -0
  175. package/dist/cli/commands/desktop/capture-window.d.ts.map +1 -0
  176. package/dist/cli/commands/desktop/shared.d.ts +19 -0
  177. package/dist/cli/commands/desktop/shared.d.ts.map +1 -0
  178. package/dist/cli/commands/desktop/status.d.ts +3 -0
  179. package/dist/cli/commands/desktop/status.d.ts.map +1 -0
  180. package/dist/cli/commands/desktop/windows.d.ts +3 -0
  181. package/dist/cli/commands/desktop/windows.d.ts.map +1 -0
  182. package/dist/cli/commands/devtools/dialog.d.ts +19 -0
  183. package/dist/cli/commands/devtools/dialog.d.ts.map +1 -0
  184. package/dist/cli/commands/devtools/perf.d.ts.map +1 -1
  185. package/dist/cli/commands/devtools/screencast-start.d.ts +20 -0
  186. package/dist/cli/commands/devtools/screencast-start.d.ts.map +1 -0
  187. package/dist/cli/commands/devtools/screencast-stop.d.ts +17 -0
  188. package/dist/cli/commands/devtools/screencast-stop.d.ts.map +1 -0
  189. package/dist/cli/commands/devtools/screenshot.d.ts +3 -0
  190. package/dist/cli/commands/devtools/screenshot.d.ts.map +1 -1
  191. package/dist/cli/commands/dom/attr.d.ts.map +1 -1
  192. package/dist/cli/commands/dom/checked.d.ts.map +1 -1
  193. package/dist/cli/commands/dom/enabled.d.ts.map +1 -1
  194. package/dist/cli/commands/dom/html.d.ts.map +1 -1
  195. package/dist/cli/commands/dom/text.d.ts.map +1 -1
  196. package/dist/cli/commands/dom/value.d.ts.map +1 -1
  197. package/dist/cli/commands/dom/visible.d.ts.map +1 -1
  198. package/dist/cli/commands/export/clone-component.d.ts +9 -0
  199. package/dist/cli/commands/export/clone-component.d.ts.map +1 -1
  200. package/dist/cli/commands/export/clone-page.d.ts +8 -0
  201. package/dist/cli/commands/export/clone-page.d.ts.map +1 -1
  202. package/dist/cli/commands/interact/check.d.ts.map +1 -1
  203. package/dist/cli/commands/interact/click.d.ts.map +1 -1
  204. package/dist/cli/commands/interact/hover.d.ts.map +1 -1
  205. package/dist/cli/commands/interact/pointer-down.d.ts +7 -0
  206. package/dist/cli/commands/interact/pointer-down.d.ts.map +1 -0
  207. package/dist/cli/commands/interact/pointer-drag.d.ts +7 -0
  208. package/dist/cli/commands/interact/pointer-drag.d.ts.map +1 -0
  209. package/dist/cli/commands/interact/pointer-move.d.ts +7 -0
  210. package/dist/cli/commands/interact/pointer-move.d.ts.map +1 -0
  211. package/dist/cli/commands/interact/pointer-shared.d.ts +6 -0
  212. package/dist/cli/commands/interact/pointer-shared.d.ts.map +1 -0
  213. package/dist/cli/commands/interact/pointer-up.d.ts +7 -0
  214. package/dist/cli/commands/interact/pointer-up.d.ts.map +1 -0
  215. package/dist/cli/commands/interact/press.d.ts.map +1 -1
  216. package/dist/cli/commands/interact/scroll-into-view.d.ts.map +1 -1
  217. package/dist/cli/commands/interact/scroll.d.ts.map +1 -1
  218. package/dist/cli/commands/interact/select.d.ts.map +1 -1
  219. package/dist/cli/commands/interact/type.d.ts.map +1 -1
  220. package/dist/cli/commands/interact/uncheck.d.ts.map +1 -1
  221. package/dist/cli/commands/interact/upload.d.ts +18 -0
  222. package/dist/cli/commands/interact/upload.d.ts.map +1 -0
  223. package/dist/cli/commands/macro-resolve.d.ts +2 -0
  224. package/dist/cli/commands/macro-resolve.d.ts.map +1 -1
  225. package/dist/cli/commands/native.d.ts +22 -8
  226. package/dist/cli/commands/native.d.ts.map +1 -1
  227. package/dist/cli/commands/nav/goto.d.ts.map +1 -1
  228. package/dist/cli/commands/nav/review.d.ts +7 -0
  229. package/dist/cli/commands/nav/review.d.ts.map +1 -0
  230. package/dist/cli/commands/nav/snapshot.d.ts.map +1 -1
  231. package/dist/cli/commands/nav/wait.d.ts.map +1 -1
  232. package/dist/cli/commands/pages/open.d.ts.map +1 -1
  233. package/dist/cli/commands/product-video.d.ts +2 -0
  234. package/dist/cli/commands/product-video.d.ts.map +1 -1
  235. package/dist/cli/commands/research.d.ts +3 -0
  236. package/dist/cli/commands/research.d.ts.map +1 -1
  237. package/dist/cli/commands/run.d.ts +14 -0
  238. package/dist/cli/commands/run.d.ts.map +1 -1
  239. package/dist/cli/commands/serve.d.ts +1 -21
  240. package/dist/cli/commands/serve.d.ts.map +1 -1
  241. package/dist/cli/commands/session/connect.d.ts.map +1 -1
  242. package/dist/cli/commands/session/disconnect.d.ts.map +1 -1
  243. package/dist/cli/commands/session/inspector.d.ts +21 -0
  244. package/dist/cli/commands/session/inspector.d.ts.map +1 -0
  245. package/dist/cli/commands/session/launch.d.ts.map +1 -1
  246. package/dist/cli/commands/shopping.d.ts +5 -0
  247. package/dist/cli/commands/shopping.d.ts.map +1 -1
  248. package/dist/cli/commands/status.d.ts +2 -9
  249. package/dist/cli/commands/status.d.ts.map +1 -1
  250. package/dist/cli/commands/targets/new.d.ts.map +1 -1
  251. package/dist/cli/daemon-autostart.d.ts +11 -0
  252. package/dist/cli/daemon-autostart.d.ts.map +1 -1
  253. package/dist/cli/daemon-client.d.ts +3 -0
  254. package/dist/cli/daemon-client.d.ts.map +1 -1
  255. package/dist/cli/daemon-commands.d.ts.map +1 -1
  256. package/dist/cli/daemon-state.d.ts +16 -0
  257. package/dist/cli/daemon-state.d.ts.map +1 -1
  258. package/dist/cli/daemon-status.d.ts +7 -2
  259. package/dist/cli/daemon-status.d.ts.map +1 -1
  260. package/dist/cli/daemon.d.ts +1 -0
  261. package/dist/cli/daemon.d.ts.map +1 -1
  262. package/dist/cli/help.d.ts +19 -3
  263. package/dist/cli/help.d.ts.map +1 -1
  264. package/dist/cli/index.js +2927 -932
  265. package/dist/cli/index.js.map +1 -1
  266. package/dist/cli/install-autostart-output.d.ts +6 -0
  267. package/dist/cli/install-autostart-output.d.ts.map +1 -0
  268. package/dist/cli/install-autostart-reconciliation.d.ts +23 -0
  269. package/dist/cli/install-autostart-reconciliation.d.ts.map +1 -0
  270. package/dist/cli/installers/skills.d.ts +42 -6
  271. package/dist/cli/installers/skills.d.ts.map +1 -1
  272. package/dist/cli/output.d.ts +3 -0
  273. package/dist/cli/output.d.ts.map +1 -1
  274. package/dist/cli/remote-canvas-manager.d.ts +8 -0
  275. package/dist/cli/remote-canvas-manager.d.ts.map +1 -0
  276. package/dist/cli/remote-desktop-runtime.d.ts +15 -0
  277. package/dist/cli/remote-desktop-runtime.d.ts.map +1 -0
  278. package/dist/cli/remote-manager.d.ts +27 -3
  279. package/dist/cli/remote-manager.d.ts.map +1 -1
  280. package/dist/cli/remote-relay.d.ts +2 -0
  281. package/dist/cli/remote-relay.d.ts.map +1 -1
  282. package/dist/cli/transport-timeouts.d.ts +8 -0
  283. package/dist/cli/transport-timeouts.d.ts.map +1 -0
  284. package/dist/cli/utils/http.d.ts +9 -0
  285. package/dist/cli/utils/http.d.ts.map +1 -1
  286. package/dist/cli/utils/parse.d.ts +3 -0
  287. package/dist/cli/utils/parse.d.ts.map +1 -1
  288. package/dist/cli/utils/skills.d.ts +1 -2
  289. package/dist/cli/utils/skills.d.ts.map +1 -1
  290. package/dist/cli/utils/workflow-message.d.ts +2 -0
  291. package/dist/cli/utils/workflow-message.d.ts.map +1 -0
  292. package/dist/config.d.ts +47 -0
  293. package/dist/config.d.ts.map +1 -1
  294. package/dist/core/bootstrap.d.ts.map +1 -1
  295. package/dist/core/index.d.ts +1 -0
  296. package/dist/core/index.d.ts.map +1 -1
  297. package/dist/core/logging.d.ts +3 -1
  298. package/dist/core/logging.d.ts.map +1 -1
  299. package/dist/core/runtime-assemblies.d.ts +22 -0
  300. package/dist/core/runtime-assemblies.d.ts.map +1 -0
  301. package/dist/core/types.d.ts +17 -0
  302. package/dist/core/types.d.ts.map +1 -1
  303. package/dist/desktop/audit.d.ts +37 -0
  304. package/dist/desktop/audit.d.ts.map +1 -0
  305. package/dist/desktop/errors.d.ts +7 -0
  306. package/dist/desktop/errors.d.ts.map +1 -0
  307. package/dist/desktop/index.d.ts +6 -0
  308. package/dist/desktop/index.d.ts.map +1 -0
  309. package/dist/desktop/runtime.d.ts +26 -0
  310. package/dist/desktop/runtime.d.ts.map +1 -0
  311. package/dist/desktop/types.d.ts +76 -0
  312. package/dist/desktop/types.d.ts.map +1 -0
  313. package/dist/extension-extractor.d.ts +6 -0
  314. package/dist/extension-extractor.d.ts.map +1 -1
  315. package/dist/fs-UMRKOBNN.js +7 -0
  316. package/dist/fs-UMRKOBNN.js.map +1 -0
  317. package/dist/index.d.ts.map +1 -1
  318. package/dist/index.js +1221 -460
  319. package/dist/index.js.map +1 -1
  320. package/dist/integrations/figma/assets.d.ts +13 -0
  321. package/dist/integrations/figma/assets.d.ts.map +1 -0
  322. package/dist/integrations/figma/auth.d.ts +3 -0
  323. package/dist/integrations/figma/auth.d.ts.map +1 -0
  324. package/dist/integrations/figma/client.d.ts +42 -0
  325. package/dist/integrations/figma/client.d.ts.map +1 -0
  326. package/dist/integrations/figma/mappers.d.ts +23 -0
  327. package/dist/integrations/figma/mappers.d.ts.map +1 -0
  328. package/dist/integrations/figma/normalize.d.ts +99 -0
  329. package/dist/integrations/figma/normalize.d.ts.map +1 -0
  330. package/dist/integrations/figma/url.d.ts +17 -0
  331. package/dist/integrations/figma/url.d.ts.map +1 -0
  332. package/dist/integrations/figma/variables.d.ts +21 -0
  333. package/dist/integrations/figma/variables.d.ts.map +1 -0
  334. package/dist/macros/execute-runtime.d.ts +19 -0
  335. package/dist/macros/execute-runtime.d.ts.map +1 -0
  336. package/dist/macros/execute.d.ts +3 -1
  337. package/dist/macros/execute.d.ts.map +1 -1
  338. package/dist/{macros-NUBRM44Y.js → macros-ND2M7LWU.js} +2 -2
  339. package/dist/opendevbrowser.d.ts.map +1 -1
  340. package/dist/opendevbrowser.js +1221 -460
  341. package/dist/opendevbrowser.js.map +1 -1
  342. package/dist/providers/blocker.d.ts.map +1 -1
  343. package/dist/providers/browser-fallback.d.ts +30 -0
  344. package/dist/providers/browser-fallback.d.ts.map +1 -0
  345. package/dist/providers/constraint.d.ts +45 -0
  346. package/dist/providers/constraint.d.ts.map +1 -0
  347. package/dist/providers/index.d.ts +11 -2
  348. package/dist/providers/index.d.ts.map +1 -1
  349. package/dist/providers/policy.d.ts.map +1 -1
  350. package/dist/providers/product-video-compiler.d.ts +92 -0
  351. package/dist/providers/product-video-compiler.d.ts.map +1 -0
  352. package/dist/providers/registry.d.ts +37 -1
  353. package/dist/providers/registry.d.ts.map +1 -1
  354. package/dist/providers/renderer.d.ts.map +1 -1
  355. package/dist/providers/research-compiler.d.ts +64 -0
  356. package/dist/providers/research-compiler.d.ts.map +1 -0
  357. package/dist/providers/research-executor.d.ts +27 -0
  358. package/dist/providers/research-executor.d.ts.map +1 -0
  359. package/dist/providers/runtime-bundle.d.ts +26 -0
  360. package/dist/providers/runtime-bundle.d.ts.map +1 -0
  361. package/dist/providers/runtime-factory.d.ts +6 -1
  362. package/dist/providers/runtime-factory.d.ts.map +1 -1
  363. package/dist/providers/runtime-policy.d.ts +24 -0
  364. package/dist/providers/runtime-policy.d.ts.map +1 -0
  365. package/dist/providers/shared/anti-bot-policy.d.ts +3 -2
  366. package/dist/providers/shared/anti-bot-policy.d.ts.map +1 -1
  367. package/dist/providers/shopping/index.d.ts +11 -1
  368. package/dist/providers/shopping/index.d.ts.map +1 -1
  369. package/dist/providers/shopping-compiler.d.ts +51 -0
  370. package/dist/providers/shopping-compiler.d.ts.map +1 -0
  371. package/dist/providers/shopping-executor.d.ts +18 -0
  372. package/dist/providers/shopping-executor.d.ts.map +1 -0
  373. package/dist/providers/shopping-postprocess.d.ts +46 -0
  374. package/dist/providers/shopping-postprocess.d.ts.map +1 -0
  375. package/dist/providers/shopping-workflow.d.ts +33 -0
  376. package/dist/providers/shopping-workflow.d.ts.map +1 -0
  377. package/dist/providers/social/platform.d.ts +2 -1
  378. package/dist/providers/social/platform.d.ts.map +1 -1
  379. package/dist/providers/social/search-quality.d.ts +16 -0
  380. package/dist/providers/social/search-quality.d.ts.map +1 -0
  381. package/dist/providers/social/youtube-resolver.d.ts +2 -1
  382. package/dist/providers/social/youtube-resolver.d.ts.map +1 -1
  383. package/dist/providers/social/youtube.d.ts.map +1 -1
  384. package/dist/providers/types.d.ts +116 -4
  385. package/dist/providers/types.d.ts.map +1 -1
  386. package/dist/providers/web/crawl-worker.d.ts.map +1 -1
  387. package/dist/providers/web/extract.d.ts +16 -0
  388. package/dist/providers/web/extract.d.ts.map +1 -1
  389. package/dist/providers/web/index.d.ts.map +1 -1
  390. package/dist/providers/workflow-contracts.d.ts +53 -0
  391. package/dist/providers/workflow-contracts.d.ts.map +1 -0
  392. package/dist/providers/workflows.d.ts +30 -6
  393. package/dist/providers/workflows.d.ts.map +1 -1
  394. package/dist/providers-G36AM3Z2.js +121 -0
  395. package/dist/providers-G36AM3Z2.js.map +1 -0
  396. package/dist/public-surface/generated-manifest.d.ts +1168 -0
  397. package/dist/public-surface/generated-manifest.d.ts.map +1 -0
  398. package/dist/public-surface/source.d.ts +437 -0
  399. package/dist/public-surface/source.d.ts.map +1 -0
  400. package/dist/relay/protocol.d.ts +108 -4
  401. package/dist/relay/protocol.d.ts.map +1 -1
  402. package/dist/relay/relay-endpoints.d.ts +21 -0
  403. package/dist/relay/relay-endpoints.d.ts.map +1 -1
  404. package/dist/relay/relay-server.d.ts +32 -1
  405. package/dist/relay/relay-server.d.ts.map +1 -1
  406. package/dist/relay/relay-types.d.ts +3 -0
  407. package/dist/relay/relay-types.d.ts.map +1 -1
  408. package/dist/skills/bundled-skill-directories.d.ts +8 -0
  409. package/dist/skills/bundled-skill-directories.d.ts.map +1 -0
  410. package/dist/skills/skill-loader.d.ts +9 -1
  411. package/dist/skills/skill-loader.d.ts.map +1 -1
  412. package/dist/skills/skill-loader.js +7 -0
  413. package/dist/skills/skill-loader.js.map +1 -0
  414. package/dist/skills/skill-nudge.d.ts.map +1 -1
  415. package/dist/skills/types.d.ts +31 -0
  416. package/dist/skills/types.d.ts.map +1 -1
  417. package/dist/snapshot/ops-snapshot.d.ts +1 -1
  418. package/dist/snapshot/ops-snapshot.d.ts.map +1 -1
  419. package/dist/snapshot/refs.d.ts +6 -1
  420. package/dist/snapshot/refs.d.ts.map +1 -1
  421. package/dist/snapshot/snapshotter.d.ts.map +1 -1
  422. package/dist/tools/annotate.d.ts.map +1 -1
  423. package/dist/tools/canvas.d.ts +4 -0
  424. package/dist/tools/canvas.d.ts.map +1 -0
  425. package/dist/tools/check.d.ts.map +1 -1
  426. package/dist/tools/click.d.ts.map +1 -1
  427. package/dist/tools/clone_component.d.ts.map +1 -1
  428. package/dist/tools/clone_page.d.ts.map +1 -1
  429. package/dist/tools/connect.d.ts.map +1 -1
  430. package/dist/tools/deps.d.ts +6 -0
  431. package/dist/tools/deps.d.ts.map +1 -1
  432. package/dist/tools/desktop-shared.d.ts +6 -0
  433. package/dist/tools/desktop-shared.d.ts.map +1 -0
  434. package/dist/tools/desktop_accessibility_snapshot.d.ts +4 -0
  435. package/dist/tools/desktop_accessibility_snapshot.d.ts.map +1 -0
  436. package/dist/tools/desktop_active_window.d.ts +4 -0
  437. package/dist/tools/desktop_active_window.d.ts.map +1 -0
  438. package/dist/tools/desktop_capture_desktop.d.ts +4 -0
  439. package/dist/tools/desktop_capture_desktop.d.ts.map +1 -0
  440. package/dist/tools/desktop_capture_window.d.ts +4 -0
  441. package/dist/tools/desktop_capture_window.d.ts.map +1 -0
  442. package/dist/tools/desktop_status.d.ts +4 -0
  443. package/dist/tools/desktop_status.d.ts.map +1 -0
  444. package/dist/tools/desktop_windows.d.ts +4 -0
  445. package/dist/tools/desktop_windows.d.ts.map +1 -0
  446. package/dist/tools/dialog.d.ts +4 -0
  447. package/dist/tools/dialog.d.ts.map +1 -0
  448. package/dist/tools/dom_get_html.d.ts.map +1 -1
  449. package/dist/tools/dom_get_text.d.ts.map +1 -1
  450. package/dist/tools/get_attr.d.ts.map +1 -1
  451. package/dist/tools/get_value.d.ts.map +1 -1
  452. package/dist/tools/goto.d.ts.map +1 -1
  453. package/dist/tools/hover.d.ts.map +1 -1
  454. package/dist/tools/index.d.ts +3 -0
  455. package/dist/tools/index.d.ts.map +1 -1
  456. package/dist/tools/is_checked.d.ts.map +1 -1
  457. package/dist/tools/is_enabled.d.ts.map +1 -1
  458. package/dist/tools/is_visible.d.ts.map +1 -1
  459. package/dist/tools/launch.d.ts.map +1 -1
  460. package/dist/tools/macro_resolve.d.ts.map +1 -1
  461. package/dist/tools/perf.d.ts.map +1 -1
  462. package/dist/tools/pointer_down.d.ts +4 -0
  463. package/dist/tools/pointer_down.d.ts.map +1 -0
  464. package/dist/tools/pointer_drag.d.ts +4 -0
  465. package/dist/tools/pointer_drag.d.ts.map +1 -0
  466. package/dist/tools/pointer_move.d.ts +4 -0
  467. package/dist/tools/pointer_move.d.ts.map +1 -0
  468. package/dist/tools/pointer_up.d.ts +4 -0
  469. package/dist/tools/pointer_up.d.ts.map +1 -0
  470. package/dist/tools/press.d.ts.map +1 -1
  471. package/dist/tools/product_video_run.d.ts.map +1 -1
  472. package/dist/tools/prompting_guide.d.ts.map +1 -1
  473. package/dist/tools/research_run.d.ts.map +1 -1
  474. package/dist/tools/response.d.ts +4 -1
  475. package/dist/tools/response.d.ts.map +1 -1
  476. package/dist/tools/review.d.ts +4 -0
  477. package/dist/tools/review.d.ts.map +1 -0
  478. package/dist/tools/screencast_start.d.ts +4 -0
  479. package/dist/tools/screencast_start.d.ts.map +1 -0
  480. package/dist/tools/screencast_stop.d.ts +4 -0
  481. package/dist/tools/screencast_stop.d.ts.map +1 -0
  482. package/dist/tools/screenshot.d.ts.map +1 -1
  483. package/dist/tools/scroll.d.ts.map +1 -1
  484. package/dist/tools/scroll_into_view.d.ts.map +1 -1
  485. package/dist/tools/select.d.ts.map +1 -1
  486. package/dist/tools/session_inspector.d.ts +4 -0
  487. package/dist/tools/session_inspector.d.ts.map +1 -0
  488. package/dist/tools/shopping_run.d.ts.map +1 -1
  489. package/dist/tools/skill_list.d.ts.map +1 -1
  490. package/dist/tools/skill_load.d.ts.map +1 -1
  491. package/dist/tools/snapshot.d.ts.map +1 -1
  492. package/dist/tools/type.d.ts.map +1 -1
  493. package/dist/tools/uncheck.d.ts.map +1 -1
  494. package/dist/tools/upload.d.ts +4 -0
  495. package/dist/tools/upload.d.ts.map +1 -0
  496. package/dist/tools/wait.d.ts.map +1 -1
  497. package/dist/tools/workflow-runtime.d.ts +4 -2
  498. package/dist/tools/workflow-runtime.d.ts.map +1 -1
  499. package/dist/utils/package-assets.d.ts +4 -0
  500. package/dist/utils/package-assets.d.ts.map +1 -0
  501. package/extension/canvas.html +1006 -0
  502. package/extension/dist/annotate-content.css +15 -6
  503. package/extension/dist/annotate-content.js +175 -35
  504. package/extension/dist/annotation-payload.js +199 -0
  505. package/extension/dist/background.js +544 -69
  506. package/extension/dist/canvas/canvas-runtime.js +1490 -0
  507. package/extension/dist/canvas/model.js +341 -0
  508. package/extension/dist/canvas/viewport-fit.js +67 -0
  509. package/extension/dist/canvas-page.js +3609 -0
  510. package/extension/dist/ops/dom-bridge.js +255 -3
  511. package/extension/dist/ops/ops-runtime.js +3324 -301
  512. package/extension/dist/ops/ops-session-store.js +97 -112
  513. package/extension/dist/ops/snapshot-builder.js +2 -2
  514. package/extension/dist/ops/snapshot-shared.js +2 -2
  515. package/extension/dist/ops/target-session-coordinator.js +159 -0
  516. package/extension/dist/popup.js +201 -42
  517. package/extension/dist/services/CDPRouter.js +1567 -63
  518. package/extension/dist/services/ConnectionManager.js +453 -78
  519. package/extension/dist/services/RelayClient.js +79 -30
  520. package/extension/dist/services/TabManager.js +118 -22
  521. package/extension/dist/services/TargetSessionMap.js +127 -3
  522. package/extension/dist/services/attach-errors.js +20 -0
  523. package/extension/dist/services/cdp-router-commands.js +135 -8
  524. package/extension/dist/services/url-restrictions.js +9 -13
  525. package/extension/dist/types.js +2 -0
  526. package/extension/manifest.json +2 -2
  527. package/extension/popup.html +59 -6
  528. package/package.json +19 -9
  529. package/skills/AGENTS.md +8 -4
  530. package/skills/opendevbrowser-best-practices/SKILL.md +183 -6
  531. package/skills/opendevbrowser-best-practices/artifacts/browser-agent-known-issues-matrix.md +1 -0
  532. package/skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md +141 -0
  533. package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +129 -19
  534. package/skills/opendevbrowser-best-practices/artifacts/parity-gates.md +9 -2
  535. package/skills/opendevbrowser-best-practices/artifacts/provider-workflows.md +6 -0
  536. package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +58 -0
  537. package/skills/opendevbrowser-best-practices/assets/templates/canvas-blocker-checklist.json +70 -0
  538. package/skills/opendevbrowser-best-practices/assets/templates/canvas-feedback-eval.json +73 -0
  539. package/skills/opendevbrowser-best-practices/assets/templates/canvas-generation-plan.v1.json +67 -0
  540. package/skills/opendevbrowser-best-practices/assets/templates/canvas-handshake-example.json +126 -0
  541. package/skills/opendevbrowser-best-practices/assets/templates/robustness-checklist.json +57 -0
  542. package/skills/opendevbrowser-best-practices/assets/templates/skill-runtime-pack-matrix.json +674 -0
  543. package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +12 -3
  544. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +107 -12
  545. package/skills/opendevbrowser-best-practices/scripts/resolve-odb-cli.sh +100 -0
  546. package/skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh +83 -1
  547. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +365 -84
  548. package/skills/opendevbrowser-best-practices/scripts/validator-fixture-cli.sh +208 -0
  549. package/skills/opendevbrowser-continuity-ledger/SKILL.md +14 -1
  550. package/skills/opendevbrowser-continuity-ledger/scripts/validate-skill-assets.sh +61 -0
  551. package/skills/opendevbrowser-data-extraction/SKILL.md +6 -0
  552. package/skills/opendevbrowser-data-extraction/scripts/validate-skill-assets.sh +112 -0
  553. package/skills/opendevbrowser-design-agent/SKILL.md +275 -0
  554. package/skills/opendevbrowser-design-agent/artifacts/app-shell-and-state-wiring.md +84 -0
  555. package/skills/opendevbrowser-design-agent/artifacts/async-search-state-ownership.md +58 -0
  556. package/skills/opendevbrowser-design-agent/artifacts/component-pattern-index.md +130 -0
  557. package/skills/opendevbrowser-design-agent/artifacts/design-contract-playbook.md +157 -0
  558. package/skills/opendevbrowser-design-agent/artifacts/design-release-gate.md +40 -0
  559. package/skills/opendevbrowser-design-agent/artifacts/design-workflows.md +153 -0
  560. package/skills/opendevbrowser-design-agent/artifacts/existing-surface-adaptation.md +56 -0
  561. package/skills/opendevbrowser-design-agent/artifacts/external-pattern-synthesis.md +103 -0
  562. package/skills/opendevbrowser-design-agent/artifacts/frontend-evaluation-rubric.md +61 -0
  563. package/skills/opendevbrowser-design-agent/artifacts/implementation-anti-patterns.md +163 -0
  564. package/skills/opendevbrowser-design-agent/artifacts/isolated-preview-validation.md +68 -0
  565. package/skills/opendevbrowser-design-agent/artifacts/loading-and-feedback-surfaces.md +56 -0
  566. package/skills/opendevbrowser-design-agent/artifacts/opendevbrowser-ui-example-map.md +44 -0
  567. package/skills/opendevbrowser-design-agent/artifacts/performance-audit-playbook.md +70 -0
  568. package/skills/opendevbrowser-design-agent/artifacts/research-harvest-workflow.md +81 -0
  569. package/skills/opendevbrowser-design-agent/artifacts/scroll-reveal-surface-planning.md +64 -0
  570. package/skills/opendevbrowser-design-agent/artifacts/state-ownership-matrix.md +36 -0
  571. package/skills/opendevbrowser-design-agent/artifacts/theming-and-token-ownership.md +43 -0
  572. package/skills/opendevbrowser-design-agent/assets/templates/canvas-generation-plan.design.v1.json +58 -0
  573. package/skills/opendevbrowser-design-agent/assets/templates/design-audit-report.v1.md +34 -0
  574. package/skills/opendevbrowser-design-agent/assets/templates/design-brief.v1.md +40 -0
  575. package/skills/opendevbrowser-design-agent/assets/templates/design-contract.v1.json +226 -0
  576. package/skills/opendevbrowser-design-agent/assets/templates/design-release-gate.v1.json +35 -0
  577. package/skills/opendevbrowser-design-agent/assets/templates/design-review-checklist.json +57 -0
  578. package/skills/opendevbrowser-design-agent/assets/templates/real-surface-design-matrix.json +32 -0
  579. package/skills/opendevbrowser-design-agent/assets/templates/reference-pattern-board.v1.json +31 -0
  580. package/skills/opendevbrowser-design-agent/scripts/design-workflow.sh +171 -0
  581. package/skills/opendevbrowser-design-agent/scripts/extract-canvas-plan.sh +56 -0
  582. package/skills/opendevbrowser-design-agent/scripts/validate-skill-assets.sh +223 -0
  583. package/skills/opendevbrowser-form-testing/SKILL.md +19 -3
  584. package/skills/opendevbrowser-form-testing/artifacts/form-workflows.md +5 -4
  585. package/skills/opendevbrowser-form-testing/assets/templates/challenge-decision-tree.json +2 -0
  586. package/skills/opendevbrowser-form-testing/scripts/validate-skill-assets.sh +109 -0
  587. package/skills/opendevbrowser-login-automation/SKILL.md +21 -3
  588. package/skills/opendevbrowser-login-automation/artifacts/login-workflows.md +5 -4
  589. package/skills/opendevbrowser-login-automation/assets/templates/auth-signals.json +5 -0
  590. package/skills/opendevbrowser-login-automation/assets/templates/login-scenario-matrix.json +3 -2
  591. package/skills/opendevbrowser-login-automation/scripts/run-login-workflow.sh +17 -1
  592. package/skills/opendevbrowser-login-automation/scripts/validate-skill-assets.sh +133 -0
  593. package/skills/opendevbrowser-product-presentation-asset/SKILL.md +23 -11
  594. package/skills/opendevbrowser-product-presentation-asset/artifacts/asset-pack-assembly.md +5 -3
  595. package/skills/opendevbrowser-product-presentation-asset/assets/templates/shot-list.md +2 -0
  596. package/skills/opendevbrowser-product-presentation-asset/assets/templates/video-assembly.md +3 -2
  597. package/skills/opendevbrowser-product-presentation-asset/scripts/capture-screenshots.sh +5 -1
  598. package/skills/opendevbrowser-product-presentation-asset/scripts/collect-product.sh +6 -2
  599. package/skills/opendevbrowser-product-presentation-asset/scripts/download-images.sh +5 -1
  600. package/skills/opendevbrowser-product-presentation-asset/scripts/render-video-brief.sh +20 -7
  601. package/skills/opendevbrowser-product-presentation-asset/scripts/validate-skill-assets.sh +39 -0
  602. package/skills/opendevbrowser-product-presentation-asset/scripts/write-manifest.sh +5 -1
  603. package/skills/opendevbrowser-research/SKILL.md +14 -6
  604. package/skills/opendevbrowser-research/scripts/render-output.sh +5 -1
  605. package/skills/opendevbrowser-research/scripts/run-research.sh +5 -1
  606. package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +45 -0
  607. package/skills/opendevbrowser-research/scripts/write-artifacts.sh +5 -1
  608. package/skills/opendevbrowser-shopping/SKILL.md +20 -1
  609. package/skills/opendevbrowser-shopping/scripts/normalize-offers.sh +6 -2
  610. package/skills/opendevbrowser-shopping/scripts/run-deal-hunt.sh +5 -1
  611. package/skills/opendevbrowser-shopping/scripts/run-shopping.sh +5 -1
  612. package/skills/opendevbrowser-shopping/scripts/validate-skill-assets.sh +54 -0
  613. package/dist/chunk-ST7CO5FA.js +0 -18668
  614. package/dist/chunk-ST7CO5FA.js.map +0 -1
  615. /package/dist/{chunk-7W3SPXIB.js.map → chunk-FUSXMW3G.js.map} +0 -0
  616. /package/dist/{macros-NUBRM44Y.js.map → macros-ND2M7LWU.js.map} +0 -0
@@ -1,34 +1,35 @@
1
1
  import {
2
+ AGENT_INBOX_SYSTEM_MARKER,
2
3
  DaemonClient,
3
4
  ScriptRunner,
4
5
  buildAnnotateResult,
5
- buildBlockerArtifacts,
6
- classifyBlockerSignal,
7
- createBrowserFallbackPort,
8
- createConfiguredProviderRuntime,
6
+ buildBrowserReviewResult,
7
+ buildLoopbackSessionRelayEndpoint,
8
+ classifySessionRelayEndpoint,
9
+ createAutomationCoordinator,
10
+ createCoreRuntimeAssemblies,
9
11
  createOpenDevBrowserCore,
10
- createRequestId,
11
- executeMacroResolution,
12
+ executeMacroWithRuntime,
12
13
  extractExtension,
13
14
  fetchDaemonStatusFromMetadata,
14
- runProductVideoWorkflow,
15
- runResearchWorkflow,
16
- runShoppingWorkflow,
17
- shapeExecutionPayload,
15
+ inspectSession,
16
+ onboarding_metadata_default,
17
+ resolveBundledProviderRuntime,
18
+ resolveSessionRelayRoute,
18
19
  startDaemon
19
- } from "./chunk-ST7CO5FA.js";
20
- import "./chunk-7W3SPXIB.js";
20
+ } from "./chunk-L57D35TB.js";
21
+ import "./chunk-YBQECXZX.js";
22
+ import "./chunk-Y2KL55OG.js";
23
+ import "./chunk-TBUCZX4A.js";
24
+ import {
25
+ CHALLENGE_AUTOMATION_MODES,
26
+ buildBlockerArtifacts,
27
+ classifyBlockerSignal,
28
+ createRequestId
29
+ } from "./chunk-5FZQJRBQ.js";
30
+ import "./chunk-FUSXMW3G.js";
21
31
 
22
32
  // src/cli/remote-manager.ts
23
- function isLegacyRelayEndpoint(wsEndpoint) {
24
- try {
25
- const url = new URL(wsEndpoint);
26
- const path = url.pathname.endsWith("/") ? url.pathname.slice(0, -1) : url.pathname;
27
- return path === "/cdp";
28
- } catch {
29
- return false;
30
- }
31
- }
32
33
  var RemoteManager = class {
33
34
  client;
34
35
  constructor(client) {
@@ -40,10 +41,16 @@ var RemoteManager = class {
40
41
  connect(options) {
41
42
  return this.client.call("session.connect", options);
42
43
  }
43
- connectRelay(wsEndpoint) {
44
+ connectRelay(wsEndpoint, options) {
45
+ const startUrl = typeof options?.startUrl === "string" && options.startUrl.trim().length > 0 ? options.startUrl.trim() : void 0;
46
+ const parsedRelayEndpoint = classifySessionRelayEndpoint(wsEndpoint);
44
47
  return this.client.call(
45
48
  "session.connect",
46
- isLegacyRelayEndpoint(wsEndpoint) ? { wsEndpoint, extensionLegacy: true } : { wsEndpoint }
49
+ {
50
+ wsEndpoint,
51
+ ...parsedRelayEndpoint?.inputPath === "/cdp" ? { extensionLegacy: true } : {},
52
+ ...startUrl ? { startUrl } : {}
53
+ }
47
54
  );
48
55
  }
49
56
  disconnect(sessionId, closeBrowser = false) {
@@ -242,11 +249,44 @@ var RemoteManager = class {
242
249
  ...typeof targetId === "string" ? { targetId } : {}
243
250
  });
244
251
  }
245
- screenshot(sessionId, path, targetId) {
252
+ screenshot(sessionId, options = {}) {
246
253
  return this.client.call("page.screenshot", {
247
254
  sessionId,
248
- path,
249
- ...typeof targetId === "string" ? { targetId } : {}
255
+ ...typeof options.path === "string" ? { path: options.path } : {},
256
+ ...typeof options.targetId === "string" ? { targetId: options.targetId } : {},
257
+ ...typeof options.ref === "string" ? { ref: options.ref } : {},
258
+ ...options.fullPage === true ? { fullPage: true } : {}
259
+ });
260
+ }
261
+ startScreencast(sessionId, options = {}) {
262
+ return this.client.call("page.screencast.start", {
263
+ sessionId,
264
+ ...typeof options.targetId === "string" ? { targetId: options.targetId } : {},
265
+ ...typeof options.outputDir === "string" ? { outputDir: options.outputDir } : {},
266
+ ...typeof options.intervalMs === "number" ? { intervalMs: options.intervalMs } : {},
267
+ ...typeof options.maxFrames === "number" ? { maxFrames: options.maxFrames } : {}
268
+ });
269
+ }
270
+ stopScreencast(sessionId, screencastId) {
271
+ return this.client.call("page.screencast.stop", {
272
+ sessionId,
273
+ screencastId
274
+ });
275
+ }
276
+ upload(sessionId, input) {
277
+ return this.client.call("interact.upload", {
278
+ sessionId,
279
+ ref: input.ref,
280
+ files: input.files,
281
+ ...typeof input.targetId === "string" ? { targetId: input.targetId } : {}
282
+ });
283
+ }
284
+ dialog(sessionId, input = {}) {
285
+ return this.client.call("page.dialog", {
286
+ sessionId,
287
+ action: input.action ?? "status",
288
+ ...typeof input.promptText === "string" ? { promptText: input.promptText } : {},
289
+ ...typeof input.targetId === "string" ? { targetId: input.targetId } : {}
250
290
  });
251
291
  }
252
292
  consolePoll(sessionId, sinceSeq, max = 50) {
@@ -255,6 +295,59 @@ var RemoteManager = class {
255
295
  networkPoll(sessionId, sinceSeq, max = 50) {
256
296
  return this.client.call("devtools.networkPoll", { sessionId, sinceSeq, max });
257
297
  }
298
+ debugTraceSnapshot(sessionId, options = {}) {
299
+ return this.client.call("devtools.debugTraceSnapshot", {
300
+ sessionId,
301
+ ...options
302
+ });
303
+ }
304
+ createSessionInspector() {
305
+ return {
306
+ status: (sessionId) => this.status(sessionId),
307
+ listTargets: (sessionId, includeUrls) => this.listTargets(sessionId, includeUrls),
308
+ consolePoll: (sessionId, sinceSeq, max) => this.consolePoll(sessionId, sinceSeq, max),
309
+ networkPoll: (sessionId, sinceSeq, max) => this.networkPoll(sessionId, sinceSeq, max),
310
+ debugTraceSnapshot: (sessionId, options) => this.debugTraceSnapshot(sessionId, options)
311
+ };
312
+ }
313
+ pointerMove(sessionId, x, y, targetId, steps) {
314
+ return this.client.call("pointer.move", {
315
+ sessionId,
316
+ x,
317
+ y,
318
+ ...typeof steps === "number" ? { steps } : {},
319
+ ...typeof targetId === "string" ? { targetId } : {}
320
+ });
321
+ }
322
+ pointerDown(sessionId, x, y, targetId, button = "left", clickCount = 1) {
323
+ return this.client.call("pointer.down", {
324
+ sessionId,
325
+ x,
326
+ y,
327
+ button,
328
+ clickCount,
329
+ ...typeof targetId === "string" ? { targetId } : {}
330
+ });
331
+ }
332
+ pointerUp(sessionId, x, y, targetId, button = "left", clickCount = 1) {
333
+ return this.client.call("pointer.up", {
334
+ sessionId,
335
+ x,
336
+ y,
337
+ button,
338
+ clickCount,
339
+ ...typeof targetId === "string" ? { targetId } : {}
340
+ });
341
+ }
342
+ drag(sessionId, from, to, targetId, steps) {
343
+ return this.client.call("pointer.drag", {
344
+ sessionId,
345
+ from,
346
+ to,
347
+ ...typeof steps === "number" ? { steps } : {},
348
+ ...typeof targetId === "string" ? { targetId } : {}
349
+ });
350
+ }
258
351
  listTargets(sessionId, includeUrls = false) {
259
352
  return this.client.call("targets.list", { sessionId, includeUrls });
260
353
  }
@@ -281,6 +374,53 @@ var RemoteManager = class {
281
374
  }
282
375
  };
283
376
 
377
+ // src/cli/remote-canvas-manager.ts
378
+ var RemoteCanvasManager = class {
379
+ client;
380
+ constructor(client) {
381
+ this.client = client;
382
+ }
383
+ execute(command, params = {}) {
384
+ return this.client.call("canvas.execute", { command, params });
385
+ }
386
+ };
387
+
388
+ // src/cli/remote-desktop-runtime.ts
389
+ var RemoteDesktopRuntime = class {
390
+ client;
391
+ constructor(client) {
392
+ this.client = client;
393
+ }
394
+ status() {
395
+ return this.client.call("desktop.status");
396
+ }
397
+ listWindows(reason) {
398
+ return this.client.call("desktop.windows.list", {
399
+ ...reason ? { reason } : {}
400
+ });
401
+ }
402
+ activeWindow(reason) {
403
+ return this.client.call("desktop.window.active", {
404
+ ...reason ? { reason } : {}
405
+ });
406
+ }
407
+ captureDesktop(input) {
408
+ return this.client.call("desktop.capture.desktop", { reason: input.reason });
409
+ }
410
+ captureWindow(windowId, input) {
411
+ return this.client.call("desktop.capture.window", {
412
+ windowId,
413
+ reason: input.reason
414
+ });
415
+ }
416
+ accessibilitySnapshot(reason, windowId) {
417
+ return this.client.call("desktop.accessibility.snapshot", {
418
+ reason,
419
+ ...windowId ? { windowId } : {}
420
+ });
421
+ }
422
+ };
423
+
284
424
  // src/cli/remote-relay.ts
285
425
  var emptyStatus = {
286
426
  running: false,
@@ -289,6 +429,7 @@ var emptyStatus = {
289
429
  cdpConnected: false,
290
430
  annotationConnected: false,
291
431
  opsConnected: false,
432
+ canvasConnected: false,
292
433
  pairingRequired: false,
293
434
  instanceId: "",
294
435
  epoch: 0,
@@ -300,6 +441,7 @@ var emptyStatus = {
300
441
  cdpConnected: false,
301
442
  annotationConnected: false,
302
443
  opsConnected: false,
444
+ canvasConnected: false,
303
445
  pairingRequired: false
304
446
  }
305
447
  };
@@ -309,6 +451,7 @@ var RemoteRelay = class {
309
451
  lastCdpUrl = null;
310
452
  lastAnnotationUrl = null;
311
453
  lastOpsUrl = null;
454
+ lastCanvasUrl = null;
312
455
  constructor(client) {
313
456
  this.client = client;
314
457
  }
@@ -322,11 +465,14 @@ var RemoteRelay = class {
322
465
  this.lastAnnotationUrl = typeof annotationUrl === "string" ? annotationUrl : null;
323
466
  const opsUrl = await this.client.call("relay.opsUrl");
324
467
  this.lastOpsUrl = typeof opsUrl === "string" ? opsUrl : null;
468
+ const canvasUrl = await this.client.call("relay.canvasUrl");
469
+ this.lastCanvasUrl = typeof canvasUrl === "string" ? canvasUrl : null;
325
470
  } catch {
326
471
  this.lastStatus = emptyStatus;
327
472
  this.lastCdpUrl = null;
328
473
  this.lastAnnotationUrl = null;
329
474
  this.lastOpsUrl = null;
475
+ this.lastCanvasUrl = null;
330
476
  }
331
477
  }
332
478
  status() {
@@ -341,11 +487,14 @@ var RemoteRelay = class {
341
487
  getOpsUrl() {
342
488
  return this.lastOpsUrl;
343
489
  }
490
+ getCanvasUrl() {
491
+ return this.lastCanvasUrl;
492
+ }
344
493
  };
345
494
 
346
495
  // src/skills/skill-nudge.ts
347
496
  var SKILL_NUDGE_MARKER = "[opendevbrowser:skill-nudge]";
348
- var SKILL_NUDGE_MESSAGE = `${SKILL_NUDGE_MARKER} If this task likely matches a skill, start with skill("opendevbrowser-best-practices", "quick start"). Use another skill only when it is more relevant.`;
497
+ var SKILL_NUDGE_MESSAGE = `${SKILL_NUDGE_MARKER} If this task likely matches a skill, start with skill("${onboarding_metadata_default.skillName}", "${onboarding_metadata_default.skillTopic}"). For frontend, UI, screenshot-to-code, or /canvas design work, then load skill("${onboarding_metadata_default.designSkillName}"). Use the canonical opendevbrowser-* packs and start with the bundled quick-start lane before low-level browser commands.`;
349
498
  function createSkillNudgeState() {
350
499
  return { pending: false, requestedAtMs: null };
351
500
  }
@@ -418,18 +567,25 @@ import { tool } from "@opencode-ai/plugin";
418
567
  function ok(data) {
419
568
  return JSON.stringify({ ok: true, ...data });
420
569
  }
421
- function failure(message, code) {
570
+ function failure(message, code, details) {
422
571
  return JSON.stringify({
423
572
  ok: false,
424
573
  error: {
425
574
  message,
426
- code
575
+ code,
576
+ ...details ? { details } : {}
427
577
  }
428
578
  });
429
579
  }
430
580
  function serializeError(error) {
431
581
  if (error instanceof Error) {
432
- return { message: error.message };
582
+ const detailCarrier = error;
583
+ 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;
584
+ return {
585
+ message: error.message,
586
+ code: detailCarrier.code,
587
+ details
588
+ };
433
589
  }
434
590
  return { message: "Unknown error" };
435
591
  }
@@ -463,7 +619,7 @@ function createLaunchTool(deps) {
463
619
  let relayUrl = extensionLegacy ? deps.relay?.getCdpUrl() ?? null : deps.relay?.getOpsUrl?.() ?? null;
464
620
  const relayPort = relayStatus?.port;
465
621
  if (!relayUrl && isValidPort(relayPort)) {
466
- relayUrl = `ws://127.0.0.1:${relayPort}/${extensionLegacy ? "cdp" : "ops"}`;
622
+ relayUrl = buildLoopbackSessionRelayEndpoint(relayPort, { extensionLegacy });
467
623
  }
468
624
  const waitTimeoutMs = clampWaitTimeout(args.waitTimeoutMs ?? 3e4);
469
625
  const headlessExplicit = args.headless === true;
@@ -488,7 +644,7 @@ function createLaunchTool(deps) {
488
644
  const observedStatus = shouldFetchObserved ? await fetchRelayObservedStatus(observedPort) : null;
489
645
  if (!relayUrl) {
490
646
  const fallbackPort = isValidPort(observedStatus?.port) ? observedStatus?.port : observedPort;
491
- relayUrl = fallbackPort ? `ws://127.0.0.1:${fallbackPort}/${extensionLegacy ? "cdp" : "ops"}` : null;
647
+ relayUrl = fallbackPort ? buildLoopbackSessionRelayEndpoint(fallbackPort, { extensionLegacy }) : null;
492
648
  }
493
649
  const extensionReady = Boolean(
494
650
  relayUrl && (relayStatus?.extensionHandshakeComplete || relayStatus?.extensionConnected || observedStatus?.extensionHandshakeComplete || observedStatus?.extensionConnected)
@@ -523,7 +679,7 @@ function createLaunchTool(deps) {
523
679
  return failure(buildExtensionMissingMessage(diagnostics.message), "extension_not_connected");
524
680
  }
525
681
  try {
526
- result = await deps.manager.connectRelay(relayUrl);
682
+ result = args.startUrl ? await deps.manager.connectRelay(relayUrl, { startUrl: args.startUrl }) : await deps.manager.connectRelay(relayUrl);
527
683
  usedRelay = true;
528
684
  } catch (error) {
529
685
  const errorMessage = serializeError(error).message;
@@ -561,9 +717,6 @@ function createLaunchTool(deps) {
561
717
  return failure(buildManagedFailureMessage(error), "launch_failed");
562
718
  }
563
719
  }
564
- if (usedRelay && args.startUrl && result.activeTargetId) {
565
- await deps.manager.goto(result.sessionId, args.startUrl, "load", 3e4);
566
- }
567
720
  const warnings = result.warnings ?? [];
568
721
  return ok({
569
722
  sessionId: result.sessionId,
@@ -748,21 +901,6 @@ async function fetchRelayObservedStatus(port) {
748
901
  // src/tools/connect.ts
749
902
  import { tool as tool2 } from "@opencode-ai/plugin";
750
903
  var z2 = tool2.schema;
751
- function normalizeRelayEndpoint(wsEndpoint, path, allowBase) {
752
- if (!wsEndpoint) return null;
753
- try {
754
- const url = new URL(wsEndpoint);
755
- if (url.protocol !== "ws:" && url.protocol !== "wss:") return null;
756
- if (url.hostname !== "127.0.0.1" && url.hostname !== "localhost") return null;
757
- if (!url.port || !/^\d+$/.test(url.port)) return null;
758
- const normalizedPath = url.pathname.endsWith("/") ? url.pathname.slice(0, -1) : url.pathname;
759
- if (!allowBase && normalizedPath === "") return null;
760
- if (normalizedPath && normalizedPath !== `/${path}`) return null;
761
- return `${url.protocol}//${url.hostname}:${url.port}/${path}`;
762
- } catch {
763
- return null;
764
- }
765
- }
766
904
  function createConnectTool(deps) {
767
905
  return tool2({
768
906
  description: "Connect to an existing Chrome CDP endpoint or extension relay.",
@@ -770,6 +908,7 @@ function createConnectTool(deps) {
770
908
  wsEndpoint: z2.string().optional().describe("Full WebSocket endpoint to connect to"),
771
909
  host: z2.string().optional().describe("Host for /json/version lookup"),
772
910
  port: z2.number().int().optional().describe("Port for /json/version lookup"),
911
+ startUrl: z2.string().optional().describe("Open this URL immediately after connect"),
773
912
  extensionLegacy: z2.boolean().optional().describe("Use legacy extension relay (/cdp) instead of ops")
774
913
  },
775
914
  async execute(args) {
@@ -777,17 +916,19 @@ function createConnectTool(deps) {
777
916
  await deps.relay?.refresh?.();
778
917
  const wsEndpoint = args.wsEndpoint;
779
918
  const extensionLegacy = args.extensionLegacy === true;
919
+ const startUrl = typeof args.startUrl === "string" && args.startUrl.trim().length > 0 ? args.startUrl.trim() : void 0;
780
920
  const hasExplicitCdp = Boolean(wsEndpoint || args.host || args.port);
781
921
  const relayUrl = extensionLegacy ? deps.relay?.getCdpUrl() ?? null : deps.relay?.getOpsUrl?.() ?? null;
782
- const normalizedOpsEndpoint = normalizeRelayEndpoint(wsEndpoint, "ops", true);
783
- const normalizedLegacyEndpoint = normalizeRelayEndpoint(wsEndpoint, "cdp", extensionLegacy);
784
- if (normalizedLegacyEndpoint && !extensionLegacy) {
785
- return failure("Legacy extension relay (/cdp) requires extensionLegacy=true.", "extension_legacy_required");
922
+ const parsedRelayEndpoint = classifySessionRelayEndpoint(wsEndpoint);
923
+ const resolvedRelayEndpoint = parsedRelayEndpoint ? resolveSessionRelayRoute(parsedRelayEndpoint, { extensionLegacy }) : null;
924
+ if (resolvedRelayEndpoint && "code" in resolvedRelayEndpoint) {
925
+ return failure(resolvedRelayEndpoint.message, resolvedRelayEndpoint.code);
786
926
  }
787
- const relayEndpoint = relayUrl && wsEndpoint === relayUrl ? relayUrl : extensionLegacy ? normalizedLegacyEndpoint ?? normalizedOpsEndpoint : normalizedOpsEndpoint;
927
+ const relayEndpoint = relayUrl && wsEndpoint === relayUrl ? relayUrl : resolvedRelayEndpoint?.normalizedEndpoint ?? null;
928
+ const preferredRelayEndpoint = relayEndpoint ?? (!hasExplicitCdp ? relayUrl : null);
788
929
  let result;
789
- if (relayEndpoint || !hasExplicitCdp && relayUrl) {
790
- result = await deps.manager.connectRelay(relayEndpoint ?? relayUrl ?? "");
930
+ if (preferredRelayEndpoint) {
931
+ result = startUrl ? await deps.manager.connectRelay(preferredRelayEndpoint, { startUrl }) : await deps.manager.connectRelay(preferredRelayEndpoint);
791
932
  } else {
792
933
  if (!hasExplicitCdp) {
793
934
  return failure("Extension relay not available. Connect the extension or pass wsEndpoint/host/port.", "extension_not_connected");
@@ -795,7 +936,8 @@ function createConnectTool(deps) {
795
936
  result = await deps.manager.connect({
796
937
  wsEndpoint,
797
938
  host: args.host,
798
- port: args.port
939
+ port: args.port,
940
+ startUrl
799
941
  });
800
942
  }
801
943
  return ok({
@@ -947,15 +1089,56 @@ function createStatusTool(deps) {
947
1089
  });
948
1090
  }
949
1091
 
950
- // src/tools/targets_list.ts
1092
+ // src/tools/session_inspector.ts
951
1093
  import { tool as tool5 } from "@opencode-ai/plugin";
952
1094
  var z5 = tool5.schema;
953
- function createTargetsListTool(deps) {
1095
+ function createSessionInspectorTool(deps) {
954
1096
  return tool5({
955
- description: "List targets (tabs) in the current session.",
1097
+ description: "Capture a session-first diagnostic bundle with relay health, trace proof, and a suggested next action.",
956
1098
  args: {
957
1099
  sessionId: z5.string().describe("Session id"),
958
- includeUrls: z5.boolean().optional().describe("Include target URLs")
1100
+ includeUrls: z5.boolean().optional().describe("Include target URLs in the targets summary"),
1101
+ sinceConsoleSeq: z5.number().int().optional().describe("Resume cursor for console events"),
1102
+ sinceNetworkSeq: z5.number().int().optional().describe("Resume cursor for network events"),
1103
+ sinceExceptionSeq: z5.number().int().optional().describe("Resume cursor for exception events"),
1104
+ max: z5.number().int().optional().describe("Max events per diagnostics channel"),
1105
+ requestId: z5.string().optional().describe("Optional trace request id")
1106
+ },
1107
+ async execute(args) {
1108
+ try {
1109
+ const inspector = deps.manager.createSessionInspector?.();
1110
+ if (!inspector) {
1111
+ return failure("Session inspector is unavailable for the current runtime.", "session_inspector_unavailable");
1112
+ }
1113
+ await deps.relay?.refresh?.().catch(() => void 0);
1114
+ const relayStatus = deps.relay?.status?.() ?? null;
1115
+ const result = await inspectSession(inspector, {
1116
+ sessionId: args.sessionId,
1117
+ includeUrls: args.includeUrls,
1118
+ sinceConsoleSeq: args.sinceConsoleSeq,
1119
+ sinceNetworkSeq: args.sinceNetworkSeq,
1120
+ sinceExceptionSeq: args.sinceExceptionSeq,
1121
+ max: args.max,
1122
+ requestId: args.requestId,
1123
+ relayStatus
1124
+ });
1125
+ return ok(result);
1126
+ } catch (error) {
1127
+ return failure(serializeError(error).message, "session_inspector_failed");
1128
+ }
1129
+ }
1130
+ });
1131
+ }
1132
+
1133
+ // src/tools/targets_list.ts
1134
+ import { tool as tool6 } from "@opencode-ai/plugin";
1135
+ var z6 = tool6.schema;
1136
+ function createTargetsListTool(deps) {
1137
+ return tool6({
1138
+ description: "List targets (tabs) in the current session.",
1139
+ args: {
1140
+ sessionId: z6.string().describe("Session id"),
1141
+ includeUrls: z6.boolean().optional().describe("Include target URLs")
959
1142
  },
960
1143
  async execute(args) {
961
1144
  try {
@@ -972,14 +1155,14 @@ function createTargetsListTool(deps) {
972
1155
  }
973
1156
 
974
1157
  // src/tools/target_use.ts
975
- import { tool as tool6 } from "@opencode-ai/plugin";
976
- var z6 = tool6.schema;
1158
+ import { tool as tool7 } from "@opencode-ai/plugin";
1159
+ var z7 = tool7.schema;
977
1160
  function createTargetUseTool(deps) {
978
- return tool6({
1161
+ return tool7({
979
1162
  description: "Set the active target (tab).",
980
1163
  args: {
981
- sessionId: z6.string().describe("Session id"),
982
- targetId: z6.string().describe("Target id")
1164
+ sessionId: z7.string().describe("Session id"),
1165
+ targetId: z7.string().describe("Target id")
983
1166
  },
984
1167
  async execute(args) {
985
1168
  try {
@@ -997,14 +1180,14 @@ function createTargetUseTool(deps) {
997
1180
  }
998
1181
 
999
1182
  // src/tools/target_new.ts
1000
- import { tool as tool7 } from "@opencode-ai/plugin";
1001
- var z7 = tool7.schema;
1183
+ import { tool as tool8 } from "@opencode-ai/plugin";
1184
+ var z8 = tool8.schema;
1002
1185
  function createTargetNewTool(deps) {
1003
- return tool7({
1186
+ return tool8({
1004
1187
  description: "Open a new target (tab).",
1005
1188
  args: {
1006
- sessionId: z7.string().describe("Session id"),
1007
- url: z7.string().optional().describe("Optional URL to open")
1189
+ sessionId: z8.string().describe("Session id"),
1190
+ url: z8.string().optional().describe("Optional URL to open")
1008
1191
  },
1009
1192
  async execute(args) {
1010
1193
  try {
@@ -1018,14 +1201,14 @@ function createTargetNewTool(deps) {
1018
1201
  }
1019
1202
 
1020
1203
  // src/tools/target_close.ts
1021
- import { tool as tool8 } from "@opencode-ai/plugin";
1022
- var z8 = tool8.schema;
1204
+ import { tool as tool9 } from "@opencode-ai/plugin";
1205
+ var z9 = tool9.schema;
1023
1206
  function createTargetCloseTool(deps) {
1024
- return tool8({
1207
+ return tool9({
1025
1208
  description: "Close a target (tab).",
1026
1209
  args: {
1027
- sessionId: z8.string().describe("Session id"),
1028
- targetId: z8.string().describe("Target id")
1210
+ sessionId: z9.string().describe("Session id"),
1211
+ targetId: z9.string().describe("Target id")
1029
1212
  },
1030
1213
  async execute(args) {
1031
1214
  try {
@@ -1039,15 +1222,15 @@ function createTargetCloseTool(deps) {
1039
1222
  }
1040
1223
 
1041
1224
  // src/tools/page.ts
1042
- import { tool as tool9 } from "@opencode-ai/plugin";
1043
- var z9 = tool9.schema;
1225
+ import { tool as tool10 } from "@opencode-ai/plugin";
1226
+ var z10 = tool10.schema;
1044
1227
  function createPageTool(deps) {
1045
- return tool9({
1228
+ return tool10({
1046
1229
  description: "Open or focus a named page, optionally navigating to a URL.",
1047
1230
  args: {
1048
- sessionId: z9.string().describe("Active browser session id"),
1049
- name: z9.string().describe("Stable page name"),
1050
- url: z9.string().optional().describe("Optional URL to open")
1231
+ sessionId: z10.string().describe("Active browser session id"),
1232
+ name: z10.string().describe("Stable page name"),
1233
+ url: z10.string().optional().describe("Optional URL to open")
1051
1234
  },
1052
1235
  async execute(args) {
1053
1236
  try {
@@ -1066,13 +1249,13 @@ function createPageTool(deps) {
1066
1249
  }
1067
1250
 
1068
1251
  // src/tools/list.ts
1069
- import { tool as tool10 } from "@opencode-ai/plugin";
1070
- var z10 = tool10.schema;
1252
+ import { tool as tool11 } from "@opencode-ai/plugin";
1253
+ var z11 = tool11.schema;
1071
1254
  function createListTool(deps) {
1072
- return tool10({
1255
+ return tool11({
1073
1256
  description: "List named pages in the current session.",
1074
1257
  args: {
1075
- sessionId: z10.string().describe("Active browser session id")
1258
+ sessionId: z11.string().describe("Active browser session id")
1076
1259
  },
1077
1260
  async execute(args) {
1078
1261
  try {
@@ -1086,14 +1269,14 @@ function createListTool(deps) {
1086
1269
  }
1087
1270
 
1088
1271
  // src/tools/close.ts
1089
- import { tool as tool11 } from "@opencode-ai/plugin";
1090
- var z11 = tool11.schema;
1272
+ import { tool as tool12 } from "@opencode-ai/plugin";
1273
+ var z12 = tool12.schema;
1091
1274
  function createCloseTool(deps) {
1092
- return tool11({
1275
+ return tool12({
1093
1276
  description: "Close a named page within the current session.",
1094
1277
  args: {
1095
- sessionId: z11.string().describe("Active browser session id"),
1096
- name: z11.string().describe("Named page to close")
1278
+ sessionId: z12.string().describe("Active browser session id"),
1279
+ name: z12.string().describe("Named page to close")
1097
1280
  },
1098
1281
  async execute(args) {
1099
1282
  try {
@@ -1107,17 +1290,18 @@ function createCloseTool(deps) {
1107
1290
  }
1108
1291
 
1109
1292
  // src/tools/goto.ts
1110
- import { tool as tool12 } from "@opencode-ai/plugin";
1111
- var z12 = tool12.schema;
1112
- var waitUntilSchema = z12.enum(["domcontentloaded", "load", "networkidle"]);
1293
+ import { tool as tool13 } from "@opencode-ai/plugin";
1294
+ var z13 = tool13.schema;
1295
+ var waitUntilSchema = z13.enum(["domcontentloaded", "load", "networkidle"]);
1113
1296
  function createGotoTool(deps) {
1114
- return tool12({
1297
+ return tool13({
1115
1298
  description: "Navigate the active target to a URL.",
1116
1299
  args: {
1117
- sessionId: z12.string().describe("Session id"),
1118
- url: z12.string().describe("URL to navigate to"),
1300
+ sessionId: z13.string().describe("Session id"),
1301
+ url: z13.string().describe("URL to navigate to"),
1302
+ targetId: z13.string().optional().describe("Optional target id"),
1119
1303
  waitUntil: waitUntilSchema.optional().describe("Load state to wait for"),
1120
- timeoutMs: z12.number().int().optional().describe("Timeout in milliseconds")
1304
+ timeoutMs: z13.number().int().optional().describe("Timeout in milliseconds")
1121
1305
  },
1122
1306
  async execute(args) {
1123
1307
  try {
@@ -1125,7 +1309,9 @@ function createGotoTool(deps) {
1125
1309
  args.sessionId,
1126
1310
  args.url,
1127
1311
  args.waitUntil ?? "load",
1128
- args.timeoutMs ?? 3e4
1312
+ args.timeoutMs ?? 3e4,
1313
+ void 0,
1314
+ args.targetId
1129
1315
  );
1130
1316
  return ok(result);
1131
1317
  } catch (error) {
@@ -1136,19 +1322,20 @@ function createGotoTool(deps) {
1136
1322
  }
1137
1323
 
1138
1324
  // src/tools/wait.ts
1139
- import { tool as tool13 } from "@opencode-ai/plugin";
1140
- var z13 = tool13.schema;
1141
- var waitUntilSchema2 = z13.enum(["domcontentloaded", "load", "networkidle"]);
1142
- var waitStateSchema = z13.enum(["attached", "visible", "hidden"]);
1325
+ import { tool as tool14 } from "@opencode-ai/plugin";
1326
+ var z14 = tool14.schema;
1327
+ var waitUntilSchema2 = z14.enum(["domcontentloaded", "load", "networkidle"]);
1328
+ var waitStateSchema = z14.enum(["attached", "visible", "hidden"]);
1143
1329
  function createWaitTool(deps) {
1144
- return tool13({
1330
+ return tool14({
1145
1331
  description: "Wait for a load state or a ref state.",
1146
1332
  args: {
1147
- sessionId: z13.string().describe("Session id"),
1333
+ sessionId: z14.string().describe("Session id"),
1334
+ targetId: z14.string().optional().describe("Optional target id"),
1148
1335
  until: waitUntilSchema2.optional().describe("Load state to wait for"),
1149
- ref: z13.string().optional().describe("Ref to wait for"),
1336
+ ref: z14.string().optional().describe("Ref to wait for"),
1150
1337
  state: waitStateSchema.optional().describe("Ref state to wait for"),
1151
- timeoutMs: z13.number().int().optional().describe("Timeout in milliseconds")
1338
+ timeoutMs: z14.number().int().optional().describe("Timeout in milliseconds")
1152
1339
  },
1153
1340
  async execute(args) {
1154
1341
  try {
@@ -1157,7 +1344,8 @@ function createWaitTool(deps) {
1157
1344
  args.sessionId,
1158
1345
  args.ref,
1159
1346
  args.state ?? "attached",
1160
- args.timeoutMs ?? 3e4
1347
+ args.timeoutMs ?? 3e4,
1348
+ args.targetId
1161
1349
  );
1162
1350
  return ok(result2);
1163
1351
  }
@@ -1167,7 +1355,8 @@ function createWaitTool(deps) {
1167
1355
  const result = await deps.manager.waitForLoad(
1168
1356
  args.sessionId,
1169
1357
  args.until,
1170
- args.timeoutMs ?? 3e4
1358
+ args.timeoutMs ?? 3e4,
1359
+ args.targetId
1171
1360
  );
1172
1361
  return ok(result);
1173
1362
  } catch (error) {
@@ -1178,17 +1367,18 @@ function createWaitTool(deps) {
1178
1367
  }
1179
1368
 
1180
1369
  // src/tools/snapshot.ts
1181
- import { tool as tool14 } from "@opencode-ai/plugin";
1182
- var z14 = tool14.schema;
1183
- var formatSchema = z14.enum(["outline", "actionables"]);
1370
+ import { tool as tool15 } from "@opencode-ai/plugin";
1371
+ var z15 = tool15.schema;
1372
+ var formatSchema = z15.enum(["outline", "actionables"]);
1184
1373
  function createSnapshotTool(deps) {
1185
- return tool14({
1374
+ return tool15({
1186
1375
  description: "Capture a snapshot of the current page and return refs.",
1187
1376
  args: {
1188
- sessionId: z14.string().describe("Session id"),
1377
+ sessionId: z15.string().describe("Session id"),
1378
+ targetId: z15.string().optional().describe("Optional target id"),
1189
1379
  format: formatSchema.optional().describe("Snapshot format"),
1190
- maxChars: z14.number().int().optional().describe("Max characters for snapshot output"),
1191
- cursor: z14.string().optional().describe("Cursor for paging")
1380
+ maxChars: z15.number().int().optional().describe("Max characters for snapshot output"),
1381
+ cursor: z15.string().optional().describe("Cursor for paging")
1192
1382
  },
1193
1383
  async execute(args) {
1194
1384
  try {
@@ -1197,7 +1387,8 @@ function createSnapshotTool(deps) {
1197
1387
  args.sessionId,
1198
1388
  args.format ?? "outline",
1199
1389
  args.maxChars ?? config.snapshot.maxChars,
1200
- args.cursor
1390
+ args.cursor,
1391
+ args.targetId
1201
1392
  );
1202
1393
  return ok(result);
1203
1394
  } catch (error) {
@@ -1207,19 +1398,50 @@ function createSnapshotTool(deps) {
1207
1398
  });
1208
1399
  }
1209
1400
 
1401
+ // src/tools/review.ts
1402
+ import { tool as tool16 } from "@opencode-ai/plugin";
1403
+ var z16 = tool16.schema;
1404
+ function createReviewTool(deps) {
1405
+ return tool16({
1406
+ description: "Capture a first-class review payload with status and actionables.",
1407
+ args: {
1408
+ sessionId: z16.string().describe("Session id"),
1409
+ targetId: z16.string().optional().describe("Optional target id"),
1410
+ maxChars: z16.number().int().optional().describe("Max characters for review output"),
1411
+ cursor: z16.string().optional().describe("Cursor for paging")
1412
+ },
1413
+ async execute(args) {
1414
+ try {
1415
+ const config = deps.config.get();
1416
+ const result = await buildBrowserReviewResult({
1417
+ manager: deps.manager,
1418
+ sessionId: args.sessionId,
1419
+ targetId: args.targetId,
1420
+ maxChars: args.maxChars ?? config.snapshot.maxChars,
1421
+ cursor: args.cursor
1422
+ });
1423
+ return ok(result);
1424
+ } catch (error) {
1425
+ return failure(serializeError(error).message, "review_failed");
1426
+ }
1427
+ }
1428
+ });
1429
+ }
1430
+
1210
1431
  // src/tools/click.ts
1211
- import { tool as tool15 } from "@opencode-ai/plugin";
1212
- var z15 = tool15.schema;
1432
+ import { tool as tool17 } from "@opencode-ai/plugin";
1433
+ var z17 = tool17.schema;
1213
1434
  function createClickTool(deps) {
1214
- return tool15({
1435
+ return tool17({
1215
1436
  description: "Click a referenced element.",
1216
1437
  args: {
1217
- sessionId: z15.string().describe("Session id"),
1218
- ref: z15.string().describe("Element ref")
1438
+ sessionId: z17.string().describe("Session id"),
1439
+ targetId: z17.string().optional().describe("Optional target id"),
1440
+ ref: z17.string().describe("Element ref")
1219
1441
  },
1220
1442
  async execute(args) {
1221
1443
  try {
1222
- const result = await deps.manager.click(args.sessionId, args.ref);
1444
+ const result = await deps.manager.click(args.sessionId, args.ref, args.targetId);
1223
1445
  return ok(result);
1224
1446
  } catch (error) {
1225
1447
  return failure(serializeError(error).message, "click_failed");
@@ -1229,18 +1451,19 @@ function createClickTool(deps) {
1229
1451
  }
1230
1452
 
1231
1453
  // src/tools/hover.ts
1232
- import { tool as tool16 } from "@opencode-ai/plugin";
1233
- var z16 = tool16.schema;
1454
+ import { tool as tool18 } from "@opencode-ai/plugin";
1455
+ var z18 = tool18.schema;
1234
1456
  function createHoverTool(deps) {
1235
- return tool16({
1457
+ return tool18({
1236
1458
  description: "Hover over an element by ref.",
1237
1459
  args: {
1238
- sessionId: z16.string().describe("Active browser session id"),
1239
- ref: z16.string().describe("Element ref from snapshot")
1460
+ sessionId: z18.string().describe("Active browser session id"),
1461
+ targetId: z18.string().optional().describe("Optional target id"),
1462
+ ref: z18.string().describe("Element ref from snapshot")
1240
1463
  },
1241
1464
  async execute(args) {
1242
1465
  try {
1243
- const result = await deps.manager.hover(args.sessionId, args.ref);
1466
+ const result = await deps.manager.hover(args.sessionId, args.ref, args.targetId);
1244
1467
  return ok(result);
1245
1468
  } catch (error) {
1246
1469
  return failure(serializeError(error).message, "hover_failed");
@@ -1250,19 +1473,20 @@ function createHoverTool(deps) {
1250
1473
  }
1251
1474
 
1252
1475
  // src/tools/press.ts
1253
- import { tool as tool17 } from "@opencode-ai/plugin";
1254
- var z17 = tool17.schema;
1476
+ import { tool as tool19 } from "@opencode-ai/plugin";
1477
+ var z19 = tool19.schema;
1255
1478
  function createPressTool(deps) {
1256
- return tool17({
1479
+ return tool19({
1257
1480
  description: "Press a keyboard key, optionally focusing a ref first.",
1258
1481
  args: {
1259
- sessionId: z17.string().describe("Active browser session id"),
1260
- key: z17.string().describe("Keyboard key to press, e.g. Enter or ArrowDown"),
1261
- ref: z17.string().optional().describe("Optional element ref to focus first")
1482
+ sessionId: z19.string().describe("Active browser session id"),
1483
+ targetId: z19.string().optional().describe("Optional target id"),
1484
+ key: z19.string().describe("Keyboard key to press, e.g. Enter or ArrowDown"),
1485
+ ref: z19.string().optional().describe("Optional element ref to focus first")
1262
1486
  },
1263
1487
  async execute(args) {
1264
1488
  try {
1265
- const result = await deps.manager.press(args.sessionId, args.key, args.ref);
1489
+ const result = await deps.manager.press(args.sessionId, args.key, args.ref, args.targetId);
1266
1490
  return ok(result);
1267
1491
  } catch (error) {
1268
1492
  return failure(serializeError(error).message, "press_failed");
@@ -1272,18 +1496,19 @@ function createPressTool(deps) {
1272
1496
  }
1273
1497
 
1274
1498
  // src/tools/check.ts
1275
- import { tool as tool18 } from "@opencode-ai/plugin";
1276
- var z18 = tool18.schema;
1499
+ import { tool as tool20 } from "@opencode-ai/plugin";
1500
+ var z20 = tool20.schema;
1277
1501
  function createCheckTool(deps) {
1278
- return tool18({
1502
+ return tool20({
1279
1503
  description: "Check a checkbox or toggle by ref.",
1280
1504
  args: {
1281
- sessionId: z18.string().describe("Active browser session id"),
1282
- ref: z18.string().describe("Element ref from snapshot")
1505
+ sessionId: z20.string().describe("Active browser session id"),
1506
+ targetId: z20.string().optional().describe("Optional target id"),
1507
+ ref: z20.string().describe("Element ref from snapshot")
1283
1508
  },
1284
1509
  async execute(args) {
1285
1510
  try {
1286
- const result = await deps.manager.check(args.sessionId, args.ref);
1511
+ const result = await deps.manager.check(args.sessionId, args.ref, args.targetId);
1287
1512
  return ok(result);
1288
1513
  } catch (error) {
1289
1514
  return failure(serializeError(error).message, "check_failed");
@@ -1293,18 +1518,19 @@ function createCheckTool(deps) {
1293
1518
  }
1294
1519
 
1295
1520
  // src/tools/uncheck.ts
1296
- import { tool as tool19 } from "@opencode-ai/plugin";
1297
- var z19 = tool19.schema;
1521
+ import { tool as tool21 } from "@opencode-ai/plugin";
1522
+ var z21 = tool21.schema;
1298
1523
  function createUncheckTool(deps) {
1299
- return tool19({
1524
+ return tool21({
1300
1525
  description: "Uncheck a checkbox or toggle by ref.",
1301
1526
  args: {
1302
- sessionId: z19.string().describe("Active browser session id"),
1303
- ref: z19.string().describe("Element ref from snapshot")
1527
+ sessionId: z21.string().describe("Active browser session id"),
1528
+ targetId: z21.string().optional().describe("Optional target id"),
1529
+ ref: z21.string().describe("Element ref from snapshot")
1304
1530
  },
1305
1531
  async execute(args) {
1306
1532
  try {
1307
- const result = await deps.manager.uncheck(args.sessionId, args.ref);
1533
+ const result = await deps.manager.uncheck(args.sessionId, args.ref, args.targetId);
1308
1534
  return ok(result);
1309
1535
  } catch (error) {
1310
1536
  return failure(serializeError(error).message, "uncheck_failed");
@@ -1314,17 +1540,18 @@ function createUncheckTool(deps) {
1314
1540
  }
1315
1541
 
1316
1542
  // src/tools/type.ts
1317
- import { tool as tool20 } from "@opencode-ai/plugin";
1318
- var z20 = tool20.schema;
1543
+ import { tool as tool22 } from "@opencode-ai/plugin";
1544
+ var z22 = tool22.schema;
1319
1545
  function createTypeTool(deps) {
1320
- return tool20({
1546
+ return tool22({
1321
1547
  description: "Type text into a referenced input.",
1322
1548
  args: {
1323
- sessionId: z20.string().describe("Session id"),
1324
- ref: z20.string().describe("Element ref"),
1325
- text: z20.string().describe("Text to type"),
1326
- clear: z20.boolean().optional().describe("Clear before typing"),
1327
- submit: z20.boolean().optional().describe("Press Enter after typing")
1549
+ sessionId: z22.string().describe("Session id"),
1550
+ targetId: z22.string().optional().describe("Optional target id"),
1551
+ ref: z22.string().describe("Element ref"),
1552
+ text: z22.string().describe("Text to type"),
1553
+ clear: z22.boolean().optional().describe("Clear before typing"),
1554
+ submit: z22.boolean().optional().describe("Press Enter after typing")
1328
1555
  },
1329
1556
  async execute(args) {
1330
1557
  try {
@@ -1333,7 +1560,8 @@ function createTypeTool(deps) {
1333
1560
  args.ref,
1334
1561
  args.text,
1335
1562
  Boolean(args.clear),
1336
- Boolean(args.submit)
1563
+ Boolean(args.submit),
1564
+ args.targetId
1337
1565
  );
1338
1566
  return ok(result);
1339
1567
  } catch (error) {
@@ -1344,19 +1572,20 @@ function createTypeTool(deps) {
1344
1572
  }
1345
1573
 
1346
1574
  // src/tools/select.ts
1347
- import { tool as tool21 } from "@opencode-ai/plugin";
1348
- var z21 = tool21.schema;
1575
+ import { tool as tool23 } from "@opencode-ai/plugin";
1576
+ var z23 = tool23.schema;
1349
1577
  function createSelectTool(deps) {
1350
- return tool21({
1578
+ return tool23({
1351
1579
  description: "Select options in a referenced select element.",
1352
1580
  args: {
1353
- sessionId: z21.string().describe("Session id"),
1354
- ref: z21.string().describe("Element ref"),
1355
- values: z21.array(z21.string()).describe("Values to select")
1581
+ sessionId: z23.string().describe("Session id"),
1582
+ targetId: z23.string().optional().describe("Optional target id"),
1583
+ ref: z23.string().describe("Element ref"),
1584
+ values: z23.array(z23.string()).describe("Values to select")
1356
1585
  },
1357
1586
  async execute(args) {
1358
1587
  try {
1359
- await deps.manager.select(args.sessionId, args.ref, args.values);
1588
+ await deps.manager.select(args.sessionId, args.ref, args.values, args.targetId);
1360
1589
  return ok({});
1361
1590
  } catch (error) {
1362
1591
  return failure(serializeError(error).message, "select_failed");
@@ -1366,19 +1595,20 @@ function createSelectTool(deps) {
1366
1595
  }
1367
1596
 
1368
1597
  // src/tools/scroll.ts
1369
- import { tool as tool22 } from "@opencode-ai/plugin";
1370
- var z22 = tool22.schema;
1598
+ import { tool as tool24 } from "@opencode-ai/plugin";
1599
+ var z24 = tool24.schema;
1371
1600
  function createScrollTool(deps) {
1372
- return tool22({
1601
+ return tool24({
1373
1602
  description: "Scroll the page or a referenced element.",
1374
1603
  args: {
1375
- sessionId: z22.string().describe("Session id"),
1376
- dy: z22.number().describe("Scroll delta in pixels"),
1377
- ref: z22.string().optional().describe("Optional element ref to scroll")
1604
+ sessionId: z24.string().describe("Session id"),
1605
+ targetId: z24.string().optional().describe("Optional target id"),
1606
+ dy: z24.number().describe("Scroll delta in pixels"),
1607
+ ref: z24.string().optional().describe("Optional element ref to scroll")
1378
1608
  },
1379
1609
  async execute(args) {
1380
1610
  try {
1381
- await deps.manager.scroll(args.sessionId, args.dy, args.ref);
1611
+ await deps.manager.scroll(args.sessionId, args.dy, args.ref, args.targetId);
1382
1612
  return ok({});
1383
1613
  } catch (error) {
1384
1614
  return failure(serializeError(error).message, "scroll_failed");
@@ -1388,18 +1618,19 @@ function createScrollTool(deps) {
1388
1618
  }
1389
1619
 
1390
1620
  // src/tools/scroll_into_view.ts
1391
- import { tool as tool23 } from "@opencode-ai/plugin";
1392
- var z23 = tool23.schema;
1621
+ import { tool as tool25 } from "@opencode-ai/plugin";
1622
+ var z25 = tool25.schema;
1393
1623
  function createScrollIntoViewTool(deps) {
1394
- return tool23({
1624
+ return tool25({
1395
1625
  description: "Scroll an element into view by ref.",
1396
1626
  args: {
1397
- sessionId: z23.string().describe("Active browser session id"),
1398
- ref: z23.string().describe("Element ref from snapshot")
1627
+ sessionId: z25.string().describe("Active browser session id"),
1628
+ targetId: z25.string().optional().describe("Optional target id"),
1629
+ ref: z25.string().describe("Element ref from snapshot")
1399
1630
  },
1400
1631
  async execute(args) {
1401
1632
  try {
1402
- const result = await deps.manager.scrollIntoView(args.sessionId, args.ref);
1633
+ const result = await deps.manager.scrollIntoView(args.sessionId, args.ref, args.targetId);
1403
1634
  return ok(result);
1404
1635
  } catch (error) {
1405
1636
  return failure(serializeError(error).message, "scroll_into_view_failed");
@@ -1408,23 +1639,172 @@ function createScrollIntoViewTool(deps) {
1408
1639
  });
1409
1640
  }
1410
1641
 
1642
+ // src/tools/upload.ts
1643
+ import { tool as tool26 } from "@opencode-ai/plugin";
1644
+ var z26 = tool26.schema;
1645
+ function createUploadTool(deps) {
1646
+ return tool26({
1647
+ description: "Upload files to an input or chooser by ref.",
1648
+ args: {
1649
+ sessionId: z26.string().describe("Active browser session id"),
1650
+ targetId: z26.string().optional().describe("Optional target id"),
1651
+ ref: z26.string().describe("Element ref"),
1652
+ files: z26.array(z26.string()).min(1).describe("Local host file paths")
1653
+ },
1654
+ async execute(args) {
1655
+ try {
1656
+ const result = await deps.manager.upload(args.sessionId, {
1657
+ targetId: args.targetId,
1658
+ ref: args.ref,
1659
+ files: args.files
1660
+ });
1661
+ return ok(result);
1662
+ } catch (error) {
1663
+ return failure(serializeError(error).message, "upload_failed");
1664
+ }
1665
+ }
1666
+ });
1667
+ }
1668
+
1669
+ // src/tools/pointer_move.ts
1670
+ import { tool as tool27 } from "@opencode-ai/plugin";
1671
+ var z27 = tool27.schema;
1672
+ function createPointerMoveTool(deps) {
1673
+ return tool27({
1674
+ description: "Move the pointer to viewport coordinates.",
1675
+ args: {
1676
+ sessionId: z27.string().describe("Active browser session id"),
1677
+ targetId: z27.string().optional().describe("Optional target id"),
1678
+ x: z27.number().describe("Viewport x coordinate"),
1679
+ y: z27.number().describe("Viewport y coordinate"),
1680
+ steps: z27.number().int().positive().optional().describe("Optional move interpolation step count")
1681
+ },
1682
+ async execute(args) {
1683
+ try {
1684
+ const result = await deps.manager.pointerMove(args.sessionId, args.x, args.y, args.targetId, args.steps);
1685
+ return ok(result);
1686
+ } catch (error) {
1687
+ return failure(serializeError(error).message, "pointer_move_failed");
1688
+ }
1689
+ }
1690
+ });
1691
+ }
1692
+
1693
+ // src/tools/pointer_down.ts
1694
+ import { tool as tool28 } from "@opencode-ai/plugin";
1695
+ var z28 = tool28.schema;
1696
+ function createPointerDownTool(deps) {
1697
+ return tool28({
1698
+ description: "Move to viewport coordinates and press a mouse button.",
1699
+ args: {
1700
+ sessionId: z28.string().describe("Active browser session id"),
1701
+ targetId: z28.string().optional().describe("Optional target id"),
1702
+ x: z28.number().describe("Viewport x coordinate"),
1703
+ y: z28.number().describe("Viewport y coordinate"),
1704
+ button: z28.enum(["left", "middle", "right"]).optional().describe("Mouse button to press"),
1705
+ clickCount: z28.number().int().positive().optional().describe("Associated click count")
1706
+ },
1707
+ async execute(args) {
1708
+ try {
1709
+ const result = await deps.manager.pointerDown(
1710
+ args.sessionId,
1711
+ args.x,
1712
+ args.y,
1713
+ args.targetId,
1714
+ args.button,
1715
+ args.clickCount
1716
+ );
1717
+ return ok(result);
1718
+ } catch (error) {
1719
+ return failure(serializeError(error).message, "pointer_down_failed");
1720
+ }
1721
+ }
1722
+ });
1723
+ }
1724
+
1725
+ // src/tools/pointer_up.ts
1726
+ import { tool as tool29 } from "@opencode-ai/plugin";
1727
+ var z29 = tool29.schema;
1728
+ function createPointerUpTool(deps) {
1729
+ return tool29({
1730
+ description: "Move to viewport coordinates and release a mouse button.",
1731
+ args: {
1732
+ sessionId: z29.string().describe("Active browser session id"),
1733
+ targetId: z29.string().optional().describe("Optional target id"),
1734
+ x: z29.number().describe("Viewport x coordinate"),
1735
+ y: z29.number().describe("Viewport y coordinate"),
1736
+ button: z29.enum(["left", "middle", "right"]).optional().describe("Mouse button to release"),
1737
+ clickCount: z29.number().int().positive().optional().describe("Associated click count")
1738
+ },
1739
+ async execute(args) {
1740
+ try {
1741
+ const result = await deps.manager.pointerUp(
1742
+ args.sessionId,
1743
+ args.x,
1744
+ args.y,
1745
+ args.targetId,
1746
+ args.button,
1747
+ args.clickCount
1748
+ );
1749
+ return ok(result);
1750
+ } catch (error) {
1751
+ return failure(serializeError(error).message, "pointer_up_failed");
1752
+ }
1753
+ }
1754
+ });
1755
+ }
1756
+
1757
+ // src/tools/pointer_drag.ts
1758
+ import { tool as tool30 } from "@opencode-ai/plugin";
1759
+ var z30 = tool30.schema;
1760
+ function createPointerDragTool(deps) {
1761
+ return tool30({
1762
+ description: "Drag the pointer between two viewport coordinates.",
1763
+ args: {
1764
+ sessionId: z30.string().describe("Active browser session id"),
1765
+ targetId: z30.string().optional().describe("Optional target id"),
1766
+ fromX: z30.number().describe("Start x coordinate"),
1767
+ fromY: z30.number().describe("Start y coordinate"),
1768
+ toX: z30.number().describe("End x coordinate"),
1769
+ toY: z30.number().describe("End y coordinate"),
1770
+ steps: z30.number().int().positive().optional().describe("Optional drag interpolation step count")
1771
+ },
1772
+ async execute(args) {
1773
+ try {
1774
+ const result = await deps.manager.drag(
1775
+ args.sessionId,
1776
+ { x: args.fromX, y: args.fromY },
1777
+ { x: args.toX, y: args.toY },
1778
+ args.targetId,
1779
+ args.steps
1780
+ );
1781
+ return ok(result);
1782
+ } catch (error) {
1783
+ return failure(serializeError(error).message, "pointer_drag_failed");
1784
+ }
1785
+ }
1786
+ });
1787
+ }
1788
+
1411
1789
  // src/tools/dom_get_html.ts
1412
- import { tool as tool24 } from "@opencode-ai/plugin";
1413
- var z24 = tool24.schema;
1790
+ import { tool as tool31 } from "@opencode-ai/plugin";
1791
+ var z31 = tool31.schema;
1414
1792
  function createDomGetHtmlTool(deps) {
1415
- return tool24({
1793
+ return tool31({
1416
1794
  description: "Get outerHTML for a referenced element.",
1417
1795
  args: {
1418
- sessionId: z24.string().describe("Session id"),
1419
- ref: z24.string().describe("Element ref"),
1420
- maxChars: z24.number().int().optional().describe("Max characters")
1796
+ sessionId: z31.string().describe("Session id"),
1797
+ targetId: z31.string().optional().describe("Optional target id"),
1798
+ ref: z31.string().describe("Element ref"),
1799
+ maxChars: z31.number().int().optional().describe("Max characters")
1421
1800
  },
1422
1801
  async execute(args) {
1423
1802
  try {
1424
1803
  const result = await deps.manager.domGetHtml(
1425
1804
  args.sessionId,
1426
1805
  args.ref,
1427
- args.maxChars ?? 8e3
1806
+ args.maxChars ?? 8e3,
1807
+ args.targetId
1428
1808
  );
1429
1809
  return ok({
1430
1810
  ref: args.ref,
@@ -1439,22 +1819,24 @@ function createDomGetHtmlTool(deps) {
1439
1819
  }
1440
1820
 
1441
1821
  // src/tools/dom_get_text.ts
1442
- import { tool as tool25 } from "@opencode-ai/plugin";
1443
- var z25 = tool25.schema;
1822
+ import { tool as tool32 } from "@opencode-ai/plugin";
1823
+ var z32 = tool32.schema;
1444
1824
  function createDomGetTextTool(deps) {
1445
- return tool25({
1825
+ return tool32({
1446
1826
  description: "Get inner text for a referenced element.",
1447
1827
  args: {
1448
- sessionId: z25.string().describe("Session id"),
1449
- ref: z25.string().describe("Element ref"),
1450
- maxChars: z25.number().int().optional().describe("Max characters")
1828
+ sessionId: z32.string().describe("Session id"),
1829
+ targetId: z32.string().optional().describe("Optional target id"),
1830
+ ref: z32.string().describe("Element ref"),
1831
+ maxChars: z32.number().int().optional().describe("Max characters")
1451
1832
  },
1452
1833
  async execute(args) {
1453
1834
  try {
1454
1835
  const result = await deps.manager.domGetText(
1455
1836
  args.sessionId,
1456
1837
  args.ref,
1457
- args.maxChars ?? 8e3
1838
+ args.maxChars ?? 8e3,
1839
+ args.targetId
1458
1840
  );
1459
1841
  return ok({
1460
1842
  ref: args.ref,
@@ -1469,19 +1851,20 @@ function createDomGetTextTool(deps) {
1469
1851
  }
1470
1852
 
1471
1853
  // src/tools/get_attr.ts
1472
- import { tool as tool26 } from "@opencode-ai/plugin";
1473
- var z26 = tool26.schema;
1854
+ import { tool as tool33 } from "@opencode-ai/plugin";
1855
+ var z33 = tool33.schema;
1474
1856
  function createGetAttrTool(deps) {
1475
- return tool26({
1857
+ return tool33({
1476
1858
  description: "Get a DOM attribute value by ref.",
1477
1859
  args: {
1478
- sessionId: z26.string().describe("Active browser session id"),
1479
- ref: z26.string().describe("Element ref from snapshot"),
1480
- name: z26.string().describe("Attribute name, e.g. href or aria-label")
1860
+ sessionId: z33.string().describe("Active browser session id"),
1861
+ targetId: z33.string().optional().describe("Optional target id"),
1862
+ ref: z33.string().describe("Element ref from snapshot"),
1863
+ name: z33.string().describe("Attribute name, e.g. href or aria-label")
1481
1864
  },
1482
1865
  async execute(args) {
1483
1866
  try {
1484
- const result = await deps.manager.domGetAttr(args.sessionId, args.ref, args.name);
1867
+ const result = await deps.manager.domGetAttr(args.sessionId, args.ref, args.name, args.targetId);
1485
1868
  return ok(result);
1486
1869
  } catch (error) {
1487
1870
  return failure(serializeError(error).message, "get_attr_failed");
@@ -1491,18 +1874,19 @@ function createGetAttrTool(deps) {
1491
1874
  }
1492
1875
 
1493
1876
  // src/tools/get_value.ts
1494
- import { tool as tool27 } from "@opencode-ai/plugin";
1495
- var z27 = tool27.schema;
1877
+ import { tool as tool34 } from "@opencode-ai/plugin";
1878
+ var z34 = tool34.schema;
1496
1879
  function createGetValueTool(deps) {
1497
- return tool27({
1880
+ return tool34({
1498
1881
  description: "Get the input value for an element by ref.",
1499
1882
  args: {
1500
- sessionId: z27.string().describe("Active browser session id"),
1501
- ref: z27.string().describe("Element ref from snapshot")
1883
+ sessionId: z34.string().describe("Active browser session id"),
1884
+ targetId: z34.string().optional().describe("Optional target id"),
1885
+ ref: z34.string().describe("Element ref from snapshot")
1502
1886
  },
1503
1887
  async execute(args) {
1504
1888
  try {
1505
- const result = await deps.manager.domGetValue(args.sessionId, args.ref);
1889
+ const result = await deps.manager.domGetValue(args.sessionId, args.ref, args.targetId);
1506
1890
  return ok(result);
1507
1891
  } catch (error) {
1508
1892
  return failure(serializeError(error).message, "get_value_failed");
@@ -1512,18 +1896,19 @@ function createGetValueTool(deps) {
1512
1896
  }
1513
1897
 
1514
1898
  // src/tools/is_visible.ts
1515
- import { tool as tool28 } from "@opencode-ai/plugin";
1516
- var z28 = tool28.schema;
1899
+ import { tool as tool35 } from "@opencode-ai/plugin";
1900
+ var z35 = tool35.schema;
1517
1901
  function createIsVisibleTool(deps) {
1518
- return tool28({
1902
+ return tool35({
1519
1903
  description: "Check if an element is visible by ref.",
1520
1904
  args: {
1521
- sessionId: z28.string().describe("Active browser session id"),
1522
- ref: z28.string().describe("Element ref from snapshot")
1905
+ sessionId: z35.string().describe("Active browser session id"),
1906
+ targetId: z35.string().optional().describe("Optional target id"),
1907
+ ref: z35.string().describe("Element ref from snapshot")
1523
1908
  },
1524
1909
  async execute(args) {
1525
1910
  try {
1526
- const result = await deps.manager.domIsVisible(args.sessionId, args.ref);
1911
+ const result = await deps.manager.domIsVisible(args.sessionId, args.ref, args.targetId);
1527
1912
  return ok(result);
1528
1913
  } catch (error) {
1529
1914
  return failure(serializeError(error).message, "is_visible_failed");
@@ -1533,18 +1918,19 @@ function createIsVisibleTool(deps) {
1533
1918
  }
1534
1919
 
1535
1920
  // src/tools/is_enabled.ts
1536
- import { tool as tool29 } from "@opencode-ai/plugin";
1537
- var z29 = tool29.schema;
1921
+ import { tool as tool36 } from "@opencode-ai/plugin";
1922
+ var z36 = tool36.schema;
1538
1923
  function createIsEnabledTool(deps) {
1539
- return tool29({
1924
+ return tool36({
1540
1925
  description: "Check if an element is enabled by ref.",
1541
1926
  args: {
1542
- sessionId: z29.string().describe("Active browser session id"),
1543
- ref: z29.string().describe("Element ref from snapshot")
1927
+ sessionId: z36.string().describe("Active browser session id"),
1928
+ targetId: z36.string().optional().describe("Optional target id"),
1929
+ ref: z36.string().describe("Element ref from snapshot")
1544
1930
  },
1545
1931
  async execute(args) {
1546
1932
  try {
1547
- const result = await deps.manager.domIsEnabled(args.sessionId, args.ref);
1933
+ const result = await deps.manager.domIsEnabled(args.sessionId, args.ref, args.targetId);
1548
1934
  return ok(result);
1549
1935
  } catch (error) {
1550
1936
  return failure(serializeError(error).message, "is_enabled_failed");
@@ -1554,18 +1940,19 @@ function createIsEnabledTool(deps) {
1554
1940
  }
1555
1941
 
1556
1942
  // src/tools/is_checked.ts
1557
- import { tool as tool30 } from "@opencode-ai/plugin";
1558
- var z30 = tool30.schema;
1943
+ import { tool as tool37 } from "@opencode-ai/plugin";
1944
+ var z37 = tool37.schema;
1559
1945
  function createIsCheckedTool(deps) {
1560
- return tool30({
1946
+ return tool37({
1561
1947
  description: "Check if an element is checked by ref.",
1562
1948
  args: {
1563
- sessionId: z30.string().describe("Active browser session id"),
1564
- ref: z30.string().describe("Element ref from snapshot")
1949
+ sessionId: z37.string().describe("Active browser session id"),
1950
+ targetId: z37.string().optional().describe("Optional target id"),
1951
+ ref: z37.string().describe("Element ref from snapshot")
1565
1952
  },
1566
1953
  async execute(args) {
1567
1954
  try {
1568
- const result = await deps.manager.domIsChecked(args.sessionId, args.ref);
1955
+ const result = await deps.manager.domIsChecked(args.sessionId, args.ref, args.targetId);
1569
1956
  return ok(result);
1570
1957
  } catch (error) {
1571
1958
  return failure(serializeError(error).message, "is_checked_failed");
@@ -1575,20 +1962,20 @@ function createIsCheckedTool(deps) {
1575
1962
  }
1576
1963
 
1577
1964
  // src/tools/run.ts
1578
- import { tool as tool31 } from "@opencode-ai/plugin";
1579
- var z31 = tool31.schema;
1580
- var stepSchema = z31.object({
1581
- action: z31.string().describe("Action name"),
1582
- args: z31.record(z31.string(), z31.unknown()).optional().describe("Action arguments")
1965
+ import { tool as tool38 } from "@opencode-ai/plugin";
1966
+ var z38 = tool38.schema;
1967
+ var stepSchema = z38.object({
1968
+ action: z38.string().describe("Action name"),
1969
+ args: z38.record(z38.string(), z38.unknown()).optional().describe("Action arguments")
1583
1970
  });
1584
1971
  function createRunTool(deps) {
1585
- return tool31({
1972
+ return tool38({
1586
1973
  description: "Run multiple actions in a single tool call.",
1587
1974
  args: {
1588
- sessionId: z31.string().describe("Session id"),
1589
- steps: z31.array(stepSchema).describe("Steps to execute"),
1590
- stopOnError: z31.boolean().optional().describe("Stop when a step fails"),
1591
- maxSnapshotChars: z31.number().int().optional().describe("Default maxChars for snapshot steps")
1975
+ sessionId: z38.string().describe("Session id"),
1976
+ steps: z38.array(stepSchema).describe("Steps to execute"),
1977
+ stopOnError: z38.boolean().optional().describe("Stop when a step fails"),
1978
+ maxSnapshotChars: z38.number().int().optional().describe("Default maxChars for snapshot steps")
1592
1979
  },
1593
1980
  async execute(args) {
1594
1981
  try {
@@ -1621,13 +2008,13 @@ function normalizeSteps(steps, maxSnapshotChars) {
1621
2008
  }
1622
2009
 
1623
2010
  // src/tools/prompting_guide.ts
1624
- import { tool as tool32 } from "@opencode-ai/plugin";
1625
- var z32 = tool32.schema;
2011
+ import { tool as tool39 } from "@opencode-ai/plugin";
2012
+ var z39 = tool39.schema;
1626
2013
  function createPromptingGuideTool(deps) {
1627
- return tool32({
1628
- description: "Return best-practice prompting guidance for OpenDevBrowser.",
2014
+ return tool39({
2015
+ description: `Start here for first-contact OpenDevBrowser guidance, including ${onboarding_metadata_default.skillName} ${onboarding_metadata_default.skillTopic}.`,
1629
2016
  args: {
1630
- topic: z32.string().optional().describe("Optional topic for guidance")
2017
+ topic: z39.string().optional().describe("Optional topic for guidance")
1631
2018
  },
1632
2019
  async execute(args) {
1633
2020
  try {
@@ -1641,15 +2028,15 @@ function createPromptingGuideTool(deps) {
1641
2028
  }
1642
2029
 
1643
2030
  // src/tools/console_poll.ts
1644
- import { tool as tool33 } from "@opencode-ai/plugin";
1645
- var z33 = tool33.schema;
2031
+ import { tool as tool40 } from "@opencode-ai/plugin";
2032
+ var z40 = tool40.schema;
1646
2033
  function createConsolePollTool(deps) {
1647
- return tool33({
2034
+ return tool40({
1648
2035
  description: "Poll console events for the active target.",
1649
2036
  args: {
1650
- sessionId: z33.string().describe("Session id"),
1651
- sinceSeq: z33.number().int().optional().describe("Sequence to resume from"),
1652
- max: z33.number().int().optional().describe("Max events to return")
2037
+ sessionId: z40.string().describe("Session id"),
2038
+ sinceSeq: z40.number().int().optional().describe("Sequence to resume from"),
2039
+ max: z40.number().int().optional().describe("Max events to return")
1653
2040
  },
1654
2041
  async execute(args) {
1655
2042
  try {
@@ -1667,15 +2054,15 @@ function createConsolePollTool(deps) {
1667
2054
  }
1668
2055
 
1669
2056
  // src/tools/network_poll.ts
1670
- import { tool as tool34 } from "@opencode-ai/plugin";
1671
- var z34 = tool34.schema;
2057
+ import { tool as tool41 } from "@opencode-ai/plugin";
2058
+ var z41 = tool41.schema;
1672
2059
  function createNetworkPollTool(deps) {
1673
- return tool34({
2060
+ return tool41({
1674
2061
  description: "Poll network events for the active target.",
1675
2062
  args: {
1676
- sessionId: z34.string().describe("Session id"),
1677
- sinceSeq: z34.number().int().optional().describe("Sequence to resume from"),
1678
- max: z34.number().int().optional().describe("Max events to return")
2063
+ sessionId: z41.string().describe("Session id"),
2064
+ sinceSeq: z41.number().int().optional().describe("Sequence to resume from"),
2065
+ max: z41.number().int().optional().describe("Max events to return")
1679
2066
  },
1680
2067
  async execute(args) {
1681
2068
  try {
@@ -1693,18 +2080,18 @@ function createNetworkPollTool(deps) {
1693
2080
  }
1694
2081
 
1695
2082
  // src/tools/debug_trace_snapshot.ts
1696
- import { tool as tool35 } from "@opencode-ai/plugin";
1697
- var z35 = tool35.schema;
2083
+ import { tool as tool42 } from "@opencode-ai/plugin";
2084
+ var z42 = tool42.schema;
1698
2085
  function createDebugTraceSnapshotTool(deps) {
1699
- return tool35({
2086
+ return tool42({
1700
2087
  description: "Capture a combined debug trace snapshot (page + console + network + exceptions).",
1701
2088
  args: {
1702
- sessionId: z35.string().describe("Session id"),
1703
- sinceConsoleSeq: z35.number().int().optional().describe("Resume cursor for console events"),
1704
- sinceNetworkSeq: z35.number().int().optional().describe("Resume cursor for network events"),
1705
- sinceExceptionSeq: z35.number().int().optional().describe("Resume cursor for exception events"),
1706
- max: z35.number().int().optional().describe("Max events per channel"),
1707
- requestId: z35.string().optional().describe("Optional trace request id")
2089
+ sessionId: z42.string().describe("Session id"),
2090
+ sinceConsoleSeq: z42.number().int().optional().describe("Resume cursor for console events"),
2091
+ sinceNetworkSeq: z42.number().int().optional().describe("Resume cursor for network events"),
2092
+ sinceExceptionSeq: z42.number().int().optional().describe("Resume cursor for exception events"),
2093
+ max: z42.number().int().optional().describe("Max events per channel"),
2094
+ requestId: z42.string().optional().describe("Optional trace request id")
1708
2095
  },
1709
2096
  async execute(args) {
1710
2097
  try {
@@ -1814,8 +2201,8 @@ function extractHosts(events) {
1814
2201
  }
1815
2202
 
1816
2203
  // src/tools/cookie_import.ts
1817
- import { tool as tool36 } from "@opencode-ai/plugin";
1818
- var z36 = tool36.schema;
2204
+ import { tool as tool43 } from "@opencode-ai/plugin";
2205
+ var z43 = tool43.schema;
1819
2206
  function validateCookieRecord(cookie) {
1820
2207
  const name = cookie.name?.trim();
1821
2208
  if (!name) {
@@ -1894,23 +2281,23 @@ function validateCookieRecord(cookie) {
1894
2281
  };
1895
2282
  }
1896
2283
  function createCookieImportTool(deps) {
1897
- return tool36({
2284
+ return tool43({
1898
2285
  description: "Import validated cookies into the current session context.",
1899
2286
  args: {
1900
- sessionId: z36.string().describe("Session id"),
1901
- cookies: z36.array(z36.object({
1902
- name: z36.string().min(1),
1903
- value: z36.string(),
1904
- url: z36.string().optional(),
1905
- domain: z36.string().optional(),
1906
- path: z36.string().optional(),
1907
- expires: z36.number().optional(),
1908
- httpOnly: z36.boolean().optional(),
1909
- secure: z36.boolean().optional(),
1910
- sameSite: z36.enum(["Strict", "Lax", "None"]).optional()
2287
+ sessionId: z43.string().describe("Session id"),
2288
+ cookies: z43.array(z43.object({
2289
+ name: z43.string().min(1),
2290
+ value: z43.string(),
2291
+ url: z43.string().optional(),
2292
+ domain: z43.string().optional(),
2293
+ path: z43.string().optional(),
2294
+ expires: z43.number().optional(),
2295
+ httpOnly: z43.boolean().optional(),
2296
+ secure: z43.boolean().optional(),
2297
+ sameSite: z43.enum(["Strict", "Lax", "None"]).optional()
1911
2298
  })).min(1).describe("Cookies to import"),
1912
- strict: z36.boolean().optional().describe("Reject on first invalid cookie (default true)"),
1913
- requestId: z36.string().optional().describe("Optional trace request id")
2299
+ strict: z43.boolean().optional().describe("Reject on first invalid cookie (default true)"),
2300
+ requestId: z43.string().optional().describe("Optional trace request id")
1914
2301
  },
1915
2302
  async execute(args) {
1916
2303
  try {
@@ -1952,8 +2339,8 @@ function createCookieImportTool(deps) {
1952
2339
  }
1953
2340
 
1954
2341
  // src/tools/cookie_list.ts
1955
- import { tool as tool37 } from "@opencode-ai/plugin";
1956
- var z37 = tool37.schema;
2342
+ import { tool as tool44 } from "@opencode-ai/plugin";
2343
+ var z44 = tool44.schema;
1957
2344
  function normalizeCookieUrls(urls) {
1958
2345
  if (!urls || urls.length === 0) {
1959
2346
  return void 0;
@@ -1984,12 +2371,12 @@ function normalizeCookieUrls(urls) {
1984
2371
  return normalized;
1985
2372
  }
1986
2373
  function createCookieListTool(deps) {
1987
- return tool37({
2374
+ return tool44({
1988
2375
  description: "List cookies in the current session context with optional URL filtering.",
1989
2376
  args: {
1990
- sessionId: z37.string().describe("Session id"),
1991
- urls: z37.array(z37.string().min(1)).optional().describe("Optional URL filters for cookie scoping"),
1992
- requestId: z37.string().optional().describe("Optional trace request id")
2377
+ sessionId: z44.string().describe("Session id"),
2378
+ urls: z44.array(z44.string().min(1)).optional().describe("Optional URL filters for cookie scoping"),
2379
+ requestId: z44.string().optional().describe("Optional trace request id")
1993
2380
  },
1994
2381
  async execute(args) {
1995
2382
  try {
@@ -2029,11 +2416,24 @@ function createCookieListTool(deps) {
2029
2416
  }
2030
2417
 
2031
2418
  // src/tools/macro_resolve.ts
2032
- import { tool as tool38 } from "@opencode-ai/plugin";
2033
- var z38 = tool38.schema;
2419
+ import { tool as tool45 } from "@opencode-ai/plugin";
2420
+
2421
+ // src/tools/workflow-runtime.ts
2422
+ var resolveProviderRuntime = async (deps, options) => {
2423
+ return resolveBundledProviderRuntime({
2424
+ existingRuntime: deps.providerRuntime,
2425
+ config: deps.config?.get?.(),
2426
+ manager: deps.manager,
2427
+ browserFallbackPort: deps.browserFallbackPort,
2428
+ init: options?.init
2429
+ });
2430
+ };
2431
+
2432
+ // src/tools/macro_resolve.ts
2433
+ var z45 = tool45.schema;
2034
2434
  async function loadMacroRuntime() {
2035
2435
  try {
2036
- const module = await import("./macros-NUBRM44Y.js");
2436
+ const module = await import("./macros-ND2M7LWU.js");
2037
2437
  return module;
2038
2438
  } catch {
2039
2439
  return null;
@@ -2078,13 +2478,13 @@ function parseFallbackMacro(expression, defaultProvider) {
2078
2478
  };
2079
2479
  }
2080
2480
  function createMacroResolveTool(deps) {
2081
- return tool38({
2481
+ return tool45({
2082
2482
  description: "Resolve a macro expression to a provider action with provenance metadata.",
2083
2483
  args: {
2084
- expression: z38.string().min(2).describe('Macro expression, e.g. @web.search("query")'),
2085
- defaultProvider: z38.string().optional().describe("Default provider fallback"),
2086
- includeCatalog: z38.boolean().optional().describe("Include available runtime macro names"),
2087
- execute: z38.boolean().optional().describe("Execute the resolved provider action and include execution payload")
2484
+ expression: z45.string().min(2).describe('Macro expression, e.g. @web.search("query")'),
2485
+ defaultProvider: z45.string().optional().describe("Default provider fallback"),
2486
+ includeCatalog: z45.boolean().optional().describe("Include available runtime macro names"),
2487
+ execute: z45.boolean().optional().describe("Execute the resolved provider action and include execution payload")
2088
2488
  },
2089
2489
  async execute(args) {
2090
2490
  try {
@@ -2113,15 +2513,11 @@ function createMacroResolveTool(deps) {
2113
2513
  ...catalog ? { catalog } : {}
2114
2514
  });
2115
2515
  }
2116
- const runtimeConfig = deps.config?.get?.();
2117
- const providerRuntime = deps.providerRuntime ?? createConfiguredProviderRuntime({
2118
- config: runtimeConfig,
2119
- manager: deps.manager,
2120
- browserFallbackPort: deps.browserFallbackPort
2516
+ const providerRuntime = await resolveProviderRuntime(deps);
2517
+ const execution = await executeMacroWithRuntime({
2518
+ resolution,
2519
+ runtime: providerRuntime
2121
2520
  });
2122
- const execution = shapeExecutionPayload(
2123
- await executeMacroResolution(resolution, providerRuntime)
2124
- );
2125
2521
  return ok({
2126
2522
  runtime: resolvedRuntime,
2127
2523
  resolution,
@@ -2136,17 +2532,18 @@ function createMacroResolveTool(deps) {
2136
2532
  }
2137
2533
 
2138
2534
  // src/tools/clone_page.ts
2139
- import { tool as tool39 } from "@opencode-ai/plugin";
2140
- var z39 = tool39.schema;
2535
+ import { tool as tool46 } from "@opencode-ai/plugin";
2536
+ var z46 = tool46.schema;
2141
2537
  function createClonePageTool(deps) {
2142
- return tool39({
2538
+ return tool46({
2143
2539
  description: "Export the active page as a React component and CSS bundle.",
2144
2540
  args: {
2145
- sessionId: z39.string().describe("Active browser session id")
2541
+ sessionId: z46.string().describe("Active browser session id"),
2542
+ targetId: z46.string().optional().describe("Optional target id")
2146
2543
  },
2147
2544
  async execute(args) {
2148
2545
  try {
2149
- const result = await deps.manager.clonePage(args.sessionId);
2546
+ const result = await deps.manager.clonePage(args.sessionId, args.targetId);
2150
2547
  return ok({ component: result.component, css: result.css, warnings: result.warnings });
2151
2548
  } catch (error) {
2152
2549
  return failure(serializeError(error).message, "clone_page_failed");
@@ -2156,18 +2553,19 @@ function createClonePageTool(deps) {
2156
2553
  }
2157
2554
 
2158
2555
  // src/tools/clone_component.ts
2159
- import { tool as tool40 } from "@opencode-ai/plugin";
2160
- var z40 = tool40.schema;
2556
+ import { tool as tool47 } from "@opencode-ai/plugin";
2557
+ var z47 = tool47.schema;
2161
2558
  function createCloneComponentTool(deps) {
2162
- return tool40({
2559
+ return tool47({
2163
2560
  description: "Export a selected element subtree as a React component and CSS bundle.",
2164
2561
  args: {
2165
- sessionId: z40.string().describe("Active browser session id"),
2166
- ref: z40.string().describe("Element ref from snapshot")
2562
+ sessionId: z47.string().describe("Active browser session id"),
2563
+ targetId: z47.string().optional().describe("Optional target id"),
2564
+ ref: z47.string().describe("Element ref from snapshot")
2167
2565
  },
2168
2566
  async execute(args) {
2169
2567
  try {
2170
- const result = await deps.manager.cloneComponent(args.sessionId, args.ref);
2568
+ const result = await deps.manager.cloneComponent(args.sessionId, args.ref, args.targetId);
2171
2569
  return ok({ component: result.component, css: result.css, warnings: result.warnings });
2172
2570
  } catch (error) {
2173
2571
  return failure(serializeError(error).message, "clone_component_failed");
@@ -2177,17 +2575,18 @@ function createCloneComponentTool(deps) {
2177
2575
  }
2178
2576
 
2179
2577
  // src/tools/perf.ts
2180
- import { tool as tool41 } from "@opencode-ai/plugin";
2181
- var z41 = tool41.schema;
2578
+ import { tool as tool48 } from "@opencode-ai/plugin";
2579
+ var z48 = tool48.schema;
2182
2580
  function createPerfTool(deps) {
2183
- return tool41({
2581
+ return tool48({
2184
2582
  description: "Fetch lightweight performance metrics from the active page.",
2185
2583
  args: {
2186
- sessionId: z41.string().describe("Active browser session id")
2584
+ sessionId: z48.string().describe("Active browser session id"),
2585
+ targetId: z48.string().optional().describe("Optional target id")
2187
2586
  },
2188
2587
  async execute(args) {
2189
2588
  try {
2190
- const result = await deps.manager.perfMetrics(args.sessionId);
2589
+ const result = await deps.manager.perfMetrics(args.sessionId, args.targetId);
2191
2590
  return ok({ metrics: result.metrics });
2192
2591
  } catch (error) {
2193
2592
  return failure(serializeError(error).message, "perf_failed");
@@ -2197,18 +2596,26 @@ function createPerfTool(deps) {
2197
2596
  }
2198
2597
 
2199
2598
  // src/tools/screenshot.ts
2200
- import { tool as tool42 } from "@opencode-ai/plugin";
2201
- var z42 = tool42.schema;
2599
+ import { tool as tool49 } from "@opencode-ai/plugin";
2600
+ var z49 = tool49.schema;
2202
2601
  function createScreenshotTool(deps) {
2203
- return tool42({
2602
+ return tool49({
2204
2603
  description: "Capture a screenshot of the active page.",
2205
2604
  args: {
2206
- sessionId: z42.string().describe("Active browser session id"),
2207
- path: z42.string().optional().describe("Optional output file path")
2605
+ sessionId: z49.string().describe("Active browser session id"),
2606
+ targetId: z49.string().optional().describe("Optional target id"),
2607
+ path: z49.string().optional().describe("Optional output file path"),
2608
+ ref: z49.string().optional().describe("Optional snapshot ref for an element capture"),
2609
+ fullPage: z49.boolean().optional().describe("Capture the full scrollable page")
2208
2610
  },
2209
2611
  async execute(args) {
2210
2612
  try {
2211
- const result = await deps.manager.screenshot(args.sessionId, args.path);
2613
+ const result = await deps.manager.screenshot(args.sessionId, {
2614
+ targetId: args.targetId,
2615
+ path: args.path,
2616
+ ref: args.ref,
2617
+ fullPage: args.fullPage
2618
+ });
2212
2619
  return ok(result);
2213
2620
  } catch (error) {
2214
2621
  return failure(serializeError(error).message, "screenshot_failed");
@@ -2217,29 +2624,273 @@ function createScreenshotTool(deps) {
2217
2624
  });
2218
2625
  }
2219
2626
 
2627
+ // src/tools/screencast_start.ts
2628
+ import { tool as tool50 } from "@opencode-ai/plugin";
2629
+ var z50 = tool50.schema;
2630
+ function createScreencastStartTool(deps) {
2631
+ return tool50({
2632
+ description: "Start a browser screencast replay capture.",
2633
+ args: {
2634
+ sessionId: z50.string().describe("Active browser session id"),
2635
+ targetId: z50.string().optional().describe("Optional target id"),
2636
+ outputDir: z50.string().optional().describe("Optional screencast output directory"),
2637
+ intervalMs: z50.number().int().min(250).optional().describe("Frame capture interval in milliseconds"),
2638
+ maxFrames: z50.number().int().min(1).optional().describe("Maximum frame count before auto-stop")
2639
+ },
2640
+ async execute(args) {
2641
+ try {
2642
+ const result = await deps.manager.startScreencast(args.sessionId, {
2643
+ targetId: args.targetId,
2644
+ outputDir: args.outputDir,
2645
+ intervalMs: args.intervalMs,
2646
+ maxFrames: args.maxFrames
2647
+ });
2648
+ return ok(result);
2649
+ } catch (error) {
2650
+ return failure(serializeError(error).message, "screencast_start_failed");
2651
+ }
2652
+ }
2653
+ });
2654
+ }
2655
+
2656
+ // src/tools/screencast_stop.ts
2657
+ import { tool as tool51 } from "@opencode-ai/plugin";
2658
+ var z51 = tool51.schema;
2659
+ function createScreencastStopTool(deps) {
2660
+ return tool51({
2661
+ description: "Stop a browser screencast replay capture.",
2662
+ args: {
2663
+ sessionId: z51.string().describe("Browser session id that owns the screencast"),
2664
+ screencastId: z51.string().describe("Active screencast id")
2665
+ },
2666
+ async execute(args) {
2667
+ try {
2668
+ const result = await deps.manager.stopScreencast(args.sessionId, args.screencastId);
2669
+ return ok(result);
2670
+ } catch (error) {
2671
+ return failure(serializeError(error).message, "screencast_stop_failed");
2672
+ }
2673
+ }
2674
+ });
2675
+ }
2676
+
2677
+ // src/tools/dialog.ts
2678
+ import { tool as tool52 } from "@opencode-ai/plugin";
2679
+ var z52 = tool52.schema;
2680
+ function createDialogTool(deps) {
2681
+ return tool52({
2682
+ description: "Inspect or handle a JavaScript dialog.",
2683
+ args: {
2684
+ sessionId: z52.string().describe("Active browser session id"),
2685
+ targetId: z52.string().optional().describe("Optional target id"),
2686
+ action: z52.enum(["status", "accept", "dismiss"]).optional().describe("Dialog action"),
2687
+ promptText: z52.string().optional().describe("Prompt text to submit when accepting a prompt dialog")
2688
+ },
2689
+ async execute(args) {
2690
+ try {
2691
+ const result = await deps.manager.dialog(args.sessionId, {
2692
+ targetId: args.targetId,
2693
+ action: args.action,
2694
+ promptText: args.promptText
2695
+ });
2696
+ return ok(result);
2697
+ } catch (error) {
2698
+ return failure(serializeError(error).message, "dialog_failed");
2699
+ }
2700
+ }
2701
+ });
2702
+ }
2703
+
2704
+ // src/tools/desktop_status.ts
2705
+ import { tool as tool53 } from "@opencode-ai/plugin";
2706
+
2707
+ // src/tools/desktop-shared.ts
2708
+ function isRecord(value) {
2709
+ return typeof value === "object" && value !== null && !Array.isArray(value);
2710
+ }
2711
+ function requireDesktopRuntime(deps) {
2712
+ if (deps.desktopRuntime) {
2713
+ return deps.desktopRuntime;
2714
+ }
2715
+ return failure("Desktop runtime unavailable.", "desktop_runtime_unavailable");
2716
+ }
2717
+ function desktopResult(result) {
2718
+ if (result.ok) {
2719
+ const payload = isRecord(result.value) ? { ok: true, ...result.value, audit: result.audit } : { ok: true, value: result.value, audit: result.audit };
2720
+ return JSON.stringify(payload);
2721
+ }
2722
+ return JSON.stringify({
2723
+ ok: false,
2724
+ code: result.code,
2725
+ message: result.message,
2726
+ audit: result.audit
2727
+ });
2728
+ }
2729
+ function desktopToolFailure(error, code) {
2730
+ return failure(serializeError(error).message, code);
2731
+ }
2732
+
2733
+ // src/tools/desktop_status.ts
2734
+ function createDesktopStatusTool(deps) {
2735
+ return tool53({
2736
+ description: "Inspect sibling desktop observation availability.",
2737
+ args: {},
2738
+ async execute() {
2739
+ const runtime = requireDesktopRuntime(deps);
2740
+ if (typeof runtime === "string") {
2741
+ return runtime;
2742
+ }
2743
+ try {
2744
+ return ok(await runtime.status());
2745
+ } catch (error) {
2746
+ return desktopToolFailure(error, "desktop_status_failed");
2747
+ }
2748
+ }
2749
+ });
2750
+ }
2751
+
2752
+ // src/tools/desktop_windows.ts
2753
+ import { tool as tool54 } from "@opencode-ai/plugin";
2754
+ var z53 = tool54.schema;
2755
+ function createDesktopWindowsTool(deps) {
2756
+ return tool54({
2757
+ description: "List observable desktop windows.",
2758
+ args: {
2759
+ reason: z53.string().optional().describe("Optional audit reason")
2760
+ },
2761
+ async execute(args) {
2762
+ const runtime = requireDesktopRuntime(deps);
2763
+ if (typeof runtime === "string") {
2764
+ return runtime;
2765
+ }
2766
+ try {
2767
+ return desktopResult(await runtime.listWindows(args.reason));
2768
+ } catch (error) {
2769
+ return desktopToolFailure(error, "desktop_windows_failed");
2770
+ }
2771
+ }
2772
+ });
2773
+ }
2774
+
2775
+ // src/tools/desktop_active_window.ts
2776
+ import { tool as tool55 } from "@opencode-ai/plugin";
2777
+ var z54 = tool55.schema;
2778
+ function createDesktopActiveWindowTool(deps) {
2779
+ return tool55({
2780
+ description: "Inspect the active desktop window.",
2781
+ args: {
2782
+ reason: z54.string().optional().describe("Optional audit reason")
2783
+ },
2784
+ async execute(args) {
2785
+ const runtime = requireDesktopRuntime(deps);
2786
+ if (typeof runtime === "string") {
2787
+ return runtime;
2788
+ }
2789
+ try {
2790
+ return desktopResult(await runtime.activeWindow(args.reason));
2791
+ } catch (error) {
2792
+ return desktopToolFailure(error, "desktop_active_window_failed");
2793
+ }
2794
+ }
2795
+ });
2796
+ }
2797
+
2798
+ // src/tools/desktop_capture_desktop.ts
2799
+ import { tool as tool56 } from "@opencode-ai/plugin";
2800
+ var z55 = tool56.schema;
2801
+ function createDesktopCaptureDesktopTool(deps) {
2802
+ return tool56({
2803
+ description: "Capture the current desktop surface.",
2804
+ args: {
2805
+ reason: z55.string().describe("Audit reason for the capture")
2806
+ },
2807
+ async execute(args) {
2808
+ const runtime = requireDesktopRuntime(deps);
2809
+ if (typeof runtime === "string") {
2810
+ return runtime;
2811
+ }
2812
+ try {
2813
+ return desktopResult(await runtime.captureDesktop({ reason: args.reason }));
2814
+ } catch (error) {
2815
+ return desktopToolFailure(error, "desktop_capture_desktop_failed");
2816
+ }
2817
+ }
2818
+ });
2819
+ }
2820
+
2821
+ // src/tools/desktop_capture_window.ts
2822
+ import { tool as tool57 } from "@opencode-ai/plugin";
2823
+ var z56 = tool57.schema;
2824
+ function createDesktopCaptureWindowTool(deps) {
2825
+ return tool57({
2826
+ description: "Capture a specific desktop window.",
2827
+ args: {
2828
+ windowId: z56.string().describe("Desktop window id"),
2829
+ reason: z56.string().describe("Audit reason for the capture")
2830
+ },
2831
+ async execute(args) {
2832
+ const runtime = requireDesktopRuntime(deps);
2833
+ if (typeof runtime === "string") {
2834
+ return runtime;
2835
+ }
2836
+ try {
2837
+ return desktopResult(await runtime.captureWindow(args.windowId, { reason: args.reason }));
2838
+ } catch (error) {
2839
+ return desktopToolFailure(error, "desktop_capture_window_failed");
2840
+ }
2841
+ }
2842
+ });
2843
+ }
2844
+
2845
+ // src/tools/desktop_accessibility_snapshot.ts
2846
+ import { tool as tool58 } from "@opencode-ai/plugin";
2847
+ var z57 = tool58.schema;
2848
+ function createDesktopAccessibilitySnapshotTool(deps) {
2849
+ return tool58({
2850
+ description: "Capture desktop accessibility state.",
2851
+ args: {
2852
+ reason: z57.string().describe("Audit reason for the accessibility snapshot"),
2853
+ windowId: z57.string().optional().describe("Optional desktop window id")
2854
+ },
2855
+ async execute(args) {
2856
+ const runtime = requireDesktopRuntime(deps);
2857
+ if (typeof runtime === "string") {
2858
+ return runtime;
2859
+ }
2860
+ try {
2861
+ return desktopResult(await runtime.accessibilitySnapshot(args.reason, args.windowId));
2862
+ } catch (error) {
2863
+ return desktopToolFailure(error, "desktop_accessibility_snapshot_failed");
2864
+ }
2865
+ }
2866
+ });
2867
+ }
2868
+
2220
2869
  // src/tools/annotate.ts
2221
- import { tool as tool43 } from "@opencode-ai/plugin";
2222
- var z43 = tool43.schema;
2223
- var screenshotModeSchema = z43.enum(["visible", "full", "none"]);
2224
- var transportSchema = z43.enum(["auto", "direct", "relay"]);
2870
+ import { tool as tool59 } from "@opencode-ai/plugin";
2871
+ var z58 = tool59.schema;
2872
+ var screenshotModeSchema = z58.enum(["visible", "full", "none"]);
2873
+ var transportSchema = z58.enum(["auto", "direct", "relay"]);
2225
2874
  function createAnnotateTool(deps) {
2226
- return tool43({
2875
+ return tool59({
2227
2876
  description: "Request interactive annotations via direct (CDP) or relay transport.",
2228
2877
  args: {
2229
- sessionId: z43.string().describe("Session id"),
2878
+ sessionId: z58.string().describe("Session id"),
2879
+ stored: z58.boolean().optional().describe("Fetch the latest payload explicitly sent from popup/canvas surfaces"),
2880
+ includeScreenshots: z58.boolean().optional().describe("When fetching stored payloads, prefer screenshots if still available in memory"),
2230
2881
  transport: transportSchema.optional().describe("auto | direct | relay (default: auto)"),
2231
- targetId: z43.string().optional().describe("Optional target id for direct mode"),
2232
- tabId: z43.number().int().optional().describe("Optional Chrome tab id for relay mode"),
2233
- url: z43.string().optional().describe("Optional URL to open before annotating"),
2882
+ targetId: z58.string().optional().describe("Optional target id for direct mode"),
2883
+ tabId: z58.number().int().optional().describe("Optional Chrome tab id for relay mode"),
2884
+ url: z58.string().optional().describe("Optional URL to open before annotating"),
2234
2885
  screenshotMode: screenshotModeSchema.optional().describe("visible | full | none (default: visible)"),
2235
- debug: z43.boolean().optional().describe("Include debug metadata"),
2236
- context: z43.string().optional().describe("Optional context for the annotator"),
2237
- timeoutMs: z43.number().int().optional().describe("Timeout in milliseconds")
2886
+ debug: z58.boolean().optional().describe("Include debug metadata"),
2887
+ context: z58.string().optional().describe("Optional context for the annotator"),
2888
+ timeoutMs: z58.number().int().optional().describe("Timeout in milliseconds")
2238
2889
  },
2239
2890
  async execute(args) {
2240
2891
  try {
2241
- const transport = args.transport ?? "auto";
2242
- if (transport === "relay") {
2892
+ const transport = args.stored ? "relay" : args.transport ?? "auto";
2893
+ if (transport === "relay" && !args.stored) {
2243
2894
  const status = await deps.manager.status(args.sessionId);
2244
2895
  if (status.mode !== "extension") {
2245
2896
  return failure("Annotations require extension mode (relay).", "annotate_requires_extension");
@@ -2248,6 +2899,8 @@ function createAnnotateTool(deps) {
2248
2899
  const response = await deps.annotationManager.requestAnnotation({
2249
2900
  sessionId: args.sessionId,
2250
2901
  transport,
2902
+ stored: args.stored ?? false,
2903
+ includeScreenshots: args.includeScreenshots ?? true,
2251
2904
  targetId: args.targetId,
2252
2905
  tabId: args.tabId,
2253
2906
  url: args.url,
@@ -2256,6 +2909,12 @@ function createAnnotateTool(deps) {
2256
2909
  context: args.context,
2257
2910
  timeoutMs: args.timeoutMs
2258
2911
  });
2912
+ if (response.status === "cancelled") {
2913
+ return ok({
2914
+ cancelled: true,
2915
+ message: response.error?.message ?? "Annotation cancelled."
2916
+ });
2917
+ }
2259
2918
  if (response.status !== "ok" || !response.payload) {
2260
2919
  const message2 = response.error?.message ?? "Annotation failed.";
2261
2920
  const code = response.error?.code ?? "annotate_failed";
@@ -2275,47 +2934,36 @@ function createAnnotateTool(deps) {
2275
2934
  }
2276
2935
 
2277
2936
  // src/tools/research_run.ts
2278
- import { tool as tool44 } from "@opencode-ai/plugin";
2279
-
2280
- // src/tools/workflow-runtime.ts
2281
- var resolveProviderRuntime = (deps) => {
2282
- if (deps.providerRuntime) {
2283
- return deps.providerRuntime;
2284
- }
2285
- return createConfiguredProviderRuntime({
2286
- config: deps.config?.get?.(),
2287
- manager: deps.manager,
2288
- browserFallbackPort: deps.browserFallbackPort
2289
- });
2290
- };
2291
-
2292
- // src/tools/research_run.ts
2293
- var z44 = tool44.schema;
2294
- var sourceSelectionSchema = z44.enum(["auto", "web", "community", "social", "shopping", "all"]);
2295
- var sourceSchema = z44.enum(["web", "community", "social", "shopping"]);
2296
- var modeSchema = z44.enum(["compact", "json", "md", "context", "path"]);
2297
- var cookiePolicySchema = z44.enum(["off", "auto", "required"]);
2937
+ import { tool as tool60 } from "@opencode-ai/plugin";
2938
+ var z59 = tool60.schema;
2939
+ var sourceSelectionSchema = z59.enum(["auto", "web", "community", "social", "shopping", "all"]);
2940
+ var sourceSchema = z59.enum(["web", "community", "social", "shopping"]);
2941
+ var modeSchema = z59.enum(["compact", "json", "md", "context", "path"]);
2942
+ var cookiePolicySchema = z59.enum(["off", "auto", "required"]);
2943
+ var challengeAutomationModeSchema = z59.enum(CHALLENGE_AUTOMATION_MODES);
2298
2944
  function createResearchRunTool(deps) {
2299
- return tool44({
2945
+ return tool60({
2300
2946
  description: "Run cross-source research with strict timebox and artifact outputs.",
2301
2947
  args: {
2302
- topic: z44.string().min(1).describe("Research topic"),
2303
- days: z44.number().int().positive().optional().describe("Timebox in days"),
2304
- from: z44.string().optional().describe("ISO start date"),
2305
- to: z44.string().optional().describe("ISO end date"),
2948
+ topic: z59.string().min(1).describe("Research topic"),
2949
+ days: z59.number().int().positive().optional().describe("Timebox in days"),
2950
+ from: z59.string().optional().describe("ISO start date"),
2951
+ to: z59.string().optional().describe("ISO end date"),
2306
2952
  sourceSelection: sourceSelectionSchema.optional().describe("auto|web|community|social|shopping|all"),
2307
- sources: z44.array(sourceSchema).optional().describe("Explicit source list"),
2953
+ sources: z59.array(sourceSchema).optional().describe("Explicit source list"),
2308
2954
  mode: modeSchema.optional().describe("compact|json|md|context|path"),
2309
- includeEngagement: z44.boolean().optional().describe("Include engagement enrichment"),
2310
- limitPerSource: z44.number().int().positive().optional().describe("Result limit per source"),
2311
- outputDir: z44.string().optional().describe("Optional artifact output directory"),
2312
- ttlHours: z44.number().int().positive().optional().describe("Artifact retention TTL in hours"),
2313
- useCookies: z44.boolean().optional().describe("Enable/disable provider cookie injection for this run"),
2955
+ includeEngagement: z59.boolean().optional().describe("Include engagement enrichment"),
2956
+ limitPerSource: z59.number().int().positive().optional().describe("Result limit per source"),
2957
+ outputDir: z59.string().optional().describe("Optional artifact output directory"),
2958
+ ttlHours: z59.number().int().positive().optional().describe("Artifact retention TTL in hours"),
2959
+ useCookies: z59.boolean().optional().describe("Enable/disable provider cookie injection for this run"),
2960
+ challengeAutomationMode: challengeAutomationModeSchema.optional().describe("Challenge automation mode: off|browser|browser_with_helper"),
2314
2961
  cookiePolicyOverride: cookiePolicySchema.optional().describe("Override cookie policy: off|auto|required")
2315
2962
  },
2316
2963
  async execute(args) {
2317
2964
  try {
2318
- const runtime = resolveProviderRuntime(deps);
2965
+ const runtime = await resolveProviderRuntime(deps);
2966
+ const { runResearchWorkflow } = await import("./providers-G36AM3Z2.js");
2319
2967
  const result = await runResearchWorkflow(runtime, {
2320
2968
  topic: args.topic,
2321
2969
  days: args.days,
@@ -2329,6 +2977,7 @@ function createResearchRunTool(deps) {
2329
2977
  outputDir: args.outputDir,
2330
2978
  ttlHours: args.ttlHours,
2331
2979
  useCookies: args.useCookies,
2980
+ challengeAutomationMode: args.challengeAutomationMode,
2332
2981
  cookiePolicyOverride: args.cookiePolicyOverride
2333
2982
  });
2334
2983
  return ok(result);
@@ -2340,29 +2989,32 @@ function createResearchRunTool(deps) {
2340
2989
  }
2341
2990
 
2342
2991
  // src/tools/shopping_run.ts
2343
- import { tool as tool45 } from "@opencode-ai/plugin";
2344
- var z45 = tool45.schema;
2345
- var sortSchema = z45.enum(["best_deal", "lowest_price", "highest_rating", "fastest_shipping"]);
2346
- var modeSchema2 = z45.enum(["compact", "json", "md", "context", "path"]);
2347
- var cookiePolicySchema2 = z45.enum(["off", "auto", "required"]);
2992
+ import { tool as tool61 } from "@opencode-ai/plugin";
2993
+ var z60 = tool61.schema;
2994
+ var sortSchema = z60.enum(["best_deal", "lowest_price", "highest_rating", "fastest_shipping"]);
2995
+ var modeSchema2 = z60.enum(["compact", "json", "md", "context", "path"]);
2996
+ var cookiePolicySchema2 = z60.enum(["off", "auto", "required"]);
2997
+ var challengeAutomationModeSchema2 = z60.enum(CHALLENGE_AUTOMATION_MODES);
2348
2998
  function createShoppingRunTool(deps) {
2349
- return tool45({
2999
+ return tool61({
2350
3000
  description: "Run shopping/deal intelligence across shopping providers.",
2351
3001
  args: {
2352
- query: z45.string().min(1).describe("Shopping query"),
2353
- providers: z45.array(z45.string()).optional().describe("Optional provider allow-list"),
2354
- budget: z45.number().positive().optional().describe("Optional budget amount"),
2355
- region: z45.string().optional().describe("Region hint"),
3002
+ query: z60.string().min(1).describe("Shopping query"),
3003
+ providers: z60.array(z60.string()).optional().describe("Optional provider allow-list"),
3004
+ budget: z60.number().positive().optional().describe("Optional budget amount"),
3005
+ region: z60.string().optional().describe("Region hint"),
2356
3006
  sort: sortSchema.optional().describe("best_deal|lowest_price|highest_rating|fastest_shipping"),
2357
3007
  mode: modeSchema2.optional().describe("compact|json|md|context|path"),
2358
- outputDir: z45.string().optional().describe("Optional artifact output directory"),
2359
- ttlHours: z45.number().int().positive().optional().describe("Artifact retention TTL in hours"),
2360
- useCookies: z45.boolean().optional().describe("Enable/disable provider cookie injection for this run"),
3008
+ outputDir: z60.string().optional().describe("Optional artifact output directory"),
3009
+ ttlHours: z60.number().int().positive().optional().describe("Artifact retention TTL in hours"),
3010
+ useCookies: z60.boolean().optional().describe("Enable/disable provider cookie injection for this run"),
3011
+ challengeAutomationMode: challengeAutomationModeSchema2.optional().describe("Challenge automation mode: off|browser|browser_with_helper"),
2361
3012
  cookiePolicyOverride: cookiePolicySchema2.optional().describe("Override cookie policy: off|auto|required")
2362
3013
  },
2363
3014
  async execute(args) {
2364
3015
  try {
2365
- const runtime = resolveProviderRuntime(deps);
3016
+ const runtime = await resolveProviderRuntime(deps);
3017
+ const { runShoppingWorkflow } = await import("./providers-G36AM3Z2.js");
2366
3018
  const result = await runShoppingWorkflow(runtime, {
2367
3019
  query: args.query,
2368
3020
  providers: args.providers,
@@ -2373,6 +3025,7 @@ function createShoppingRunTool(deps) {
2373
3025
  outputDir: args.outputDir,
2374
3026
  ttlHours: args.ttlHours,
2375
3027
  useCookies: args.useCookies,
3028
+ challengeAutomationMode: args.challengeAutomationMode,
2376
3029
  cookiePolicyOverride: args.cookiePolicyOverride
2377
3030
  });
2378
3031
  return ok(result);
@@ -2384,9 +3037,10 @@ function createShoppingRunTool(deps) {
2384
3037
  }
2385
3038
 
2386
3039
  // src/tools/product_video_run.ts
2387
- import { tool as tool46 } from "@opencode-ai/plugin";
2388
- var z46 = tool46.schema;
2389
- var cookiePolicySchema3 = z46.enum(["off", "auto", "required"]);
3040
+ import { tool as tool62 } from "@opencode-ai/plugin";
3041
+ var z61 = tool62.schema;
3042
+ var cookiePolicySchema3 = z61.enum(["off", "auto", "required"]);
3043
+ var challengeAutomationModeSchema3 = z61.enum(CHALLENGE_AUTOMATION_MODES);
2390
3044
  async function captureScreenshotBuffer(deps, url) {
2391
3045
  let sessionId = null;
2392
3046
  try {
@@ -2410,23 +3064,26 @@ async function captureScreenshotBuffer(deps, url) {
2410
3064
  }
2411
3065
  }
2412
3066
  function createProductVideoRunTool(deps) {
2413
- return tool46({
3067
+ return tool62({
2414
3068
  description: "Collect a product presentation asset pack for video/UGC workflows.",
2415
3069
  args: {
2416
- product_url: z46.string().optional().describe("Product URL"),
2417
- product_name: z46.string().optional().describe("Product name"),
2418
- provider_hint: z46.string().optional().describe("Optional provider hint"),
2419
- include_screenshots: z46.boolean().optional().describe("Include screenshots (default true)"),
2420
- include_all_images: z46.boolean().optional().describe("Include all discovered images (default true)"),
2421
- include_copy: z46.boolean().optional().describe("Include product copy extraction (default true)"),
2422
- output_dir: z46.string().optional().describe("Optional output directory"),
2423
- ttl_hours: z46.number().int().positive().optional().describe("Artifact retention TTL in hours"),
2424
- useCookies: z46.boolean().optional().describe("Enable/disable provider cookie injection for this run"),
3070
+ product_url: z61.string().optional().describe("Product URL"),
3071
+ product_name: z61.string().optional().describe("Product name"),
3072
+ provider_hint: z61.string().optional().describe("Optional provider hint"),
3073
+ include_screenshots: z61.boolean().optional().describe("Include screenshots (default true)"),
3074
+ include_all_images: z61.boolean().optional().describe("Include all discovered images (default true)"),
3075
+ include_copy: z61.boolean().optional().describe("Include product copy extraction (default true)"),
3076
+ output_dir: z61.string().optional().describe("Optional output directory"),
3077
+ ttl_hours: z61.number().int().positive().optional().describe("Artifact retention TTL in hours"),
3078
+ timeoutMs: z61.number().int().positive().optional().describe("Workflow timeout in milliseconds"),
3079
+ useCookies: z61.boolean().optional().describe("Enable/disable provider cookie injection for this run"),
3080
+ challengeAutomationMode: challengeAutomationModeSchema3.optional().describe("Challenge automation mode: off|browser|browser_with_helper"),
2425
3081
  cookiePolicyOverride: cookiePolicySchema3.optional().describe("Override cookie policy: off|auto|required")
2426
3082
  },
2427
3083
  async execute(args) {
2428
3084
  try {
2429
- const runtime = resolveProviderRuntime(deps);
3085
+ const runtime = await resolveProviderRuntime(deps);
3086
+ const { runProductVideoWorkflow } = await import("./providers-G36AM3Z2.js");
2430
3087
  const includeScreenshots = args.include_screenshots ?? true;
2431
3088
  const result = await runProductVideoWorkflow(runtime, {
2432
3089
  product_url: args.product_url,
@@ -2437,7 +3094,9 @@ function createProductVideoRunTool(deps) {
2437
3094
  include_copy: args.include_copy,
2438
3095
  output_dir: args.output_dir,
2439
3096
  ttl_hours: args.ttl_hours,
3097
+ timeoutMs: args.timeoutMs,
2440
3098
  useCookies: args.useCookies,
3099
+ challengeAutomationMode: args.challengeAutomationMode,
2441
3100
  cookiePolicyOverride: args.cookiePolicyOverride
2442
3101
  }, {
2443
3102
  captureScreenshot: includeScreenshots ? async (url) => captureScreenshotBuffer(deps, url) : void 0
@@ -2450,11 +3109,42 @@ function createProductVideoRunTool(deps) {
2450
3109
  });
2451
3110
  }
2452
3111
 
3112
+ // src/tools/canvas.ts
3113
+ import { tool as tool63 } from "@opencode-ai/plugin";
3114
+ var z62 = tool63.schema;
3115
+ function createCanvasTool(deps) {
3116
+ return tool63({
3117
+ description: "Execute a typed design-canvas command such as canvas.session.open, canvas.feedback.next, or canvas.document.patch.",
3118
+ args: {
3119
+ command: z62.string().min(1).describe("Canvas command name"),
3120
+ params: z62.record(z62.string(), z62.unknown()).optional().describe("Canvas command payload")
3121
+ },
3122
+ async execute(args) {
3123
+ if (!deps.canvasManager) {
3124
+ return failure("Canvas manager unavailable.", "canvas_unavailable");
3125
+ }
3126
+ try {
3127
+ if (!args.command.startsWith("canvas.")) {
3128
+ return failure("Canvas commands must start with 'canvas.'.", "canvas_invalid_command");
3129
+ }
3130
+ const result = await deps.canvasManager.execute(args.command, args.params ?? {});
3131
+ if (result && typeof result === "object" && !Array.isArray(result)) {
3132
+ return ok(result);
3133
+ }
3134
+ return ok({ result });
3135
+ } catch (error) {
3136
+ const serialized = serializeError(error);
3137
+ return failure(serialized.message, serialized.code ?? "canvas_failed", serialized.details);
3138
+ }
3139
+ }
3140
+ });
3141
+ }
3142
+
2453
3143
  // src/tools/skill_list.ts
2454
- import { tool as tool47 } from "@opencode-ai/plugin";
3144
+ import { tool as tool64 } from "@opencode-ai/plugin";
2455
3145
  function createSkillListTool(deps) {
2456
- return tool47({
2457
- description: "List available skills from OpenCode skill directories (compatibility wrapper)",
3146
+ return tool64({
3147
+ description: "List bundled and discovered skill packs before choosing a local onboarding or workflow lane.",
2458
3148
  args: {},
2459
3149
  async execute() {
2460
3150
  const skills = await deps.skills.listSkills();
@@ -2463,20 +3153,23 @@ function createSkillListTool(deps) {
2463
3153
  description: s.description,
2464
3154
  version: s.version
2465
3155
  }));
2466
- return ok({ skills: skillList, count: skillList.length });
3156
+ return ok({
3157
+ skills: skillList,
3158
+ count: skillList.length
3159
+ });
2467
3160
  }
2468
3161
  });
2469
3162
  }
2470
3163
 
2471
3164
  // src/tools/skill_load.ts
2472
- import { tool as tool48 } from "@opencode-ai/plugin";
2473
- var z47 = tool48.schema;
3165
+ import { tool as tool65 } from "@opencode-ai/plugin";
3166
+ var z63 = tool65.schema;
2474
3167
  function createSkillLoadTool(deps) {
2475
- return tool48({
2476
- description: "Load a specific skill by name from OpenCode skill directories (compatibility wrapper)",
3168
+ return tool65({
3169
+ description: `Load a local skill directly; start with ${onboarding_metadata_default.skillName} ${onboarding_metadata_default.skillTopic} before low-level browser commands.`,
2477
3170
  args: {
2478
- name: z47.string().describe("Name of the skill to load (e.g., 'opendevbrowser-login-automation', 'opendevbrowser-form-testing')"),
2479
- topic: z47.string().optional().describe("Optional topic to filter the skill content")
3171
+ name: z63.string().describe("Name of the skill to load (e.g., 'opendevbrowser-login-automation', 'opendevbrowser-form-testing')"),
3172
+ topic: z63.string().optional().describe("Optional topic to filter the skill content")
2480
3173
  },
2481
3174
  async execute(args) {
2482
3175
  try {
@@ -2491,9 +3184,10 @@ function createSkillLoadTool(deps) {
2491
3184
  }
2492
3185
 
2493
3186
  // src/tools/index.ts
3187
+ var LOCAL_ONLY_TOOL_NAMES = new Set(onboarding_metadata_default.localOnlyToolNames);
2494
3188
  function createTools(deps) {
2495
- const wrap = (definition) => {
2496
- if (!deps.ensureHub) return definition;
3189
+ const wrap = (name, definition) => {
3190
+ if (!deps.ensureHub || LOCAL_ONLY_TOOL_NAMES.has(name)) return definition;
2497
3191
  return {
2498
3192
  ...definition,
2499
3193
  execute: async (args, context) => {
@@ -2506,65 +3200,88 @@ function createTools(deps) {
2506
3200
  };
2507
3201
  };
2508
3202
  return {
2509
- opendevbrowser_launch: wrap(createLaunchTool(deps)),
2510
- opendevbrowser_connect: wrap(createConnectTool(deps)),
2511
- opendevbrowser_disconnect: wrap(createDisconnectTool(deps)),
2512
- opendevbrowser_status: wrap(createStatusTool(deps)),
2513
- opendevbrowser_targets_list: wrap(createTargetsListTool(deps)),
2514
- opendevbrowser_target_use: wrap(createTargetUseTool(deps)),
2515
- opendevbrowser_target_new: wrap(createTargetNewTool(deps)),
2516
- opendevbrowser_target_close: wrap(createTargetCloseTool(deps)),
2517
- opendevbrowser_page: wrap(createPageTool(deps)),
2518
- opendevbrowser_list: wrap(createListTool(deps)),
2519
- opendevbrowser_close: wrap(createCloseTool(deps)),
2520
- opendevbrowser_goto: wrap(createGotoTool(deps)),
2521
- opendevbrowser_wait: wrap(createWaitTool(deps)),
2522
- opendevbrowser_snapshot: wrap(createSnapshotTool(deps)),
2523
- opendevbrowser_click: wrap(createClickTool(deps)),
2524
- opendevbrowser_hover: wrap(createHoverTool(deps)),
2525
- opendevbrowser_press: wrap(createPressTool(deps)),
2526
- opendevbrowser_check: wrap(createCheckTool(deps)),
2527
- opendevbrowser_uncheck: wrap(createUncheckTool(deps)),
2528
- opendevbrowser_type: wrap(createTypeTool(deps)),
2529
- opendevbrowser_select: wrap(createSelectTool(deps)),
2530
- opendevbrowser_scroll: wrap(createScrollTool(deps)),
2531
- opendevbrowser_scroll_into_view: wrap(createScrollIntoViewTool(deps)),
2532
- opendevbrowser_dom_get_html: wrap(createDomGetHtmlTool(deps)),
2533
- opendevbrowser_dom_get_text: wrap(createDomGetTextTool(deps)),
2534
- opendevbrowser_get_attr: wrap(createGetAttrTool(deps)),
2535
- opendevbrowser_get_value: wrap(createGetValueTool(deps)),
2536
- opendevbrowser_is_visible: wrap(createIsVisibleTool(deps)),
2537
- opendevbrowser_is_enabled: wrap(createIsEnabledTool(deps)),
2538
- opendevbrowser_is_checked: wrap(createIsCheckedTool(deps)),
2539
- opendevbrowser_run: wrap(createRunTool(deps)),
2540
- opendevbrowser_prompting_guide: wrap(createPromptingGuideTool(deps)),
2541
- opendevbrowser_console_poll: wrap(createConsolePollTool(deps)),
2542
- opendevbrowser_network_poll: wrap(createNetworkPollTool(deps)),
2543
- opendevbrowser_debug_trace_snapshot: wrap(createDebugTraceSnapshotTool(deps)),
2544
- opendevbrowser_cookie_import: wrap(createCookieImportTool(deps)),
2545
- opendevbrowser_cookie_list: wrap(createCookieListTool(deps)),
2546
- opendevbrowser_macro_resolve: wrap(createMacroResolveTool(deps)),
2547
- opendevbrowser_research_run: wrap(createResearchRunTool(deps)),
2548
- opendevbrowser_shopping_run: wrap(createShoppingRunTool(deps)),
2549
- opendevbrowser_product_video_run: wrap(createProductVideoRunTool(deps)),
2550
- opendevbrowser_clone_page: wrap(createClonePageTool(deps)),
2551
- opendevbrowser_clone_component: wrap(createCloneComponentTool(deps)),
2552
- opendevbrowser_perf: wrap(createPerfTool(deps)),
2553
- opendevbrowser_screenshot: wrap(createScreenshotTool(deps)),
2554
- opendevbrowser_annotate: wrap(createAnnotateTool(deps)),
2555
- opendevbrowser_skill_list: wrap(createSkillListTool(deps)),
2556
- opendevbrowser_skill_load: wrap(createSkillLoadTool(deps))
3203
+ opendevbrowser_launch: wrap("opendevbrowser_launch", createLaunchTool(deps)),
3204
+ opendevbrowser_connect: wrap("opendevbrowser_connect", createConnectTool(deps)),
3205
+ opendevbrowser_disconnect: wrap("opendevbrowser_disconnect", createDisconnectTool(deps)),
3206
+ opendevbrowser_status: wrap("opendevbrowser_status", createStatusTool(deps)),
3207
+ opendevbrowser_session_inspector: wrap("opendevbrowser_session_inspector", createSessionInspectorTool(deps)),
3208
+ opendevbrowser_targets_list: wrap("opendevbrowser_targets_list", createTargetsListTool(deps)),
3209
+ opendevbrowser_target_use: wrap("opendevbrowser_target_use", createTargetUseTool(deps)),
3210
+ opendevbrowser_target_new: wrap("opendevbrowser_target_new", createTargetNewTool(deps)),
3211
+ opendevbrowser_target_close: wrap("opendevbrowser_target_close", createTargetCloseTool(deps)),
3212
+ opendevbrowser_page: wrap("opendevbrowser_page", createPageTool(deps)),
3213
+ opendevbrowser_list: wrap("opendevbrowser_list", createListTool(deps)),
3214
+ opendevbrowser_close: wrap("opendevbrowser_close", createCloseTool(deps)),
3215
+ opendevbrowser_goto: wrap("opendevbrowser_goto", createGotoTool(deps)),
3216
+ opendevbrowser_wait: wrap("opendevbrowser_wait", createWaitTool(deps)),
3217
+ opendevbrowser_snapshot: wrap("opendevbrowser_snapshot", createSnapshotTool(deps)),
3218
+ opendevbrowser_review: wrap("opendevbrowser_review", createReviewTool(deps)),
3219
+ opendevbrowser_click: wrap("opendevbrowser_click", createClickTool(deps)),
3220
+ opendevbrowser_hover: wrap("opendevbrowser_hover", createHoverTool(deps)),
3221
+ opendevbrowser_press: wrap("opendevbrowser_press", createPressTool(deps)),
3222
+ opendevbrowser_check: wrap("opendevbrowser_check", createCheckTool(deps)),
3223
+ opendevbrowser_uncheck: wrap("opendevbrowser_uncheck", createUncheckTool(deps)),
3224
+ opendevbrowser_type: wrap("opendevbrowser_type", createTypeTool(deps)),
3225
+ opendevbrowser_select: wrap("opendevbrowser_select", createSelectTool(deps)),
3226
+ opendevbrowser_scroll: wrap("opendevbrowser_scroll", createScrollTool(deps)),
3227
+ opendevbrowser_scroll_into_view: wrap("opendevbrowser_scroll_into_view", createScrollIntoViewTool(deps)),
3228
+ opendevbrowser_upload: wrap("opendevbrowser_upload", createUploadTool(deps)),
3229
+ opendevbrowser_pointer_move: wrap("opendevbrowser_pointer_move", createPointerMoveTool(deps)),
3230
+ opendevbrowser_pointer_down: wrap("opendevbrowser_pointer_down", createPointerDownTool(deps)),
3231
+ opendevbrowser_pointer_up: wrap("opendevbrowser_pointer_up", createPointerUpTool(deps)),
3232
+ opendevbrowser_pointer_drag: wrap("opendevbrowser_pointer_drag", createPointerDragTool(deps)),
3233
+ opendevbrowser_dom_get_html: wrap("opendevbrowser_dom_get_html", createDomGetHtmlTool(deps)),
3234
+ opendevbrowser_dom_get_text: wrap("opendevbrowser_dom_get_text", createDomGetTextTool(deps)),
3235
+ opendevbrowser_get_attr: wrap("opendevbrowser_get_attr", createGetAttrTool(deps)),
3236
+ opendevbrowser_get_value: wrap("opendevbrowser_get_value", createGetValueTool(deps)),
3237
+ opendevbrowser_is_visible: wrap("opendevbrowser_is_visible", createIsVisibleTool(deps)),
3238
+ opendevbrowser_is_enabled: wrap("opendevbrowser_is_enabled", createIsEnabledTool(deps)),
3239
+ opendevbrowser_is_checked: wrap("opendevbrowser_is_checked", createIsCheckedTool(deps)),
3240
+ opendevbrowser_run: wrap("opendevbrowser_run", createRunTool(deps)),
3241
+ opendevbrowser_prompting_guide: wrap("opendevbrowser_prompting_guide", createPromptingGuideTool(deps)),
3242
+ opendevbrowser_console_poll: wrap("opendevbrowser_console_poll", createConsolePollTool(deps)),
3243
+ opendevbrowser_network_poll: wrap("opendevbrowser_network_poll", createNetworkPollTool(deps)),
3244
+ opendevbrowser_debug_trace_snapshot: wrap("opendevbrowser_debug_trace_snapshot", createDebugTraceSnapshotTool(deps)),
3245
+ opendevbrowser_cookie_import: wrap("opendevbrowser_cookie_import", createCookieImportTool(deps)),
3246
+ opendevbrowser_cookie_list: wrap("opendevbrowser_cookie_list", createCookieListTool(deps)),
3247
+ opendevbrowser_macro_resolve: wrap("opendevbrowser_macro_resolve", createMacroResolveTool(deps)),
3248
+ opendevbrowser_research_run: wrap("opendevbrowser_research_run", createResearchRunTool(deps)),
3249
+ opendevbrowser_shopping_run: wrap("opendevbrowser_shopping_run", createShoppingRunTool(deps)),
3250
+ opendevbrowser_product_video_run: wrap("opendevbrowser_product_video_run", createProductVideoRunTool(deps)),
3251
+ opendevbrowser_canvas: wrap("opendevbrowser_canvas", createCanvasTool(deps)),
3252
+ opendevbrowser_clone_page: wrap("opendevbrowser_clone_page", createClonePageTool(deps)),
3253
+ opendevbrowser_clone_component: wrap("opendevbrowser_clone_component", createCloneComponentTool(deps)),
3254
+ opendevbrowser_perf: wrap("opendevbrowser_perf", createPerfTool(deps)),
3255
+ opendevbrowser_screenshot: wrap("opendevbrowser_screenshot", createScreenshotTool(deps)),
3256
+ opendevbrowser_screencast_start: wrap("opendevbrowser_screencast_start", createScreencastStartTool(deps)),
3257
+ opendevbrowser_screencast_stop: wrap("opendevbrowser_screencast_stop", createScreencastStopTool(deps)),
3258
+ opendevbrowser_dialog: wrap("opendevbrowser_dialog", createDialogTool(deps)),
3259
+ opendevbrowser_desktop_status: wrap("opendevbrowser_desktop_status", createDesktopStatusTool(deps)),
3260
+ opendevbrowser_desktop_windows: wrap("opendevbrowser_desktop_windows", createDesktopWindowsTool(deps)),
3261
+ opendevbrowser_desktop_active_window: wrap("opendevbrowser_desktop_active_window", createDesktopActiveWindowTool(deps)),
3262
+ opendevbrowser_desktop_capture_desktop: wrap("opendevbrowser_desktop_capture_desktop", createDesktopCaptureDesktopTool(deps)),
3263
+ opendevbrowser_desktop_capture_window: wrap("opendevbrowser_desktop_capture_window", createDesktopCaptureWindowTool(deps)),
3264
+ opendevbrowser_desktop_accessibility_snapshot: wrap(
3265
+ "opendevbrowser_desktop_accessibility_snapshot",
3266
+ createDesktopAccessibilitySnapshotTool(deps)
3267
+ ),
3268
+ opendevbrowser_annotate: wrap("opendevbrowser_annotate", createAnnotateTool(deps)),
3269
+ opendevbrowser_skill_list: wrap("opendevbrowser_skill_list", createSkillListTool(deps)),
3270
+ opendevbrowser_skill_load: wrap("opendevbrowser_skill_load", createSkillLoadTool(deps))
2557
3271
  };
2558
3272
  }
2559
3273
 
2560
3274
  // src/index.ts
2561
3275
  var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
2562
3276
  const core = createOpenDevBrowserCore({ directory, worktree });
2563
- const { config, configStore, skills, ensureRelay, cleanup, getExtensionPath } = core;
3277
+ const { config, configStore, skills, ensureRelay, cleanup, getExtensionPath, agentInbox } = core;
2564
3278
  let relay = core.relay;
2565
3279
  let manager = core.manager;
3280
+ let canvasManager = core.canvasManager;
2566
3281
  let runner = core.runner;
2567
3282
  let annotationManager = core.annotationManager;
3283
+ let desktopRuntime = core.desktopRuntime;
3284
+ let automationCoordinator = core.automationCoordinator;
2568
3285
  let providerRuntime = core.providerRuntime;
2569
3286
  let browserFallbackPort = core.browserFallbackPort;
2570
3287
  let hubStop = null;
@@ -2581,10 +3298,13 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
2581
3298
  }
2582
3299
  const toolDeps = {
2583
3300
  manager,
3301
+ canvasManager,
2584
3302
  annotationManager,
2585
3303
  runner,
2586
3304
  config: configStore,
2587
3305
  skills,
3306
+ desktopRuntime,
3307
+ automationCoordinator,
2588
3308
  providerRuntime,
2589
3309
  browserFallbackPort,
2590
3310
  relay,
@@ -2595,19 +3315,30 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
2595
3315
  daemonClient = new DaemonClient({ autoRenew: true });
2596
3316
  }
2597
3317
  manager = new RemoteManager(daemonClient);
3318
+ canvasManager = new RemoteCanvasManager(daemonClient);
3319
+ desktopRuntime = new RemoteDesktopRuntime(daemonClient);
2598
3320
  relay = new RemoteRelay(daemonClient);
2599
3321
  annotationManager.setRelay(relay);
2600
3322
  annotationManager.setBrowserManager(manager);
2601
3323
  runner = new ScriptRunner(manager);
2602
- browserFallbackPort = createBrowserFallbackPort(manager);
2603
- providerRuntime = createConfiguredProviderRuntime({
3324
+ ({
3325
+ providerRuntime,
3326
+ browserFallbackPort
3327
+ } = createCoreRuntimeAssemblies({
3328
+ cacheRoot: core.cacheRoot,
2604
3329
  config: configStore.get(),
3330
+ manager
3331
+ }));
3332
+ automationCoordinator = createAutomationCoordinator({
2605
3333
  manager,
2606
- browserFallbackPort
3334
+ desktopRuntime
2607
3335
  });
2608
3336
  toolDeps.manager = manager;
3337
+ toolDeps.canvasManager = canvasManager;
2609
3338
  toolDeps.relay = relay;
2610
3339
  toolDeps.runner = runner;
3340
+ toolDeps.desktopRuntime = desktopRuntime;
3341
+ toolDeps.automationCoordinator = automationCoordinator;
2611
3342
  toolDeps.providerRuntime = providerRuntime;
2612
3343
  toolDeps.browserFallbackPort = browserFallbackPort;
2613
3344
  };
@@ -2670,11 +3401,30 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
2670
3401
  process.on("SIGINT", cleanupAll);
2671
3402
  process.on("SIGTERM", cleanupAll);
2672
3403
  process.on("beforeExit", cleanupAll);
3404
+ const registerAgentInboxScope = (sessionID, registration) => {
3405
+ if (!sessionID) {
3406
+ return;
3407
+ }
3408
+ try {
3409
+ agentInbox.registerScope(sessionID, registration);
3410
+ } catch (error) {
3411
+ console.warn(
3412
+ "[opendevbrowser] Failed to register agent inbox scope:",
3413
+ error instanceof Error ? error.message : String(error)
3414
+ );
3415
+ }
3416
+ };
2673
3417
  return {
2674
3418
  tool: createTools(toolDeps),
2675
- "chat.message": async (_input, output) => {
3419
+ "chat.message": async (input, output) => {
2676
3420
  const config2 = configStore.get();
2677
3421
  if (output.message.role !== "user") return;
3422
+ registerAgentInboxScope(input.sessionID, {
3423
+ messageId: input.messageID ?? null,
3424
+ agent: input.agent ?? null,
3425
+ model: input.model ?? null,
3426
+ variant: input.variant ?? null
3427
+ });
2678
3428
  const text = extractTextFromParts(output.parts);
2679
3429
  if (!text) return;
2680
3430
  if (config2.skills.nudge.enabled && shouldTriggerSkillNudge(text, config2.skills.nudge.keywords)) {
@@ -2686,11 +3436,22 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
2686
3436
  }
2687
3437
  }
2688
3438
  },
2689
- "experimental.chat.system.transform": async (_input, output) => {
3439
+ "experimental.chat.system.transform": async (input, output) => {
2690
3440
  const config2 = configStore.get();
2691
3441
  const systemEntries = output.system ?? [];
2692
3442
  let nextEntries = systemEntries;
2693
3443
  let changed = false;
3444
+ registerAgentInboxScope(input.sessionID, {
3445
+ model: null
3446
+ });
3447
+ if (input.sessionID && !systemEntries.some((entry) => entry.includes(AGENT_INBOX_SYSTEM_MARKER))) {
3448
+ const injection = agentInbox.buildSystemInjection(input.sessionID);
3449
+ if (injection) {
3450
+ nextEntries = [...nextEntries, injection.systemBlock];
3451
+ agentInbox.acknowledge(injection.receiptIds);
3452
+ changed = true;
3453
+ }
3454
+ }
2694
3455
  if (config2.skills.nudge.enabled) {
2695
3456
  if (systemEntries.some((entry) => entry.includes(SKILL_NUDGE_MARKER))) {
2696
3457
  clearSkillNudge(skillNudgeState);