@cereworker/browser 26.330.1 → 26.330.2

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/tools.d.ts CHANGED
@@ -1,5 +1,9 @@
1
+ import type { ToolExecutionValue } from '@cereworker/core';
1
2
  import { z } from 'zod';
2
3
  import type { BrowserBackend } from './backend.js';
4
+ type ToolContext = {
5
+ abortSignal?: AbortSignal;
6
+ };
3
7
  export declare function createBrowserTools(backend: BrowserBackend): {
4
8
  browserNavigate: {
5
9
  description: string;
@@ -12,16 +16,12 @@ export declare function createBrowserTools(backend: BrowserBackend): {
12
16
  }>;
13
17
  execute: (args: {
14
18
  url: string;
15
- }, context?: {
16
- abortSignal?: AbortSignal;
17
- }) => Promise<string>;
19
+ }, context?: ToolContext) => Promise<ToolExecutionValue>;
18
20
  };
19
21
  browserGetText: {
20
22
  description: string;
21
23
  parameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
22
- execute: (args: Record<string, never>, context?: {
23
- abortSignal?: AbortSignal;
24
- }) => Promise<string>;
24
+ execute: (args: Record<string, never>, context?: ToolContext) => Promise<ToolExecutionValue>;
25
25
  };
26
26
  browserScreenshot: {
27
27
  description: string;
@@ -34,9 +34,7 @@ export declare function createBrowserTools(backend: BrowserBackend): {
34
34
  }>;
35
35
  execute: (args: {
36
36
  path?: string;
37
- }, context?: {
38
- abortSignal?: AbortSignal;
39
- }) => Promise<string>;
37
+ }, context?: ToolContext) => Promise<ToolExecutionValue>;
40
38
  };
41
39
  browserClick: {
42
40
  description: string;
@@ -49,9 +47,7 @@ export declare function createBrowserTools(backend: BrowserBackend): {
49
47
  }>;
50
48
  execute: (args: {
51
49
  selector: string;
52
- }, context?: {
53
- abortSignal?: AbortSignal;
54
- }) => Promise<string>;
50
+ }, context?: ToolContext) => Promise<ToolExecutionValue>;
55
51
  };
56
52
  browserClickByText: {
57
53
  description: string;
@@ -68,9 +64,7 @@ export declare function createBrowserTools(backend: BrowserBackend): {
68
64
  execute: (args: {
69
65
  text: string;
70
66
  role?: string;
71
- }, context?: {
72
- abortSignal?: AbortSignal;
73
- }) => Promise<string>;
67
+ }, context?: ToolContext) => Promise<ToolExecutionValue>;
74
68
  };
75
69
  browserType: {
76
70
  description: string;
@@ -78,18 +72,16 @@ export declare function createBrowserTools(backend: BrowserBackend): {
78
72
  selector: z.ZodString;
79
73
  text: z.ZodString;
80
74
  }, "strip", z.ZodTypeAny, {
81
- text: string;
82
75
  selector: string;
83
- }, {
84
76
  text: string;
77
+ }, {
85
78
  selector: string;
79
+ text: string;
86
80
  }>;
87
81
  execute: (args: {
88
82
  selector: string;
89
83
  text: string;
90
- }, context?: {
91
- abortSignal?: AbortSignal;
92
- }) => Promise<string>;
84
+ }, context?: ToolContext) => Promise<ToolExecutionValue>;
93
85
  };
94
86
  browserEval: {
95
87
  description: string;
@@ -102,9 +94,7 @@ export declare function createBrowserTools(backend: BrowserBackend): {
102
94
  }>;
103
95
  execute: (args: {
104
96
  code: string;
105
- }, context?: {
106
- abortSignal?: AbortSignal;
107
- }) => Promise<string>;
97
+ }, context?: ToolContext) => Promise<ToolExecutionValue>;
108
98
  };
109
99
  browserWait: {
110
100
  description: string;
@@ -112,8 +102,8 @@ export declare function createBrowserTools(backend: BrowserBackend): {
112
102
  selector: z.ZodString;
113
103
  timeout: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
114
104
  }, "strip", z.ZodTypeAny, {
115
- timeout: number;
116
105
  selector: string;
106
+ timeout: number;
117
107
  }, {
118
108
  selector: string;
119
109
  timeout?: number | undefined;
@@ -121,23 +111,17 @@ export declare function createBrowserTools(backend: BrowserBackend): {
121
111
  execute: (args: {
122
112
  selector: string;
123
113
  timeout?: number;
124
- }, context?: {
125
- abortSignal?: AbortSignal;
126
- }) => Promise<string>;
114
+ }, context?: ToolContext) => Promise<ToolExecutionValue>;
127
115
  };
