@jobshimo/browser-link 0.15.0 → 0.17.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.
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * Builders that assemble the CDP `Runtime.evaluate` expression strings for
3
- * `snapshot`, `find`, `click` and `type`. Extracted out of background.ts so
4
- * the produced JS source can be unit-tested by evaluating it directly in a
5
- * DOM environment (see the `*.test.ts` files next to this module) the
6
- * exact same string background.ts sends over CDP.
3
+ * `snapshot`, `find`, `click`, `type`, `press` and the shared post-action
4
+ * `settle` wait. Extracted out of background.ts so the produced JS source
5
+ * can be unit-tested by evaluating it directly in a DOM environment (see
6
+ * the `*.test.ts` files next to this module) — the exact same string
7
+ * background.ts sends over CDP.
7
8
  */
8
9
  import { DEEP_QUERY_JS } from './deep-query.js';
9
10
  import { DOM_HELPERS_JS } from './dom-helpers.js';
@@ -220,4 +221,70 @@ export function buildTypeResolveJs(opts) {
220
221
  return true;
221
222
  })()`;
222
223
  }
224
+ export function buildFocusJs(opts) {
225
+ const optsJson = JSON.stringify({ selector: opts.selector });
226
+ return `
227
+ (() => {
228
+ ${DEEP_QUERY_JS}
229
+ const opts = ${optsJson};
230
+ const el = deepQueryFirst(opts.selector);
231
+ if (!el) return false;
232
+ el.focus();
233
+ return true;
234
+ })()`;
235
+ }
236
+ export function buildSettleJs(opts) {
237
+ const optsJson = JSON.stringify({
238
+ settleMs: Math.max(0, opts.settle_ms),
239
+ timeoutMs: Math.max(0, opts.settle_timeout_ms),
240
+ });
241
+ return `
242
+ (() => {
243
+ const opts = ${optsJson};
244
+ const startUrl = location.href;
245
+ const startActiveEl = document.activeElement;
246
+ const state = { mutationCount: 0, lastMutationAt: Date.now() };
247
+ const observer = new MutationObserver((mutations) => {
248
+ state.mutationCount += mutations.length;
249
+ state.lastMutationAt = Date.now();
250
+ });
251
+ observer.observe(document, {
252
+ subtree: true,
253
+ childList: true,
254
+ attributes: true,
255
+ characterData: true,
256
+ });
257
+ const start = Date.now();
258
+ return new Promise((resolve) => {
259
+ function finish(settled) {
260
+ observer.disconnect();
261
+ const result = {
262
+ settled: settled,
263
+ duration_ms: Date.now() - start,
264
+ mutation_count: state.mutationCount,
265
+ };
266
+ if (location.href !== startUrl) result.url_changed = location.href;
267
+ if (document.activeElement !== startActiveEl) result.focus_moved = true;
268
+ resolve(result);
269
+ }
270
+ if (opts.settleMs <= 0) {
271
+ finish(true);
272
+ return;
273
+ }
274
+ (function check() {
275
+ const now = Date.now();
276
+ const quietFor = now - state.lastMutationAt;
277
+ if (quietFor >= opts.settleMs) {
278
+ finish(true);
279
+ return;
280
+ }
281
+ if (now - start >= opts.timeoutMs) {
282
+ finish(false);
283
+ return;
284
+ }
285
+ setTimeout(check, Math.min(opts.settleMs - quietFor, 50));
286
+ })();
287
+ });
288
+ })()`;
289
+ }
223
290
  //# sourceMappingURL=builders.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"builders.js","sourceRoot":"","sources":["../../src/inpage/builders.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAwBlD,MAAM,UAAU,eAAe,CAAC,OAAqB,EAAE;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAC9B,cAAc,EAAE,OAAO,IAAI,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI;QACtF,eAAe,EAAE,IAAI,CAAC,gBAAgB,KAAK,IAAI;QAC/C,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACxD,cAAc,EACZ,OAAO,IAAI,CAAC,eAAe,KAAK,QAAQ,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC;YAClE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC;YACrC,CAAC,CAAC,GAAG;KACV,CAAC,CAAC;IACH,OAAO;;IAEL,aAAa;IACb,cAAc;iBACD,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4FxB,CAAC;AACF,CAAC;AAsBD,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAC9B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QAC9E,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI;QAC1B,cAAc,EAAE,CAAC;KAClB,CAAC,CAAC;IACH,OAAO;;IAEL,aAAa;IACb,cAAc;iBACD,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuDxB,CAAC;AACF,CAAC;AAiBD,MAAM,UAAU,mBAAmB,CAAC,IAAsB;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAChF,OAAO;;IAEL,aAAa;iBACA,QAAQ;;;;;;;;;;;;;;;;;;CAkBxB,CAAC;AACF,CAAC;AAeD,MAAM,UAAU,kBAAkB,CAAC,IAAqB;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7D,OAAO;;IAEL,aAAa;iBACA,QAAQ;;;;IAIrB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,gGAAgG,CAAC,CAAC,CAAC,EAAE;;KAEjH,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"builders.js","sourceRoot":"","sources":["../../src/inpage/builders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Keyboard key definitions for CDP `Input.dispatchKeyEvent`, driving
3
+ * `browser.press` (trusted keyboard input — see `background.ts`'s
4
+ * `case 'press'`).
5
+ *
6
+ * Deliberately NOT an `inpage/*.ts` module: this runs in the extension's
7
+ * own service-worker context and only produces CDP command parameters —
8
+ * no page JS execution involved, nothing to inject via `Runtime.evaluate`.
9
+ *
10
+ * Modeled after Puppeteer's `USKeyboardLayout` (US keyboard — the only
11
+ * layout CDP's `Input.dispatchKeyEvent` needs; Chrome maps
12
+ * `windowsVirtualKeyCode` + `code` to the OS's actual layout on its own),
13
+ * trimmed to what `browser.press` exposes: the named control/navigation
14
+ * keys plus any single printable character.
15
+ */
16
+ export interface KeyDefinition {
17
+ /** DOM `KeyboardEvent.key` value. */
18
+ key: string;
19
+ /** DOM `KeyboardEvent.code` value — physical key identity. */
20
+ code: string;
21
+ /** CDP `windowsVirtualKeyCode` (mirrored into `nativeVirtualKeyCode`).
22
+ * Chrome derives the platform-native key from this plus `code` — the
23
+ * same numeric value works on every OS. */
24
+ keyCode: number;
25
+ /** Text CDP should insert via a `char` event. Only set for keys that
26
+ * produce visible input (printable characters, Space). Control keys
27
+ * (Enter, Escape, Tab, arrows, …) omit it — they dispatch keyDown/keyUp
28
+ * only, no `char` event, matching real hardware. */
29
+ text?: string;
30
+ /** True when producing this exact character requires the Shift modifier
31
+ * on a US layout (e.g. "@" is Shift+2, "_" is Shift+-). The caller ORs
32
+ * this into the dispatched modifiers bitmask so `event.shiftKey`
33
+ * reports correctly even when the caller only asked for the character,
34
+ * not the physical chord. */
35
+ needsShift?: boolean;
36
+ }
37
+ /**
38
+ * Resolve a human-provided `key` name (the `browser.press` `key` param)
39
+ * into CDP dispatch parameters. Accepts:
40
+ * - a named control/navigation key, case-insensitive ("Enter", "arrowup"),
41
+ * - a single printable character, case-SENSITIVE ("a" vs "A", "@").
42
+ *
43
+ * Returns `null` when the name is neither — the caller surfaces that as a
44
+ * validation error instead of silently no-op'ing on an unrecognized key.
45
+ */
46
+ export declare function resolveKey(name: string): KeyDefinition | null;
47
+ /** CDP `Input.dispatchKeyEvent` modifiers bitmask. */
48
+ export declare const MODIFIER_BITS: Readonly<Record<string, number>>;
49
+ /** Fold a `modifiers` array (as accepted by `browser.press`) into the CDP
50
+ * bitmask. Unknown entries are ignored defensively — the server-side
51
+ * dispatcher already validates the enum, this is a second line of
52
+ * defence for direct/test callers. */
53
+ export declare function modifiersToBitmask(modifiers: readonly string[] | undefined): number;
54
+ /** One CDP `Input.dispatchKeyEvent` command payload. A type alias (not an
55
+ * interface) so it carries an implicit index signature and is directly
56
+ * assignable to the `Record<string, unknown>` the cdp() helper takes. */
57
+ export type CdpKeyEvent = {
58
+ type: 'keyDown' | 'rawKeyDown' | 'char' | 'keyUp';
59
+ modifiers: number;
60
+ key: string;
61
+ code: string;
62
+ windowsVirtualKeyCode: number;
63
+ nativeVirtualKeyCode: number;
64
+ text?: string;
65
+ unmodifiedText?: string;
66
+ };
67
+ /**
68
+ * Build the CDP `Input.dispatchKeyEvent` sequence for one key press.
69
+ * Pure function (no chrome.* access) so the exact event shapes are
70
+ * unit-testable; background.ts dispatches each entry in order.
71
+ *
72
+ * Shape: a text-bearing key (printable characters, Space, Enter) gets a
73
+ * `keyDown` (identity only, no `text` field — Chrome would insert text
74
+ * from a text-bearing keyDown AND from a following char event, doubling
75
+ * the input) followed by a separate `char` event carrying the text — the
76
+ * `char` event is what produces the KEYPRESS whose default action drives
77
+ * text insertion and, for Enter ('\r'), the WHATWG implicit form
78
+ * submission. A control key with no text (Escape, Tab, arrows, …) gets
79
+ * `rawKeyDown` with nothing to follow but `keyUp`, matching real hardware
80
+ * (those keys never fire keypress in Blink).
81
+ */
82
+ export declare function buildKeyEventSequence(def: KeyDefinition, modifiers: number): CdpKeyEvent[];
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Keyboard key definitions for CDP `Input.dispatchKeyEvent`, driving
3
+ * `browser.press` (trusted keyboard input — see `background.ts`'s
4
+ * `case 'press'`).
5
+ *
6
+ * Deliberately NOT an `inpage/*.ts` module: this runs in the extension's
7
+ * own service-worker context and only produces CDP command parameters —
8
+ * no page JS execution involved, nothing to inject via `Runtime.evaluate`.
9
+ *
10
+ * Modeled after Puppeteer's `USKeyboardLayout` (US keyboard — the only
11
+ * layout CDP's `Input.dispatchKeyEvent` needs; Chrome maps
12
+ * `windowsVirtualKeyCode` + `code` to the OS's actual layout on its own),
13
+ * trimmed to what `browser.press` exposes: the named control/navigation
14
+ * keys plus any single printable character.
15
+ */
16
+ /** The named control/navigation keys `browser.press` accepts, keyed by
17
+ * their canonical human name. Values are the standard Windows virtual-key
18
+ * codes (VK_RETURN, VK_ESCAPE, VK_TAB, …) — well-known constants, stable
19
+ * across every Chromium build. */
20
+ const NAMED_KEYS = {
21
+ // Enter carries text '\r' (matching Puppeteer's USKeyboardLayout): the
22
+ // WHATWG implicit form submission algorithm runs as the default action
23
+ // of the KEYPRESS event, and the CDP sequence only produces a keypress
24
+ // through the `char` event — which `buildKeyEventSequence` emits only
25
+ // for text-bearing keys. Without this, pressing Enter in a form field
26
+ // would fire keydown/keyup but never submit the form.
27
+ Enter: { key: 'Enter', code: 'Enter', keyCode: 13, text: '\r' },
28
+ Escape: { key: 'Escape', code: 'Escape', keyCode: 27 },
29
+ Tab: { key: 'Tab', code: 'Tab', keyCode: 9 },
30
+ Backspace: { key: 'Backspace', code: 'Backspace', keyCode: 8 },
31
+ Delete: { key: 'Delete', code: 'Delete', keyCode: 46 },
32
+ ArrowUp: { key: 'ArrowUp', code: 'ArrowUp', keyCode: 38 },
33
+ ArrowDown: { key: 'ArrowDown', code: 'ArrowDown', keyCode: 40 },
34
+ ArrowLeft: { key: 'ArrowLeft', code: 'ArrowLeft', keyCode: 37 },
35
+ ArrowRight: { key: 'ArrowRight', code: 'ArrowRight', keyCode: 39 },
36
+ Home: { key: 'Home', code: 'Home', keyCode: 36 },
37
+ End: { key: 'End', code: 'End', keyCode: 35 },
38
+ PageUp: { key: 'PageUp', code: 'PageUp', keyCode: 33 },
39
+ PageDown: { key: 'PageDown', code: 'PageDown', keyCode: 34 },
40
+ Space: { key: ' ', code: 'Space', keyCode: 32, text: ' ' },
41
+ };
42
+ /** Lowercased lookup so NAME matching is case-insensitive ("arrowup",
43
+ * "ENTER", "Escape" all resolve to the same definition). Single printable
44
+ * characters are resolved separately and stay case-SENSITIVE — "a" and
45
+ * "A" are different keystrokes. A `Map` (not a plain `Record`) so a missing
46
+ * key types as `undefined` — a `Record<string, KeyDefinition>` index would
47
+ * type as always-`KeyDefinition` (never falsy, since objects are always
48
+ * truthy) without `noUncheckedIndexedAccess`, which would make the
49
+ * presence check in `resolveKey` dead code from TypeScript's point of view. */
50
+ const NAMED_KEYS_LOWER = new Map(Object.entries(NAMED_KEYS).map(([name, def]) => [name.toLowerCase(), def]));
51
+ /** Physical key (code + Windows virtual-key code) for each punctuation key
52
+ * on a US keyboard, keyed by the character it produces UNSHIFTED. Shared
53
+ * with the shifted variant of the same physical key below. Values are the
54
+ * standard VK_OEM_* constants. */
55
+ const PUNCTUATION_PHYSICAL = [
56
+ ['-', 'Minus', 189],
57
+ ['=', 'Equal', 187],
58
+ ['[', 'BracketLeft', 219],
59
+ [']', 'BracketRight', 221],
60
+ ['\\', 'Backslash', 220],
61
+ [';', 'Semicolon', 186],
62
+ ["'", 'Quote', 222],
63
+ ['`', 'Backquote', 192],
64
+ [',', 'Comma', 188],
65
+ ['.', 'Period', 190],
66
+ ['/', 'Slash', 191],
67
+ ];
68
+ /** Shifted glyph produced by the same physical punctuation key, US layout. */
69
+ const SHIFTED_PUNCTUATION = {
70
+ '-': '_',
71
+ '=': '+',
72
+ '[': '{',
73
+ ']': '}',
74
+ '\\': '|',
75
+ ';': ':',
76
+ "'": '"',
77
+ '`': '~',
78
+ ',': '<',
79
+ '.': '>',
80
+ '/': '?',
81
+ };
82
+ /** Shifted digit-row symbols, US layout — the physical key is the digit
83
+ * itself (Shift+2 -> "@", Shift+1 -> "!", …). */
84
+ const SHIFTED_DIGITS = {
85
+ '1': '!',
86
+ '2': '@',
87
+ '3': '#',
88
+ '4': '$',
89
+ '5': '%',
90
+ '6': '^',
91
+ '7': '&',
92
+ '8': '*',
93
+ '9': '(',
94
+ '0': ')',
95
+ };
96
+ function buildPrintableTable() {
97
+ const table = new Map();
98
+ // A literal ' ' resolves to the same definition as the named 'Space' key —
99
+ // without this alias it would fall through to the generic printable
100
+ // fallback and lose the physical Space code/keyCode.
101
+ table.set(' ', NAMED_KEYS.Space);
102
+ for (let i = 0; i < 26; i++) {
103
+ const lower = String.fromCharCode(97 + i);
104
+ const upper = String.fromCharCode(65 + i);
105
+ const code = `Key${upper}`;
106
+ const keyCode = upper.charCodeAt(0);
107
+ table.set(lower, { key: lower, code, keyCode, text: lower });
108
+ table.set(upper, { key: upper, code, keyCode, text: upper, needsShift: true });
109
+ }
110
+ for (let d = 0; d <= 9; d++) {
111
+ const ch = String(d);
112
+ const code = `Digit${ch}`;
113
+ const keyCode = 48 + d;
114
+ table.set(ch, { key: ch, code, keyCode, text: ch });
115
+ const shifted = SHIFTED_DIGITS[ch];
116
+ table.set(shifted, { key: shifted, code, keyCode, text: shifted, needsShift: true });
117
+ }
118
+ for (const [unshifted, code, keyCode] of PUNCTUATION_PHYSICAL) {
119
+ table.set(unshifted, { key: unshifted, code, keyCode, text: unshifted });
120
+ const shifted = SHIFTED_PUNCTUATION[unshifted];
121
+ table.set(shifted, { key: shifted, code, keyCode, text: shifted, needsShift: true });
122
+ }
123
+ return table;
124
+ }
125
+ const PRINTABLE_TABLE = buildPrintableTable();
126
+ /**
127
+ * Resolve a human-provided `key` name (the `browser.press` `key` param)
128
+ * into CDP dispatch parameters. Accepts:
129
+ * - a named control/navigation key, case-insensitive ("Enter", "arrowup"),
130
+ * - a single printable character, case-SENSITIVE ("a" vs "A", "@").
131
+ *
132
+ * Returns `null` when the name is neither — the caller surfaces that as a
133
+ * validation error instead of silently no-op'ing on an unrecognized key.
134
+ */
135
+ export function resolveKey(name) {
136
+ const named = NAMED_KEYS_LOWER.get(name.toLowerCase());
137
+ if (named)
138
+ return named;
139
+ if (name.length === 1) {
140
+ const printable = PRINTABLE_TABLE.get(name);
141
+ if (printable)
142
+ return printable;
143
+ // Any other single printable character (unicode letters, symbols not
144
+ // in the curated punctuation table): best-effort. `key`/`text` are
145
+ // always correct — they drive what actually gets inserted via the
146
+ // `char` event. `code`/`keyCode` degrade to a generic placeholder
147
+ // since there is no physical-key mapping for it on a US layout.
148
+ return { key: name, code: 'Unidentified', keyCode: name.charCodeAt(0), text: name };
149
+ }
150
+ return null;
151
+ }
152
+ /** CDP `Input.dispatchKeyEvent` modifiers bitmask. */
153
+ export const MODIFIER_BITS = {
154
+ Alt: 1,
155
+ Control: 2,
156
+ Meta: 4,
157
+ Shift: 8,
158
+ };
159
+ /** Fold a `modifiers` array (as accepted by `browser.press`) into the CDP
160
+ * bitmask. Unknown entries are ignored defensively — the server-side
161
+ * dispatcher already validates the enum, this is a second line of
162
+ * defence for direct/test callers. */
163
+ export function modifiersToBitmask(modifiers) {
164
+ if (!modifiers || modifiers.length === 0)
165
+ return 0;
166
+ let mask = 0;
167
+ for (const m of modifiers) {
168
+ const bit = MODIFIER_BITS[m];
169
+ if (bit)
170
+ mask |= bit;
171
+ }
172
+ return mask;
173
+ }
174
+ /**
175
+ * Build the CDP `Input.dispatchKeyEvent` sequence for one key press.
176
+ * Pure function (no chrome.* access) so the exact event shapes are
177
+ * unit-testable; background.ts dispatches each entry in order.
178
+ *
179
+ * Shape: a text-bearing key (printable characters, Space, Enter) gets a
180
+ * `keyDown` (identity only, no `text` field — Chrome would insert text
181
+ * from a text-bearing keyDown AND from a following char event, doubling
182
+ * the input) followed by a separate `char` event carrying the text — the
183
+ * `char` event is what produces the KEYPRESS whose default action drives
184
+ * text insertion and, for Enter ('\r'), the WHATWG implicit form
185
+ * submission. A control key with no text (Escape, Tab, arrows, …) gets
186
+ * `rawKeyDown` with nothing to follow but `keyUp`, matching real hardware
187
+ * (those keys never fire keypress in Blink).
188
+ */
189
+ export function buildKeyEventSequence(def, modifiers) {
190
+ const base = {
191
+ modifiers,
192
+ key: def.key,
193
+ code: def.code,
194
+ windowsVirtualKeyCode: def.keyCode,
195
+ nativeVirtualKeyCode: def.keyCode,
196
+ };
197
+ const hasText = typeof def.text === 'string' && def.text.length > 0;
198
+ const events = [{ ...base, type: hasText ? 'keyDown' : 'rawKeyDown' }];
199
+ if (hasText) {
200
+ events.push({ ...base, type: 'char', text: def.text, unmodifiedText: def.text });
201
+ }
202
+ events.push({ ...base, type: 'keyUp' });
203
+ return events;
204
+ }
205
+ //# sourceMappingURL=keymap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keymap.js","sourceRoot":"","sources":["../src/keymap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAwBH;;;kCAGkC;AAClC,MAAM,UAAU,GAAkC;IAChD,uEAAuE;IACvE,uEAAuE;IACvE,uEAAuE;IACvE,sEAAsE;IACtE,sEAAsE;IACtE,sDAAsD;IACtD,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;IAC/D,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;IACtD,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;IAC5C,SAAS,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE;IAC9D,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;IACtD,OAAO,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;IACzD,SAAS,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE;IAC/D,SAAS,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE;IAC/D,UAAU,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE;IAClE,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;IAChD,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;IAC7C,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;IACtD,QAAQ,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;IAC5D,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE;CAC3D,CAAC;AAEF;;;;;;;+EAO+E;AAC/E,MAAM,gBAAgB,GAA+B,IAAI,GAAG,CAC1D,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC,CAC3E,CAAC;AAEF;;;kCAGkC;AAClC,MAAM,oBAAoB,GAAqD;IAC7E,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC;IACnB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC;IACnB,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,CAAC;IACzB,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,CAAC;IAC1B,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC;IACxB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC;IACvB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC;IACnB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC;IACvB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC;IACnB,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC;IACpB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC;CACpB,CAAC;AAEF,8EAA8E;AAC9E,MAAM,mBAAmB,GAAqC;IAC5D,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,GAAG;IACT,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;CACT,CAAC;AAEF;iDACiD;AACjD,MAAM,cAAc,GAAqC;IACvD,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;CACT,CAAC;AAEF,SAAS,mBAAmB;IAC1B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE/C,2EAA2E;IAC3E,oEAAoE;IACpE,qDAAqD;IACrD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACpC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7D,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,IAAI,GAAG,QAAQ,EAAE,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC;QACvB,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;QACnC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,KAAK,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC;QAC9D,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAC/C,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,eAAe,GAAG,mBAAmB,EAAE,CAAC;AAE9C;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACvD,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC;QAChC,qEAAqE;QACrE,mEAAmE;QACnE,kEAAkE;QAClE,kEAAkE;QAClE,gEAAgE;QAChE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACtF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sDAAsD;AACtD,MAAM,CAAC,MAAM,aAAa,GAAqC;IAC7D,GAAG,EAAE,CAAC;IACN,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF;;;sCAGsC;AACtC,MAAM,UAAU,kBAAkB,CAAC,SAAwC;IACzE,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACnD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,GAAG;YAAE,IAAI,IAAI,GAAG,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAgBD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAkB,EAAE,SAAiB;IACzE,MAAM,IAAI,GAAG;QACX,SAAS;QACT,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,qBAAqB,EAAE,GAAG,CAAC,OAAO;QAClC,oBAAoB,EAAE,GAAG,CAAC,OAAO;KAClC,CAAC;IACF,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACpE,MAAM,MAAM,GAAkB,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IACtF,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "browser-link",
4
- "version": "0.15.0",
4
+ "version": "0.17.0",
5
5
  "description": "Bridge between Chrome and an MCP client (Claude Code, OpenCode, GitHub Copilot CLI, …). Per-tab manual activation.",
