@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.
- package/dist/agent-instructions/content.js +27 -5
- package/dist/agent-instructions/content.js.map +1 -1
- package/dist/commands/about.js +4 -0
- package/dist/commands/about.js.map +1 -1
- package/dist/extension/background.js +328 -163
- package/dist/extension/background.js.map +1 -1
- package/dist/extension/flow.d.ts +161 -0
- package/dist/extension/flow.js +213 -0
- package/dist/extension/flow.js.map +1 -0
- package/dist/extension/inpage/builders.d.ts +41 -0
- package/dist/extension/inpage/builders.js +71 -4
- package/dist/extension/inpage/builders.js.map +1 -1
- package/dist/extension/keymap.d.ts +82 -0
- package/dist/extension/keymap.js +205 -0
- package/dist/extension/keymap.js.map +1 -0
- package/dist/extension/manifest.json +1 -1
- package/dist/extension/settle.d.ts +39 -0
- package/dist/extension/settle.js +69 -0
- package/dist/extension/settle.js.map +1 -0
- package/dist/permissions.js +12 -0
- package/dist/permissions.js.map +1 -1
- package/dist/tools/browser-definitions.js +223 -2
- package/dist/tools/browser-definitions.js.map +1 -1
- package/dist/tools/browser-dispatch.js +278 -6
- package/dist/tools/browser-dispatch.js.map +1 -1
- package/dist/tools/server-instructions.js +36 -7
- package/dist/tools/server-instructions.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Builders that assemble the CDP `Runtime.evaluate` expression strings for
|
|
3
|
-
* `snapshot`, `find`, `click
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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
|
|
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":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": 3,
|
|
3
3
|
"name": "browser-link",
|
|
4
|
-
"version": "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"}
|
package/dist/permissions.js
CHANGED
|
@@ -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',
|
package/dist/permissions.js.map
CHANGED
|
@@ -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":"AAAA;;;;;;;;;GASG;AAeH,MAAM,CAAC,MAAM,cAAc,GAAwB;IACjD,6BAA6B;IAC7B,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE;IACjG;QACE,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,kDAAkD;KAC5D;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,wDAAwD;KAClE;IACD;QACE,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,4BAA4B;KACtC;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,sFAAsF;KAChG;IACD;QACE,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,wEAAwE;KAClF;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,mFAAmF;KAC7F;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,8BAA8B;KACxC;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,8BAA8B;KACxC;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,sCAAsC;KAChD;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,wDAAwD;KAClE;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,qDAAqD;KAC/D;IAED,2BAA2B;IAC3B;QACE,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,2BAA2B;KACrC;IACD;QACE,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,kCAAkC;KAC5C;IACD;QACE,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,yBAAyB;KACnC;IACD;QACE,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,sDAAsD;KAChE;IACD;QACE,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,kDAAkD;KAC5D;IACD;QACE,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,sEAAsE;KAChF;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,2DAA2D;KACrE;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,sEAAsE;KAChF;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,qDAAqD;KAC/D;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,qBAAqB;KAC/B;IACD;QACE,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,gEAAgE;KAC1E;IAED,kCAAkC;IAClC;QACE,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,sCAAsC;KAChD;IAED,yBAAyB;IACzB;QACE,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,+CAA+C;KACzD;IACD,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE;IAE7F,0BAA0B;IAC1B;QACE,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,oCAAoC;KAC9C;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,kCAAkC;KAC5C;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,gCAAgC;KAC1C;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,mBAAmB;KAC7B;CACF,CAAC;AAWF,SAAS,UAAU,CAAC,SAAmC;IACrD,OAAO,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC;SACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAyB;IAC3C,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,EAAE;IACjD;QACE,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,8CAA8C;QACrD,QAAQ,EAAE,UAAU,CAClB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,KAAK,WAAW,CACtF;KACF;IACD;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,8CAA8C;QACrD,QAAQ,EAAE,CAAC,kBAAkB,CAAC;KAC/B;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,yCAAyC;QAChD,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC;KAChD;CACF,CAAC;AAEF,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAEpF,qFAAqF;AACrF,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,QAAuC;IACjF,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED;;kEAEkE;AAClE,MAAM,UAAU,qBAAqB,CAAC,KAAoC;IACxE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAY;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IACrD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC"}
|