128
116
  browserGetUrl: {
129
117
  description: string;
130
118
  parameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
131
- execute: (args: Record<string, never>, context?: {
132
- abortSignal?: AbortSignal;
133
- }) => Promise<string>;
119
+ execute: (args: Record<string, never>, context?: ToolContext) => Promise<ToolExecutionValue>;
134
120
  };
135
121
  browserListTabs: {
136
122
  description: string;
137
123
  parameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
138
- execute: (args: Record<string, never>, context?: {
139
- abortSignal?: AbortSignal;
140
- }) => Promise<string>;
124
+ execute: (_args: Record<string, never>, context?: ToolContext) => Promise<ToolExecutionValue>;
141
125
  };
142
126
  browserSwitchTab: {
143
127
  description: string;
@@ -150,9 +134,7 @@ export declare function createBrowserTools(backend: BrowserBackend): {
150
134
  }>;
151
135
  execute: (args: {
152
136
  tabId: string;
153
- }, context?: {
154
- abortSignal?: AbortSignal;
155
- }) => Promise<string>;
137
+ }, context?: ToolContext) => Promise<ToolExecutionValue>;
156
138
  };
157
139
  browserNewTab: {
158
140
  description: string;
@@ -165,9 +147,7 @@ export declare function createBrowserTools(backend: BrowserBackend): {
165
147
  }>;
166
148
  execute: (args: {
167
149
  url?: string;
168
- }, context?: {
169
- abortSignal?: AbortSignal;
170
- }) => Promise<string>;
150
+ }, context?: ToolContext) => Promise<ToolExecutionValue>;
171
151
  };
172
152
  browserCloseTab: {
173
153
  description: string;
@@ -180,25 +160,20 @@ export declare function createBrowserTools(backend: BrowserBackend): {
180
160
  }>;
181
161
  execute: (args: {
182
162
  tabId?: string;
183
- }, context?: {
184
- abortSignal?: AbortSignal;
185
- }) => Promise<string>;
163
+ }, context?: ToolContext) => Promise<ToolExecutionValue>;
186
164
  };
187
165
  browserConnect: {
188
166
  description: string;
189
167
  parameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
190
- execute: (args: Record<string, never>, context?: {
191
- abortSignal?: AbortSignal;
192
- }) => Promise<string>;
168
+ execute: (args: Record<string, never>, context?: ToolContext) => Promise<ToolExecutionValue>;
193
169
  };
194
170
  browserDisconnect: {
195
171
  description: string;
196
172
  parameters: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
197
- execute: (args: unknown, context?: {
198
- abortSignal?: AbortSignal;
199
- }) => Promise<string>;
173
+ execute: (args: unknown, context?: ToolContext) => Promise<ToolExecutionValue>;
200
174
  };
201
175
  };
202
176
  export type BrowserTools = ReturnType<typeof createBrowserTools>;
203
177
  export type BrowserToolName = keyof BrowserTools;