6
6
  "permissions": [
7
7
  "debugger",
@@ -0,0 +1,39 @@
1
+ /** Defaults and hard ceilings — same clamp-at-the-boundary philosophy as
2
+ * the drag durations in background.ts. Mirrored by the schema bounds in
3
+ * the server's browser-definitions.ts. */
4
+ export declare const DEFAULT_SETTLE_MS = 150;
5
+ export declare const MAX_SETTLE_MS = 2000;
6
+ export declare const DEFAULT_SETTLE_TIMEOUT_MS = 2000;
7
+ export declare const MAX_SETTLE_TIMEOUT_MS = 10000;
8
+ export interface SettleParams {
9
+ settleMs: number;
10
+ settleTimeoutMs: number;
11
+ }
12
+ /**
13
+ * Resolve the settle params for an action call. Returns `null` when settle
14
+ * is disabled (`settle_ms: 0`, explicit) — the caller skips the extra
15
+ * `Runtime.evaluate` round trip entirely in that case rather than running a
16
+ * zero-length wait. `settle_ms` omitted defaults to `DEFAULT_SETTLE_MS`
17
+ * (settle stays ON by default); any other numeric value is clamped into
18
+ * (0, MAX_SETTLE_MS].
19
+ */
20
+ export declare function resolveSettleParams(p: Record<string, unknown>): SettleParams | null;
21
+ /** Evaluate-in-page function shape settleSafely needs — background.ts
22
+ * passes `(expr) => evaluateInTab(tabId, expr)`. */
23
+ export type EvaluateFn = (expression: string) => Promise<unknown>;
24
+ /**
25
+ * Run the settle wait, GUARANTEED not to throw. Returns the in-page settle
26
+ * result, a degraded-but-truthful fallback when the evaluation failed, or
27
+ * `undefined` when settle is disabled for this call.
28
+ *
29
+ * The guarantee matters because the action itself already SUCCEEDED by the
30
+ * time settle runs: if the action triggered a full-document navigation, the
31
+ * execution context the settle expression runs in is destroyed mid-wait and
32
+ * `Runtime.evaluate` rejects. Letting that rejection escape would flip the
33
+ * whole tool response to ok:false for an action that landed — an agent
34
+ * would retry it and risk a duplicate submission. Instead the caller gets
35
+ * `{ settled: false, reason: 'context-destroyed' | 'settle-error' }` spliced
36
+ * onto an ok:true result: 'context-destroyed' is itself a strong signal the
37
+ * action navigated the page.
38
+ */
39
+ export declare function settleSafely(evaluate: EvaluateFn, settle: SettleParams | null): Promise<Record<string, unknown> | undefined>;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Shared `settle_ms` / `settle_timeout_ms` handling for the click / type /
3
+ * press actions in background.ts. Lives outside `inpage/` (this runs in the
4
+ * extension's service-worker context) and takes the evaluate function as a
5
+ * parameter so the failure handling is unit-testable without chrome.* —
6
+ * background.ts passes a closure over `evaluateInTab`.
7
+ */
8
+ import { buildSettleJs } from './inpage/builders.js';
9
+ /** Defaults and hard ceilings — same clamp-at-the-boundary philosophy as
10
+ * the drag durations in background.ts. Mirrored by the schema bounds in
11
+ * the server's browser-definitions.ts. */
12
+ export const DEFAULT_SETTLE_MS = 150;
13
+ export const MAX_SETTLE_MS = 2000;
14
+ export const DEFAULT_SETTLE_TIMEOUT_MS = 2000;
15
+ export const MAX_SETTLE_TIMEOUT_MS = 10_000;
16
+ /**
17
+ * Resolve the settle params for an action call. Returns `null` when settle
18
+ * is disabled (`settle_ms: 0`, explicit) — the caller skips the extra
19
+ * `Runtime.evaluate` round trip entirely in that case rather than running a
20
+ * zero-length wait. `settle_ms` omitted defaults to `DEFAULT_SETTLE_MS`
21
+ * (settle stays ON by default); any other numeric value is clamped into
22
+ * (0, MAX_SETTLE_MS].
23
+ */
24
+ export function resolveSettleParams(p) {
25
+ const rawSettleMs = p.settle_ms;
26
+ const settleMs = typeof rawSettleMs === 'number' && Number.isFinite(rawSettleMs) && rawSettleMs >= 0
27
+ ? Math.min(rawSettleMs, MAX_SETTLE_MS)
28
+ : DEFAULT_SETTLE_MS;
29
+ if (settleMs <= 0)
30
+ return null;
31
+ const rawTimeout = p.settle_timeout_ms;
32
+ const settleTimeoutMs = typeof rawTimeout === 'number' && Number.isFinite(rawTimeout) && rawTimeout >= 0
33
+ ? Math.min(rawTimeout, MAX_SETTLE_TIMEOUT_MS)
34
+ : DEFAULT_SETTLE_TIMEOUT_MS;
35
+ return { settleMs, settleTimeoutMs };
36
+ }
37
+ /**
38
+ * Run the settle wait, GUARANTEED not to throw. Returns the in-page settle
39
+ * result, a degraded-but-truthful fallback when the evaluation failed, or
40
+ * `undefined` when settle is disabled for this call.
41
+ *
42
+ * The guarantee matters because the action itself already SUCCEEDED by the
43
+ * time settle runs: if the action triggered a full-document navigation, the
44
+ * execution context the settle expression runs in is destroyed mid-wait and
45
+ * `Runtime.evaluate` rejects. Letting that rejection escape would flip the
46
+ * whole tool response to ok:false for an action that landed — an agent
47
+ * would retry it and risk a duplicate submission. Instead the caller gets
48
+ * `{ settled: false, reason: 'context-destroyed' | 'settle-error' }` spliced
49
+ * onto an ok:true result: 'context-destroyed' is itself a strong signal the
50
+ * action navigated the page.
51
+ */
52
+ export async function settleSafely(evaluate, settle) {
53
+ if (!settle)
54
+ return undefined;
55
+ try {
56
+ const result = await evaluate(buildSettleJs({ settle_ms: settle.settleMs, settle_timeout_ms: settle.settleTimeoutMs }));
57
+ if (result && typeof result === 'object')
58
+ return result;
59
+ // Defensive: the expression always returns an object; anything else
60
+ // means the evaluation pipeline degraded (e.g. serialization loss).
61
+ return { settled: false, reason: 'settle-error' };
62
+ }
63
+ catch (err) {
64
+ const message = err instanceof Error ? err.message : String(err);
65
+ const contextDestroyed = /context/i.test(message) || /navigat/i.test(message);
66
+ return { settled: false, reason: contextDestroyed ? 'context-destroyed' : 'settle-error' };
67
+ }
68
+ }
69
+ //# sourceMappingURL=settle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settle.js","sourceRoot":"","sources":["../src/settle.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD;;0CAE0C;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AAClC,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAC9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAO5C;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAA0B;IAC5D,MAAM,WAAW,GAAG,CAAC,CAAC,SAAS,CAAC;IAChC,MAAM,QAAQ,GACZ,OAAO,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC;QACjF,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC;QACtC,CAAC,CAAC,iBAAiB,CAAC;IACxB,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,UAAU,GAAG,CAAC,CAAC,iBAAiB,CAAC;IACvC,MAAM,eAAe,GACnB,OAAO,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC;QAC9E,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,qBAAqB,CAAC;QAC7C,CAAC,CAAC,yBAAyB,CAAC;IAChC,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;AACvC,CAAC;AAMD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAoB,EACpB,MAA2B;IAE3B,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,aAAa,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,CACzF,CAAC;QACF,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAiC,CAAC;QACnF,oEAAoE;QACpE,oEAAoE;QACpE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,gBAAgB,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;IAC7F,CAAC;AACH,CAAC"}
@@ -96,12 +96,24 @@ export const TOOL_CATALOGUE = [
96
96
  category: 'action',
97
97
  summary: 'Type text into an input',
98
98
  },
99
+ {
100
+ name: 'browser.press',
101
+ family: 'bridge',
102
+ category: 'action',
103
+ summary: 'Press a key (with modifiers) using trusted CDP input',
104
+ },
99
105
  {
100
106
  name: 'browser.drag',
101
107
  family: 'bridge',
102
108
  category: 'action',
103
109
  summary: 'Drag an element to another element or coordinate',
104
110
  },
111
+ {
112
+ name: 'browser.flow',
113
+ family: 'bridge',
114
+ category: 'action',
115
+ summary: 'Run a find/click/type/press/wait_for step sequence in one round trip',
116
+ },
105
117
  {
106
118
  name: 'browser.dialog_respond',
107
119
  family: 'bridge',
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"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"}