opendevbrowser 0.0.16 → 0.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/README.md +51 -27
  2. package/dist/browser/annotation-manager.d.ts +3 -0
  3. package/dist/browser/annotation-manager.d.ts.map +1 -1
  4. package/dist/browser/browser-manager.d.ts +6 -1
  5. package/dist/browser/browser-manager.d.ts.map +1 -1
  6. package/dist/browser/canvas-client.d.ts +53 -0
  7. package/dist/browser/canvas-client.d.ts.map +1 -0
  8. package/dist/browser/canvas-code-sync-manager.d.ts +79 -0
  9. package/dist/browser/canvas-code-sync-manager.d.ts.map +1 -0
  10. package/dist/browser/canvas-manager.d.ts +94 -0
  11. package/dist/browser/canvas-manager.d.ts.map +1 -0
  12. package/dist/browser/canvas-runtime-preview-bridge.d.ts +20 -0
  13. package/dist/browser/canvas-runtime-preview-bridge.d.ts.map +1 -0
  14. package/dist/browser/canvas-session-sync-manager.d.ts +21 -0
  15. package/dist/browser/canvas-session-sync-manager.d.ts.map +1 -0
  16. package/dist/browser/manager-types.d.ts +13 -1
  17. package/dist/browser/manager-types.d.ts.map +1 -1
  18. package/dist/browser/ops-browser-manager.d.ts +11 -1
  19. package/dist/browser/ops-browser-manager.d.ts.map +1 -1
  20. package/dist/canvas/code-sync/apply-tsx.d.ts +23 -0
  21. package/dist/canvas/code-sync/apply-tsx.d.ts.map +1 -0
  22. package/dist/canvas/code-sync/graph.d.ts +5 -0
  23. package/dist/canvas/code-sync/graph.d.ts.map +1 -0
  24. package/dist/canvas/code-sync/hash.d.ts +3 -0
  25. package/dist/canvas/code-sync/hash.d.ts.map +1 -0
  26. package/dist/canvas/code-sync/import.d.ts +18 -0
  27. package/dist/canvas/code-sync/import.d.ts.map +1 -0
  28. package/dist/canvas/code-sync/manifest.d.ts +5 -0
  29. package/dist/canvas/code-sync/manifest.d.ts.map +1 -0
  30. package/dist/canvas/code-sync/tsx-adapter.d.ts +8 -0
  31. package/dist/canvas/code-sync/tsx-adapter.d.ts.map +1 -0
  32. package/dist/canvas/code-sync/types.d.ts +152 -0
  33. package/dist/canvas/code-sync/types.d.ts.map +1 -0
  34. package/dist/canvas/code-sync/write.d.ts +9 -0
  35. package/dist/canvas/code-sync/write.d.ts.map +1 -0
  36. package/dist/canvas/document-store.d.ts +81 -0
  37. package/dist/canvas/document-store.d.ts.map +1 -0
  38. package/dist/canvas/export.d.ts +12 -0
  39. package/dist/canvas/export.d.ts.map +1 -0
  40. package/dist/canvas/repo-store.d.ts +10 -0
  41. package/dist/canvas/repo-store.d.ts.map +1 -0
  42. package/dist/canvas/surface-palette.d.ts +15 -0
  43. package/dist/canvas/surface-palette.d.ts.map +1 -0
  44. package/dist/canvas/types.d.ts +255 -0
  45. package/dist/canvas/types.d.ts.map +1 -0
  46. package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js +7 -0
  47. package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js.map +1 -0
  48. package/dist/{chunk-ST7CO5FA.js → chunk-5J3IFL3X.js} +11577 -13539
  49. package/dist/chunk-5J3IFL3X.js.map +1 -0
  50. package/dist/chunk-D633UO34.js +8149 -0
  51. package/dist/chunk-D633UO34.js.map +1 -0
  52. package/dist/{chunk-7W3SPXIB.js → chunk-FUSXMW3G.js} +4 -1
  53. package/dist/chunk-TBUCZX4A.js +34 -0
  54. package/dist/chunk-TBUCZX4A.js.map +1 -0
  55. package/dist/chunk-V7KUDHDG.js +276 -0
  56. package/dist/chunk-V7KUDHDG.js.map +1 -0
  57. package/dist/chunk-Y2KL55OG.js +59 -0
  58. package/dist/chunk-Y2KL55OG.js.map +1 -0
  59. package/dist/cli/args.d.ts +3 -3
  60. package/dist/cli/args.d.ts.map +1 -1
  61. package/dist/cli/commands/annotate.d.ts +11 -0
  62. package/dist/cli/commands/annotate.d.ts.map +1 -1
  63. package/dist/cli/commands/canvas.d.ts +45 -0
  64. package/dist/cli/commands/canvas.d.ts.map +1 -0
  65. package/dist/cli/commands/devtools/perf.d.ts.map +1 -1
  66. package/dist/cli/commands/devtools/screenshot.d.ts +1 -0
  67. package/dist/cli/commands/devtools/screenshot.d.ts.map +1 -1
  68. package/dist/cli/commands/dom/attr.d.ts.map +1 -1
  69. package/dist/cli/commands/dom/checked.d.ts.map +1 -1
  70. package/dist/cli/commands/dom/enabled.d.ts.map +1 -1
  71. package/dist/cli/commands/dom/html.d.ts.map +1 -1
  72. package/dist/cli/commands/dom/text.d.ts.map +1 -1
  73. package/dist/cli/commands/dom/value.d.ts.map +1 -1
  74. package/dist/cli/commands/dom/visible.d.ts.map +1 -1
  75. package/dist/cli/commands/export/clone-component.d.ts +9 -0
  76. package/dist/cli/commands/export/clone-component.d.ts.map +1 -1
  77. package/dist/cli/commands/export/clone-page.d.ts +8 -0
  78. package/dist/cli/commands/export/clone-page.d.ts.map +1 -1
  79. package/dist/cli/commands/interact/check.d.ts.map +1 -1
  80. package/dist/cli/commands/interact/click.d.ts.map +1 -1
  81. package/dist/cli/commands/interact/hover.d.ts.map +1 -1
  82. package/dist/cli/commands/interact/press.d.ts.map +1 -1
  83. package/dist/cli/commands/interact/scroll-into-view.d.ts.map +1 -1
  84. package/dist/cli/commands/interact/scroll.d.ts.map +1 -1
  85. package/dist/cli/commands/interact/select.d.ts.map +1 -1
  86. package/dist/cli/commands/interact/type.d.ts.map +1 -1
  87. package/dist/cli/commands/interact/uncheck.d.ts.map +1 -1
  88. package/dist/cli/commands/native.d.ts +12 -1
  89. package/dist/cli/commands/native.d.ts.map +1 -1
  90. package/dist/cli/commands/nav/goto.d.ts.map +1 -1
  91. package/dist/cli/commands/nav/snapshot.d.ts.map +1 -1
  92. package/dist/cli/commands/nav/wait.d.ts.map +1 -1
  93. package/dist/cli/commands/serve.d.ts +5 -0
  94. package/dist/cli/commands/serve.d.ts.map +1 -1
  95. package/dist/cli/commands/session/connect.d.ts.map +1 -1
  96. package/dist/cli/commands/status.d.ts +5 -0
  97. package/dist/cli/commands/status.d.ts.map +1 -1
  98. package/dist/cli/daemon-commands.d.ts.map +1 -1
  99. package/dist/cli/help.d.ts +5 -0
  100. package/dist/cli/help.d.ts.map +1 -1
  101. package/dist/cli/index.js +724 -163
  102. package/dist/cli/index.js.map +1 -1
  103. package/dist/cli/remote-canvas-manager.d.ts +8 -0
  104. package/dist/cli/remote-canvas-manager.d.ts.map +1 -0
  105. package/dist/cli/remote-manager.d.ts +3 -1
  106. package/dist/cli/remote-manager.d.ts.map +1 -1
  107. package/dist/cli/remote-relay.d.ts +2 -0
  108. package/dist/cli/remote-relay.d.ts.map +1 -1
  109. package/dist/cli/utils/parse.d.ts +1 -0
  110. package/dist/cli/utils/parse.d.ts.map +1 -1
  111. package/dist/core/bootstrap.d.ts.map +1 -1
  112. package/dist/core/types.d.ts +2 -0
  113. package/dist/core/types.d.ts.map +1 -1
  114. package/dist/fs-UMRKOBNN.js +7 -0
  115. package/dist/fs-UMRKOBNN.js.map +1 -0
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +192 -67
  118. package/dist/index.js.map +1 -1
  119. package/dist/{macros-NUBRM44Y.js → macros-ND2M7LWU.js} +2 -2
  120. package/dist/opendevbrowser.d.ts.map +1 -1
  121. package/dist/opendevbrowser.js +192 -67
  122. package/dist/opendevbrowser.js.map +1 -1
  123. package/dist/providers/index.d.ts.map +1 -1
  124. package/dist/providers/shopping/index.d.ts.map +1 -1
  125. package/dist/providers-G3LRHQXX.js +121 -0
  126. package/dist/providers-G3LRHQXX.js.map +1 -0
  127. package/dist/relay/protocol.d.ts +85 -3
  128. package/dist/relay/protocol.d.ts.map +1 -1
  129. package/dist/relay/relay-server.d.ts +14 -1
  130. package/dist/relay/relay-server.d.ts.map +1 -1
  131. package/dist/relay/relay-types.d.ts +3 -0
  132. package/dist/relay/relay-types.d.ts.map +1 -1
  133. package/dist/runtime-factory-BICHDPE7.js +13 -0
  134. package/dist/runtime-factory-BICHDPE7.js.map +1 -0
  135. package/dist/tools/annotate.d.ts.map +1 -1
  136. package/dist/tools/canvas.d.ts +4 -0
  137. package/dist/tools/canvas.d.ts.map +1 -0
  138. package/dist/tools/check.d.ts.map +1 -1
  139. package/dist/tools/click.d.ts.map +1 -1
  140. package/dist/tools/clone_component.d.ts.map +1 -1
  141. package/dist/tools/clone_page.d.ts.map +1 -1
  142. package/dist/tools/connect.d.ts.map +1 -1
  143. package/dist/tools/deps.d.ts +2 -0
  144. package/dist/tools/deps.d.ts.map +1 -1
  145. package/dist/tools/dom_get_html.d.ts.map +1 -1
  146. package/dist/tools/dom_get_text.d.ts.map +1 -1
  147. package/dist/tools/get_attr.d.ts.map +1 -1
  148. package/dist/tools/get_value.d.ts.map +1 -1
  149. package/dist/tools/goto.d.ts.map +1 -1
  150. package/dist/tools/hover.d.ts.map +1 -1
  151. package/dist/tools/index.d.ts.map +1 -1
  152. package/dist/tools/is_checked.d.ts.map +1 -1
  153. package/dist/tools/is_enabled.d.ts.map +1 -1
  154. package/dist/tools/is_visible.d.ts.map +1 -1
  155. package/dist/tools/launch.d.ts.map +1 -1
  156. package/dist/tools/macro_resolve.d.ts.map +1 -1
  157. package/dist/tools/perf.d.ts.map +1 -1
  158. package/dist/tools/press.d.ts.map +1 -1
  159. package/dist/tools/product_video_run.d.ts.map +1 -1
  160. package/dist/tools/research_run.d.ts.map +1 -1
  161. package/dist/tools/response.d.ts +4 -1
  162. package/dist/tools/response.d.ts.map +1 -1
  163. package/dist/tools/screenshot.d.ts.map +1 -1
  164. package/dist/tools/scroll.d.ts.map +1 -1
  165. package/dist/tools/scroll_into_view.d.ts.map +1 -1
  166. package/dist/tools/select.d.ts.map +1 -1
  167. package/dist/tools/shopping_run.d.ts.map +1 -1
  168. package/dist/tools/snapshot.d.ts.map +1 -1
  169. package/dist/tools/type.d.ts.map +1 -1
  170. package/dist/tools/uncheck.d.ts.map +1 -1
  171. package/dist/tools/wait.d.ts.map +1 -1
  172. package/dist/tools/workflow-runtime.d.ts +1 -2
  173. package/dist/tools/workflow-runtime.d.ts.map +1 -1
  174. package/extension/canvas.html +636 -0
  175. package/extension/dist/annotate-content.css +15 -6
  176. package/extension/dist/annotate-content.js +119 -9
  177. package/extension/dist/annotation-payload.js +163 -0
  178. package/extension/dist/background.js +148 -18
  179. package/extension/dist/canvas/canvas-runtime.js +1061 -0
  180. package/extension/dist/canvas/model.js +213 -0
  181. package/extension/dist/canvas/viewport-fit.js +67 -0
  182. package/extension/dist/canvas-page.js +1801 -0
  183. package/extension/dist/ops/dom-bridge.js +116 -3
  184. package/extension/dist/ops/ops-runtime.js +508 -44
  185. package/extension/dist/ops/ops-session-store.js +21 -114
  186. package/extension/dist/ops/target-session-coordinator.js +157 -0
  187. package/extension/dist/popup.js +155 -31
  188. package/extension/dist/services/ConnectionManager.js +17 -0
  189. package/extension/dist/services/RelayClient.js +9 -0
  190. package/extension/dist/services/TabManager.js +35 -12
  191. package/extension/dist/types.js +2 -0
  192. package/extension/manifest.json +1 -1
  193. package/extension/popup.html +52 -0
  194. package/package.json +6 -4
  195. package/skills/AGENTS.md +5 -2
  196. package/skills/opendevbrowser-best-practices/SKILL.md +71 -3
  197. package/skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md +141 -0
  198. package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +113 -17
  199. package/skills/opendevbrowser-best-practices/assets/templates/canvas-blocker-checklist.json +70 -0
  200. package/skills/opendevbrowser-best-practices/assets/templates/canvas-feedback-eval.json +73 -0
  201. package/skills/opendevbrowser-best-practices/assets/templates/canvas-generation-plan.v1.json +67 -0
  202. package/skills/opendevbrowser-best-practices/assets/templates/canvas-handshake-example.json +126 -0
  203. package/skills/opendevbrowser-best-practices/assets/templates/robustness-checklist.json +57 -0
  204. package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +7 -3
  205. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +26 -0
  206. package/skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh +82 -1
  207. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +225 -84
  208. package/dist/chunk-ST7CO5FA.js.map +0 -1
  209. /package/dist/{chunk-7W3SPXIB.js.map → chunk-FUSXMW3G.js.map} +0 -0
  210. /package/dist/{macros-NUBRM44Y.js.map → macros-ND2M7LWU.js.map} +0 -0
