koneck 2.36.1 → 2.38.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.
@@ -0,0 +1,114 @@
1
+ /**
2
+ * A real browser the agent can use, and you can watch.
3
+ *
4
+ * An agent that writes a web page and then greps its own source for a class name is guessing. The
5
+ * question "does the button work" is answered by pressing it, and until now nothing here could.
6
+ * This drives Chromium over the DevTools protocol: open a page, read what it actually renders,
7
+ * click, type, and take a picture of the result.
8
+ *
9
+ * No dependency. Chromium exposes DevTools over a WebSocket, Node has had a WebSocket global since
10
+ * 21, and the protocol is JSON — so a browser driver is a few hundred lines rather than a hundred
11
+ * megabytes of node_modules. Puppeteer and Playwright each ship their own Chromium build; KONECK
12
+ * installs with `npm i -g koneck` and would be a very different proposition at that size.
13
+ *
14
+ * Chromium is not bundled either, for the same reason. What is present is used and what is absent
15
+ * is reported as absent — the same rule as the language servers.
16
+ *
17
+ * Human-like on purpose: a click is a real mouse event dispatched at the element's centre, not
18
+ * `el.click()`. Frameworks that synthesise their own event plumbing behave differently under the
19
+ * two, and the point of a browser is to find out what a person would find out.
20
+ */
21
+ /** Names a Chromium-family browser goes by, in the order they are tried. */
22
+ export declare const CHROME_BINARIES: string[];
23
+ /** The browser to drive, or nothing. */
24
+ export declare function findBrowser(candidates?: readonly string[], env?: NodeJS.ProcessEnv): string | null;
25
+ export interface PageState {
26
+ url: string;
27
+ title: string;
28
+ /** What the page renders as text, which is what a person would read. */
29
+ text: string;
30
+ /** Interactive things, so the agent can act without guessing at selectors. */
31
+ controls: Array<{
32
+ tag: string;
33
+ label: string;
34
+ selector: string;
35
+ }>;
36
+ }
37
+ /** How long any one protocol call gets. A browser that has wedged must not wedge the run. */
38
+ export declare const CALL_TIMEOUT_MS = 20000;
39
+ /**
40
+ * One browser, one page.
41
+ *
42
+ * A single page rather than a pool: the agent is doing one thing, the person is watching one
43
+ * thing, and tabs would need naming, listing and disambiguating for no gain anybody asked for.
44
+ */
45
+ export declare class Browser {
46
+ private child;
47
+ private socket;
48
+ private profile;
49
+ private sessionId;
50
+ private nextId;
51
+ private readonly pending;
52
+ /** The last picture taken, so the interface can show it without asking for another. */
53
+ lastShot: string | null;
54
+ get running(): boolean;
55
+ /** Starts a browser, or explains why it could not. Never throws. */
56
+ start(headless?: boolean): Promise<{
57
+ ok: boolean;
58
+ error?: string;
59
+ }>;
60
+ /** A protocol call with no session — browser-level rather than page-level. */
61
+ private raw;
62
+ /** A page-level call. Flat sessions carry the session on the message. */
63
+ private call;
64
+ /** Runs an expression in the page and returns its value. */
65
+ private evaluate;
66
+ open(url: string): Promise<{
67
+ ok: boolean;
68
+ error?: string;
69
+ }>;
70
+ /**
71
+ * Waits for the page to stop changing, rather than for a fixed time.
72
+ *
73
+ * readyState alone is not enough for anything that renders after load, which is most of what
74
+ * anybody builds now. So it also waits for the rendered text to stop growing: two identical
75
+ * readings in a row means the page has settled, and a page that never settles is bounded by the
76
+ * attempt count rather than left to hang.
77
+ */
78
+ private settle;
79
+ state(): Promise<PageState>;
80
+ /** Where an element is, in page coordinates. Null when it is not there or not visible. */
81
+ private centreOf;
82
+ /**
83
+ * Clicks where a person would click.
84
+ *
85
+ * Real mouse events at the element's centre, not `el.click()`. The two behave differently under
86
+ * frameworks that build their own event plumbing, and the reason to drive a browser at all is to
87
+ * find out what a person would find out.
88
+ */
89
+ click(selector: string): Promise<{
90
+ ok: boolean;
91
+ error?: string;
92
+ }>;
93
+ /** A click at a point, which is what a user clicking the preview means. */
94
+ clickAt(x: number, y: number): Promise<{
95
+ ok: boolean;
96
+ }>;
97
+ private pointAndPress;
98
+ /** Focuses a field and types into it, the way a keyboard would. */
99
+ type(selector: string, text: string, submit?: boolean): Promise<{
100
+ ok: boolean;
101
+ error?: string;
102
+ }>;
103
+ /** A named key, for the ones that mean something rather than insert something. */
104
+ press(key: string): Promise<{
105
+ ok: boolean;
106
+ }>;
107
+ scroll(by: number): Promise<{
108
+ ok: boolean;
109
+ }>;
110
+ /** A picture of the page as it is, base64 PNG. */
111
+ screenshot(): Promise<string | null>;
112
+ stop(): Promise<void>;
113
+ }
114
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAQH,4EAA4E;AAC5E,eAAO,MAAM,eAAe,UAI3B,CAAC;AAEF,wCAAwC;AACxC,wBAAgB,WAAW,CACzB,UAAU,GAAE,SAAS,MAAM,EAAoB,EAC/C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,IAAI,CAkBf;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,QAAQ,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE;AAED,6FAA6F;AAC7F,eAAO,MAAM,eAAe,QAAS,CAAC;AAiBtC;;;;;GAKG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,uFAAuF;IACvF,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B,IAAI,OAAO,IAAI,OAAO,CAA0C;IAEhE,oEAAoE;IAC9D,KAAK,CAAC,QAAQ,UAAO,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAqEtE,8EAA8E;IAC9E,OAAO,CAAC,GAAG;IAWX,yEAAyE;IACzE,OAAO,CAAC,IAAI;IAWZ,4DAA4D;YAC9C,QAAQ;IAQhB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IASjE;;;;;;;OAOG;YACW,MAAM;IAmBd,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC;IAmCjC,0FAA0F;YAC5E,QAAQ;IAWtB;;;;;;OAMG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAQvE,2EAA2E;IACrE,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC;YAM/C,aAAa;IAO3B,mEAAmE;IAC7D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,UAAQ,GACrD,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAkB5C,kFAAkF;IAC5E,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC;IA8B5C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC;IAKlD,kDAAkD;IAC5C,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQpC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAe5B"}
@@ -0,0 +1,389 @@
1
+ /**
2
+ * A real browser the agent can use, and you can watch.
3
+ *
4
+ * An agent that writes a web page and then greps its own source for a class name is guessing. The
5
+ * question "does the button work" is answered by pressing it, and until now nothing here could.
6
+ * This drives Chromium over the DevTools protocol: open a page, read what it actually renders,
7
+ * click, type, and take a picture of the result.
8
+ *
9
+ * No dependency. Chromium exposes DevTools over a WebSocket, Node has had a WebSocket global since
10
+ * 21, and the protocol is JSON — so a browser driver is a few hundred lines rather than a hundred
11
+ * megabytes of node_modules. Puppeteer and Playwright each ship their own Chromium build; KONECK
12
+ * installs with `npm i -g koneck` and would be a very different proposition at that size.
13
+ *
14
+ * Chromium is not bundled either, for the same reason. What is present is used and what is absent
15
+ * is reported as absent — the same rule as the language servers.
16
+ *
17
+ * Human-like on purpose: a click is a real mouse event dispatched at the element's centre, not
18
+ * `el.click()`. Frameworks that synthesise their own event plumbing behave differently under the
19
+ * two, and the point of a browser is to find out what a person would find out.
20
+ */
21
+ import { spawn } from 'child_process';
22
+ import { mkdtemp, rm } from 'fs/promises';
23
+ import { existsSync } from 'fs';
24
+ import os from 'os';
25
+ import path from 'path';
26
+ /** Names a Chromium-family browser goes by, in the order they are tried. */
27
+ export const CHROME_BINARIES = [
28
+ 'chromium', 'chromium-browser', 'google-chrome', 'google-chrome-stable', 'chrome',
29
+ '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
30
+ '/Applications/Chromium.app/Contents/MacOS/Chromium',
31
+ ];
32
+ /** The browser to drive, or nothing. */
33
+ export function findBrowser(candidates = CHROME_BINARIES, env = process.env) {
34
+ const named = env['KONECK_BROWSER'];
35
+ if (named && (existsSync(named) || !named.includes(path.sep)))
36
+ return named;
37
+ const dirs = (env['PATH'] ?? '').split(path.delimiter).filter(Boolean);
38
+ const exts = process.platform === 'win32'
39
+ ? (env['PATHEXT'] ?? '.EXE;.CMD;.BAT').split(';') : [''];
40
+ for (const candidate of candidates) {
41
+ if (candidate.includes(path.sep)) {
42
+ if (existsSync(candidate))
43
+ return candidate;
44
+ continue;
45
+ }
46
+ for (const dir of dirs) {
47
+ for (const ext of exts) {
48
+ if (existsSync(path.join(dir, candidate + ext)))
49
+ return candidate;
50
+ }
51
+ }
52
+ }
53
+ return null;
54
+ }
55
+ /** How long any one protocol call gets. A browser that has wedged must not wedge the run. */
56
+ export const CALL_TIMEOUT_MS = 20_000;
57
+ /** Page text handed back, capped. A whole document is not an answer. */
58
+ const MAX_TEXT = 12_000;
59
+ /** Interactive elements listed. Beyond this a page is a haystack, not a form. */
60
+ const MAX_CONTROLS = 60;
61
+ /**
62
+ * The soonest a page is called settled.
63
+ *
64
+ * Anything that renders after load — which is most of what anybody builds — needs longer than
65
+ * readyState. Measured against a page appending text on a 700ms timer: returning as soon as two
66
+ * readings matched meant the agent read the page without that paragraph in it and had no way to
67
+ * know. Long enough to catch the ordinary case, short enough not to be felt on a static page.
68
+ */
69
+ const MIN_SETTLE_MS = 900;
70
+ /**
71
+ * One browser, one page.
72
+ *
73
+ * A single page rather than a pool: the agent is doing one thing, the person is watching one
74
+ * thing, and tabs would need naming, listing and disambiguating for no gain anybody asked for.
75
+ */
76
+ export class Browser {
77
+ child = null;
78
+ socket = null;
79
+ profile = '';
80
+ sessionId = '';
81
+ nextId = 1;
82
+ pending = new Map();
83
+ /** The last picture taken, so the interface can show it without asking for another. */
84
+ lastShot = null;
85
+ get running() { return this.socket?.readyState === 1; }
86
+ /** Starts a browser, or explains why it could not. Never throws. */
87
+ async start(headless = true) {
88
+ if (this.running)
89
+ return { ok: true };
90
+ const binary = findBrowser();
91
+ if (!binary) {
92
+ return { ok: false, error: 'No Chromium-family browser found. Install chromium (or set KONECK_BROWSER to a binary) '
93
+ + 'and this works; nothing else here needs it.' };
94
+ }
95
+ this.profile = await mkdtemp(path.join(os.tmpdir(), 'koneck-browser-'));
96
+ const args = [
97
+ ...(headless ? ['--headless=new'] : []),
98
+ '--disable-gpu', '--no-first-run', '--no-default-browser-check',
99
+ // A sandbox inside a container or as root refuses to start, and this browser only ever
100
+ // visits what it is told to.
101
+ '--no-sandbox', '--disable-dev-shm-usage',
102
+ '--remote-debugging-port=0', `--user-data-dir=${this.profile}`,
103
+ '--window-size=1280,900', 'about:blank',
104
+ ];
105
+ const child = spawn(binary, args, { stdio: ['ignore', 'pipe', 'pipe'] });
106
+ this.child = child;
107
+ // The port is chosen by the browser and announced on stderr; there is no other way to learn it.
108
+ const endpoint = await new Promise(resolve => {
109
+ let buffer = '';
110
+ const timer = setTimeout(() => resolve(null), 25_000);
111
+ child.stderr?.on('data', (d) => {
112
+ buffer += d.toString();
113
+ const found = /ws:\/\/[^\s]+/.exec(buffer);
114
+ if (found) {
115
+ clearTimeout(timer);
116
+ resolve(found[0]);
117
+ }
118
+ });
119
+ child.once('exit', () => { clearTimeout(timer); resolve(null); });
120
+ });
121
+ if (!endpoint) {
122
+ await this.stop();
123
+ return { ok: false, error: `${binary} started but never announced a DevTools endpoint.` };
124
+ }
125
+ const socket = new WebSocket(endpoint);
126
+ this.socket = socket;
127
+ const opened = await new Promise(resolve => {
128
+ const timer = setTimeout(() => resolve(false), 15_000);
129
+ socket.onopen = () => { clearTimeout(timer); resolve(true); };
130
+ socket.onerror = () => { clearTimeout(timer); resolve(false); };
131
+ });
132
+ if (!opened) {
133
+ await this.stop();
134
+ return { ok: false, error: 'could not connect to DevTools' };
135
+ }
136
+ socket.addEventListener('message', ev => {
137
+ let message;
138
+ try {
139
+ message = JSON.parse(String(ev.data));
140
+ }
141
+ catch {
142
+ return;
143
+ }
144
+ if (typeof message.id !== 'number')
145
+ return; // an event, not a reply
146
+ const waiting = this.pending.get(message.id);
147
+ if (!waiting)
148
+ return;
149
+ clearTimeout(waiting.timer);
150
+ this.pending.delete(message.id);
151
+ waiting.resolve(message.error ? { __error: message.error.message } : message.result);
152
+ });
153
+ const target = await this.raw('Target.createTarget', { url: 'about:blank' });
154
+ if (!target?.targetId) {
155
+ await this.stop();
156
+ return { ok: false, error: 'no page to drive' };
157
+ }
158
+ const attached = await this.raw('Target.attachToTarget', { targetId: target.targetId, flatten: true });
159
+ if (!attached?.sessionId) {
160
+ await this.stop();
161
+ return { ok: false, error: 'could not attach' };
162
+ }
163
+ this.sessionId = attached.sessionId;
164
+ await this.call('Page.enable', {});
165
+ await this.call('Runtime.enable', {});
166
+ return { ok: true };
167
+ }
168
+ /** A protocol call with no session — browser-level rather than page-level. */
169
+ raw(method, params) {
170
+ const socket = this.socket;
171
+ if (!socket || socket.readyState !== 1)
172
+ return Promise.resolve(null);
173
+ const id = this.nextId++;
174
+ return new Promise(resolve => {
175
+ const timer = setTimeout(() => { this.pending.delete(id); resolve(null); }, CALL_TIMEOUT_MS);
176
+ this.pending.set(id, { resolve, timer });
177
+ socket.send(JSON.stringify({ id, method, params }));
178
+ });
179
+ }
180
+ /** A page-level call. Flat sessions carry the session on the message. */
181
+ call(method, params) {
182
+ const socket = this.socket;
183
+ if (!socket || socket.readyState !== 1)
184
+ return Promise.resolve(null);
185
+ const id = this.nextId++;
186
+ return new Promise(resolve => {
187
+ const timer = setTimeout(() => { this.pending.delete(id); resolve(null); }, CALL_TIMEOUT_MS);
188
+ this.pending.set(id, { resolve, timer });
189
+ socket.send(JSON.stringify({ id, method, params, sessionId: this.sessionId }));
190
+ });
191
+ }
192
+ /** Runs an expression in the page and returns its value. */
193
+ async evaluate(expression) {
194
+ const out = await this.call('Runtime.evaluate', {
195
+ expression, returnByValue: true, awaitPromise: true,
196
+ });
197
+ if (!out || out.exceptionDetails)
198
+ return null;
199
+ return out.result?.value ?? null;
200
+ }
201
+ async open(url) {
202
+ const target = /^[a-z]+:\/\//i.test(url) ? url : 'http://' + url;
203
+ const nav = await this.call('Page.navigate', { url: target });
204
+ if (nav?.errorText)
205
+ return { ok: false, error: `${target} — ${nav.errorText}` };
206
+ await this.settle();
207
+ return { ok: true };
208
+ }
209
+ /**
210
+ * Waits for the page to stop changing, rather than for a fixed time.
211
+ *
212
+ * readyState alone is not enough for anything that renders after load, which is most of what
213
+ * anybody builds now. So it also waits for the rendered text to stop growing: two identical
214
+ * readings in a row means the page has settled, and a page that never settles is bounded by the
215
+ * attempt count rather than left to hang.
216
+ */
217
+ async settle(attempts = 14) {
218
+ let previous = '';
219
+ let stable = 0;
220
+ const started = Date.now();
221
+ for (let i = 0; i < attempts; i++) {
222
+ await new Promise(r => setTimeout(r, 220));
223
+ const now = await this.evaluate('document.readyState + "|" + (document.body ? document.body.innerText.length : 0)');
224
+ if (now && now === previous && now.startsWith('complete'))
225
+ stable++;
226
+ else
227
+ stable = 0;
228
+ previous = now ?? '';
229
+ // Three consecutive identical readings, and never sooner than MIN_SETTLE_MS.
230
+ //
231
+ // Two was not enough. A page whose script renders 700ms after load reported the same length
232
+ // at 220ms and 440ms — stable, complete, and missing a whole paragraph. Measured against a
233
+ // page that appends text on a timer: with two readings the agent never saw it.
234
+ if (stable >= 2 && Date.now() - started >= MIN_SETTLE_MS)
235
+ return;
236
+ }
237
+ }
238
+ async state() {
239
+ const got = await this.evaluate(`(() => {
240
+ const seen = new Set();
241
+ const controls = [];
242
+ const label = (el) => (
243
+ el.getAttribute('aria-label') || el.getAttribute('placeholder') || el.getAttribute('name')
244
+ || el.getAttribute('title') || (el.innerText || el.value || '').trim() || el.id || ''
245
+ ).replace(/\\s+/g, ' ').slice(0, 80);
246
+ // A selector that will still find it: an id if it has one, otherwise nth-of-type.
247
+ const selectorFor = (el) => {
248
+ if (el.id) return '#' + el.id;
249
+ const tag = el.tagName.toLowerCase();
250
+ const same = [...document.querySelectorAll(tag)];
251
+ return tag + ':nth-of-type(' + (same.indexOf(el) + 1) + ')';
252
+ };
253
+ for (const el of document.querySelectorAll(
254
+ 'a[href],button,input,select,textarea,[role=button],[onclick]')) {
255
+ const box = el.getBoundingClientRect();
256
+ if (box.width === 0 || box.height === 0) continue; // not on screen, not a control
257
+ const sel = selectorFor(el);
258
+ if (seen.has(sel)) continue;
259
+ seen.add(sel);
260
+ controls.push({ tag: el.tagName.toLowerCase(), label: label(el), selector: sel });
261
+ if (controls.length >= ${MAX_CONTROLS}) break;
262
+ }
263
+ return {
264
+ url: location.href,
265
+ title: document.title,
266
+ text: (document.body ? document.body.innerText : '').trim().slice(0, ${MAX_TEXT}),
267
+ controls,
268
+ };
269
+ })()`);
270
+ return got ?? { url: '', title: '', text: '', controls: [] };
271
+ }
272
+ /** Where an element is, in page coordinates. Null when it is not there or not visible. */
273
+ async centreOf(selector) {
274
+ return this.evaluate(`(() => {
275
+ const el = document.querySelector(${JSON.stringify(selector)});
276
+ if (!el) return null;
277
+ el.scrollIntoView({block: 'center'});
278
+ const b = el.getBoundingClientRect();
279
+ if (b.width === 0 || b.height === 0) return null;
280
+ return { x: b.left + b.width / 2, y: b.top + b.height / 2 };
281
+ })()`);
282
+ }
283
+ /**
284
+ * Clicks where a person would click.
285
+ *
286
+ * Real mouse events at the element's centre, not `el.click()`. The two behave differently under
287
+ * frameworks that build their own event plumbing, and the reason to drive a browser at all is to
288
+ * find out what a person would find out.
289
+ */
290
+ async click(selector) {
291
+ const at = await this.centreOf(selector);
292
+ if (!at)
293
+ return { ok: false, error: `nothing visible matches ${selector}` };
294
+ await this.pointAndPress(at.x, at.y);
295
+ await this.settle(6);
296
+ return { ok: true };
297
+ }
298
+ /** A click at a point, which is what a user clicking the preview means. */
299
+ async clickAt(x, y) {
300
+ await this.pointAndPress(x, y);
301
+ await this.settle(6);
302
+ return { ok: true };
303
+ }
304
+ async pointAndPress(x, y) {
305
+ const common = { x, y, button: 'left', clickCount: 1 };
306
+ await this.call('Input.dispatchMouseEvent', { type: 'mouseMoved', x, y });
307
+ await this.call('Input.dispatchMouseEvent', { ...common, type: 'mousePressed' });
308
+ await this.call('Input.dispatchMouseEvent', { ...common, type: 'mouseReleased' });
309
+ }
310
+ /** Focuses a field and types into it, the way a keyboard would. */
311
+ async type(selector, text, submit = false) {
312
+ const at = await this.centreOf(selector);
313
+ if (!at)
314
+ return { ok: false, error: `nothing visible matches ${selector}` };
315
+ await this.pointAndPress(at.x, at.y);
316
+ // Clear first: typing into a field that already has a value is otherwise appending.
317
+ const cleared = await this.evaluate(`(() => {
318
+ const el = document.querySelector(${JSON.stringify(selector)});
319
+ if (!el) return false;
320
+ if ('value' in el) { el.value = ''; el.dispatchEvent(new Event('input', {bubbles: true})); }
321
+ return true;
322
+ })()`);
323
+ if (!cleared)
324
+ return { ok: false, error: `${selector} went away` };
325
+ await this.call('Input.insertText', { text });
326
+ if (submit)
327
+ await this.press('Enter');
328
+ await this.settle(6);
329
+ return { ok: true };
330
+ }
331
+ /** A named key, for the ones that mean something rather than insert something. */
332
+ async press(key) {
333
+ const known = {
334
+ Enter: { code: 'Enter', key: 'Enter', windowsVirtualKeyCode: 13, text: '\r' },
335
+ Tab: { code: 'Tab', key: 'Tab', windowsVirtualKeyCode: 9, text: '\t' },
336
+ Escape: { code: 'Escape', key: 'Escape', windowsVirtualKeyCode: 27 },
337
+ Backspace: { code: 'Backspace', key: 'Backspace', windowsVirtualKeyCode: 8 },
338
+ ArrowDown: { code: 'ArrowDown', key: 'ArrowDown', windowsVirtualKeyCode: 40 },
339
+ ArrowUp: { code: 'ArrowUp', key: 'ArrowUp', windowsVirtualKeyCode: 38 },
340
+ ArrowLeft: { code: 'ArrowLeft', key: 'ArrowLeft', windowsVirtualKeyCode: 37 },
341
+ ArrowRight: { code: 'ArrowRight', key: 'ArrowRight', windowsVirtualKeyCode: 39 },
342
+ };
343
+ const spec = known[key] ?? known['Enter'];
344
+ const down = spec.text !== undefined
345
+ ? { ...spec, unmodifiedText: spec.text }
346
+ : spec;
347
+ await this.call('Input.dispatchKeyEvent', { type: 'keyDown', ...down });
348
+ await this.call('Input.dispatchKeyEvent', { type: 'keyUp', ...spec });
349
+ await this.settle(6);
350
+ return { ok: true };
351
+ }
352
+ async scroll(by) {
353
+ await this.evaluate(`window.scrollBy(0, ${Math.trunc(by)})`);
354
+ return { ok: true };
355
+ }
356
+ /** A picture of the page as it is, base64 PNG. */
357
+ async screenshot() {
358
+ const out = await this.call('Page.captureScreenshot', { format: 'png', captureBeyondViewport: false });
359
+ if (!out?.data)
360
+ return null;
361
+ this.lastShot = 'data:image/png;base64,' + out.data;
362
+ return this.lastShot;
363
+ }
364
+ async stop() {
365
+ for (const { timer, resolve } of this.pending.values()) {
366
+ clearTimeout(timer);
367
+ resolve(null);
368
+ }
369
+ this.pending.clear();
370
+ try {
371
+ this.socket?.close();
372
+ }
373
+ catch { /* already gone */ }
374
+ this.socket = null;
375
+ const child = this.child;
376
+ this.child = null;
377
+ if (child && child.exitCode === null) {
378
+ try {
379
+ child.kill('SIGKILL');
380
+ }
381
+ catch { /* already gone */ }
382
+ }
383
+ if (this.profile) {
384
+ await rm(this.profile, { recursive: true, force: true }).catch(() => { });
385
+ this.profile = '';
386
+ }
387
+ }
388
+ }
389
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
package/dist/tools.d.ts CHANGED
@@ -141,4 +141,17 @@ export interface CodeLookupArgs {
141
141
  path?: string;
142
142
  symbol?: string;
143
143
  }
144
+ export interface BrowserArgs {
145
+ action?: string;
146
+ url?: string;
147
+ selector?: string;
148
+ text?: string;
149
+ key?: string;
150
+ submit?: boolean;
151
+ by?: number;
152
+ }
153
+ /** The live browser, for an interface that wants to show what the agent is looking at. */
154
+ export declare function currentBrowser(): import('./browser.js').Browser | null;
155
+ /** Shuts it down. Called when a run ends, so a headless Chromium is not left behind. */
156
+ export declare function closeBrowser(): Promise<void>;
144
157
  //# sourceMappingURL=tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}