@producible/cereworker-browser 26.520.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/LICENSE +21 -0
  2. package/dist/backend.d.ts +28 -0
  3. package/dist/backend.d.ts.map +1 -0
  4. package/dist/backend.js +2 -0
  5. package/dist/backend.js.map +1 -0
  6. package/dist/cdp.d.ts +29 -0
  7. package/dist/cdp.d.ts.map +1 -0
  8. package/dist/cdp.js +180 -0
  9. package/dist/cdp.js.map +1 -0
  10. package/dist/extension-backend.d.ts +23 -0
  11. package/dist/extension-backend.d.ts.map +1 -0
  12. package/dist/extension-backend.js +60 -0
  13. package/dist/extension-backend.js.map +1 -0
  14. package/dist/index.d.ts +7 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +6 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/puppeteer.d.ts +31 -0
  19. package/dist/puppeteer.d.ts.map +1 -0
  20. package/dist/puppeteer.js +182 -0
  21. package/dist/puppeteer.js.map +1 -0
  22. package/dist/relay.d.ts +32 -0
  23. package/dist/relay.d.ts.map +1 -0
  24. package/dist/relay.js +171 -0
  25. package/dist/relay.js.map +1 -0
  26. package/dist/relay.test.d.ts +2 -0
  27. package/dist/relay.test.d.ts.map +1 -0
  28. package/dist/relay.test.js +37 -0
  29. package/dist/relay.test.js.map +1 -0
  30. package/dist/tools.d.ts +179 -0
  31. package/dist/tools.d.ts.map +1 -0
  32. package/dist/tools.js +514 -0
  33. package/dist/tools.js.map +1 -0
  34. package/dist/tools.test.d.ts +2 -0
  35. package/dist/tools.test.d.ts.map +1 -0
  36. package/dist/tools.test.js +92 -0
  37. package/dist/tools.test.js.map +1 -0
  38. package/extension/background.js +444 -0
  39. package/extension/icons/icon128.png +0 -0
  40. package/extension/icons/icon16.png +0 -0
  41. package/extension/icons/icon32.png +0 -0
  42. package/extension/icons/icon48.png +0 -0
  43. package/extension/manifest.json +38 -0
  44. package/extension/options.html +34 -0
  45. package/extension/options.js +53 -0
  46. package/package.json +36 -0
