@openacme/browser 0.4.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,539 @@
1
+ import { killChrome, launchChrome, resolveExecutableOrThrow, resolveUserDataDir, } from "./chrome.js";
2
+ import { connectOverCdp, isRecoverableDisconnect } from "./cdp.js";
3
+ import { refLocator } from "./refs.js";
4
+ import { ariaSnapshot } from "./snapshot.js";
5
+ const MAX_CONSOLE_PER_PAGE = 200;
6
+ /**
7
+ * Owns the single managed Chrome process for the OpenAcme workforce.
8
+ *
9
+ * One Chrome under `<dataDir>/browser-profile/`; one shared default
10
+ * `BrowserContext` so all agents share cookies / login state. Tabs are
11
+ * partitioned per-agent: each agent gets its own `t1`, `t2`, ... alias
12
+ * space. Cross-agent tab access is refused.
13
+ *
14
+ * Lazy: nothing happens until the first tool call. CDP disconnect on
15
+ * sleep/wake is recovered transparently — `cachedBrowser` is invalidated
16
+ * by the `disconnected` listener and re-established on next call.
17
+ */
18
+ export class BrowserManager {
19
+ userDataDir;
20
+ cfg;
21
+ running = null;
22
+ cachedBrowser = null;
23
+ connectingPromise = null;
24
+ launchingPromise = null;
25
+ // Tab ownership: targetId -> owning agentId
26
+ tabOwnership = new Map();
27
+ // Per-agent alias spaces (tN ids stable within an agent)
28
+ agentTabs = new Map();
29
+ // The agent's currently-active tab
30
+ activeTabByAgent = new Map(); // agentId -> targetId
31
+ // Per-page transient state (console buffer, pending dialog policy)
32
+ pageState = new WeakMap();
33
+ constructor(opts) {
34
+ this.userDataDir = resolveUserDataDir(opts.dataDir);
35
+ this.cfg = opts.config;
36
+ }
37
+ // ───────────────────────── lifecycle ─────────────────────────
38
+ async ensureChrome() {
39
+ if (this.running && this.running.proc.exitCode === null)
40
+ return this.running;
41
+ if (this.launchingPromise)
42
+ return this.launchingPromise;
43
+ const exe = resolveExecutableOrThrow(this.cfg);
44
+ this.launchingPromise = launchChrome({
45
+ exe,
46
+ cdpPort: this.cfg.port,
47
+ userDataDir: this.userDataDir,
48
+ headless: this.cfg.headless,
49
+ noSandbox: this.cfg.noSandbox,
50
+ })
51
+ .then((r) => {
52
+ r.proc.once("exit", () => {
53
+ if (this.running === r) {
54
+ this.running = null;
55
+ this.cachedBrowser = null;
56
+ this.resetAllTabState();
57
+ }
58
+ });
59
+ this.running = r;
60
+ return r;
61
+ })
62
+ .finally(() => {
63
+ this.launchingPromise = null;
64
+ });
65
+ return this.launchingPromise;
66
+ }
67
+ async getBrowser() {
68
+ if (this.cachedBrowser)
69
+ return this.cachedBrowser;
70
+ if (this.connectingPromise)
71
+ return this.connectingPromise;
72
+ this.connectingPromise = this.connectFresh().finally(() => {
73
+ this.connectingPromise = null;
74
+ });
75
+ return this.connectingPromise;
76
+ }
77
+ async connectFresh() {
78
+ const running = await this.ensureChrome();
79
+ const browser = await connectOverCdp({
80
+ wsUrl: running.cdpUrl,
81
+ onDisconnected: (b) => {
82
+ if (this.cachedBrowser === b)
83
+ this.cachedBrowser = null;
84
+ },
85
+ });
86
+ this.cachedBrowser = browser;
87
+ return browser;
88
+ }
89
+ async sharedContext() {
90
+ const browser = await this.getBrowser();
91
+ const contexts = browser.contexts();
92
+ if (contexts.length === 0) {
93
+ // Should never happen with connectOverCDP — Chrome always exposes
94
+ // the default context — but defensive.
95
+ throw new Error("No BrowserContext available on the connected Chrome.");
96
+ }
97
+ const ctx = contexts[0];
98
+ return ctx;
99
+ }
100
+ resetAllTabState() {
101
+ this.tabOwnership.clear();
102
+ this.agentTabs.clear();
103
+ this.activeTabByAgent.clear();
104
+ }
105
+ async close() {
106
+ if (this.cachedBrowser) {
107
+ try {
108
+ await this.cachedBrowser.close();
109
+ }
110
+ catch {
111
+ // ignore — we're shutting down
112
+ }
113
+ this.cachedBrowser = null;
114
+ }
115
+ if (this.running) {
116
+ await killChrome(this.running);
117
+ this.running = null;
118
+ }
119
+ this.resetAllTabState();
120
+ }
121
+ // ───────────────────────── per-page observation ─────────────────────────
122
+ observePage(page) {
123
+ if (this.pageState.has(page))
124
+ return;
125
+ const state = { console: [], dialogHandler: null };
126
+ this.pageState.set(page, state);
127
+ page.on("console", (msg) => {
128
+ if (state.console.length >= MAX_CONSOLE_PER_PAGE)
129
+ state.console.shift();
130
+ state.console.push({
131
+ type: msg.type(),
132
+ text: msg.text(),
133
+ location: msg.location(),
134
+ timestamp: new Date().toISOString(),
135
+ });
136
+ });
137
+ page.on("pageerror", (err) => {
138
+ if (state.console.length >= MAX_CONSOLE_PER_PAGE)
139
+ state.console.shift();
140
+ state.console.push({
141
+ type: "error",
142
+ text: err.message,
143
+ timestamp: new Date().toISOString(),
144
+ });
145
+ });
146
+ }
147
+ // ───────────────────────── tab ownership ─────────────────────────
148
+ agentTabsFor(agentId) {
149
+ let s = this.agentTabs.get(agentId);
150
+ if (!s) {
151
+ s = { next: 1, byTargetId: new Map(), byTabId: new Map() };
152
+ this.agentTabs.set(agentId, s);
153
+ }
154
+ return s;
155
+ }
156
+ assignTabAlias(agentId, targetId) {
157
+ const s = this.agentTabsFor(agentId);
158
+ const existing = s.byTargetId.get(targetId);
159
+ if (existing)
160
+ return existing;
161
+ const id = `t${s.next}`;
162
+ s.next += 1;
163
+ s.byTargetId.set(targetId, id);
164
+ s.byTabId.set(id, targetId);
165
+ this.tabOwnership.set(targetId, agentId);
166
+ return id;
167
+ }
168
+ trackPageForAgent(agentId, page, targetId) {
169
+ this.observePage(page);
170
+ const tabId = this.assignTabAlias(agentId, targetId);
171
+ this.activeTabByAgent.set(agentId, targetId);
172
+ page.once("close", () => {
173
+ this.releaseTab(targetId);
174
+ });
175
+ return tabId;
176
+ }
177
+ releaseTab(targetId) {
178
+ const owner = this.tabOwnership.get(targetId);
179
+ if (!owner)
180
+ return;
181
+ this.tabOwnership.delete(targetId);
182
+ const s = this.agentTabs.get(owner);
183
+ if (s) {
184
+ const alias = s.byTargetId.get(targetId);
185
+ if (alias) {
186
+ s.byTabId.delete(alias);
187
+ s.byTargetId.delete(targetId);
188
+ }
189
+ }
190
+ if (this.activeTabByAgent.get(owner) === targetId) {
191
+ this.activeTabByAgent.delete(owner);
192
+ }
193
+ }
194
+ async targetIdOf(page) {
195
+ const session = await page.context().newCDPSession(page);
196
+ try {
197
+ const info = (await session.send("Target.getTargetInfo"));
198
+ const id = info.targetInfo?.targetId;
199
+ if (!id)
200
+ throw new Error("Target.getTargetInfo returned no targetId");
201
+ return id;
202
+ }
203
+ finally {
204
+ await session.detach().catch(() => { });
205
+ }
206
+ }
207
+ /**
208
+ * Resolve the Page for `tabId` (or the active tab if omitted) and verify
209
+ * the agent owns it. Throws on missing tab / cross-agent access.
210
+ */
211
+ async resolvePage(agentId, tabId, opts) {
212
+ const s = this.agentTabsFor(agentId);
213
+ let targetId;
214
+ if (tabId) {
215
+ targetId = s.byTabId.get(tabId);
216
+ if (!targetId) {
217
+ throw new Error(`Tab ${tabId} not found for this agent.`);
218
+ }
219
+ }
220
+ else {
221
+ targetId = this.activeTabByAgent.get(agentId);
222
+ }
223
+ const ctx = await this.sharedContext();
224
+ if (targetId) {
225
+ const page = await this.findPageByTargetId(ctx, targetId);
226
+ if (page) {
227
+ this.observePage(page);
228
+ const resolvedTabId = s.byTargetId.get(targetId);
229
+ return { page, tabId: resolvedTabId, targetId };
230
+ }
231
+ // The target id we remember is gone (page closed externally,
232
+ // Chrome respawned, etc.). Clean up and fall through.
233
+ this.releaseTab(targetId);
234
+ targetId = undefined;
235
+ }
236
+ if (!opts.createIfNone) {
237
+ throw new Error("No tabs owned by this agent. Call browser_navigate first to open one.");
238
+ }
239
+ const page = await ctx.newPage();
240
+ const newTargetId = await this.targetIdOf(page);
241
+ const newTabId = this.trackPageForAgent(agentId, page, newTargetId);
242
+ return { page, tabId: newTabId, targetId: newTargetId };
243
+ }
244
+ async findPageByTargetId(ctx, targetId) {
245
+ for (const p of ctx.pages()) {
246
+ try {
247
+ const tid = await this.targetIdOf(p);
248
+ if (tid === targetId)
249
+ return p;
250
+ }
251
+ catch {
252
+ // ignore — the page may have closed mid-iteration
253
+ }
254
+ }
255
+ return null;
256
+ }
257
+ /**
258
+ * Run an action with one-shot reconnect on transient CDP disconnects.
259
+ * The action gets a fresh `page` resolution on retry.
260
+ */
261
+ async withReconnect(agentId, tabId, opts, fn) {
262
+ try {
263
+ const r = await this.resolvePage(agentId, tabId, opts);
264
+ return await fn(r.page, { tabId: r.tabId, targetId: r.targetId });
265
+ }
266
+ catch (e) {
267
+ if (!isRecoverableDisconnect(e))
268
+ throw e;
269
+ // Invalidate connection + tab state and retry once.
270
+ this.cachedBrowser = null;
271
+ const r = await this.resolvePage(agentId, tabId, opts);
272
+ return await fn(r.page, { tabId: r.tabId, targetId: r.targetId });
273
+ }
274
+ }
275
+ // ───────────────────────── public API ─────────────────────────
276
+ async navigate(agentId, p) {
277
+ return this.withReconnect(agentId, p.tabId, { createIfNone: true }, async (page, ids) => {
278
+ await page.goto(p.url, { waitUntil: "domcontentloaded" });
279
+ const [title, url, snapshot] = await Promise.all([
280
+ page.title(),
281
+ Promise.resolve(page.url()),
282
+ ariaSnapshot(page),
283
+ ]);
284
+ return { tabId: ids.tabId, url, title, snapshot };
285
+ });
286
+ }
287
+ async snapshot(agentId, p) {
288
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
289
+ const snapshot = await ariaSnapshot(page);
290
+ return { tabId: ids.tabId, url: page.url(), snapshot };
291
+ });
292
+ }
293
+ async click(agentId, p) {
294
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
295
+ await refLocator(page, p.ref).click();
296
+ return { tabId: ids.tabId };
297
+ });
298
+ }
299
+ async type(agentId, p) {
300
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
301
+ const loc = refLocator(page, p.ref);
302
+ await loc.fill(p.text);
303
+ if (p.submit)
304
+ await loc.press("Enter");
305
+ return { tabId: ids.tabId };
306
+ });
307
+ }
308
+ async pressKey(agentId, p) {
309
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
310
+ await page.keyboard.press(p.key);
311
+ return { tabId: ids.tabId };
312
+ });
313
+ }
314
+ async takeScreenshot(agentId, p) {
315
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
316
+ const buf = await page.screenshot({ fullPage: !!p.fullPage, type: "png" });
317
+ return {
318
+ tabId: ids.tabId,
319
+ pngBase64: buf.toString("base64"),
320
+ mediaType: "image/png",
321
+ };
322
+ });
323
+ }
324
+ async waitFor(agentId, p) {
325
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
326
+ if (p.text) {
327
+ await page
328
+ .getByText(p.text, { exact: false })
329
+ .first()
330
+ .waitFor({ timeout: 30_000 });
331
+ }
332
+ else if (p.textGone) {
333
+ await page
334
+ .getByText(p.textGone, { exact: false })
335
+ .first()
336
+ .waitFor({ state: "hidden", timeout: 30_000 });
337
+ }
338
+ else if (p.timeMs && p.timeMs > 0) {
339
+ await page.waitForTimeout(p.timeMs);
340
+ }
341
+ return { tabId: ids.tabId };
342
+ });
343
+ }
344
+ async evaluate(agentId, p) {
345
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
346
+ // `function` is treated as an expression body — the model writes
347
+ // something like `document.title` or `(() => Array.from(document.images).length)()`.
348
+ const result = await page.evaluate(p.function);
349
+ return { tabId: ids.tabId, result };
350
+ });
351
+ }
352
+ async consoleMessages(agentId, p) {
353
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
354
+ const state = this.pageState.get(page);
355
+ const messages = state ? [...state.console] : [];
356
+ if (p.clear && state)
357
+ state.console = [];
358
+ return { tabId: ids.tabId, messages };
359
+ });
360
+ }
361
+ // ── tabs ──
362
+ async tabsList(agentId) {
363
+ const ctx = await this.sharedContext();
364
+ const s = this.agentTabsFor(agentId);
365
+ const active = this.activeTabByAgent.get(agentId);
366
+ const out = [];
367
+ for (const page of ctx.pages()) {
368
+ let targetId;
369
+ try {
370
+ targetId = await this.targetIdOf(page);
371
+ }
372
+ catch {
373
+ continue;
374
+ }
375
+ const tabId = s.byTargetId.get(targetId);
376
+ if (!tabId)
377
+ continue;
378
+ out.push({
379
+ tabId,
380
+ url: page.url(),
381
+ title: await page.title().catch(() => ""),
382
+ active: targetId === active,
383
+ });
384
+ }
385
+ out.sort((a, b) => {
386
+ const na = Number.parseInt(a.tabId.slice(1), 10);
387
+ const nb = Number.parseInt(b.tabId.slice(1), 10);
388
+ return na - nb;
389
+ });
390
+ return out;
391
+ }
392
+ async tabsNew(agentId, p) {
393
+ const ctx = await this.sharedContext();
394
+ const page = await ctx.newPage();
395
+ if (p.url)
396
+ await page.goto(p.url, { waitUntil: "domcontentloaded" });
397
+ const targetId = await this.targetIdOf(page);
398
+ const tabId = this.trackPageForAgent(agentId, page, targetId);
399
+ return {
400
+ tabId,
401
+ url: page.url(),
402
+ title: await page.title().catch(() => ""),
403
+ active: true,
404
+ };
405
+ }
406
+ async tabsClose(agentId, p) {
407
+ const s = this.agentTabsFor(agentId);
408
+ const targetId = s.byTabId.get(p.tabId);
409
+ if (!targetId)
410
+ throw new Error(`Tab ${p.tabId} not found for this agent.`);
411
+ const ctx = await this.sharedContext();
412
+ const page = await this.findPageByTargetId(ctx, targetId);
413
+ if (page)
414
+ await page.close();
415
+ this.releaseTab(targetId);
416
+ }
417
+ async tabsSelect(agentId, p) {
418
+ const s = this.agentTabsFor(agentId);
419
+ const targetId = s.byTabId.get(p.tabId);
420
+ if (!targetId)
421
+ throw new Error(`Tab ${p.tabId} not found for this agent.`);
422
+ const ctx = await this.sharedContext();
423
+ const page = await this.findPageByTargetId(ctx, targetId);
424
+ if (!page) {
425
+ this.releaseTab(targetId);
426
+ throw new Error(`Tab ${p.tabId} is no longer open.`);
427
+ }
428
+ this.activeTabByAgent.set(agentId, targetId);
429
+ await page.bringToFront().catch(() => { });
430
+ return {
431
+ tabId: p.tabId,
432
+ url: page.url(),
433
+ title: await page.title().catch(() => ""),
434
+ active: true,
435
+ };
436
+ }
437
+ // ── consolidated `act` verbs ──
438
+ async hover(agentId, p) {
439
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
440
+ await refLocator(page, p.ref).hover();
441
+ return { tabId: ids.tabId };
442
+ });
443
+ }
444
+ async drag(agentId, p) {
445
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
446
+ await refLocator(page, p.startRef).dragTo(refLocator(page, p.endRef));
447
+ return { tabId: ids.tabId };
448
+ });
449
+ }
450
+ async selectOption(agentId, p) {
451
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
452
+ const selected = await refLocator(page, p.ref).selectOption(p.values);
453
+ return { tabId: ids.tabId, selected };
454
+ });
455
+ }
456
+ async fillForm(agentId, p) {
457
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
458
+ for (const f of p.fields) {
459
+ await refLocator(page, f.ref).fill(f.value);
460
+ }
461
+ return { tabId: ids.tabId, filled: p.fields.length };
462
+ });
463
+ }
464
+ async fileUpload(agentId, p) {
465
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
466
+ await refLocator(page, p.ref).setInputFiles(p.paths);
467
+ return { tabId: ids.tabId };
468
+ });
469
+ }
470
+ /**
471
+ * Arm a one-shot dialog handler on the page. The handler resolves the
472
+ * NEXT dialog event with accept/dismiss + optional prompt text.
473
+ */
474
+ async handleDialog(agentId, p) {
475
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
476
+ await new Promise((resolve, reject) => {
477
+ const timer = setTimeout(() => {
478
+ page.off("dialog", onDialog);
479
+ reject(new Error("Timed out waiting for a dialog"));
480
+ }, 30_000);
481
+ const onDialog = async (dialog) => {
482
+ clearTimeout(timer);
483
+ try {
484
+ if (p.accept) {
485
+ await dialog.accept(p.promptText ?? undefined);
486
+ }
487
+ else {
488
+ await dialog.dismiss();
489
+ }
490
+ resolve();
491
+ }
492
+ catch (e) {
493
+ reject(e);
494
+ }
495
+ };
496
+ page.once("dialog", onDialog);
497
+ });
498
+ return {
499
+ tabId: ids.tabId,
500
+ result: p.accept ? "accepted" : "dismissed",
501
+ };
502
+ });
503
+ }
504
+ async resize(agentId, p) {
505
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
506
+ await page.setViewportSize({ width: p.width, height: p.height });
507
+ return { tabId: ids.tabId, width: p.width, height: p.height };
508
+ });
509
+ }
510
+ async navigateBack(agentId, p) {
511
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
512
+ await page.goBack({ waitUntil: "domcontentloaded" });
513
+ return { tabId: ids.tabId, url: page.url() };
514
+ });
515
+ }
516
+ async navigateForward(agentId, p) {
517
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
518
+ await page.goForward({ waitUntil: "domcontentloaded" });
519
+ return { tabId: ids.tabId, url: page.url() };
520
+ });
521
+ }
522
+ async saveAsPdf(agentId, p) {
523
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
524
+ const filename = p.filename ?? `browser-${ids.tabId}-${Date.now()}.pdf`;
525
+ const outPath = filename.includes("/")
526
+ ? filename
527
+ : `/tmp/${filename}`;
528
+ await page.pdf({ path: outPath, format: "Letter" });
529
+ return { tabId: ids.tabId, path: outPath };
530
+ });
531
+ }
532
+ async clickCoords(agentId, p) {
533
+ return this.withReconnect(agentId, p.tabId, { createIfNone: false }, async (page, ids) => {
534
+ await page.mouse.click(p.x, p.y);
535
+ return { tabId: ids.tabId };
536
+ });
537
+ }
538
+ }
539
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
package/dist/refs.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import type { Locator, Page } from "playwright-core";
2
+ /**
3
+ * Resolve a snapshot ref (`e3`, `@e3`, `ref=e3`) to a Playwright Locator.
4
+ * Uses Playwright's `aria-ref=` selector which is the stable counterpart to
5
+ * the refs emitted by `Locator.ariaSnapshot({ ref: true })`.
6
+ */
7
+ export declare function refLocator(page: Page, ref: string): Locator;
8
+ //# sourceMappingURL=refs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../src/refs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAO3D"}
package/dist/refs.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Resolve a snapshot ref (`e3`, `@e3`, `ref=e3`) to a Playwright Locator.
3
+ * Uses Playwright's `aria-ref=` selector which is the stable counterpart to
4
+ * the refs emitted by `Locator.ariaSnapshot({ ref: true })`.
5
+ */
6
+ export function refLocator(page, ref) {
7
+ const normalized = ref.startsWith("@")
8
+ ? ref.slice(1)
9
+ : ref.startsWith("ref=")
10
+ ? ref.slice(4)
11
+ : ref;
12
+ return page.locator(`aria-ref=${normalized}`);
13
+ }
14
+ //# sourceMappingURL=refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.js","sourceRoot":"","sources":["../src/refs.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,IAAU,EAAE,GAAW;IAChD,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QACpC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACd,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YACtB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YACd,CAAC,CAAC,GAAG,CAAC;IACV,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,UAAU,EAAE,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Page } from "playwright-core";
2
+ export declare const SNAPSHOT_CHAR_CAP = 8000;
3
+ /**
4
+ * Capture the page's aria-snapshot in the AI-optimized YAML-with-refs
5
+ * format. Mode "ai" emits `[ref=eN]` markers resolvable via
6
+ * `page.locator("aria-ref=eN")`. Verified against `playwright-core` 1.59
7
+ * (`ariaSnapshot({ mode: "ai" })`).
8
+ */
9
+ export declare function ariaSnapshot(page: Page): Promise<string>;
10
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAItC;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAK9D"}
@@ -0,0 +1,16 @@
1
+ export const SNAPSHOT_CHAR_CAP = 8000;
2
+ const TRUNCATION_FOOTER = "\n... truncated (interact then call browser_snapshot again)";
3
+ /**
4
+ * Capture the page's aria-snapshot in the AI-optimized YAML-with-refs
5
+ * format. Mode "ai" emits `[ref=eN]` markers resolvable via
6
+ * `page.locator("aria-ref=eN")`. Verified against `playwright-core` 1.59
7
+ * (`ariaSnapshot({ mode: "ai" })`).
8
+ */
9
+ export async function ariaSnapshot(page) {
10
+ const text = await page.locator("body").ariaSnapshot({ mode: "ai" });
11
+ if (text.length <= SNAPSHOT_CHAR_CAP)
12
+ return text;
13
+ const room = SNAPSHOT_CHAR_CAP - TRUNCATION_FOOTER.length;
14
+ return text.slice(0, Math.max(0, room)) + TRUNCATION_FOOTER;
15
+ }
16
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,iBAAiB,GACrB,6DAA6D,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAU;IAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,IAAI,IAAI,CAAC,MAAM,IAAI,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAClD,MAAM,IAAI,GAAG,iBAAiB,GAAG,iBAAiB,CAAC,MAAM,CAAC;IAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,iBAAiB,CAAC;AAC9D,CAAC"}