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.
- package/README.md +51 -27
- package/dist/browser/annotation-manager.d.ts +3 -0
- package/dist/browser/annotation-manager.d.ts.map +1 -1
- package/dist/browser/browser-manager.d.ts +6 -1
- package/dist/browser/browser-manager.d.ts.map +1 -1
- package/dist/browser/canvas-client.d.ts +53 -0
- package/dist/browser/canvas-client.d.ts.map +1 -0
- package/dist/browser/canvas-code-sync-manager.d.ts +79 -0
- package/dist/browser/canvas-code-sync-manager.d.ts.map +1 -0
- package/dist/browser/canvas-manager.d.ts +94 -0
- package/dist/browser/canvas-manager.d.ts.map +1 -0
- package/dist/browser/canvas-runtime-preview-bridge.d.ts +20 -0
- package/dist/browser/canvas-runtime-preview-bridge.d.ts.map +1 -0
- package/dist/browser/canvas-session-sync-manager.d.ts +21 -0
- package/dist/browser/canvas-session-sync-manager.d.ts.map +1 -0
- package/dist/browser/manager-types.d.ts +13 -1
- package/dist/browser/manager-types.d.ts.map +1 -1
- package/dist/browser/ops-browser-manager.d.ts +11 -1
- package/dist/browser/ops-browser-manager.d.ts.map +1 -1
- package/dist/canvas/code-sync/apply-tsx.d.ts +23 -0
- package/dist/canvas/code-sync/apply-tsx.d.ts.map +1 -0
- package/dist/canvas/code-sync/graph.d.ts +5 -0
- package/dist/canvas/code-sync/graph.d.ts.map +1 -0
- package/dist/canvas/code-sync/hash.d.ts +3 -0
- package/dist/canvas/code-sync/hash.d.ts.map +1 -0
- package/dist/canvas/code-sync/import.d.ts +18 -0
- package/dist/canvas/code-sync/import.d.ts.map +1 -0
- package/dist/canvas/code-sync/manifest.d.ts +5 -0
- package/dist/canvas/code-sync/manifest.d.ts.map +1 -0
- package/dist/canvas/code-sync/tsx-adapter.d.ts +8 -0
- package/dist/canvas/code-sync/tsx-adapter.d.ts.map +1 -0
- package/dist/canvas/code-sync/types.d.ts +152 -0
- package/dist/canvas/code-sync/types.d.ts.map +1 -0
- package/dist/canvas/code-sync/write.d.ts +9 -0
- package/dist/canvas/code-sync/write.d.ts.map +1 -0
- package/dist/canvas/document-store.d.ts +81 -0
- package/dist/canvas/document-store.d.ts.map +1 -0
- package/dist/canvas/export.d.ts +12 -0
- package/dist/canvas/export.d.ts.map +1 -0
- package/dist/canvas/repo-store.d.ts +10 -0
- package/dist/canvas/repo-store.d.ts.map +1 -0
- package/dist/canvas/surface-palette.d.ts +15 -0
- package/dist/canvas/surface-palette.d.ts.map +1 -0
- package/dist/canvas/types.d.ts +255 -0
- package/dist/canvas/types.d.ts.map +1 -0
- package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js +7 -0
- package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js.map +1 -0
- package/dist/{chunk-ST7CO5FA.js → chunk-5J3IFL3X.js} +11577 -13539
- package/dist/chunk-5J3IFL3X.js.map +1 -0
- package/dist/chunk-D633UO34.js +8149 -0
- package/dist/chunk-D633UO34.js.map +1 -0
- package/dist/{chunk-7W3SPXIB.js → chunk-FUSXMW3G.js} +4 -1
- package/dist/chunk-TBUCZX4A.js +34 -0
- package/dist/chunk-TBUCZX4A.js.map +1 -0
- package/dist/chunk-V7KUDHDG.js +276 -0
- package/dist/chunk-V7KUDHDG.js.map +1 -0
- package/dist/chunk-Y2KL55OG.js +59 -0
- package/dist/chunk-Y2KL55OG.js.map +1 -0
- package/dist/cli/args.d.ts +3 -3
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/commands/annotate.d.ts +11 -0
- package/dist/cli/commands/annotate.d.ts.map +1 -1
- package/dist/cli/commands/canvas.d.ts +45 -0
- package/dist/cli/commands/canvas.d.ts.map +1 -0
- package/dist/cli/commands/devtools/perf.d.ts.map +1 -1
- package/dist/cli/commands/devtools/screenshot.d.ts +1 -0
- package/dist/cli/commands/devtools/screenshot.d.ts.map +1 -1
- package/dist/cli/commands/dom/attr.d.ts.map +1 -1
- package/dist/cli/commands/dom/checked.d.ts.map +1 -1
- package/dist/cli/commands/dom/enabled.d.ts.map +1 -1
- package/dist/cli/commands/dom/html.d.ts.map +1 -1
- package/dist/cli/commands/dom/text.d.ts.map +1 -1
- package/dist/cli/commands/dom/value.d.ts.map +1 -1
- package/dist/cli/commands/dom/visible.d.ts.map +1 -1
- package/dist/cli/commands/export/clone-component.d.ts +9 -0
- package/dist/cli/commands/export/clone-component.d.ts.map +1 -1
- package/dist/cli/commands/export/clone-page.d.ts +8 -0
- package/dist/cli/commands/export/clone-page.d.ts.map +1 -1
- package/dist/cli/commands/interact/check.d.ts.map +1 -1
- package/dist/cli/commands/interact/click.d.ts.map +1 -1
- package/dist/cli/commands/interact/hover.d.ts.map +1 -1
- package/dist/cli/commands/interact/press.d.ts.map +1 -1
- package/dist/cli/commands/interact/scroll-into-view.d.ts.map +1 -1
- package/dist/cli/commands/interact/scroll.d.ts.map +1 -1
- package/dist/cli/commands/interact/select.d.ts.map +1 -1
- package/dist/cli/commands/interact/type.d.ts.map +1 -1
- package/dist/cli/commands/interact/uncheck.d.ts.map +1 -1
- package/dist/cli/commands/native.d.ts +12 -1
- package/dist/cli/commands/native.d.ts.map +1 -1
- package/dist/cli/commands/nav/goto.d.ts.map +1 -1
- package/dist/cli/commands/nav/snapshot.d.ts.map +1 -1
- package/dist/cli/commands/nav/wait.d.ts.map +1 -1
- package/dist/cli/commands/serve.d.ts +5 -0
- package/dist/cli/commands/serve.d.ts.map +1 -1
- package/dist/cli/commands/session/connect.d.ts.map +1 -1
- package/dist/cli/commands/status.d.ts +5 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/daemon-commands.d.ts.map +1 -1
- package/dist/cli/help.d.ts +5 -0
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/index.js +724 -163
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/remote-canvas-manager.d.ts +8 -0
- package/dist/cli/remote-canvas-manager.d.ts.map +1 -0
- package/dist/cli/remote-manager.d.ts +3 -1
- package/dist/cli/remote-manager.d.ts.map +1 -1
- package/dist/cli/remote-relay.d.ts +2 -0
- package/dist/cli/remote-relay.d.ts.map +1 -1
- package/dist/cli/utils/parse.d.ts +1 -0
- package/dist/cli/utils/parse.d.ts.map +1 -1
- package/dist/core/bootstrap.d.ts.map +1 -1
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/fs-UMRKOBNN.js +7 -0
- package/dist/fs-UMRKOBNN.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +192 -67
- package/dist/index.js.map +1 -1
- package/dist/{macros-NUBRM44Y.js → macros-ND2M7LWU.js} +2 -2
- package/dist/opendevbrowser.d.ts.map +1 -1
- package/dist/opendevbrowser.js +192 -67
- package/dist/opendevbrowser.js.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/shopping/index.d.ts.map +1 -1
- package/dist/providers-G3LRHQXX.js +121 -0
- package/dist/providers-G3LRHQXX.js.map +1 -0
- package/dist/relay/protocol.d.ts +85 -3
- package/dist/relay/protocol.d.ts.map +1 -1
- package/dist/relay/relay-server.d.ts +14 -1
- package/dist/relay/relay-server.d.ts.map +1 -1
- package/dist/relay/relay-types.d.ts +3 -0
- package/dist/relay/relay-types.d.ts.map +1 -1
- package/dist/runtime-factory-BICHDPE7.js +13 -0
- package/dist/runtime-factory-BICHDPE7.js.map +1 -0
- package/dist/tools/annotate.d.ts.map +1 -1
- package/dist/tools/canvas.d.ts +4 -0
- package/dist/tools/canvas.d.ts.map +1 -0
- package/dist/tools/check.d.ts.map +1 -1
- package/dist/tools/click.d.ts.map +1 -1
- package/dist/tools/clone_component.d.ts.map +1 -1
- package/dist/tools/clone_page.d.ts.map +1 -1
- package/dist/tools/connect.d.ts.map +1 -1
- package/dist/tools/deps.d.ts +2 -0
- package/dist/tools/deps.d.ts.map +1 -1
- package/dist/tools/dom_get_html.d.ts.map +1 -1
- package/dist/tools/dom_get_text.d.ts.map +1 -1
- package/dist/tools/get_attr.d.ts.map +1 -1
- package/dist/tools/get_value.d.ts.map +1 -1
- package/dist/tools/goto.d.ts.map +1 -1
- package/dist/tools/hover.d.ts.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/is_checked.d.ts.map +1 -1
- package/dist/tools/is_enabled.d.ts.map +1 -1
- package/dist/tools/is_visible.d.ts.map +1 -1
- package/dist/tools/launch.d.ts.map +1 -1
- package/dist/tools/macro_resolve.d.ts.map +1 -1
- package/dist/tools/perf.d.ts.map +1 -1
- package/dist/tools/press.d.ts.map +1 -1
- package/dist/tools/product_video_run.d.ts.map +1 -1
- package/dist/tools/research_run.d.ts.map +1 -1
- package/dist/tools/response.d.ts +4 -1
- package/dist/tools/response.d.ts.map +1 -1
- package/dist/tools/screenshot.d.ts.map +1 -1
- package/dist/tools/scroll.d.ts.map +1 -1
- package/dist/tools/scroll_into_view.d.ts.map +1 -1
- package/dist/tools/select.d.ts.map +1 -1
- package/dist/tools/shopping_run.d.ts.map +1 -1
- package/dist/tools/snapshot.d.ts.map +1 -1
- package/dist/tools/type.d.ts.map +1 -1
- package/dist/tools/uncheck.d.ts.map +1 -1
- package/dist/tools/wait.d.ts.map +1 -1
- package/dist/tools/workflow-runtime.d.ts +1 -2
- package/dist/tools/workflow-runtime.d.ts.map +1 -1
- package/extension/canvas.html +636 -0
- package/extension/dist/annotate-content.css +15 -6
- package/extension/dist/annotate-content.js +119 -9
- package/extension/dist/annotation-payload.js +163 -0
- package/extension/dist/background.js +148 -18
- package/extension/dist/canvas/canvas-runtime.js +1061 -0
- package/extension/dist/canvas/model.js +213 -0
- package/extension/dist/canvas/viewport-fit.js +67 -0
- package/extension/dist/canvas-page.js +1801 -0
- package/extension/dist/ops/dom-bridge.js +116 -3
- package/extension/dist/ops/ops-runtime.js +508 -44
- package/extension/dist/ops/ops-session-store.js +21 -114
- package/extension/dist/ops/target-session-coordinator.js +157 -0
- package/extension/dist/popup.js +155 -31
- package/extension/dist/services/ConnectionManager.js +17 -0
- package/extension/dist/services/RelayClient.js +9 -0
- package/extension/dist/services/TabManager.js +35 -12
- package/extension/dist/types.js +2 -0
- package/extension/manifest.json +1 -1
- package/extension/popup.html +52 -0
- package/package.json +6 -4
- package/skills/AGENTS.md +5 -2
- package/skills/opendevbrowser-best-practices/SKILL.md +71 -3
- package/skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md +141 -0
- package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +113 -17
- package/skills/opendevbrowser-best-practices/assets/templates/canvas-blocker-checklist.json +70 -0
- package/skills/opendevbrowser-best-practices/assets/templates/canvas-feedback-eval.json +73 -0
- package/skills/opendevbrowser-best-practices/assets/templates/canvas-generation-plan.v1.json +67 -0
- package/skills/opendevbrowser-best-practices/assets/templates/canvas-handshake-example.json +126 -0
- package/skills/opendevbrowser-best-practices/assets/templates/robustness-checklist.json +57 -0
- package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +7 -3
- package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +26 -0
- package/skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh +82 -1
- package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +225 -84
- package/dist/chunk-ST7CO5FA.js.map +0 -1
- /package/dist/{chunk-7W3SPXIB.js.map → chunk-FUSXMW3G.js.map} +0 -0
- /package/dist/{macros-NUBRM44Y.js.map → macros-ND2M7LWU.js.map} +0 -0
package/dist/opendevbrowser.js
CHANGED
|
@@ -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-
|
|
20
|
-
import "./chunk-
|
|
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) ? {
|
|
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
|
-
|
|
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-
|
|
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
|
|
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
|
-
|
|
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/
|
|
2542
|
+
// src/tools/canvas.ts
|
|
2454
2543
|
import { tool as tool47 } from "@opencode-ai/plugin";
|
|
2455
|
-
|
|
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
|
|
2473
|
-
var
|
|
2592
|
+
import { tool as tool49 } from "@opencode-ai/plugin";
|
|
2593
|
+
var z48 = tool49.schema;
|
|
2474
2594
|
function createSkillLoadTool(deps) {
|
|
2475
|
-
return
|
|
2595
|
+
return tool49({
|
|
2476
2596
|
description: "Load a specific skill by name from OpenCode skill directories (compatibility wrapper)",
|
|
2477
2597
|
args: {
|
|
2478
|
-
name:
|
|
2479
|
-
topic:
|
|
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;
|