178
+ export {};
204
179
  //# sourceMappingURL=tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAiBnD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc;;;;;;;;;;;iBAOxB,MAAM;qBApBjB;YAAE,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC;;;;;yDAAjD;YAAE,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;mBAgC9B,MAAM;qBAhCzB;YAAE,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;sBAuC3B,MAAM;qBAvC5B;YAAE,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;kBA+C/B,MAAM;mBAAS,MAAM;qBA/CvC;YAAE,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;sBAuD3B,MAAM;kBAAQ,MAAM;qBAvD1C;YAAE,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;kBA8D/B,MAAM;qBA9DxB;YAAE,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;sBAsE3B,MAAM;sBAAY,MAAM;qBAtE9C;YAAE,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC;;;;;yDAAjD;YAAE,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC;;;;;yDAAjD;YAAE,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;mBA8F9B,MAAM;qBA9FzB;YAAE,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;kBAqG/B,MAAM;qBArGxB;YAAE,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC;;;;;;;;;;;;oBA4G7B,MAAM;qBA5G1B;YAAE,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC;;;;;yDAAjD;YAAE,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC;;;;;2CAAjD;YAAE,WAAW,CAAC,EAAE,WAAW,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,CAAC;;EA4HvE;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACjE,MAAM,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,cAAc,CAAC;AAE5D,KAAK,WAAW,GAAG;IAAE,WAAW,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC;AAsKjD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc;;;;;;;;;;;iBAQpC,MAAM;qBAvJL,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC;;;;;yDAA3C,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC;;;;;;;;;;;;mBAoMpC,MAAM;qBApMb,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC;;;;;;;;;;;;sBAwNjC,MAAM;qBAxNhB,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC;;;;;;;;;;;;;;;kBAgPrC,MAAM;mBAAS,MAAM;qBAhP3B,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC;;;;;;;;;;;;;;;sBAyQjC,MAAM;kBAAQ,MAAM;qBAzQ9B,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC;;;;;;;;;;;;kBAiSrC,MAAM;qBAjSZ,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC;;;;;;;;;;;;;;;sBA4TjC,MAAM;sBAAY,MAAM;qBA5TlC,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC;;;;;yDAA3C,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC;;;;;yBAgWrC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,WAAW;;;;;;;;;;;;mBAwC3C,MAAM;qBAxYb,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC;;;;;;;;;;;;kBAkarC,MAAM;qBAlaZ,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC;;;;;;;;;;;;oBA2bnC,MAAM;qBA3bd,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC;;;;;yDAA3C,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC;;;;;2CAA3C,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC;;EAgfjE;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACjE,MAAM,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC"}
package/dist/tools.js CHANGED
@@ -1,17 +1,136 @@
1
1
  import { z } from 'zod';