package/dist/tools.js ADDED
@@ -0,0 +1,514 @@
1
+ import { z } from 'zod';
2
+ function wrap(fn, build) {
3
+ return async (args, context) => {
4
+ try {
5
+ const output = await fn(args, context);
6
+ return build(args, output, browserOutputLooksLikeError(output));
7
+ }
8
+ catch (err) {
9
+ if (err instanceof Error && err.name === 'AbortError') {
10
+ throw err;
11
+ }
12
+ const output = err instanceof Error ? err.message : String(err);
13
+ return build(args, output, true);
14
+ }
15
+ };
16
+ }
17
+ function createBrowserToolResult(output, options) {
18
+ return {
19
+ output,
20
+ isError: options.isError ?? false,
21
+ ...(options.details ? { details: options.details } : {}),
22
+ metadata: {
23
+ resume: options.resume,
24
+ },
25
+ };
26
+ }
27
+ function browserOutputLooksLikeError(output) {
28
+ const trimmed = output.trim();
29
+ return [
30
+ /^Error:/i,
31
+ /^Element not found:/i,
32
+ /^No clickable element found/i,
33
+ /^Invalid tab id:/i,
34
+ /^Timeout waiting for:/i,
35
+ /^Cannot close the last tab\./i,
36
+ /^Chrome extension not connected/i,
37
+ /^Extension not connected/i,
38
+ /^Command .* timed out/i,
39
+ /^Directory not found:/i,
40
+ ].some((pattern) => pattern.test(trimmed));
41
+ }
42
+ function truncate(text, maxChars) {
43
+ const normalized = text.replace(/\r\n/g, '\n').trim();
44
+ if (normalized.length <= maxChars)
45
+ return normalized;
46
+ return `${normalized.slice(0, Math.max(0, maxChars - 1)).trimEnd()}…`;
47
+ }
48
+ function compactWhitespace(text) {
49
+ return truncate(text, 220).replace(/\s+/g, ' ').trim();
50
+ }
51
+ function summarizeReadText(text) {
52
+ const normalized = text.replace(/\r\n/g, '\n').trim();
53
+ if (!normalized)
54
+ return 'Read page text (empty page text).';
55
+ const excerpt = truncate(normalized.replace(/\s+/g, ' '), 180);
56
+ return `Read page text: ${excerpt}`;
57
+ }
58
+ function summarizeTypedText(text) {
59
+ const preview = truncate(text.replace(/\s+/g, ' '), 120);
60
+ return preview ? `Typed text "${preview}"` : 'Typed text.';
61
+ }
62
+ function summarizeStructuredValue(value) {
63
+ if (Array.isArray(value)) {
64
+ return `array(${value.length}): ${truncate(JSON.stringify(value), 180)}`;
65
+ }
66
+ if (value && typeof value === 'object') {
67
+ return `object: ${truncate(JSON.stringify(value), 180)}`;
68
+ }
69
+ return truncate(String(value), 180);
70
+ }
71
+ function tryParseJson(output) {
72
+ const trimmed = output.trim();
73
+ if (!trimmed)
74
+ return null;
75
+ if (!(trimmed.startsWith('{') ||
76
+ trimmed.startsWith('[') ||
77
+ trimmed === 'null' ||
78
+ trimmed === 'true' ||
79
+ trimmed === 'false' ||
80
+ /^-?\d/.test(trimmed))) {
81
+ return null;
82
+ }
83
+ try {
84
+ return JSON.parse(trimmed);
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ }
90
+ function inferOpaqueEvalSummary(output) {
91
+ if (output.includes('[object Object]')) {
92
+ return 'Evaluated browser code -> opaque object result.';
93
+ }
94
+ return `Evaluated browser code -> ${compactWhitespace(output)}`;
95
+ }
96
+ function formatTabsOutput(tabs) {
97
+ if (tabs.length === 0)
98
+ return 'No tabs open.';
99
+ return tabs
100
+ .map((tab) => `${tab.active ? '→ ' : ' '}[${tab.id}] ${tab.url}${tab.title ? ` - ${tab.title}` : ''}`)
101
+ .join('\n');
102
+ }
103
+ function summarizeTabs(tabs) {
104
+ if (tabs.length === 0)
105
+ return 'Listed tabs: no tabs open.';
106
+ const active = tabs.find((tab) => tab.active);
107
+ if (active) {
108
+ return `Listed ${tabs.length} tab(s); active tab ${active.id}: ${active.url}`;
109
+ }
110
+ return `Listed ${tabs.length} tab(s).`;
111
+ }
112
+ function parseNavigateOutput(output) {
113
+ const match = output.match(/^Navigated to (.+?) - Title: (.+)$/);
114
+ if (match) {
115
+ return { url: match[1], title: match[2] };
116
+ }
117
+ return {};
118
+ }
119
+ function parseSwitchTabOutput(output) {
120
+ const match = output.match(/^Switched to tab ([^:]+): (.+)$/);
121
+ if (match) {
122
+ return { tabId: match[1], url: match[2] };
123
+ }
124
+ return {};
125
+ }
126
+ function parseNewTabOutput(output) {
127
+ const direct = output.match(/^Opened new tab: (.+)$/);
128
+ if (direct)
129
+ return { url: direct[1] };
130
+ const counted = output.match(/^Opened new tab \(\d+ total\)(?:: (.+))?$/);
131
+ if (counted)
132
+ return { url: counted[1] };
133
+ return {};
134
+ }
135
+ function parseCloseTabOutput(output) {
136
+ const match = output.match(/^Closed current tab\. Now on: (.+)$/);
137
+ if (match)
138
+ return { url: match[1] };
139
+ return {};
140
+ }
141
+ export function createBrowserTools(backend) {
142
+ return {
143
+ browserNavigate: {
144
+ description: 'Navigate the browser to a URL. Prefer httpFetch for API calls.',
145
+ parameters: z.object({
146
+ url: z.string().describe('The URL to navigate to'),
147
+ }),
148
+ execute: wrap((args, context) => backend.navigate(args.url, { abortSignal: context?.abortSignal }), (args, output, isError) => {
149
+ const parsed = parseNavigateOutput(output);
150
+ return createBrowserToolResult(output, {
151
+ isError,
152
+ resume: {
153
+ action: 'navigate',
154
+ summary: compactWhitespace(output),
155
+ url: parsed.url ?? args.url,
156
+ stateChanging: true,
157
+ stateDelta: {
158
+ currentUrl: parsed.url ?? args.url,
159
+ },
160
+ },
161
+ details: {
162
+ requestedUrl: args.url,
163
+ actualUrl: parsed.url ?? args.url,
164
+ title: parsed.title,
165
+ },
166
+ });
167
+ }),
168
+ },
169
+ browserGetText: {
170
+ description: 'Get the visible text content of the current page',
171
+ parameters: z.object({}),
172
+ execute: wrap(async (_args, context) => backend.getPageText({ abortSignal: context?.abortSignal }), (_args, output, isError) => createBrowserToolResult(output, {
173
+ isError,
174
+ resume: {
175
+ action: 'read_page_text',
176
+ summary: summarizeReadText(output),
177
+ stateChanging: false,
178
+ },
179
+ details: {
180
+ textLength: output.length,
181
+ excerpt: truncate(output, 500),
182
+ },
183
+ })),
184
+ },
185
+ browserScreenshot: {
186
+ description: 'Take a screenshot of the current page',
187
+ parameters: z.object({
188
+ path: z.string().optional().describe('File path to save screenshot'),
189
+ }),
190
+ execute: wrap(async (args, context) => backend.screenshot(args.path, { abortSignal: context?.abortSignal }), (args, output, isError) => createBrowserToolResult(output, {
191
+ isError,
192
+ resume: {
193
+ action: 'screenshot',
194
+ summary: compactWhitespace(output),
195
+ stateChanging: false,
196
+ },
197
+ details: {
198
+ requestedPath: args.path,
199
+ },
200
+ })),
201
+ },
202
+ browserClick: {
203
+ description: 'Click an element on the page by CSS selector. Uses full mouse event sequence for React/SPA compatibility.',
204
+ parameters: z.object({
205
+ selector: z.string().describe('CSS selector of the element to click'),
206
+ }),
207
+ execute: wrap(async (args, context) => backend.click(args.selector, { abortSignal: context?.abortSignal }), (args, output, isError) => createBrowserToolResult(output, {
208
+ isError,
209
+ resume: {
210
+ action: 'click',
211
+ summary: isError
212
+ ? `Failed to click selector ${args.selector}: ${compactWhitespace(output)}`
213
+ : `Clicked selector ${args.selector}: ${compactWhitespace(output)}`,
214
+ targetSelector: args.selector,
215
+ stateChanging: !isError,
216
+ stateDelta: !isError
217
+ ? {
218
+ targetSelector: args.selector,
219
+ }
220
+ : undefined,
221
+ },
222
+ details: {
223
+ selector: args.selector,
224
+ },
225
+ })),
226
+ },
227
+ browserClickByText: {
228
+ description: 'Click a button or link by its visible text. More reliable than CSS selectors for dynamic SPAs like X/Twitter. Optionally filter by ARIA role.',
229
+ parameters: z.object({
230
+ text: z
231
+ .string()
232
+ .describe('Exact visible text of the element to click (e.g. "Next", "Post", "Log in")'),
233
+ role: z.string().optional().describe('Optional ARIA role filter (e.g. "button")'),
234
+ }),
235
+ execute: wrap(async (args, context) => backend.clickByText(args.text, args.role, { abortSignal: context?.abortSignal }), (args, output, isError) => createBrowserToolResult(output, {
236
+ isError,
237
+ resume: {
238
+ action: 'click_text',
239
+ summary: isError
240
+ ? `Failed to click text "${args.text}"${args.role ? ` (${args.role})` : ''}: ${compactWhitespace(output)}`
241
+ : `Clicked text "${args.text}"${args.role ? ` (${args.role})` : ''}: ${compactWhitespace(output)}`,
242
+ targetText: args.text,
243
+ stateChanging: !isError,
244
+ stateDelta: !isError
245
+ ? {
246
+ targetText: args.text,
247
+ targetRole: args.role,
248
+ }
249
+ : undefined,
250
+ },
251
+ details: {
252
+ text: args.text,
253
+ role: args.role,
254
+ },
255
+ })),
256
+ },
257
+ browserType: {
258
+ description: 'Type text into an input element on the page',
259
+ parameters: z.object({
260
+ selector: z.string().describe('CSS selector of the input element'),
261
+ text: z.string().describe('Text to type'),
262
+ }),
263
+ execute: wrap(async (args, context) => backend.type(args.selector, args.text, { abortSignal: context?.abortSignal }), (args, output, isError) => createBrowserToolResult(output, {
264
+ isError,
265
+ resume: {
266
+ action: 'type',
267
+ summary: isError
268
+ ? `Failed to type into ${args.selector}: ${compactWhitespace(output)}`
269
+ : `${summarizeTypedText(args.text)} into ${args.selector}.`,
270
+ targetSelector: args.selector,
271
+ stateChanging: !isError,
272
+ stateDelta: !isError
273
+ ? {
274
+ targetSelector: args.selector,
275
+ typedTextPreview: truncate(args.text, 120),
276
+ }
277
+ : undefined,
278
+ },
279
+ details: {
280
+ selector: args.selector,
281
+ typedTextPreview: truncate(args.text, 500),
282
+ },
283
+ })),
284
+ },
285
+ browserEval: {
286
+ description: 'Execute JavaScript code in the browser page context',
287
+ parameters: z.object({
288
+ code: z.string().describe('JavaScript code to evaluate'),
289
+ }),
290
+ execute: wrap(async (args, context) => backend.evaluate(args.code, { abortSignal: context?.abortSignal }), (args, output, isError) => {
291
+ const parsedValue = tryParseJson(output);
292
+ return createBrowserToolResult(output, {
293
+ isError,
294
+ resume: {
295
+ action: 'evaluate',
296
+ summary: parsedValue !== null
297
+ ? `Evaluated browser code -> ${summarizeStructuredValue(parsedValue)}`
298
+ : inferOpaqueEvalSummary(output),
299
+ stateChanging: false,
300
+ stateDelta: parsedValue !== null && typeof parsedValue === 'object'
301
+ ? { parsedValue }
302
+ : undefined,
303
+ },
304
+ details: {
305
+ codePreview: truncate(args.code, 300),
306
+ ...(parsedValue !== null ? { parsedValue } : {}),
307
+ },
308
+ });
309
+ }),
310
+ },
311
+ browserWait: {
312
+ description: 'Wait for a CSS selector to appear on the page',
313
+ parameters: z.object({
314
+ selector: z.string().describe('CSS selector to wait for'),
315
+ timeout: z.number().optional().default(5000).describe('Timeout in milliseconds'),
316
+ }),
317
+ execute: wrap(async (args, context) => backend.waitForSelector(args.selector, args.timeout, {
318
+ abortSignal: context?.abortSignal,
319
+ }), (args, output, isError) => createBrowserToolResult(output, {
320
+ isError,
321
+ resume: {
322
+ action: 'wait_for_selector',
323
+ summary: compactWhitespace(output),
324
+ targetSelector: args.selector,
325
+ stateChanging: false,
326
+ },
327
+ details: {
328
+ selector: args.selector,
329
+ timeoutMs: args.timeout ?? 5000,
330
+ },
331
+ })),
332
+ },
333
+ browserGetUrl: {
334
+ description: 'Get the current URL of the browser page',
335
+ parameters: z.object({}),
336
+ execute: wrap(async (_args, context) => backend.getPageUrl({ abortSignal: context?.abortSignal }), (_args, output, isError) => createBrowserToolResult(output, {
337
+ isError,
338
+ resume: {
339
+ action: 'get_url',
340
+ summary: `Current URL: ${compactWhitespace(output)}`,
341
+ url: output.trim(),
342
+ stateChanging: false,
343
+ stateDelta: {
344
+ currentUrl: output.trim(),
345
+ },
346
+ },
347
+ })),
348
+ },
349
+ browserListTabs: {
350
+ description: 'List all open browser tabs with their URLs',
351
+ parameters: z.object({}),
352
+ execute: async (_args, context) => {
353
+ try {
354
+ const tabs = await backend.listTabs({ abortSignal: context?.abortSignal });
355
+ const active = tabs.find((tab) => tab.active);
356
+ return createBrowserToolResult(formatTabsOutput(tabs), {
357
+ isError: false,
358
+ resume: {
359
+ action: 'list_tabs',
360
+ summary: summarizeTabs(tabs),
361
+ url: active?.url,
362
+ activeTabId: active?.id,
363
+ tabs,
364
+ stateChanging: false,
365
+ stateDelta: {
366
+ currentUrl: active?.url,
367
+ activeTabId: active?.id,
368
+ tabs,
369
+ },
370
+ },
371
+ details: {
372
+ tabs,
373
+ },
374
+ });
375
+ }
376
+ catch (err) {
377
+ if (err instanceof Error && err.name === 'AbortError') {
378
+ throw err;
379
+ }
380
+ const output = err instanceof Error ? err.message : String(err);
381
+ return createBrowserToolResult(output, {
382
+ isError: true,
383
+ resume: {
384
+ action: 'list_tabs',
385
+ summary: compactWhitespace(output),
386
+ stateChanging: false,
387
+ },
388
+ });
389
+ }
390
+ },
391
+ },
392
+ browserSwitchTab: {
393
+ description: 'Switch to a different browser tab by its ID',
394
+ parameters: z.object({
395
+ tabId: z.string().describe('Tab ID from browserListTabs'),
396
+ }),
397
+ execute: wrap(async (args, context) => backend.switchTab(args.tabId, { abortSignal: context?.abortSignal }), (args, output, isError) => {
398
+ const parsed = parseSwitchTabOutput(output);
399
+ return createBrowserToolResult(output, {
400
+ isError,
401
+ resume: {
402
+ action: 'switch_tab',
403
+ summary: compactWhitespace(output),
404
+ url: parsed.url,
405
+ tabId: parsed.tabId ?? args.tabId,
406
+ activeTabId: parsed.tabId ?? args.tabId,
407
+ stateChanging: !isError,
408
+ stateDelta: !isError
409
+ ? {
410
+ currentUrl: parsed.url,
411
+ activeTabId: parsed.tabId ?? args.tabId,
412
+ }
413
+ : undefined,
414
+ },
415
+ details: {
416
+ requestedTabId: args.tabId,
417
+ },
418
+ });
419
+ }),
420
+ },
421
+ browserNewTab: {
422
+ description: 'Open a new browser tab, optionally navigating to a URL',
423
+ parameters: z.object({
424
+ url: z.string().optional().describe('URL to navigate to in the new tab'),
425
+ }),
426
+ execute: wrap(async (args, context) => backend.newTab(args.url, { abortSignal: context?.abortSignal }), (args, output, isError) => {
427
+ const parsed = parseNewTabOutput(output);
428
+ return createBrowserToolResult(output, {
429
+ isError,
430
+ resume: {
431
+ action: 'new_tab',
432
+ summary: compactWhitespace(output),
433
+ url: parsed.url ?? args.url,
434
+ stateChanging: !isError,
435
+ stateDelta: !isError
436
+ ? {
437
+ currentUrl: parsed.url ?? args.url,
438
+ }
439
+ : undefined,
440
+ },
441
+ details: {
442
+ requestedUrl: args.url,
443
+ actualUrl: parsed.url ?? args.url,
444
+ },
445
+ });
446
+ }),
447
+ },
448
+ browserCloseTab: {
449
+ description: 'Close a browser tab by ID, or close the current tab',
450
+ parameters: z.object({
451
+ tabId: z.string().optional().describe('Tab ID to close (current tab if omitted)'),
452
+ }),
453
+ execute: wrap(async (args, context) => backend.closeTab(args.tabId, { abortSignal: context?.abortSignal }), (args, output, isError) => {
454
+ const parsed = parseCloseTabOutput(output);
455
+ return createBrowserToolResult(output, {
456
+ isError,
457
+ resume: {
458
+ action: 'close_tab',
459
+ summary: compactWhitespace(output),
460
+ url: parsed.url,
461
+ tabId: args.tabId,
462
+ stateChanging: !isError,
463
+ stateDelta: !isError
464
+ ? {
465
+ currentUrl: parsed.url,
466
+ }
467
+ : undefined,
468
+ },
469
+ details: {
470
+ requestedTabId: args.tabId,
471
+ },
472
+ });
473
+ }),
474
+ },
475
+ browserConnect: {
476
+ description: 'Connect to the browser backend. In extension mode, waits for the Chrome extension.',
477
+ parameters: z.object({}),
478
+ execute: wrap(async (_args, context) => backend.connect({ abortSignal: context?.abortSignal }), (_args, output, isError) => createBrowserToolResult(output, {
479
+ isError,
480
+ resume: {
481
+ action: 'connect_browser',
482
+ summary: compactWhitespace(output),
483
+ stateChanging: !isError,
484
+ stateDelta: !isError
485
+ ? {
486
+ connected: true,
487
+ }
488
+ : undefined,
489
+ },
490
+ })),
491
+ },
492
+ browserDisconnect: {
493
+ description: 'Disconnect from the browser without closing it',
494
+ parameters: z.object({}),
495
+ execute: wrap(async () => {
496
+ await backend.disconnect();
497
+ return 'Disconnected from browser';
498
+ }, (_args, output, isError) => createBrowserToolResult(output, {
499
+ isError,
500
+ resume: {
501
+ action: 'disconnect_browser',
502
+ summary: compactWhitespace(output),
503
+ stateChanging: !isError,
504
+ stateDelta: !isError
505
+ ? {
506
+ connected: false,
507
+ }
508
+ : undefined,
509
+ },
510
+ })),
511
+ },
512
+ };
513
+ }
514
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../src/tools.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,92 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { createBrowserTools } from './tools.js';
3
+ function createBackend(overrides = {}) {
4
+ return {
5
+ navigate: vi.fn(async (url) => `Navigated to ${url} - Title: Example`),
6
+ getPageText: vi.fn(async () => 'visible text'),
7
+ screenshot: vi.fn(async (path) => `Screenshot saved to ${path ?? '/tmp/test.png'}`),
8
+ click: vi.fn(async (selector) => `Clicked: ${selector}`),
9
+ clickByText: vi.fn(async (text) => `Clicked element with text: "${text}"`),
10
+ type: vi.fn(async (selector) => `Typed into: ${selector}`),
11
+ evaluate: vi.fn(async () => '{"items":[{"text":"alpha"},{"text":"beta"}]}'),
12
+ waitForSelector: vi.fn(async (selector) => `Found: ${selector}`),
13
+ getPageUrl: vi.fn(async () => 'https://x.com/home'),
14
+ listTabs: vi.fn(async () => []),
15
+ switchTab: vi.fn(async (tabId) => `Switched to tab ${tabId}: https://x.com/home`),
16
+ newTab: vi.fn(async (url) => `Opened new tab: ${url ?? 'about:blank'}`),
17
+ closeTab: vi.fn(async () => 'Closed current tab. Now on: https://x.com/home'),
18
+ connect: vi.fn(async () => 'Connected to Chrome via extension'),
19
+ disconnect: vi.fn(async () => undefined),
20
+ isConnected: vi.fn(() => true),
21
+ ...overrides,
22
+ };
23
+ }
24
+ describe('createBrowserTools', () => {
25
+ it('adds structured tab details and resume metadata for browserListTabs', async () => {
26
+ const tabs = [
27
+ { id: '11', title: 'Home / X', url: 'https://x.com/home', active: true },
28
+ { id: '12', title: 'Profile / X', url: 'https://x.com/CereWorkerX', active: false },
29
+ ];
30
+ const backend = createBackend({
31
+ listTabs: vi.fn(async () => tabs),
32
+ });
33
+ const tools = createBrowserTools(backend);
34
+ const result = await tools.browserListTabs.execute({});
35
+ expect(result.output).toContain('→ [11] https://x.com/home - Home / X');
36
+ expect(result.details).toEqual({ tabs });
37
+ expect(result.metadata?.resume).toMatchObject({
38
+ action: 'list_tabs',
39
+ activeTabId: '11',
40
+ url: 'https://x.com/home',
41
+ stateChanging: false,
42
+ tabs,
43
+ stateDelta: {
44
+ currentUrl: 'https://x.com/home',
45
+ activeTabId: '11',
46
+ tabs,
47
+ },
48
+ });
49
+ });
50
+ it('parses JSON browserEval output into structured details', async () => {
51
+ const backend = createBackend({
52
+ evaluate: vi.fn(async () => '[{"i":0,"text":"hello"},{"i":1,"text":"world"}]'),
53
+ });
54
+ const tools = createBrowserTools(backend);
55
+ const result = await tools.browserEval.execute({ code: 'return window.__items' });
56
+ const resume = result.metadata?.resume;
57
+ expect(result.isError).toBe(false);
58
+ expect(result.details).toMatchObject({
59
+ parsedValue: [
60
+ { i: 0, text: 'hello' },
61
+ { i: 1, text: 'world' },
62
+ ],
63
+ });
64
+ expect(resume).toMatchObject({
65
+ action: 'evaluate',
66
+ stateChanging: false,
67
+ stateDelta: {
68
+ parsedValue: [
69
+ { i: 0, text: 'hello' },
70
+ { i: 1, text: 'world' },
71
+ ],
72
+ },
73
+ });
74
+ expect(String(resume?.summary)).toContain('array(2)');
75
+ });
76
+ it('marks click-by-text misses as errors while preserving retry metadata', async () => {
77
+ const backend = createBackend({
78
+ clickByText: vi.fn(async () => 'No clickable element found with text: "Like"'),
79
+ });
80
+ const tools = createBrowserTools(backend);
81
+ const result = await tools.browserClickByText.execute({ text: 'Like' });
82
+ const resume = result.metadata?.resume;
83
+ expect(result.isError).toBe(true);
84
+ expect(resume).toMatchObject({
85
+ action: 'click_text',
86
+ targetText: 'Like',
87
+ stateChanging: false,
88
+ });
89
+ expect(String(resume?.summary)).toContain('Failed to click text "Like"');
90
+ });
91
+ });
92
+ //# sourceMappingURL=tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../src/tools.test.ts"],"names":[],"mappings":"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"}