@jobshimo/browser-link 0.22.0 → 0.23.0

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 (63) hide show
  1. package/README.md +5 -0
  2. package/dist/agent-instructions/content.js +11 -0
  3. package/dist/agent-instructions/content.js.map +1 -1
  4. package/dist/cdp/client.d.ts +35 -0
  5. package/dist/cdp/client.js +149 -0
  6. package/dist/cdp/client.js.map +1 -0
  7. package/dist/cdp/flow.d.ts +178 -0
  8. package/dist/cdp/flow.js +217 -0
  9. package/dist/cdp/flow.js.map +1 -0
  10. package/dist/cdp/gate.d.ts +31 -0
  11. package/dist/cdp/gate.js +35 -0
  12. package/dist/cdp/gate.js.map +1 -0
  13. package/dist/cdp/grant.d.ts +45 -0
  14. package/dist/cdp/grant.js +81 -0
  15. package/dist/cdp/grant.js.map +1 -0
  16. package/dist/cdp/inpage/builders.d.ts +165 -0
  17. package/dist/cdp/inpage/builders.js +501 -0
  18. package/dist/cdp/inpage/builders.js.map +1 -0
  19. package/dist/cdp/inpage/deep-query.d.ts +57 -0
  20. package/dist/cdp/inpage/deep-query.js +325 -0
  21. package/dist/cdp/inpage/deep-query.js.map +1 -0
  22. package/dist/cdp/inpage/dom-helpers.d.ts +27 -0
  23. package/dist/cdp/inpage/dom-helpers.js +147 -0
  24. package/dist/cdp/inpage/dom-helpers.js.map +1 -0
  25. package/dist/cdp/keymap.d.ts +83 -0
  26. package/dist/cdp/keymap.js +205 -0
  27. package/dist/cdp/keymap.js.map +1 -0
  28. package/dist/cdp/settle.d.ts +38 -0
  29. package/dist/cdp/settle.js +76 -0
  30. package/dist/cdp/settle.js.map +1 -0
  31. package/dist/cdp/support.d.ts +26 -0
  32. package/dist/cdp/support.js +58 -0
  33. package/dist/cdp/support.js.map +1 -0
  34. package/dist/cdp/targets.d.ts +54 -0
  35. package/dist/cdp/targets.js +176 -0
  36. package/dist/cdp/targets.js.map +1 -0
  37. package/dist/cdp/transport.d.ts +31 -0
  38. package/dist/cdp/transport.js +531 -0
  39. package/dist/cdp/transport.js.map +1 -0
  40. package/dist/cli.js +50 -0
  41. package/dist/cli.js.map +1 -1
  42. package/dist/commands/about.js +13 -0
  43. package/dist/commands/about.js.map +1 -1
  44. package/dist/commands/cdp.d.ts +28 -0
  45. package/dist/commands/cdp.js +172 -0
  46. package/dist/commands/cdp.js.map +1 -0
  47. package/dist/commands/config.d.ts +92 -0
  48. package/dist/commands/config.js +173 -12
  49. package/dist/commands/config.js.map +1 -1
  50. package/dist/config.d.ts +70 -0
  51. package/dist/config.js +94 -1
  52. package/dist/config.js.map +1 -1
  53. package/dist/extension/manifest.json +1 -1
  54. package/dist/server.js +9 -0
  55. package/dist/server.js.map +1 -1
  56. package/dist/tools/browser-definitions.js +4 -3
  57. package/dist/tools/browser-definitions.js.map +1 -1
  58. package/dist/tools/browser-dispatch.d.ts +31 -0
  59. package/dist/tools/browser-dispatch.js +88 -40
  60. package/dist/tools/browser-dispatch.js.map +1 -1
  61. package/dist/tools/server-instructions.js +19 -0
  62. package/dist/tools/server-instructions.js.map +1 -1
  63. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"targets.js","sourceRoot":"","sources":["../../src/cdp/targets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { cdpUnsupportedToolError } from './support.js';
2
+ export { CDP_TOOL_SUPPORT, isCdpToolSupported } from './support.js';
3
+ export { cdpUnsupportedToolError };
4
+ /** Drop every cached connection immediately, closing each WebSocket.
5
+ * Exported for tests; not on any agent-reachable path. */
6
+ export declare function resetConnectionsForTest(): void;
7
+ /**
8
+ * Entry point matching `BrowserToolDeps['callBrowserTool']`'s signature —
9
+ * `tools/browser-dispatch.ts` calls this for any tool addressing a `cdp:`
10
+ * tab, after confirming (via `CDP_TOOL_SUPPORT`) that the tool is in v1
11
+ * scope. `tool` is the WIRE-level name ('click', not 'browser.click').
12
+ *
13
+ * Re-checks `checkCdpDirectGate()` itself (defense in depth — this module
14
+ * must never be safe to call without the gate passing, even if a future
15
+ * caller reaches it directly instead of through the dispatcher).
16
+ *
17
+ * `timeoutMs` (the dispatcher's per-tool budget) is DELIBERATELY not applied
18
+ * as an outer race here, unlike the WS-bridge path where it bounds a single
19
+ * opaque round trip to the extension. Over cdp-direct every underlying step
20
+ * already carries its OWN hard bound, so there is no unbounded wait for an
21
+ * outer timeout to guard: each `CdpClient.send` has a 15s default per-command
22
+ * timeout (see client.ts), `waitForLoad` caps navigation's load wait at 20s,
23
+ * `performWaitFor` clamps its own poll loop to <=30s, and `runFlow`'s budget
24
+ * was already validated <=60s upstream. Wrapping the whole call in a second
25
+ * timer would only add a redundant, harder-to-reason-about failure mode (an
26
+ * outer reject while an inner CDP command is still in flight and will settle
27
+ * on its own bound). The parameter is kept in the signature for shape-parity
28
+ * with `callBrowserTool` and so a future transport change that DOES introduce
29
+ * an unbounded step can start honouring it without a signature churn.
30
+ */
31
+ export declare function callCdpTool(tabId: string, tool: string, params: unknown, _timeoutMs?: number): Promise<unknown>;
@@ -0,0 +1,531 @@
1
+ /**
2
+ * The cdp-direct tool-routing adapter: implements the same call surface the
3
+ * WS-bridge path (`bridge/ws-bridge.ts`'s `sendToolRequest`) uses —
4
+ * `callCdpTool(tabId, tool, params, timeoutMs?) => Promise<unknown>` — but
5
+ * executes each wire-level tool directly over a raw CDP-over-WebSocket
6
+ * connection (`./client.ts`) instead of routing through the extension.
7
+ *
8
+ * Mirrors `packages/extension/src/background.ts`'s `handleTool` switch and
9
+ * its extracted `performFind` / `performClick` / `performType` /
10
+ * `performPress` / `performWaitFor` helpers function-for-function, using
11
+ * the SAME in-page builder strings (`./inpage/builders.ts`, a verbatim copy
12
+ * — see its header comment) and the SAME `browser.flow` step engine
13
+ * (`./flow.ts`, also a verbatim copy). The wire-level contract is
14
+ * identical: a resolved promise is a wire `ok:true` result, a rejected
15
+ * promise is a wire `ok:false` (the rejection's message is the error
16
+ * string) — exactly what `sendToolRequest` produces for the extension path,
17
+ * so `tools/browser-dispatch.ts` cannot tell the two transports apart by
18
+ * shape.
19
+ */
20
+ import { loadConfig, sanitizeCdpPort } from '../config.js';
21
+ import { checkCdpDirectGate } from './gate.js';
22
+ import { buildTargetWsUrl, cdpTargetIdFromTabId, isDrivablePageTarget } from './targets.js';
23
+ import { CdpClient } from './client.js';
24
+ import { cdpUnsupportedToolError } from './support.js';
25
+ import { buildClickResolveJs, buildFindJs, buildFocusJs, buildSnapshotJs, buildStateJs, buildTypeResolveJs, } from './inpage/builders.js';
26
+ import { resolveSettleParams, settleSafely } from './settle.js';
27
+ import { buildKeyEventSequence, modifiersToBitmask, resolveKey } from './keymap.js';
28
+ import { runFlow, } from './flow.js';
29
+ // The declarative v1 support table lives in `./support.ts` (zero
30
+ // dependencies, importable by `tools/browser-dispatch.ts` without pulling
31
+ // in this whole transport) — re-exported here so existing callers of
32
+ // `cdp/transport.ts` keep working.
33
+ export { CDP_TOOL_SUPPORT, isCdpToolSupported } from './support.js';
34
+ export { cdpUnsupportedToolError };
35
+ const connections = new Map();
36
+ /** Idle connections are closed after this long unused — keeps a long-lived
37
+ * server process from accumulating an unbounded number of open WebSockets
38
+ * to targets an agent stopped touching hours ago. */
39
+ const IDLE_CLEANUP_MS = 5 * 60_000;
40
+ const IDLE_SWEEP_INTERVAL_MS = 60_000;
41
+ let cleanupTimer = null;
42
+ function ensureCleanupTimer() {
43
+ if (cleanupTimer)
44
+ return;
45
+ cleanupTimer = setInterval(() => {
46
+ const now = Date.now();
47
+ for (const [targetId, conn] of connections) {
48
+ if (now - conn.lastUsedAt > IDLE_CLEANUP_MS) {
49
+ conn.client.close();
50
+ connections.delete(targetId);
51
+ }
52
+ }
53
+ }, IDLE_SWEEP_INTERVAL_MS);
54
+ cleanupTimer.unref();
55
+ }
56
+ async function getConnection(targetId) {
57
+ const existing = connections.get(targetId);
58
+ if (existing && existing.client.isOpen) {
59
+ existing.lastUsedAt = Date.now();
60
+ return existing.client;
61
+ }
62
+ if (existing)
63
+ connections.delete(targetId);
64
+ const cfg = loadConfig();
65
+ // sanitizeCdpPort neutralizes an untrusted config.json port string before
66
+ // it reaches the ws URL; the host-assert below is defense in depth.
67
+ const port = sanitizeCdpPort(cfg.cdpDirectPort);
68
+ const wsUrl = buildTargetWsUrl(port, targetId);
69
+ let wsHost;
70
+ try {
71
+ wsHost = new URL(wsUrl).hostname;
72
+ }
73
+ catch {
74
+ throw new Error(`cdp-direct: could not parse the ws url for target ${targetId}`);
75
+ }
76
+ if (wsHost !== '127.0.0.1') {
77
+ throw new Error(`cdp-direct: refusing a non-loopback ws url for target ${targetId}`);
78
+ }
79
+ const client = new CdpClient(wsUrl);
80
+ await client.connect();
81
+ // Re-validate the target on connect, NOT just at discovery. `list_tabs`
82
+ // filters devtools/extension targets for display, but the transport is
83
+ // reached by a caller-supplied `cdp:<targetId>` whose provenance we do
84
+ // not trust — the id need not have come from a `list_tabs` this process
85
+ // produced. Ask the freshly-attached session what it actually is and
86
+ // refuse anything that is not a real page (a DevTools UI surface, an
87
+ // extension page, a worker/service_worker target), using the SAME
88
+ // predicate discovery uses so the two can never drift. Do this BEFORE
89
+ // Page.enable so we never even enable domains on a target we are about
90
+ // to reject.
91
+ const info = await client.send('Target.getTargetInfo');
92
+ if (!isDrivablePageTarget(info.targetInfo.type, info.targetInfo.url)) {
93
+ client.close();
94
+ throw new Error(`cdp-direct: target ${targetId} is not a drivable page ` +
95
+ `(type=${info.targetInfo.type ?? 'unknown'}) — refusing to connect.`);
96
+ }
97
+ // Page.enable is the only domain cdp-direct's v1 tool set needs enabled
98
+ // up front — it unlocks Page.loadEventFired, which navigate's
99
+ // wait_for_load uses. Runtime.evaluate and Input.* commands work without
100
+ // their own domain being explicitly enabled.
101
+ await client.send('Page.enable');
102
+ ensureCleanupTimer();
103
+ connections.set(targetId, { client, lastUsedAt: Date.now() });
104
+ return client;
105
+ }
106
+ /** Drop every cached connection immediately, closing each WebSocket.
107
+ * Exported for tests; not on any agent-reachable path. */
108
+ export function resetConnectionsForTest() {
109
+ for (const conn of connections.values())
110
+ conn.client.close();
111
+ connections.clear();
112
+ if (cleanupTimer) {
113
+ clearInterval(cleanupTimer);
114
+ cleanupTimer = null;
115
+ }
116
+ }
117
+ async function evaluateInTab(client, expression) {
118
+ const res = await client.send('Runtime.evaluate', {
119
+ expression,
120
+ returnByValue: true,
121
+ awaitPromise: true,
122
+ userGesture: true,
123
+ });
124
+ if (res.exceptionDetails) {
125
+ const ex = res.exceptionDetails;
126
+ throw new Error(ex.exception?.description ?? ex.text ?? 'Evaluation failed');
127
+ }
128
+ return res.result.value;
129
+ }
130
+ function waitForLoad(client, timeoutMs = 20_000) {
131
+ return new Promise((resolve, reject) => {
132
+ let settled = false;
133
+ const off = client.on('Page.loadEventFired', () => {
134
+ if (settled)
135
+ return;
136
+ settled = true;
137
+ off();
138
+ clearTimeout(timer);
139
+ resolve();
140
+ });
141
+ const timer = setTimeout(() => {
142
+ if (settled)
143
+ return;
144
+ settled = true;
145
+ off();
146
+ reject(new Error('navigation timed out'));
147
+ }, timeoutMs);
148
+ });
149
+ }
150
+ function runSettle(client, settle) {
151
+ return settleSafely((expression) => evaluateInTab(client, expression), settle);
152
+ }
153
+ async function dispatchKeyEventSequence(client, def, modifiers) {
154
+ if (!def)
155
+ return;
156
+ for (const event of buildKeyEventSequence(def, modifiers)) {
157
+ await client.send('Input.dispatchKeyEvent', event);
158
+ }
159
+ }
160
+ async function performFind(client, params) {
161
+ try {
162
+ if (!params.text)
163
+ return { ok: false, error: 'find: text required' };
164
+ const opts = { text: params.text, role: params.role, exact: params.exact === true };
165
+ const value = await evaluateInTab(client, buildFindJs(opts));
166
+ return { ok: true, result: value };
167
+ }
168
+ catch (err) {
169
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
170
+ }
171
+ }
172
+ async function performClick(client, params) {
173
+ try {
174
+ const { selector, force = false } = params;
175
+ const settle = resolveSettleParams({
176
+ settle_ms: params.settle_ms,
177
+ settle_timeout_ms: params.settle_timeout_ms,
178
+ });
179
+ const resolveOpts = { selector, force };
180
+ const resolved = await evaluateInTab(client, buildClickResolveJs(resolveOpts));
181
+ if (!resolved.ok) {
182
+ if (resolved.reason === 'occluded') {
183
+ return {
184
+ ok: false,
185
+ error: `Element covered by ${resolved.blocker} — click the covering element or dismiss it first`,
186
+ };
187
+ }
188
+ if (resolved.reason === 'invalid-selector') {
189
+ return { ok: false, error: `Invalid selector "${selector}": ${resolved.error}` };
190
+ }
191
+ return { ok: false, error: `Element not found: ${selector}` };
192
+ }
193
+ await client.send('Input.dispatchMouseEvent', {
194
+ type: 'mouseMoved',
195
+ x: resolved.x,
196
+ y: resolved.y,
197
+ });
198
+ await client.send('Input.dispatchMouseEvent', {
199
+ type: 'mousePressed',
200
+ x: resolved.x,
201
+ y: resolved.y,
202
+ button: 'left',
203
+ clickCount: 1,
204
+ });
205
+ await client.send('Input.dispatchMouseEvent', {
206
+ type: 'mouseReleased',
207
+ x: resolved.x,
208
+ y: resolved.y,
209
+ button: 'left',
210
+ clickCount: 1,
211
+ });
212
+ const settleResult = await runSettle(client, settle);
213
+ const result = { clicked: selector, tag: resolved.tag };
214
+ if (settleResult)
215
+ result.settle = settleResult;
216
+ return { ok: true, result };
217
+ }
218
+ catch (err) {
219
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
220
+ }
221
+ }
222
+ async function performType(client, params) {
223
+ try {
224
+ const { selector, text, clear = false } = params;
225
+ const settle = resolveSettleParams({
226
+ settle_ms: params.settle_ms,
227
+ settle_timeout_ms: params.settle_timeout_ms,
228
+ });
229
+ if (selector !== undefined) {
230
+ const opts = { selector, clear };
231
+ const resolved = await evaluateInTab(client, buildTypeResolveJs(opts));
232
+ if (!resolved.ok) {
233
+ if (resolved.reason === 'invalid-selector') {
234
+ return { ok: false, error: `Invalid selector "${selector}": ${resolved.error}` };
235
+ }
236
+ return { ok: false, error: `Element not found: ${selector}` };
237
+ }
238
+ }
239
+ await client.send('Input.insertText', { text });
240
+ const settleResult = await runSettle(client, settle);
241
+ const result = { typed: text.length };
242
+ if (selector !== undefined)
243
+ result.selector = selector;
244
+ if (settleResult)
245
+ result.settle = settleResult;
246
+ return { ok: true, result };
247
+ }
248
+ catch (err) {
249
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
250
+ }
251
+ }
252
+ async function performPress(client, params) {
253
+ try {
254
+ const key = params.key;
255
+ if (!key)
256
+ return { ok: false, error: 'press: key required' };
257
+ const def = resolveKey(key);
258
+ if (!def)
259
+ return { ok: false, error: `press: unrecognized key "${key}"` };
260
+ const modifierNames = params.modifiers ?? [];
261
+ const modifiers = modifiersToBitmask(modifierNames) | (def.needsShift ? 8 : 0);
262
+ const settle = resolveSettleParams({
263
+ settle_ms: params.settle_ms,
264
+ settle_timeout_ms: params.settle_timeout_ms,
265
+ });
266
+ if (params.selector) {
267
+ const focused = await evaluateInTab(client, buildFocusJs({ selector: params.selector }));
268
+ if (!focused) {
269
+ return { ok: false, error: `Element not found: ${params.selector}` };
270
+ }
271
+ }
272
+ await dispatchKeyEventSequence(client, def, modifiers);
273
+ const settleResult = await runSettle(client, settle);
274
+ const result = { key, modifiers: modifierNames };
275
+ if (settleResult)
276
+ result.settle = settleResult;
277
+ return { ok: true, result };
278
+ }
279
+ catch (err) {
280
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
281
+ }
282
+ }
283
+ function buildWaitSelectorExpr(selector, condition) {
284
+ const sel = JSON.stringify(selector);
285
+ if (condition === 'attached') {
286
+ return `Boolean(document.querySelector(${sel}))`;
287
+ }
288
+ if (condition === 'detached') {
289
+ return `!document.querySelector(${sel})`;
290
+ }
291
+ const want = condition === 'hidden' ? '!' : '';
292
+ return `(() => {
293
+ const el = document.querySelector(${sel});
294
+ if (!el) return ${condition === 'hidden' ? 'true' : 'false'};
295
+ const s = getComputedStyle(el);
296
+ if (s.display === 'none' || s.visibility === 'hidden' || s.opacity === '0') return ${condition === 'hidden' ? 'true' : 'false'};
297
+ const r = el.getBoundingClientRect();
298
+ return ${want}(r.width > 0 && r.height > 0);
299
+ })()`;
300
+ }
301
+ function sleep(ms) {
302
+ return new Promise((resolve) => {
303
+ if (typeof ms === 'number' && ms > 0 && ms < 60_000) {
304
+ setTimeout(resolve, ms);
305
+ }
306
+ else {
307
+ setTimeout(resolve, 0);
308
+ }
309
+ });
310
+ }
311
+ async function performWaitFor(client, params) {
312
+ // cdp-direct never enables the Network domain (console/network are out of
313
+ // v1 scope — see CDP_TOOL_SUPPORT), so a network_url wait has nothing to
314
+ // poll against. This is a narrow, explicitly-commented exception to the
315
+ // tool-level support table, not a scattered gate: every OTHER wait_for
316
+ // mode (selector, expression) is fully supported.
317
+ if (params.network_url !== undefined) {
318
+ return {
319
+ ok: false,
320
+ error: 'wait_for: network_url mode is not supported over cdp-direct in v1 (no network buffering) — use a tab connected through the Chrome extension instead.',
321
+ };
322
+ }
323
+ try {
324
+ const waitSelector = params.selector;
325
+ const waitExpression = params.expression;
326
+ const waitCondition = params.condition ?? 'visible';
327
+ const MAX_WAIT_TIMEOUT_MS = 30_000;
328
+ const MIN_POLL_MS = 50;
329
+ const MAX_POLL_MS = 1_000;
330
+ const requestedTimeout = params.timeout_ms ?? 5_000;
331
+ const timeoutMs = requestedTimeout < MAX_WAIT_TIMEOUT_MS ? requestedTimeout : MAX_WAIT_TIMEOUT_MS;
332
+ const requestedPoll = params.poll_interval_ms ?? 100;
333
+ const pollIntervalMs = requestedPoll < MIN_POLL_MS
334
+ ? MIN_POLL_MS
335
+ : requestedPoll > MAX_POLL_MS
336
+ ? MAX_POLL_MS
337
+ : requestedPoll;
338
+ let check = null;
339
+ if (waitSelector !== undefined) {
340
+ const expr = buildWaitSelectorExpr(waitSelector, waitCondition);
341
+ check = async () => {
342
+ try {
343
+ const value = await evaluateInTab(client, expr);
344
+ return Boolean(value);
345
+ }
346
+ catch {
347
+ return false;
348
+ }
349
+ };
350
+ }
351
+ else if (waitExpression !== undefined) {
352
+ const wrapped = `Boolean(${waitExpression})`;
353
+ check = async () => {
354
+ try {
355
+ const value = await evaluateInTab(client, wrapped);
356
+ return Boolean(value);
357
+ }
358
+ catch {
359
+ return false;
360
+ }
361
+ };
362
+ }
363
+ const startedAt = Date.now();
364
+ let checks = 0;
365
+ let matched = false;
366
+ while (check) {
367
+ checks++;
368
+ if (await check()) {
369
+ matched = true;
370
+ break;
371
+ }
372
+ if (Date.now() - startedAt >= timeoutMs)
373
+ break;
374
+ await sleep(pollIntervalMs);
375
+ }
376
+ const elapsedMs = Date.now() - startedAt;
377
+ const result = matched
378
+ ? { matched: true, elapsed_ms: elapsedMs, checks }
379
+ : { matched: false, elapsed_ms: elapsedMs, checks, reason: 'timeout' };
380
+ return { ok: true, result };
381
+ }
382
+ catch (err) {
383
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
384
+ }
385
+ }
386
+ async function getTargetInfo(client) {
387
+ const info = await client.send('Target.getTargetInfo');
388
+ return { title: info.targetInfo.title ?? '', url: info.targetInfo.url ?? '' };
389
+ }
390
+ /**
391
+ * Entry point matching `BrowserToolDeps['callBrowserTool']`'s signature —
392
+ * `tools/browser-dispatch.ts` calls this for any tool addressing a `cdp:`
393
+ * tab, after confirming (via `CDP_TOOL_SUPPORT`) that the tool is in v1
394
+ * scope. `tool` is the WIRE-level name ('click', not 'browser.click').
395
+ *
396
+ * Re-checks `checkCdpDirectGate()` itself (defense in depth — this module
397
+ * must never be safe to call without the gate passing, even if a future
398
+ * caller reaches it directly instead of through the dispatcher).
399
+ *
400
+ * `timeoutMs` (the dispatcher's per-tool budget) is DELIBERATELY not applied
401
+ * as an outer race here, unlike the WS-bridge path where it bounds a single
402
+ * opaque round trip to the extension. Over cdp-direct every underlying step
403
+ * already carries its OWN hard bound, so there is no unbounded wait for an
404
+ * outer timeout to guard: each `CdpClient.send` has a 15s default per-command
405
+ * timeout (see client.ts), `waitForLoad` caps navigation's load wait at 20s,
406
+ * `performWaitFor` clamps its own poll loop to <=30s, and `runFlow`'s budget
407
+ * was already validated <=60s upstream. Wrapping the whole call in a second
408
+ * timer would only add a redundant, harder-to-reason-about failure mode (an
409
+ * outer reject while an inner CDP command is still in flight and will settle
410
+ * on its own bound). The parameter is kept in the signature for shape-parity
411
+ * with `callBrowserTool` and so a future transport change that DOES introduce
412
+ * an unbounded step can start honouring it without a signature churn.
413
+ */
414
+ export async function callCdpTool(tabId, tool, params, _timeoutMs) {
415
+ const gate = checkCdpDirectGate();
416
+ if (!gate.ok)
417
+ throw new Error(gate.error);
418
+ const targetId = cdpTargetIdFromTabId(tabId);
419
+ if (!targetId)
420
+ throw new Error(`cdp-direct: malformed cdp tab id "${tabId}"`);
421
+ const client = await getConnection(targetId);
422
+ const p = (params ?? {});
423
+ switch (tool) {
424
+ case 'ping':
425
+ return getTargetInfo(client);
426
+ case 'navigate': {
427
+ const url = typeof p.url === 'string' ? p.url : '';
428
+ const waitForLoadFlag = p.wait_for_load !== false;
429
+ await client.send('Page.navigate', { url });
430
+ if (waitForLoadFlag)
431
+ await waitForLoad(client);
432
+ return getTargetInfo(client);
433
+ }
434
+ case 'snapshot': {
435
+ const opts = {
436
+ within_selector: typeof p.within_selector === 'string' ? p.within_selector : undefined,
437
+ only_interactive: p.only_interactive === true,
438
+ exclude: Array.isArray(p.exclude)
439
+ ? p.exclude.filter((x) => typeof x === 'string')
440
+ : undefined,
441
+ max_interactive: typeof p.max_interactive === 'number' ? p.max_interactive : undefined,
442
+ };
443
+ return evaluateInTab(client, buildSnapshotJs(opts));
444
+ }
445
+ case 'state':
446
+ return evaluateInTab(client, buildStateJs());
447
+ case 'find': {
448
+ const outcome = await performFind(client, {
449
+ text: typeof p.text === 'string' ? p.text : '',
450
+ role: typeof p.role === 'string' ? p.role : undefined,
451
+ exact: p.exact === true,
452
+ });
453
+ if (!outcome.ok)
454
+ throw new Error(outcome.error);
455
+ return outcome.result;
456
+ }
457
+ case 'click': {
458
+ const outcome = await performClick(client, {
459
+ selector: typeof p.selector === 'string' ? p.selector : '',
460
+ force: p.force === true,
461
+ settle_ms: typeof p.settle_ms === 'number' ? p.settle_ms : undefined,
462
+ settle_timeout_ms: typeof p.settle_timeout_ms === 'number' ? p.settle_timeout_ms : undefined,
463
+ });
464
+ if (!outcome.ok)
465
+ throw new Error(outcome.error);
466
+ return outcome.result;
467
+ }
468
+ case 'type': {
469
+ const outcome = await performType(client, {
470
+ selector: typeof p.selector === 'string' ? p.selector : undefined,
471
+ text: typeof p.text === 'string' ? p.text : '',
472
+ clear: p.clear === true,
473
+ settle_ms: typeof p.settle_ms === 'number' ? p.settle_ms : undefined,
474
+ settle_timeout_ms: typeof p.settle_timeout_ms === 'number' ? p.settle_timeout_ms : undefined,
475
+ });
476
+ if (!outcome.ok)
477
+ throw new Error(outcome.error);
478
+ return outcome.result;
479
+ }
480
+ case 'press': {
481
+ const modifierNames = Array.isArray(p.modifiers)
482
+ ? p.modifiers.filter((m) => typeof m === 'string')
483
+ : [];
484
+ const outcome = await performPress(client, {
485
+ key: typeof p.key === 'string' ? p.key : undefined,
486
+ modifiers: modifierNames,
487
+ selector: typeof p.selector === 'string' ? p.selector : undefined,
488
+ settle_ms: typeof p.settle_ms === 'number' ? p.settle_ms : undefined,
489
+ settle_timeout_ms: typeof p.settle_timeout_ms === 'number' ? p.settle_timeout_ms : undefined,
490
+ });
491
+ if (!outcome.ok)
492
+ throw new Error(outcome.error);
493
+ return outcome.result;
494
+ }
495
+ case 'evaluate': {
496
+ const expression = typeof p.expression === 'string' ? p.expression : '';
497
+ return evaluateInTab(client, expression);
498
+ }
499
+ case 'wait_for': {
500
+ const outcome = await performWaitFor(client, {
501
+ selector: typeof p.selector === 'string' ? p.selector : undefined,
502
+ expression: typeof p.expression === 'string' ? p.expression : undefined,
503
+ network_url: typeof p.network_url === 'string' ? p.network_url : undefined,
504
+ condition: typeof p.condition === 'string' ? p.condition : undefined,
505
+ timeout_ms: typeof p.timeout_ms === 'number' ? p.timeout_ms : undefined,
506
+ poll_interval_ms: typeof p.poll_interval_ms === 'number' ? p.poll_interval_ms : undefined,
507
+ });
508
+ if (!outcome.ok)
509
+ throw new Error(outcome.error);
510
+ return outcome.result;
511
+ }
512
+ case 'flow': {
513
+ const rawSteps = Array.isArray(p.steps)
514
+ ? p.steps.filter((s) => typeof s === 'object' && s !== null)
515
+ : [];
516
+ return runFlow(rawSteps, {
517
+ performFind: (fp) => performFind(client, fp),
518
+ performClick: (cp) => performClick(client, cp),
519
+ performType: (tp) => performType(client, tp),
520
+ performPress: (pp) => performPress(client, pp),
521
+ performWaitFor: (wp) => performWaitFor(client, wp),
522
+ buildRecoverySnapshot: () => evaluateInTab(client, buildSnapshotJs({ only_interactive: true, max_interactive: 40 })),
523
+ });
524
+ }
525
+ default:
526
+ // Reached only if a caller bypasses CDP_TOOL_SUPPORT's gate — defense
527
+ // in depth, not a path browser-dispatch.ts's routing exercises.
528
+ throw cdpUnsupportedToolError(tool);
529
+ }
530
+ }
531
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/cdp/transport.ts"],"names":[],"mappings":"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"}