2
- function wrap(fn) {
2
+ function wrap(fn, build) {
3
3
  return async (args, context) => {
4
4
  try {
5
- return await fn(args, context);
5
+ const output = await fn(args, context);
6
+ return build(args, output, browserOutputLooksLikeError(output));
6
7
  }
7
8
  catch (err) {
8
9
  if (err instanceof Error && err.name === 'AbortError') {
9
10
  throw err;
10
11
  }
11
- return err instanceof Error ? err.message : String(err);
12
+ const output = err instanceof Error ? err.message : String(err);
13
+ return build(args, output, true);
12
14
  }
13
15
  };
14
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('{') || trimmed.startsWith('[') || trimmed === 'null' || trimmed === 'true' || trimmed === 'false' || /^-?\d/.test(trimmed))) {
76
+ return null;
77
+ }
78
+ try {
79
+ return JSON.parse(trimmed);
80
+ }
81
+ catch {
82
+ return null;
83
+ }
84
+ }
85
+ function inferOpaqueEvalSummary(output) {
86
+ if (output.includes('[object Object]')) {
87
+ return 'Evaluated browser code -> opaque object result.';
88
+ }
89
+ return `Evaluated browser code -> ${compactWhitespace(output)}`;
90
+ }
91
+ function formatTabsOutput(tabs) {
92
+ if (tabs.length === 0)
93
+ return 'No tabs open.';
94
+ return tabs.map((tab) => `${tab.active ? '→ ' : ' '}[${tab.id}] ${tab.url}${tab.title ? ` - ${tab.title}` : ''}`).join('\n');
95
+ }
96
+ function summarizeTabs(tabs) {
97
+ if (tabs.length === 0)
98
+ return 'Listed tabs: no tabs open.';
99
+ const active = tabs.find((tab) => tab.active);
100
+ if (active) {
101
+ return `Listed ${tabs.length} tab(s); active tab ${active.id}: ${active.url}`;
102
+ }
103
+ return `Listed ${tabs.length} tab(s).`;
104
+ }
105
+ function parseNavigateOutput(output) {
106
+ const match = output.match(/^Navigated to (.+?) - Title: (.+)$/);
107
+ if (match) {
108
+ return { url: match[1], title: match[2] };
109
+ }
110
+ return {};
111
+ }
112
+ function parseSwitchTabOutput(output) {
113
+ const match = output.match(/^Switched to tab ([^:]+): (.+)$/);
114
+ if (match) {
115
+ return { tabId: match[1], url: match[2] };
116
+ }
117
+ return {};
118
+ }
119
+ function parseNewTabOutput(output) {
120
+ const direct = output.match(/^Opened new tab: (.+)$/);
121
+ if (direct)
122
+ return { url: direct[1] };
123
+ const counted = output.match(/^Opened new tab \(\d+ total\)(?:: (.+))?$/);
124
+ if (counted)
125
+ return { url: counted[1] };
126
+ return {};
127
+ }
128
+ function parseCloseTabOutput(output) {
129
+ const match = output.match(/^Closed current tab\. Now on: (.+)$/);
130
+ if (match)
131
+ return { url: match[1] };
132
+ return {};
133
+ }
15
134
  export function createBrowserTools(backend) {
16
135
  return {
17
136
  browserNavigate: {
@@ -19,26 +138,76 @@ export function createBrowserTools(backend) {
19
138
  parameters: z.object({
20
139
  url: z.string().describe('The URL to navigate to'),
21
140
  }),
22
- execute: wrap((args, context) => backend.navigate(args.url, { abortSignal: context?.abortSignal })),
141
+ execute: wrap((args, context) => backend.navigate(args.url, { abortSignal: context?.abortSignal }), (args, output, isError) => {
142
+ const parsed = parseNavigateOutput(output);
143
+ return createBrowserToolResult(output, {
144
+ isError,
145
+ resume: {
146
+ action: 'navigate',
147
+ summary: compactWhitespace(output),
148
+ url: parsed.url ?? args.url,
149
+ stateChanging: true,
150
+ },
151
+ details: {
152
+ requestedUrl: args.url,
153
+ actualUrl: parsed.url ?? args.url,
154
+ title: parsed.title,
155
+ },
156
+ });
157
+ }),
23
158
  },
24
159
  browserGetText: {
25
160
  description: 'Get the visible text content of the current page',
26
161
  parameters: z.object({}),
27
- execute: wrap(async (_args, context) => backend.getPageText({ abortSignal: context?.abortSignal })),
162
+ execute: wrap(async (_args, context) => backend.getPageText({ abortSignal: context?.abortSignal }), (_args, output, isError) => createBrowserToolResult(output, {
163
+ isError,
164
+ resume: {
165
+ action: 'read_page_text',
166
+ summary: summarizeReadText(output),
167
+ stateChanging: false,
168
+ },
169
+ details: {
170
+ textLength: output.length,
171
+ excerpt: truncate(output, 500),
172
+ },
173
+ })),
28
174
  },
29
175
  browserScreenshot: {
30
176
  description: 'Take a screenshot of the current page',
31
177
  parameters: z.object({
32
178
  path: z.string().optional().describe('File path to save screenshot'),
33
179
  }),
34
- execute: wrap(async (args, context) => backend.screenshot(args.path, { abortSignal: context?.abortSignal })),
180
+ execute: wrap(async (args, context) => backend.screenshot(args.path, { abortSignal: context?.abortSignal }), (args, output, isError) => createBrowserToolResult(output, {
181
+ isError,
182
+ resume: {
183
+ action: 'screenshot',
184
+ summary: compactWhitespace(output),
185
+ stateChanging: false,
186
+ },
187
+ details: {
188
+ requestedPath: args.path,
189
+ },
190
+ })),
35
191
  },
36
192
  browserClick: {
37
193
  description: 'Click an element on the page by CSS selector. Uses full mouse event sequence for React/SPA compatibility.',
38
194
  parameters: z.object({
39
195
  selector: z.string().describe('CSS selector of the element to click'),
40
196
  }),
41
- execute: wrap(async (args, context) => backend.click(args.selector, { abortSignal: context?.abortSignal })),
197
+ execute: wrap(async (args, context) => backend.click(args.selector, { abortSignal: context?.abortSignal }), (args, output, isError) => createBrowserToolResult(output, {
198
+ isError,
199
+ resume: {
200
+ action: 'click',
201
+ summary: isError
202
+ ? `Failed to click selector ${args.selector}: ${compactWhitespace(output)}`
203
+ : `Clicked selector ${args.selector}: ${compactWhitespace(output)}`,
204
+ targetSelector: args.selector,
205
+ stateChanging: !isError,
206
+ },
207
+ details: {
208
+ selector: args.selector,
209
+ },
210
+ })),
42
211
  },
43
212
  browserClickByText: {
44
213
  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.',
@@ -46,7 +215,21 @@ export function createBrowserTools(backend) {
46
215
  text: z.string().describe('Exact visible text of the element to click (e.g. "Next", "Post", "Log in")'),
47
216
  role: z.string().optional().describe('Optional ARIA role filter (e.g. "button")'),
48
217
  }),
49
- execute: wrap(async (args, context) => backend.clickByText(args.text, args.role, { abortSignal: context?.abortSignal })),
218
+ execute: wrap(async (args, context) => backend.clickByText(args.text, args.role, { abortSignal: context?.abortSignal }), (args, output, isError) => createBrowserToolResult(output, {
219
+ isError,
220
+ resume: {
221
+ action: 'click_text',
222
+ summary: isError
223
+ ? `Failed to click text "${args.text}"${args.role ? ` (${args.role})` : ''}: ${compactWhitespace(output)}`
224
+ : `Clicked text "${args.text}"${args.role ? ` (${args.role})` : ''}: ${compactWhitespace(output)}`,
225
+ targetText: args.text,
226
+ stateChanging: !isError,
227
+ },
228
+ details: {
229
+ text: args.text,
230
+ role: args.role,
231
+ },
232
+ })),
50
233
  },
51
234
  browserType: {
52
235
  description: 'Type text into an input element on the page',
@@ -54,14 +237,44 @@ export function createBrowserTools(backend) {
54
237
  selector: z.string().describe('CSS selector of the input element'),
55
238
  text: z.string().describe('Text to type'),
56
239
  }),
57
- execute: wrap(async (args, context) => backend.type(args.selector, args.text, { abortSignal: context?.abortSignal })),
240
+ execute: wrap(async (args, context) => backend.type(args.selector, args.text, { abortSignal: context?.abortSignal }), (args, output, isError) => createBrowserToolResult(output, {
241
+ isError,
242
+ resume: {
243
+ action: 'type',
244
+ summary: isError
245
+ ? `Failed to type into ${args.selector}: ${compactWhitespace(output)}`
246
+ : `${summarizeTypedText(args.text)} into ${args.selector}.`,
247
+ targetSelector: args.selector,
248
+ stateChanging: !isError,
249
+ },
250
+ details: {
251
+ selector: args.selector,
252
+ typedTextPreview: truncate(args.text, 500),
253
+ },
254
+ })),
58
255
  },
59
256
  browserEval: {
60
257
  description: 'Execute JavaScript code in the browser page context',
61
258
  parameters: z.object({
62
259
  code: z.string().describe('JavaScript code to evaluate'),
63
260
  }),
64
- execute: wrap(async (args, context) => backend.evaluate(args.code, { abortSignal: context?.abortSignal })),
261
+ execute: wrap(async (args, context) => backend.evaluate(args.code, { abortSignal: context?.abortSignal }), (args, output, isError) => {
262
+ const parsedValue = tryParseJson(output);
263
+ return createBrowserToolResult(output, {
264
+ isError,
265
+ resume: {
266
+ action: 'evaluate',
267
+ summary: parsedValue !== null
268
+ ? `Evaluated browser code -> ${summarizeStructuredValue(parsedValue)}`
269
+ : inferOpaqueEvalSummary(output),
270
+ stateChanging: false,
271
+ },
272
+ details: {
273
+ codePreview: truncate(args.code, 300),
274
+ ...(parsedValue !== null ? { parsedValue } : {}),
275
+ },
276
+ });
277
+ }),
65
278
  },
66
279
  browserWait: {
67
280
  description: 'Wait for a CSS selector to appear on the page',
@@ -69,48 +282,149 @@ export function createBrowserTools(backend) {
69
282
  selector: z.string().describe('CSS selector to wait for'),
70
283
  timeout: z.number().optional().default(5000).describe('Timeout in milliseconds'),
71
284
  }),
72
- execute: wrap(async (args, context) => backend.waitForSelector(args.selector, args.timeout, { abortSignal: context?.abortSignal })),
285
+ execute: wrap(async (args, context) => backend.waitForSelector(args.selector, args.timeout, { abortSignal: context?.abortSignal }), (args, output, isError) => createBrowserToolResult(output, {
286
+ isError,
287
+ resume: {
288
+ action: 'wait_for_selector',
289
+ summary: compactWhitespace(output),
290
+ targetSelector: args.selector,
291
+ stateChanging: false,
292
+ },
293
+ details: {
294
+ selector: args.selector,
295
+ timeoutMs: args.timeout ?? 5000,
296
+ },
297
+ })),
73
298
  },