@@ -2,22 +2,25 @@ import {
2
2
  DaemonClient,
3
3
  ScriptRunner,
4
4
  buildAnnotateResult,
5
- buildBlockerArtifacts,
6
- classifyBlockerSignal,
7
- createBrowserFallbackPort,
8
- createConfiguredProviderRuntime,
9
5
  createOpenDevBrowserCore,
10
- createRequestId,
11
6
  executeMacroResolution,
12
7
  extractExtension,
13
8
  fetchDaemonStatusFromMetadata,
14
- runProductVideoWorkflow,
15
- runResearchWorkflow,
16
- runShoppingWorkflow,
17
9
  shapeExecutionPayload,
18
10
  startDaemon
19
- } from "./chunk-ST7CO5FA.js";
20
- import "./chunk-7W3SPXIB.js";
11
+ } from "./chunk-5J3IFL3X.js";
12
+ import "./chunk-Y2KL55OG.js";
13
+ import "./chunk-TBUCZX4A.js";
14
+ import {
15
+ createBrowserFallbackPort,
16
+ createConfiguredProviderRuntime
17
+ } from "./chunk-V7KUDHDG.js";
18
+ import {
19
+ buildBlockerArtifacts,
20
+ classifyBlockerSignal,
21
+ createRequestId
22
+ } from "./chunk-D633UO34.js";
23
+ import "./chunk-FUSXMW3G.js";
21
24
 