74
299
  browserGetUrl: {
75
300
  description: 'Get the current URL of the browser page',
76
301
  parameters: z.object({}),
77
- execute: wrap(async (_args, context) => backend.getPageUrl({ abortSignal: context?.abortSignal })),
302
+ execute: wrap(async (_args, context) => backend.getPageUrl({ abortSignal: context?.abortSignal }), (_args, output, isError) => createBrowserToolResult(output, {
303
+ isError,
304
+ resume: {
305
+ action: 'get_url',
306
+ summary: `Current URL: ${compactWhitespace(output)}`,
307
+ url: output.trim(),
308
+ stateChanging: false,
309
+ },
310
+ })),
78
311
  },
79
312
  browserListTabs: {
80
313
  description: 'List all open browser tabs with their URLs',
81
314
  parameters: z.object({}),
82
- execute: wrap(async (_args, context) => {
83
- const tabs = await backend.listTabs({ abortSignal: context?.abortSignal });
84
- if (tabs.length === 0)
85
- return 'No tabs open.';
86
- return tabs.map((t) => `${t.active ? '→ ' : ' '}[${t.id}] ${t.url}${t.title ? ` - ${t.title}` : ''}`).join('\n');
87
- }),
315
+ execute: async (_args, context) => {
316
+ try {
317
+ const tabs = await backend.listTabs({ abortSignal: context?.abortSignal });
318
+ const active = tabs.find((tab) => tab.active);
319
+ return createBrowserToolResult(formatTabsOutput(tabs), {
320
+ isError: false,
321
+ resume: {
322
+ action: 'list_tabs',
323
+ summary: summarizeTabs(tabs),
324
+ url: active?.url,
325
+ activeTabId: active?.id,
326
+ tabs,
327
+ stateChanging: false,
328
+ },
329
+ details: {
330
+ tabs,
331
+ },
332
+ });
333
+ }
334
+ catch (err) {
335
+ if (err instanceof Error && err.name === 'AbortError') {
336
+ throw err;
337
+ }
338
+ const output = err instanceof Error ? err.message : String(err);
339
+ return createBrowserToolResult(output, {
340
+ isError: true,
341
+ resume: {
342
+ action: 'list_tabs',
343
+ summary: compactWhitespace(output),
344
+ stateChanging: false,
345
+ },
346
+ });
347
+ }
348
+ },
88
349
  },
89
350
  browserSwitchTab: {
90
351
  description: 'Switch to a different browser tab by its ID',
91
352
  parameters: z.object({
92
353
  tabId: z.string().describe('Tab ID from browserListTabs'),
93
354
  }),
94
- execute: wrap(async (args, context) => backend.switchTab(args.tabId, { abortSignal: context?.abortSignal })),
355
+ execute: wrap(async (args, context) => backend.switchTab(args.tabId, { abortSignal: context?.abortSignal }), (args, output, isError) => {
356
+ const parsed = parseSwitchTabOutput(output);
357
+ return createBrowserToolResult(output, {
358
+ isError,
359
+ resume: {
360
+ action: 'switch_tab',
361
+ summary: compactWhitespace(output),
362
+ url: parsed.url,
363
+ tabId: parsed.tabId ?? args.tabId,
364
+ activeTabId: parsed.tabId ?? args.tabId,
365
+ stateChanging: !isError,
366
+ },
367
+ details: {
368
+ requestedTabId: args.tabId,
369
+ },
370
+ });
371
+ }),
95
372
  },
96
373
  browserNewTab: {
97
374
  description: 'Open a new browser tab, optionally navigating to a URL',
98
375
  parameters: z.object({
99
376
  url: z.string().optional().describe('URL to navigate to in the new tab'),
100
377
  }),
101
- execute: wrap(async (args, context) => backend.newTab(args.url, { abortSignal: context?.abortSignal })),
378
+ execute: wrap(async (args, context) => backend.newTab(args.url, { abortSignal: context?.abortSignal }), (args, output, isError) => {
379
+ const parsed = parseNewTabOutput(output);
380
+ return createBrowserToolResult(output, {
381
+ isError,
382
+ resume: {
383
+ action: 'new_tab',
384
+ summary: compactWhitespace(output),
385
+ url: parsed.url ?? args.url,
386
+ stateChanging: !isError,
387
+ },
388
+ details: {
389
+ requestedUrl: args.url,
390
+ actualUrl: parsed.url ?? args.url,
391
+ },
392
+ });
393
+ }),
102
394
  },