22
25
  // src/cli/remote-manager.ts
23
26
  function isLegacyRelayEndpoint(wsEndpoint) {
@@ -40,10 +43,18 @@ var RemoteManager = class {
40
43
  connect(options) {
41
44
  return this.client.call("session.connect", options);
42
45
  }
43
- connectRelay(wsEndpoint) {
46
+ connectRelay(wsEndpoint, options) {
47
+ const startUrl = typeof options?.startUrl === "string" && options.startUrl.trim().length > 0 ? options.startUrl.trim() : void 0;
44
48
  return this.client.call(
45
49
  "session.connect",
46
- isLegacyRelayEndpoint(wsEndpoint) ? { wsEndpoint, extensionLegacy: true } : { wsEndpoint }
50
+ isLegacyRelayEndpoint(wsEndpoint) ? {
51
+ wsEndpoint,
52
+ extensionLegacy: true,
53
+ ...startUrl ? { startUrl } : {}
54
+ } : {
55
+ wsEndpoint,
56
+ ...startUrl ? { startUrl } : {}
57
+ }
47
58
  );
48
59
  }
49
60
  disconnect(sessionId, closeBrowser = false) {
@@ -281,6 +292,17 @@ var RemoteManager = class {
281
292
  }
282
293
  };
283
294
 
295
+ // src/cli/remote-canvas-manager.ts
296
+ var RemoteCanvasManager = class {
297
+ client;
298
+ constructor(client) {
299
+ this.client = client;
300
+ }
301
+ execute(command, params = {}) {
302
+ return this.client.call("canvas.execute", { command, params });
303
+ }
304
+ };
305
+
284
306
  // src/cli/remote-relay.ts
285
307
  var emptyStatus = {
286
308
  running: false,
@@ -289,6 +311,7 @@ var emptyStatus = {
289
311
  cdpConnected: false,
290
312
  annotationConnected: false,
291
313
  opsConnected: false,
314
+ canvasConnected: false,
292
315
  pairingRequired: false,
293
316
  instanceId: "",
294
317
  epoch: 0,
@@ -300,6 +323,7 @@ var emptyStatus = {
300
323
  cdpConnected: false,
301
324
  annotationConnected: false,
302
325
  opsConnected: false,
326
+ canvasConnected: false,
303
327
  pairingRequired: false
304
328
  }
305
329
  };
@@ -309,6 +333,7 @@ var RemoteRelay = class {
309
333
  lastCdpUrl = null;
310
334
  lastAnnotationUrl = null;
311
335
  lastOpsUrl = null;
336
+ lastCanvasUrl = null;
312
337
  constructor(client) {
313
338
  this.client = client;
314
339
  }
@@ -322,11 +347,14 @@ var RemoteRelay = class {
322
347
  this.lastAnnotationUrl = typeof annotationUrl === "string" ? annotationUrl : null;
323
348
  const opsUrl = await this.client.call("relay.opsUrl");
324
349
  this.lastOpsUrl = typeof opsUrl === "string" ? opsUrl : null;
350
+ const canvasUrl = await this.client.call("relay.canvasUrl");
351
+ this.lastCanvasUrl = typeof canvasUrl === "string" ? canvasUrl : null;
325
352
  } catch {
326
353
  this.lastStatus = emptyStatus;
327
354
  this.lastCdpUrl = null;
328
355
  this.lastAnnotationUrl = null;
329
356
  this.lastOpsUrl = null;
357
+ this.lastCanvasUrl = null;
330
358
  }
331
359
  }
332
360
  status() {
@@ -341,6 +369,9 @@ var RemoteRelay = class {
341
369
  getOpsUrl() {
342
370
  return this.lastOpsUrl;
343
371
  }
372
+ getCanvasUrl() {
373
+ return this.lastCanvasUrl;
374
+ }
344
375
  };
345
376
 
346
377
  // src/skills/skill-nudge.ts
@@ -418,18 +449,25 @@ import { tool } from "@opencode-ai/plugin";
418
449
  function ok(data) {
419
450
  return JSON.stringify({ ok: true, ...data });
420
451
  }
421
- function failure(message, code) {
452
+ function failure(message, code, details) {
422
453
  return JSON.stringify({
423
454
  ok: false,
424
455
  error: {
425
456
  message,
426
- code
457
+ code,
458
+ ...details ? { details } : {}
427
459
  }
428
460
  });
429
461
  }
430
462
  function serializeError(error) {
431
463
  if (error instanceof Error) {
432
- return { message: error.message };
464
+ const detailCarrier = error;
465
+ const details = detailCarrier.details && typeof detailCarrier.details === "object" && !Array.isArray(detailCarrier.details) ? detailCarrier.details : detailCarrier.blocker && typeof detailCarrier.blocker === "object" && !Array.isArray(detailCarrier.blocker) ? { blocker: detailCarrier.blocker } : void 0;
466
+ return {
467
+ message: error.message,
468
+ code: detailCarrier.code,
469
+ details
470
+ };
433
471
  }
434
472
  return { message: "Unknown error" };
435
473
  }
@@ -523,7 +561,7 @@ function createLaunchTool(deps) {
523
561
  return failure(buildExtensionMissingMessage(diagnostics.message), "extension_not_connected");
524
562
  }
525
563
  try {
526
- result = await deps.manager.connectRelay(relayUrl);
564
+ result = args.startUrl ? await deps.manager.connectRelay(relayUrl, { startUrl: args.startUrl }) : await deps.manager.connectRelay(relayUrl);
527
565
  usedRelay = true;
528
566
  } catch (error) {
529
567
  const errorMessage = serializeError(error).message;
@@ -561,9 +599,6 @@ function createLaunchTool(deps) {
561
599
  return failure(buildManagedFailureMessage(error), "launch_failed");
562
600
  }
563
601
  }
564
- if (usedRelay && args.startUrl && result.activeTargetId) {
565
- await deps.manager.goto(result.sessionId, args.startUrl, "load", 3e4);
566
- }
567
602
  const warnings = result.warnings ?? [];
568
603
  return ok({
569
604
  sessionId: result.sessionId,
@@ -770,6 +805,7 @@ function createConnectTool(deps) {
770
805
  wsEndpoint: z2.string().optional().describe("Full WebSocket endpoint to connect to"),
771
806
  host: z2.string().optional().describe("Host for /json/version lookup"),
772
807
  port: z2.number().int().optional().describe("Port for /json/version lookup"),
808
+ startUrl: z2.string().optional().describe("Open this URL immediately after connect"),
773
809
  extensionLegacy: z2.boolean().optional().describe("Use legacy extension relay (/cdp) instead of ops")
774
810
  },
775
811
  async execute(args) {
@@ -777,6 +813,7 @@ function createConnectTool(deps) {
777
813
  await deps.relay?.refresh?.();
778
814
  const wsEndpoint = args.wsEndpoint;
779
815
  const extensionLegacy = args.extensionLegacy === true;
816
+ const startUrl = typeof args.startUrl === "string" && args.startUrl.trim().length > 0 ? args.startUrl.trim() : void 0;
780
817
  const hasExplicitCdp = Boolean(wsEndpoint || args.host || args.port);
781
818
  const relayUrl = extensionLegacy ? deps.relay?.getCdpUrl() ?? null : deps.relay?.getOpsUrl?.() ?? null;
782
819
  const normalizedOpsEndpoint = normalizeRelayEndpoint(wsEndpoint, "ops", true);
@@ -787,7 +824,7 @@ function createConnectTool(deps) {
787
824
  const relayEndpoint = relayUrl && wsEndpoint === relayUrl ? relayUrl : extensionLegacy ? normalizedLegacyEndpoint ?? normalizedOpsEndpoint : normalizedOpsEndpoint;
788
825
  let result;
789
826
  if (relayEndpoint || !hasExplicitCdp && relayUrl) {
790
- result = await deps.manager.connectRelay(relayEndpoint ?? relayUrl ?? "");
827
+ result = startUrl ? await deps.manager.connectRelay(relayEndpoint ?? relayUrl ?? "", { startUrl }) : await deps.manager.connectRelay(relayEndpoint ?? relayUrl ?? "");
791
828
  } else {
792
829
  if (!hasExplicitCdp) {
793
830
  return failure("Extension relay not available. Connect the extension or pass wsEndpoint/host/port.", "extension_not_connected");
@@ -795,7 +832,8 @@ function createConnectTool(deps) {
795
832
  result = await deps.manager.connect({
796
833
  wsEndpoint,
797
834
  host: args.host,
798
- port: args.port
835
+ port: args.port,
836
+ startUrl
799
837
  });
800
838
  }
801
839
  return ok({
@@ -1116,6 +1154,7 @@ function createGotoTool(deps) {
1116
1154
  args: {
1117
1155
  sessionId: z12.string().describe("Session id"),
1118
1156
  url: z12.string().describe("URL to navigate to"),
1157
+ targetId: z12.string().optional().describe("Optional target id"),
1119
1158
  waitUntil: waitUntilSchema.optional().describe("Load state to wait for"),
1120
1159
  timeoutMs: z12.number().int().optional().describe("Timeout in milliseconds")
1121
1160
  },
@@ -1125,7 +1164,9 @@ function createGotoTool(deps) {
1125
1164
  args.sessionId,
1126
1165
  args.url,
1127
1166
  args.waitUntil ?? "load",
1128
- args.timeoutMs ?? 3e4
1167
+ args.timeoutMs ?? 3e4,
1168
+ void 0,
1169
+ args.targetId
1129
1170
  );
1130
1171
  return ok(result);
1131
1172
  } catch (error) {
@@ -1145,6 +1186,7 @@ function createWaitTool(deps) {
1145
1186
  description: "Wait for a load state or a ref state.",
1146
1187
  args: {
1147
1188
  sessionId: z13.string().describe("Session id"),
1189
+ targetId: z13.string().optional().describe("Optional target id"),
1148
1190
  until: waitUntilSchema2.optional().describe("Load state to wait for"),
1149
1191
  ref: z13.string().optional().describe("Ref to wait for"),
1150
1192
  state: waitStateSchema.optional().describe("Ref state to wait for"),
@@ -1157,7 +1199,8 @@ function createWaitTool(deps) {
1157
1199
  args.sessionId,
1158
1200
  args.ref,
1159
1201
  args.state ?? "attached",
1160
- args.timeoutMs ?? 3e4
1202
+ args.timeoutMs ?? 3e4,
1203
+ args.targetId
1161
1204
  );
1162
1205
  return ok(result2);
1163
1206
  }
@@ -1167,7 +1210,8 @@ function createWaitTool(deps) {
1167
1210
  const result = await deps.manager.waitForLoad(
1168
1211
  args.sessionId,
1169
1212
  args.until,
1170
- args.timeoutMs ?? 3e4
1213
+ args.timeoutMs ?? 3e4,
1214
+ args.targetId
1171
1215
  );
1172
1216
  return ok(result);
1173
1217
  } catch (error) {
@@ -1186,6 +1230,7 @@ function createSnapshotTool(deps) {
1186
1230
  description: "Capture a snapshot of the current page and return refs.",
1187
1231
  args: {
1188
1232
  sessionId: z14.string().describe("Session id"),
1233
+ targetId: z14.string().optional().describe("Optional target id"),
1189
1234
  format: formatSchema.optional().describe("Snapshot format"),
1190
1235
  maxChars: z14.number().int().optional().describe("Max characters for snapshot output"),
1191
1236
  cursor: z14.string().optional().describe("Cursor for paging")
@@ -1197,7 +1242,8 @@ function createSnapshotTool(deps) {
1197
1242
  args.sessionId,
1198
1243
  args.format ?? "outline",
1199
1244
  args.maxChars ?? config.snapshot.maxChars,
1200
- args.cursor
1245
+ args.cursor,
1246
+ args.targetId
1201
1247
  );
1202
1248
  return ok(result);
1203
1249
  } catch (error) {
@@ -1215,11 +1261,12 @@ function createClickTool(deps) {
1215
1261
  description: "Click a referenced element.",
1216
1262
  args: {
1217
1263
  sessionId: z15.string().describe("Session id"),
1264
+ targetId: z15.string().optional().describe("Optional target id"),
1218
1265
  ref: z15.string().describe("Element ref")
1219
1266
  },
1220
1267
  async execute(args) {
1221
1268
  try {
1222
- const result = await deps.manager.click(args.sessionId, args.ref);
1269
+ const result = await deps.manager.click(args.sessionId, args.ref, args.targetId);
1223
1270
  return ok(result);
1224
1271
  } catch (error) {
1225
1272
  return failure(serializeError(error).message, "click_failed");
@@ -1236,11 +1283,12 @@ function createHoverTool(deps) {
1236
1283
  description: "Hover over an element by ref.",
1237
1284
  args: {
1238
1285
  sessionId: z16.string().describe("Active browser session id"),
1286
+ targetId: z16.string().optional().describe("Optional target id"),
1239
1287
  ref: z16.string().describe("Element ref from snapshot")
1240
1288
  },
1241
1289
  async execute(args) {
1242
1290
  try {
1243
- const result = await deps.manager.hover(args.sessionId, args.ref);
1291
+ const result = await deps.manager.hover(args.sessionId, args.ref, args.targetId);
1244
1292
  return ok(result);
1245
1293
  } catch (error) {
1246
1294
  return failure(serializeError(error).message, "hover_failed");
@@ -1257,12 +1305,13 @@ function createPressTool(deps) {
1257
1305
  description: "Press a keyboard key, optionally focusing a ref first.",
1258
1306
  args: {
1259
1307
  sessionId: z17.string().describe("Active browser session id"),
1308
+ targetId: z17.string().optional().describe("Optional target id"),
1260
1309
  key: z17.string().describe("Keyboard key to press, e.g. Enter or ArrowDown"),
1261
1310
  ref: z17.string().optional().describe("Optional element ref to focus first")
1262
1311
  },
1263
1312
  async execute(args) {
1264
1313
  try {
1265
- const result = await deps.manager.press(args.sessionId, args.key, args.ref);
1314
+ const result = await deps.manager.press(args.sessionId, args.key, args.ref, args.targetId);
1266
1315
  return ok(result);
1267
1316
  } catch (error) {
1268
1317
  return failure(serializeError(error).message, "press_failed");
@@ -1279,11 +1328,12 @@ function createCheckTool(deps) {
1279
1328
  description: "Check a checkbox or toggle by ref.",
1280
1329
  args: {
1281
1330
  sessionId: z18.string().describe("Active browser session id"),
1331
+ targetId: z18.string().optional().describe("Optional target id"),
1282
1332
  ref: z18.string().describe("Element ref from snapshot")
1283
1333
  },
1284
1334
  async execute(args) {
1285
1335
  try {
1286
- const result = await deps.manager.check(args.sessionId, args.ref);
1336
+ const result = await deps.manager.check(args.sessionId, args.ref, args.targetId);
1287
1337
  return ok(result);
1288
1338
  } catch (error) {
1289
1339
  return failure(serializeError(error).message, "check_failed");
@@ -1300,11 +1350,12 @@ function createUncheckTool(deps) {
1300
1350
  description: "Uncheck a checkbox or toggle by ref.",
1301
1351
  args: {
1302
1352
  sessionId: z19.string().describe("Active browser session id"),
1353
+ targetId: z19.string().optional().describe("Optional target id"),
1303
1354
  ref: z19.string().describe("Element ref from snapshot")
1304
1355
  },
1305
1356
  async execute(args) {
1306
1357
  try {
1307
- const result = await deps.manager.uncheck(args.sessionId, args.ref);
1358
+ const result = await deps.manager.uncheck(args.sessionId, args.ref, args.targetId);
1308
1359
  return ok(result);
1309
1360
  } catch (error) {
1310
1361
  return failure(serializeError(error).message, "uncheck_failed");
@@ -1321,6 +1372,7 @@ function createTypeTool(deps) {
1321
1372
  description: "Type text into a referenced input.",
1322
1373
  args: {
1323
1374
  sessionId: z20.string().describe("Session id"),
1375
+ targetId: z20.string().optional().describe("Optional target id"),
1324
1376
  ref: z20.string().describe("Element ref"),
1325
1377
  text: z20.string().describe("Text to type"),
1326
1378
  clear: z20.boolean().optional().describe("Clear before typing"),
@@ -1333,7 +1385,8 @@ function createTypeTool(deps) {
1333
1385
  args.ref,
1334
1386
  args.text,
1335
1387
  Boolean(args.clear),
1336
- Boolean(args.submit)
1388
+ Boolean(args.submit),
1389
+ args.targetId
1337
1390
  );
1338
1391
  return ok(result);
1339
1392
  } catch (error) {
@@ -1351,12 +1404,13 @@ function createSelectTool(deps) {
1351
1404
  description: "Select options in a referenced select element.",
1352
1405
  args: {
1353
1406
  sessionId: z21.string().describe("Session id"),
1407
+ targetId: z21.string().optional().describe("Optional target id"),
1354
1408
  ref: z21.string().describe("Element ref"),
1355
1409
  values: z21.array(z21.string()).describe("Values to select")
1356
1410
  },
1357
1411
  async execute(args) {
1358
1412
  try {
1359
- await deps.manager.select(args.sessionId, args.ref, args.values);
1413
+ await deps.manager.select(args.sessionId, args.ref, args.values, args.targetId);
1360
1414
  return ok({});
1361
1415
  } catch (error) {
1362
1416
  return failure(serializeError(error).message, "select_failed");
@@ -1373,12 +1427,13 @@ function createScrollTool(deps) {
1373
1427
  description: "Scroll the page or a referenced element.",
1374
1428
  args: {
1375
1429
  sessionId: z22.string().describe("Session id"),
1430
+ targetId: z22.string().optional().describe("Optional target id"),
1376
1431
  dy: z22.number().describe("Scroll delta in pixels"),
1377
1432
  ref: z22.string().optional().describe("Optional element ref to scroll")
1378
1433
  },
1379
1434
  async execute(args) {
1380
1435
  try {
1381
- await deps.manager.scroll(args.sessionId, args.dy, args.ref);
1436
+ await deps.manager.scroll(args.sessionId, args.dy, args.ref, args.targetId);
1382
1437
  return ok({});
1383
1438
  } catch (error) {
1384
1439
  return failure(serializeError(error).message, "scroll_failed");
@@ -1395,11 +1450,12 @@ function createScrollIntoViewTool(deps) {
1395
1450
  description: "Scroll an element into view by ref.",
1396
1451
  args: {
1397
1452
  sessionId: z23.string().describe("Active browser session id"),
1453
+ targetId: z23.string().optional().describe("Optional target id"),
1398
1454
  ref: z23.string().describe("Element ref from snapshot")
1399
1455
  },
1400
1456
  async execute(args) {
1401
1457
  try {
1402
- const result = await deps.manager.scrollIntoView(args.sessionId, args.ref);
1458
+ const result = await deps.manager.scrollIntoView(args.sessionId, args.ref, args.targetId);
1403
1459
  return ok(result);
1404
1460
  } catch (error) {
1405
1461
  return failure(serializeError(error).message, "scroll_into_view_failed");
@@ -1416,6 +1472,7 @@ function createDomGetHtmlTool(deps) {
1416
1472
  description: "Get outerHTML for a referenced element.",
1417
1473
  args: {
1418
1474
  sessionId: z24.string().describe("Session id"),
1475
+ targetId: z24.string().optional().describe("Optional target id"),
1419
1476
  ref: z24.string().describe("Element ref"),
1420
1477
  maxChars: z24.number().int().optional().describe("Max characters")
1421
1478
  },
@@ -1424,7 +1481,8 @@ function createDomGetHtmlTool(deps) {
1424
1481
  const result = await deps.manager.domGetHtml(
1425
1482
  args.sessionId,
1426
1483
  args.ref,
1427
- args.maxChars ?? 8e3
1484
+ args.maxChars ?? 8e3,
1485
+ args.targetId
1428
1486
  );
1429
1487
  return ok({
1430
1488
  ref: args.ref,
@@ -1446,6 +1504,7 @@ function createDomGetTextTool(deps) {
1446
1504
  description: "Get inner text for a referenced element.",
1447
1505
  args: {
1448
1506
  sessionId: z25.string().describe("Session id"),
1507
+ targetId: z25.string().optional().describe("Optional target id"),
1449
1508
  ref: z25.string().describe("Element ref"),
1450
1509
  maxChars: z25.number().int().optional().describe("Max characters")
1451
1510
  },
@@ -1454,7 +1513,8 @@ function createDomGetTextTool(deps) {
1454
1513
  const result = await deps.manager.domGetText(
1455
1514
  args.sessionId,
1456
1515
  args.ref,
1457
- args.maxChars ?? 8e3
1516
+ args.maxChars ?? 8e3,
1517
+ args.targetId
1458
1518
  );
1459
1519
  return ok({
1460
1520
  ref: args.ref,
@@ -1476,12 +1536,13 @@ function createGetAttrTool(deps) {
1476
1536
  description: "Get a DOM attribute value by ref.",
1477
1537
  args: {
1478
1538
  sessionId: z26.string().describe("Active browser session id"),
1539
+ targetId: z26.string().optional().describe("Optional target id"),
1479
1540
  ref: z26.string().describe("Element ref from snapshot"),
1480
1541
  name: z26.string().describe("Attribute name, e.g. href or aria-label")
1481
1542
  },
1482
1543
  async execute(args) {
1483
1544
  try {
1484
- const result = await deps.manager.domGetAttr(args.sessionId, args.ref, args.name);
1545
+ const result = await deps.manager.domGetAttr(args.sessionId, args.ref, args.name, args.targetId);
1485
1546
  return ok(result);
1486
1547
  } catch (error) {
1487
1548
  return failure(serializeError(error).message, "get_attr_failed");
@@ -1498,11 +1559,12 @@ function createGetValueTool(deps) {
1498
1559
  description: "Get the input value for an element by ref.",
1499
1560
  args: {
1500
1561
  sessionId: z27.string().describe("Active browser session id"),
1562
+ targetId: z27.string().optional().describe("Optional target id"),
1501
1563
  ref: z27.string().describe("Element ref from snapshot")
1502
1564
  },
1503
1565
  async execute(args) {
1504
1566
  try {
1505
- const result = await deps.manager.domGetValue(args.sessionId, args.ref);
1567
+ const result = await deps.manager.domGetValue(args.sessionId, args.ref, args.targetId);
1506
1568
  return ok(result);
1507
1569
  } catch (error) {
1508
1570
  return failure(serializeError(error).message, "get_value_failed");
@@ -1519,11 +1581,12 @@ function createIsVisibleTool(deps) {
1519
1581
  description: "Check if an element is visible by ref.",
1520
1582
  args: {
1521
1583
  sessionId: z28.string().describe("Active browser session id"),
1584
+ targetId: z28.string().optional().describe("Optional target id"),
1522
1585
  ref: z28.string().describe("Element ref from snapshot")
1523
1586
  },
1524
1587
  async execute(args) {
1525
1588
  try {
1526
- const result = await deps.manager.domIsVisible(args.sessionId, args.ref);
1589
+ const result = await deps.manager.domIsVisible(args.sessionId, args.ref, args.targetId);
1527
1590
  return ok(result);
1528
1591
  } catch (error) {
1529
1592
  return failure(serializeError(error).message, "is_visible_failed");
@@ -1540,11 +1603,12 @@ function createIsEnabledTool(deps) {
1540
1603
  description: "Check if an element is enabled by ref.",
1541
1604
  args: {
1542
1605
  sessionId: z29.string().describe("Active browser session id"),
1606
+ targetId: z29.string().optional().describe("Optional target id"),
1543
1607
  ref: z29.string().describe("Element ref from snapshot")
1544
1608
  },
1545
1609
  async execute(args) {
1546
1610
  try {
1547
- const result = await deps.manager.domIsEnabled(args.sessionId, args.ref);
1611
+ const result = await deps.manager.domIsEnabled(args.sessionId, args.ref, args.targetId);
1548
1612
  return ok(result);
1549
1613
  } catch (error) {
1550
1614
  return failure(serializeError(error).message, "is_enabled_failed");
@@ -1561,11 +1625,12 @@ function createIsCheckedTool(deps) {
1561
1625
  description: "Check if an element is checked by ref.",
1562
1626
  args: {
1563
1627
  sessionId: z30.string().describe("Active browser session id"),
1628
+ targetId: z30.string().optional().describe("Optional target id"),
1564
1629
  ref: z30.string().describe("Element ref from snapshot")
1565
1630
  },
1566
1631
  async execute(args) {
1567
1632
  try {
1568
- const result = await deps.manager.domIsChecked(args.sessionId, args.ref);
1633
+ const result = await deps.manager.domIsChecked(args.sessionId, args.ref, args.targetId);
1569
1634
  return ok(result);
1570
1635
  } catch (error) {
1571
1636
  return failure(serializeError(error).message, "is_checked_failed");
@@ -2033,12 +2098,23 @@ import { tool as tool38 } from "@opencode-ai/plugin";
2033
2098
  var z38 = tool38.schema;
2034
2099
  async function loadMacroRuntime() {
2035
2100
  try {
2036
- const module = await import("./macros-NUBRM44Y.js");
2101
+ const module = await import("./macros-ND2M7LWU.js");
2037
2102
  return module;
2038
2103
  } catch {
2039
2104
  return null;
2040
2105
  }
2041
2106
  }
2107
+ async function resolveMacroProviderRuntime(deps) {
2108
+ if (deps.providerRuntime) {
2109
+ return deps.providerRuntime;
2110
+ }
2111
+ const { createConfiguredProviderRuntime: createConfiguredProviderRuntime2 } = await import("./runtime-factory-BICHDPE7.js");
2112
+ return createConfiguredProviderRuntime2({
2113
+ config: deps.config?.get?.(),
2114
+ manager: deps.manager,
2115
+ browserFallbackPort: deps.browserFallbackPort
2116
+ });
2117
+ }
2042
2118
  function parseFallbackMacro(expression, defaultProvider) {
2043
2119
  const raw = expression.trim();
2044
2120
  if (!raw.startsWith("@")) {
@@ -2113,12 +2189,7 @@ function createMacroResolveTool(deps) {
2113
2189
  ...catalog ? { catalog } : {}
2114
2190
  });
2115
2191
  }
2116
- const runtimeConfig = deps.config?.get?.();
2117
- const providerRuntime = deps.providerRuntime ?? createConfiguredProviderRuntime({
2118
- config: runtimeConfig,
2119
- manager: deps.manager,
2120
- browserFallbackPort: deps.browserFallbackPort
2121
- });
2192
+ const providerRuntime = await resolveMacroProviderRuntime(deps);
2122
2193
  const execution = shapeExecutionPayload(
2123
2194
  await executeMacroResolution(resolution, providerRuntime)
2124
2195
  );
@@ -2142,11 +2213,12 @@ function createClonePageTool(deps) {
2142
2213
  return tool39({
2143
2214
  description: "Export the active page as a React component and CSS bundle.",
2144
2215
  args: {
2145
- sessionId: z39.string().describe("Active browser session id")
2216
+ sessionId: z39.string().describe("Active browser session id"),
2217
+ targetId: z39.string().optional().describe("Optional target id")
2146
2218
  },
2147
2219
  async execute(args) {
2148
2220
  try {
2149
- const result = await deps.manager.clonePage(args.sessionId);
2221
+ const result = await deps.manager.clonePage(args.sessionId, args.targetId);
2150
2222
  return ok({ component: result.component, css: result.css, warnings: result.warnings });
2151
2223
  } catch (error) {
2152
2224
  return failure(serializeError(error).message, "clone_page_failed");
@@ -2163,11 +2235,12 @@ function createCloneComponentTool(deps) {
2163
2235
  description: "Export a selected element subtree as a React component and CSS bundle.",
2164
2236
  args: {
2165
2237
  sessionId: z40.string().describe("Active browser session id"),
2238
+ targetId: z40.string().optional().describe("Optional target id"),
2166
2239
  ref: z40.string().describe("Element ref from snapshot")
2167
2240
  },
2168
2241
  async execute(args) {
2169
2242
  try {
2170
- const result = await deps.manager.cloneComponent(args.sessionId, args.ref);
2243
+ const result = await deps.manager.cloneComponent(args.sessionId, args.ref, args.targetId);
2171
2244
  return ok({ component: result.component, css: result.css, warnings: result.warnings });
2172
2245
  } catch (error) {
2173
2246
  return failure(serializeError(error).message, "clone_component_failed");
@@ -2183,11 +2256,12 @@ function createPerfTool(deps) {
2183
2256
  return tool41({
2184
2257
  description: "Fetch lightweight performance metrics from the active page.",
2185
2258
  args: {
2186
- sessionId: z41.string().describe("Active browser session id")
2259
+ sessionId: z41.string().describe("Active browser session id"),
2260
+ targetId: z41.string().optional().describe("Optional target id")
2187
2261
  },
2188
2262
  async execute(args) {
2189
2263
  try {
2190
- const result = await deps.manager.perfMetrics(args.sessionId);
2264
+ const result = await deps.manager.perfMetrics(args.sessionId, args.targetId);
2191
2265
  return ok({ metrics: result.metrics });
2192
2266
  } catch (error) {
2193
2267
  return failure(serializeError(error).message, "perf_failed");
@@ -2204,11 +2278,12 @@ function createScreenshotTool(deps) {
2204
2278
  description: "Capture a screenshot of the active page.",
2205
2279
  args: {
2206
2280
  sessionId: z42.string().describe("Active browser session id"),
2281
+ targetId: z42.string().optional().describe("Optional target id"),
2207
2282
  path: z42.string().optional().describe("Optional output file path")
2208
2283
  },
2209
2284
  async execute(args) {
2210
2285
  try {
2211
- const result = await deps.manager.screenshot(args.sessionId, args.path);
2286
+ const result = await deps.manager.screenshot(args.sessionId, args.path, args.targetId);
2212
2287
  return ok(result);
2213
2288
  } catch (error) {
2214
2289
  return failure(serializeError(error).message, "screenshot_failed");
@@ -2227,6 +2302,8 @@ function createAnnotateTool(deps) {
2227
2302
  description: "Request interactive annotations via direct (CDP) or relay transport.",
2228
2303
  args: {
2229
2304
  sessionId: z43.string().describe("Session id"),
2305
+ stored: z43.boolean().optional().describe("Fetch the latest payload explicitly sent from popup/canvas surfaces"),
2306
+ includeScreenshots: z43.boolean().optional().describe("When fetching stored payloads, prefer screenshots if still available in memory"),
2230
2307
  transport: transportSchema.optional().describe("auto | direct | relay (default: auto)"),
2231
2308
  targetId: z43.string().optional().describe("Optional target id for direct mode"),
2232
2309
  tabId: z43.number().int().optional().describe("Optional Chrome tab id for relay mode"),
@@ -2238,7 +2315,7 @@ function createAnnotateTool(deps) {
2238
2315
  },
2239
2316
  async execute(args) {
2240
2317
  try {
2241
- const transport = args.transport ?? "auto";
2318
+ const transport = args.stored ? "relay" : args.transport ?? "auto";
2242
2319
  if (transport === "relay") {
2243
2320
  const status = await deps.manager.status(args.sessionId);
2244
2321
  if (status.mode !== "extension") {
@@ -2248,6 +2325,8 @@ function createAnnotateTool(deps) {
2248
2325
  const response = await deps.annotationManager.requestAnnotation({
2249
2326
  sessionId: args.sessionId,
2250
2327
  transport,
2328
+ stored: args.stored ?? false,
2329
+ includeScreenshots: args.includeScreenshots ?? true,
2251
2330
  targetId: args.targetId,
2252
2331
  tabId: args.tabId,
2253
2332
  url: args.url,
@@ -2256,6 +2335,12 @@ function createAnnotateTool(deps) {
2256
2335
  context: args.context,
2257
2336
  timeoutMs: args.timeoutMs
2258
2337
  });
2338
+ if (response.status === "cancelled") {
2339
+ return ok({
2340
+ cancelled: true,
2341
+ message: response.error?.message ?? "Annotation cancelled."
2342
+ });
2343
+ }
2259
2344
  if (response.status !== "ok" || !response.payload) {
2260
2345
  const message2 = response.error?.message ?? "Annotation failed.";
2261
2346
  const code = response.error?.code ?? "annotate_failed";
@@ -2278,11 +2363,12 @@ function createAnnotateTool(deps) {
2278
2363
  import { tool as tool44 } from "@opencode-ai/plugin";
2279
2364
 
2280
2365
  // src/tools/workflow-runtime.ts
2281
- var resolveProviderRuntime = (deps) => {
2366
+ var resolveProviderRuntime = async (deps) => {
2282
2367
  if (deps.providerRuntime) {
2283
2368
  return deps.providerRuntime;
2284
2369
  }
2285
- return createConfiguredProviderRuntime({
2370
+ const { createConfiguredProviderRuntime: createConfiguredProviderRuntime2 } = await import("./runtime-factory-BICHDPE7.js");
2371
+ return createConfiguredProviderRuntime2({
2286
2372
  config: deps.config?.get?.(),
2287
2373
  manager: deps.manager,
2288
2374
  browserFallbackPort: deps.browserFallbackPort
@@ -2315,7 +2401,8 @@ function createResearchRunTool(deps) {
2315
2401
  },
2316
2402
  async execute(args) {
2317
2403
  try {
2318
- const runtime = resolveProviderRuntime(deps);
2404
+ const runtime = await resolveProviderRuntime(deps);
2405
+ const { runResearchWorkflow } = await import("./providers-G3LRHQXX.js");
2319
2406
  const result = await runResearchWorkflow(runtime, {
2320
2407
  topic: args.topic,
2321
2408
  days: args.days,
@@ -2362,7 +2449,8 @@ function createShoppingRunTool(deps) {
2362
2449
  },
2363
2450
  async execute(args) {
2364
2451
  try {
2365
- const runtime = resolveProviderRuntime(deps);
2452
+ const runtime = await resolveProviderRuntime(deps);
2453
+ const { runShoppingWorkflow } = await import("./providers-G3LRHQXX.js");
2366
2454
  const result = await runShoppingWorkflow(runtime, {
2367
2455
  query: args.query,
2368
2456
  providers: args.providers,
@@ -2426,7 +2514,8 @@ function createProductVideoRunTool(deps) {
2426
2514
  },
2427
2515
  async execute(args) {
2428
2516
  try {
2429
- const runtime = resolveProviderRuntime(deps);
2517
+ const runtime = await resolveProviderRuntime(deps);
2518
+ const { runProductVideoWorkflow } = await import("./providers-G3LRHQXX.js");
2430
2519
  const includeScreenshots = args.include_screenshots ?? true;
2431
2520
  const result = await runProductVideoWorkflow(runtime, {
2432
2521
  product_url: args.product_url,
@@ -2450,10 +2539,41 @@ function createProductVideoRunTool(deps) {
2450
2539
  });
2451
2540
  }
2452
2541
 
2453
- // src/tools/skill_list.ts
2542
+ // src/tools/canvas.ts
2454
2543
  import { tool as tool47 } from "@opencode-ai/plugin";
2455
- function createSkillListTool(deps) {
2544
+ var z47 = tool47.schema;
2545
+ function createCanvasTool(deps) {
2456
2546
  return tool47({
2547
+ description: "Execute a typed design-canvas command such as canvas.session.open or canvas.document.patch.",
2548
+ args: {
2549
+ command: z47.string().min(1).describe("Canvas command name"),
2550
+ params: z47.record(z47.string(), z47.unknown()).optional().describe("Canvas command payload")
2551
+ },
2552
+ async execute(args) {
2553
+ if (!deps.canvasManager) {
2554
+ return failure("Canvas manager unavailable.", "canvas_unavailable");
2555
+ }
2556
+ try {
2557
+ if (!args.command.startsWith("canvas.")) {
2558
+ return failure("Canvas commands must start with 'canvas.'.", "canvas_invalid_command");
2559
+ }
2560
+ const result = await deps.canvasManager.execute(args.command, args.params ?? {});
2561
+ if (result && typeof result === "object" && !Array.isArray(result)) {
2562
+ return ok(result);
2563
+ }
2564
+ return ok({ result });
2565
+ } catch (error) {
2566
+ const serialized = serializeError(error);
2567
+ return failure(serialized.message, serialized.code ?? "canvas_failed", serialized.details);
2568
+ }
2569
+ }
2570
+ });
2571
+ }
2572
+
2573
+ // src/tools/skill_list.ts
2574
+ import { tool as tool48 } from "@opencode-ai/plugin";
2575
+ function createSkillListTool(deps) {
2576
+ return tool48({
2457
2577
  description: "List available skills from OpenCode skill directories (compatibility wrapper)",
2458
2578
  args: {},
2459
2579
  async execute() {
@@ -2469,14 +2589,14 @@ function createSkillListTool(deps) {
2469
2589
  }
2470
2590
 
2471
2591
  // src/tools/skill_load.ts
2472
- import { tool as tool48 } from "@opencode-ai/plugin";
2473
- var z47 = tool48.schema;
2592
+ import { tool as tool49 } from "@opencode-ai/plugin";
2593
+ var z48 = tool49.schema;
2474
2594
  function createSkillLoadTool(deps) {
2475
- return tool48({
2595
+ return tool49({
2476
2596
  description: "Load a specific skill by name from OpenCode skill directories (compatibility wrapper)",
2477
2597
  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")
2598
+ name: z48.string().describe("Name of the skill to load (e.g., 'opendevbrowser-login-automation', 'opendevbrowser-form-testing')"),
2599
+ topic: z48.string().optional().describe("Optional topic to filter the skill content")
2480
2600
  },
2481
2601
  async execute(args) {
2482
2602
  try {
@@ -2547,6 +2667,7 @@ function createTools(deps) {
2547
2667
  opendevbrowser_research_run: wrap(createResearchRunTool(deps)),
2548
2668
  opendevbrowser_shopping_run: wrap(createShoppingRunTool(deps)),
2549
2669
  opendevbrowser_product_video_run: wrap(createProductVideoRunTool(deps)),
2670
+ opendevbrowser_canvas: wrap(createCanvasTool(deps)),
2550
2671
  opendevbrowser_clone_page: wrap(createClonePageTool(deps)),
2551
2672
  opendevbrowser_clone_component: wrap(createCloneComponentTool(deps)),
2552
2673
  opendevbrowser_perf: wrap(createPerfTool(deps)),
@@ -2563,6 +2684,7 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
2563
2684
  const { config, configStore, skills, ensureRelay, cleanup, getExtensionPath } = core;
2564
2685
  let relay = core.relay;
2565
2686
  let manager = core.manager;
2687
+ let canvasManager = core.canvasManager;
2566
2688
  let runner = core.runner;
2567
2689
  let annotationManager = core.annotationManager;
2568
2690
  let providerRuntime = core.providerRuntime;
@@ -2581,6 +2703,7 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
2581
2703
  }
2582
2704
  const toolDeps = {
2583
2705
  manager,
2706
+ canvasManager,
2584
2707
  annotationManager,
2585
2708
  runner,
2586
2709
  config: configStore,
@@ -2595,6 +2718,7 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
2595
2718
  daemonClient = new DaemonClient({ autoRenew: true });
2596
2719
  }
2597
2720
  manager = new RemoteManager(daemonClient);
2721
+ canvasManager = new RemoteCanvasManager(daemonClient);
2598
2722
  relay = new RemoteRelay(daemonClient);
2599
2723
  annotationManager.setRelay(relay);
2600
2724
  annotationManager.setBrowserManager(manager);
@@ -2606,6 +2730,7 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
2606
2730
  browserFallbackPort
2607
2731
  });
2608
2732
  toolDeps.manager = manager;
2733
+ toolDeps.canvasManager = canvasManager;
2609
2734
  toolDeps.relay = relay;
2610
2735
  toolDeps.runner = runner;
2611
2736
  toolDeps.providerRuntime = providerRuntime;