103
395
  browserCloseTab: {
104
396
  description: 'Close a browser tab by ID, or close the current tab',
105
397
  parameters: z.object({
106
398
  tabId: z.string().optional().describe('Tab ID to close (current tab if omitted)'),
107
399
  }),
108
- execute: wrap(async (args, context) => backend.closeTab(args.tabId, { abortSignal: context?.abortSignal })),
400
+ execute: wrap(async (args, context) => backend.closeTab(args.tabId, { abortSignal: context?.abortSignal }), (args, output, isError) => {
401
+ const parsed = parseCloseTabOutput(output);
402
+ return createBrowserToolResult(output, {
403
+ isError,
404
+ resume: {
405
+ action: 'close_tab',
406
+ summary: compactWhitespace(output),
407
+ url: parsed.url,
408
+ tabId: args.tabId,
409
+ stateChanging: !isError,
410
+ },
411
+ details: {
412
+ requestedTabId: args.tabId,
413
+ },
414
+ });
415
+ }),
109
416
  },
110
417
  browserConnect: {
111
418
  description: 'Connect to the browser backend. In extension mode, waits for the Chrome extension.',
112
419
  parameters: z.object({}),
113
- execute: wrap(async (_args, context) => backend.connect({ abortSignal: context?.abortSignal })),
420
+ execute: wrap(async (_args, context) => backend.connect({ abortSignal: context?.abortSignal }), (_args, output, isError) => createBrowserToolResult(output, {
421
+ isError,
422
+ resume: {
423
+ action: 'connect_browser',
424
+ summary: compactWhitespace(output),
425
+ stateChanging: !isError,
426
+ },
427
+ })),
114
428
  },
115
429
  browserDisconnect: {
116
430
  description: 'Disconnect from the browser without closing it',
@@ -118,7 +432,14 @@ export function createBrowserTools(backend) {
118
432
  execute: wrap(async () => {
119
433
  await backend.disconnect();
120
434
  return 'Disconnected from browser';
121
- }),
435
+ }, (_args, output, isError) => createBrowserToolResult(output, {
436
+ isError,
437
+ resume: {
438
+ action: 'disconnect_browser',
439
+ summary: compactWhitespace(output),
440
+ stateChanging: !isError,
441
+ },
442
+ })),
122
443
  },
123
444
  };
124
445
  }
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
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,81 @@
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
+ });
44
+ });
45
+ it('parses JSON browserEval output into structured details', async () => {
46
+ const backend = createBackend({
47
+ evaluate: vi.fn(async () => '[{"i":0,"text":"hello"},{"i":1,"text":"world"}]'),
48
+ });
49
+ const tools = createBrowserTools(backend);
50
+ const result = await tools.browserEval.execute({ code: 'return window.__items' });
51
+ const resume = result.metadata?.resume;
52
+ expect(result.isError).toBe(false);
53
+ expect(result.details).toMatchObject({
54
+ parsedValue: [
55
+ { i: 0, text: 'hello' },
56
+ { i: 1, text: 'world' },
57
+ ],
58
+ });
59
+ expect(resume).toMatchObject({
60
+ action: 'evaluate',
61
+ stateChanging: false,
62
+ });
63
+ expect(String(resume?.summary)).toContain('array(2)');
64
+ });
65
+ it('marks click-by-text misses as errors while preserving retry metadata', async () => {
66
+ const backend = createBackend({
67
+ clickByText: vi.fn(async () => 'No clickable element found with text: "Like"'),
68
+ });
69
+ const tools = createBrowserTools(backend);
70
+ const result = await tools.browserClickByText.execute({ text: 'Like' });
71
+ const resume = result.metadata?.resume;
72
+ expect(result.isError).toBe(true);
73
+ expect(resume).toMatchObject({
74
+ action: 'click_text',
75
+ targetText: 'Like',
76
+ stateChanging: false,
77
+ });
78
+ expect(String(resume?.summary)).toContain('Failed to click text "Like"');
79
+ });
80
+ });
81
+ //# 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cereworker/browser",
3
- "version": "26.330.1",
3
+ "version": "26.330.2",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -20,8 +20,8 @@
20
20
  "puppeteer": "^24.0.0",
21
21
  "ws": "^8.18.0",
22
22
  "zod": "^3.24.0",
23
- "@cereworker/core": "26.330.1",
24
- "@cereworker/config": "26.330.1"
23
+ "@cereworker/core": "26.330.2",
24
+ "@cereworker/config": "26.330.2"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/ws": "^8.5.14",