illuma-agents 1.0.18 → 1.0.19

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/cjs/main.cjs CHANGED
@@ -17,6 +17,7 @@ var Calculator = require('./tools/Calculator.cjs');
17
17
  var CodeExecutor = require('./tools/CodeExecutor.cjs');
18
18
  var ProgrammaticToolCalling = require('./tools/ProgrammaticToolCalling.cjs');
19
19
  var ToolSearchRegex = require('./tools/ToolSearchRegex.cjs');
20
+ var BrowserTools = require('./tools/BrowserTools.cjs');
20
21
  var handlers = require('./tools/handlers.cjs');
21
22
  var tool = require('./tools/search/tool.cjs');
22
23
  var _enum = require('./common/enum.cjs');
@@ -95,6 +96,20 @@ exports.escapeRegexSpecialChars = ToolSearchRegex.escapeRegexSpecialChars;
95
96
  exports.hasNestedQuantifiers = ToolSearchRegex.hasNestedQuantifiers;
96
97
  exports.isDangerousPattern = ToolSearchRegex.isDangerousPattern;
97
98
  exports.sanitizeRegex = ToolSearchRegex.sanitizeRegex;
99
+ exports.BROWSER_TOOL_NAMES = BrowserTools.BROWSER_TOOL_NAMES;
100
+ exports.EBrowserTools = BrowserTools.EBrowserTools;
101
+ exports.createBrowserClickTool = BrowserTools.createBrowserClickTool;
102
+ exports.createBrowserExtractTool = BrowserTools.createBrowserExtractTool;
103
+ exports.createBrowserGoBackTool = BrowserTools.createBrowserGoBackTool;
104
+ exports.createBrowserHoverTool = BrowserTools.createBrowserHoverTool;
105
+ exports.createBrowserNavigateTool = BrowserTools.createBrowserNavigateTool;
106
+ exports.createBrowserScreenshotTool = BrowserTools.createBrowserScreenshotTool;
107
+ exports.createBrowserScrollTool = BrowserTools.createBrowserScrollTool;
108
+ exports.createBrowserTools = BrowserTools.createBrowserTools;
109
+ exports.createBrowserTypeTool = BrowserTools.createBrowserTypeTool;
110
+ exports.createBrowserWaitTool = BrowserTools.createBrowserWaitTool;
111
+ exports.hasBrowserCapability = BrowserTools.hasBrowserCapability;
112
+ exports.isBrowserToolCall = BrowserTools.isBrowserToolCall;
98
113
  exports.handleServerToolResult = handlers.handleServerToolResult;
99
114
  exports.handleToolCallChunks = handlers.handleToolCallChunks;
100
115
  exports.handleToolCalls = handlers.handleToolCalls;
@@ -1 +1 @@
1
- {"version":3,"file":"main.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"main.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,473 @@
1
+ 'use strict';
2
+
3
+ var zod = require('zod');
4
+ var tools = require('@langchain/core/tools');
5
+
6
+ /**
7
+ * Browser Automation Tools for Ranger Browser Extension
8
+ *
9
+ * These tools allow the LLM to interact with the browser through the
10
+ * ranger-browser extension. They generate structured actions that are
11
+ * sent to the extension via SSE streaming for execution.
12
+ *
13
+ * The extension handles:
14
+ * - DOM extraction with element indexing
15
+ * - Click, type, hover, scroll actions
16
+ * - Navigation and page context
17
+ * - Visual element highlighting
18
+ */
19
+ // ============================================
20
+ // Tool Schemas
21
+ // ============================================
22
+ /**
23
+ * Enhanced click schema that supports both index-based and coordinate-based clicking
24
+ */
25
+ const BrowserClickSchema = zod.z.object({
26
+ index: zod.z.number().optional().describe('The index of the element to click, as shown in the page context (e.g., [0], [1], [2]). ' +
27
+ 'Use the element index from the interactive elements list provided in the page context. ' +
28
+ 'Either index OR coordinates must be provided.'),
29
+ coordinates: zod.z.object({
30
+ x: zod.z.number().describe('X coordinate in viewport pixels'),
31
+ y: zod.z.number().describe('Y coordinate in viewport pixels'),
32
+ }).optional().describe('Coordinates for clicking elements that lack semantic info (marked with ⚠️). ' +
33
+ 'The coordinates are provided in the element listing as coords:(x,y). ' +
34
+ 'Either index OR coordinates must be provided.'),
35
+ visualDescription: zod.z.string().optional().describe('Description of what the element looks like visually. Used when clicking by appearance ' +
36
+ '(e.g., "blue button in top right corner", "hamburger menu icon")'),
37
+ reason: zod.z.string().optional().describe('Brief explanation of why you are clicking this element (for user transparency)'),
38
+ });
39
+ const BrowserTypeSchema = zod.z.object({
40
+ index: zod.z.number().describe('The index of the input element to type into, as shown in the page context'),
41
+ text: zod.z.string().describe('The text to type into the input field'),
42
+ clear: zod.z.boolean().optional().describe('Whether to clear the existing content before typing (default: false)'),
43
+ pressEnter: zod.z.boolean().optional().describe('Whether to press Enter after typing (useful for search fields, default: false)'),
44
+ });
45
+ const BrowserNavigateSchema = zod.z.object({
46
+ url: zod.z.string().describe('The URL to navigate to. Can be a full URL or a relative path.'),
47
+ reason: zod.z.string().optional().describe('Brief explanation of why you are navigating to this URL'),
48
+ });
49
+ const BrowserScrollSchema = zod.z.object({
50
+ direction: zod.z.enum(['up', 'down', 'left', 'right']).describe('The direction to scroll'),
51
+ amount: zod.z.number().optional().describe('The amount to scroll in pixels (default: 500)'),
52
+ });
53
+ const BrowserExtractSchema = zod.z.object({
54
+ query: zod.z.string().optional().describe('Optional query to filter extracted content. If provided, only content related to the query will be extracted.'),
55
+ selector: zod.z.string().optional().describe('Optional CSS selector to extract content from a specific element'),
56
+ });
57
+ const BrowserHoverSchema = zod.z.object({
58
+ index: zod.z.number().describe('The index of the element to hover over, as shown in the page context'),
59
+ });
60
+ const BrowserWaitSchema = zod.z.object({
61
+ duration: zod.z.number().optional().describe('Duration to wait in milliseconds (default: 1000)'),
62
+ reason: zod.z.string().optional().describe('Why we are waiting (e.g., "for page to load", "for animation to complete")'),
63
+ });
64
+ const BrowserGoBackSchema = zod.z.object({
65
+ reason: zod.z.string().optional().describe('Brief explanation of why you are going back'),
66
+ });
67
+ const BrowserScreenshotSchema = zod.z.object({
68
+ fullPage: zod.z.boolean().optional().describe('Whether to capture the full page or just the viewport (default: viewport only)'),
69
+ reason: zod.z.string().optional().describe('Why you need a screenshot (e.g., "to identify visual elements", "to analyze page layout")'),
70
+ });
71
+ // ============================================
72
+ // Tool Implementations
73
+ // ============================================
74
+ /**
75
+ * Browser click tool - clicks an element by index or coordinates
76
+ * Supports both semantic (index-based) and vision (coordinate-based) clicking
77
+ */
78
+ function createBrowserClickTool() {
79
+ return tools.tool(async ({ index, coordinates, visualDescription, reason }) => {
80
+ // Validate that at least one targeting method is provided
81
+ if (index === undefined && !coordinates) {
82
+ return JSON.stringify({
83
+ type: 'error',
84
+ error: 'Either index or coordinates must be provided to click an element',
85
+ });
86
+ }
87
+ // Return a structured action for the extension to execute
88
+ // The actual execution happens in the browser extension
89
+ return JSON.stringify({
90
+ type: 'browser_action',
91
+ action: {
92
+ type: 'click',
93
+ ...(index !== undefined && { index }),
94
+ ...(coordinates && { coordinates }),
95
+ ...(visualDescription && { visualDescription }),
96
+ reason,
97
+ },
98
+ // Signal that this requires browser execution
99
+ requiresBrowserExecution: true,
100
+ });
101
+ }, {
102
+ name: EBrowserTools.CLICK,
103
+ description: `Click an interactive element on the current page.
104
+
105
+ **Two ways to target elements:**
106
+
107
+ 1. **By index (preferred)**: Use the element's index number from the interactive elements list
108
+ - Format: [index] {semantic role} <tag>text</tag>
109
+ - Example: browser_click({ index: 5 }) to click element [5]
110
+
111
+ 2. **By coordinates (vision fallback)**: For elements marked with ⚠️ that lack semantic info
112
+ - Use the coords:(x,y) shown after the ⚠️ marker
113
+ - Example: browser_click({ coordinates: { x: 150, y: 200 } })
114
+
115
+ **When to use coordinates:**
116
+ - Elements marked with ⚠️ have poor semantic understanding
117
+ - Icon-only buttons without labels
118
+ - Custom canvas/SVG elements
119
+ - When you identify an element visually in a screenshot
120
+
121
+ Example: If element shows \`[12] {button} <div>⚠️ [left side, small, clickable] coords:(45,120)\`
122
+ Use either: browser_click({ index: 12 }) or browser_click({ coordinates: { x: 45, y: 120 } })`,
123
+ schema: BrowserClickSchema,
124
+ });
125
+ }
126
+ /**
127
+ * Browser type tool - types text into an input field
128
+ */
129
+ function createBrowserTypeTool() {
130
+ return tools.tool(async ({ index, text, clear, pressEnter }) => {
131
+ return JSON.stringify({
132
+ type: 'browser_action',
133
+ action: {
134
+ type: 'type',
135
+ index,
136
+ text,
137
+ clear: clear ?? false,
138
+ pressEnter: pressEnter ?? false,
139
+ },
140
+ requiresBrowserExecution: true,
141
+ });
142
+ }, {
143
+ name: EBrowserTools.TYPE,
144
+ description: `Type text into an input field on the current page.
145
+
146
+ Use this tool when you need to:
147
+ - Fill in a text input or textarea
148
+ - Enter a search query
149
+ - Fill out form fields
150
+
151
+ The element index comes from the page context's interactive elements list.
152
+ Set 'clear: true' to clear existing content before typing.
153
+ Set 'pressEnter: true' to submit after typing (useful for search fields).
154
+
155
+ Example: To type "hello world" into a search field shown as "[2]<input>Search...</input>",
156
+ use index: 2, text: "hello world"`,
157
+ schema: BrowserTypeSchema,
158
+ });
159
+ }
160
+ /**
161
+ * Browser navigate tool - navigates to a URL
162
+ */
163
+ function createBrowserNavigateTool() {
164
+ return tools.tool(async ({ url, reason }) => {
165
+ return JSON.stringify({
166
+ type: 'browser_action',
167
+ action: {
168
+ type: 'navigate',
169
+ url,
170
+ reason,
171
+ },
172
+ requiresBrowserExecution: true,
173
+ });
174
+ }, {
175
+ name: EBrowserTools.NAVIGATE,
176
+ description: `Navigate to a specific URL in the browser.
177
+
178
+ Use this tool when you need to:
179
+ - Go to a specific website
180
+ - Navigate to a different page
181
+ - Open a new URL
182
+
183
+ Provide the full URL including the protocol (https://).
184
+
185
+ Example: browser_navigate({ url: "https://www.google.com" })`,
186
+ schema: BrowserNavigateSchema,
187
+ });
188
+ }
189
+ /**
190
+ * Browser scroll tool - scrolls the page
191
+ */
192
+ function createBrowserScrollTool() {
193
+ return tools.tool(async ({ direction, amount }) => {
194
+ return JSON.stringify({
195
+ type: 'browser_action',
196
+ action: {
197
+ type: 'scroll',
198
+ scroll: {
199
+ direction,
200
+ amount: amount ?? 500,
201
+ },
202
+ },
203
+ requiresBrowserExecution: true,
204
+ });
205
+ }, {
206
+ name: EBrowserTools.SCROLL,
207
+ description: `Scroll the current page in a specified direction.
208
+
209
+ Use this tool when you need to:
210
+ - See more content on the page
211
+ - Scroll to find elements not currently visible
212
+ - Navigate long pages
213
+
214
+ Default scroll amount is 500 pixels. Adjust as needed.
215
+
216
+ Example: browser_scroll({ direction: "down", amount: 800 })`,
217
+ schema: BrowserScrollSchema,
218
+ });
219
+ }
220
+ /**
221
+ * Browser extract tool - extracts content from the page
222
+ */
223
+ function createBrowserExtractTool() {
224
+ return tools.tool(async ({ query, selector }) => {
225
+ return JSON.stringify({
226
+ type: 'browser_action',
227
+ action: {
228
+ type: 'extract',
229
+ query,
230
+ selector,
231
+ },
232
+ requiresBrowserExecution: true,
233
+ });
234
+ }, {
235
+ name: EBrowserTools.EXTRACT,
236
+ description: `Extract text content from the current page.
237
+
238
+ Use this tool when you need to:
239
+ - Get specific information from the page
240
+ - Extract text that matches a query
241
+ - Read content from a specific element
242
+
243
+ If no query or selector is provided, extracts the main page content.
244
+ Use a CSS selector to extract from a specific element.
245
+ Use a query to filter for relevant content.
246
+
247
+ Example: browser_extract({ query: "price" }) - extracts content related to pricing`,
248
+ schema: BrowserExtractSchema,
249
+ });
250
+ }
251
+ /**
252
+ * Browser hover tool - hovers over an element
253
+ */
254
+ function createBrowserHoverTool() {
255
+ return tools.tool(async ({ index }) => {
256
+ return JSON.stringify({
257
+ type: 'browser_action',
258
+ action: {
259
+ type: 'hover',
260
+ index,
261
+ },
262
+ requiresBrowserExecution: true,
263
+ });
264
+ }, {
265
+ name: EBrowserTools.HOVER,
266
+ description: `Hover over an element to reveal tooltips or dropdown menus.
267
+
268
+ Use this tool when you need to:
269
+ - Reveal a dropdown menu
270
+ - Show a tooltip
271
+ - Trigger hover effects
272
+
273
+ Example: browser_hover({ index: 3 }) - hovers over element at index 3`,
274
+ schema: BrowserHoverSchema,
275
+ });
276
+ }
277
+ /**
278
+ * Browser wait tool - waits for a specified duration
279
+ */
280
+ function createBrowserWaitTool() {
281
+ return tools.tool(async ({ duration, reason }) => {
282
+ return JSON.stringify({
283
+ type: 'browser_action',
284
+ action: {
285
+ type: 'wait',
286
+ duration: duration ?? 1000,
287
+ reason,
288
+ },
289
+ requiresBrowserExecution: true,
290
+ });
291
+ }, {
292
+ name: EBrowserTools.WAIT,
293
+ description: `Wait for a specified duration before the next action.
294
+
295
+ Use this tool when you need to:
296
+ - Wait for a page to load
297
+ - Wait for an animation to complete
298
+ - Add delay between actions
299
+
300
+ Default wait time is 1000ms (1 second).
301
+
302
+ Example: browser_wait({ duration: 2000, reason: "waiting for page to load" })`,
303
+ schema: BrowserWaitSchema,
304
+ });
305
+ }
306
+ /**
307
+ * Browser go back tool - navigates back in history
308
+ */
309
+ function createBrowserGoBackTool() {
310
+ return tools.tool(async ({ reason }) => {
311
+ return JSON.stringify({
312
+ type: 'browser_action',
313
+ action: {
314
+ type: 'back',
315
+ reason,
316
+ },
317
+ requiresBrowserExecution: true,
318
+ });
319
+ }, {
320
+ name: EBrowserTools.BACK,
321
+ description: `Navigate back to the previous page in browser history.
322
+
323
+ Use this tool when you need to:
324
+ - Return to a previous page
325
+ - Undo a navigation
326
+
327
+ Example: browser_back({ reason: "returning to search results" })`,
328
+ schema: BrowserGoBackSchema,
329
+ });
330
+ }
331
+ /**
332
+ * Browser screenshot tool - captures a screenshot
333
+ */
334
+ function createBrowserScreenshotTool() {
335
+ return tools.tool(async ({ fullPage }) => {
336
+ return JSON.stringify({
337
+ type: 'browser_action',
338
+ action: {
339
+ type: 'screenshot',
340
+ fullPage: fullPage ?? false,
341
+ },
342
+ requiresBrowserExecution: true,
343
+ });
344
+ }, {
345
+ name: EBrowserTools.SCREENSHOT,
346
+ description: `Capture a screenshot of the current page.
347
+
348
+ Use this tool when you need to:
349
+ - Capture the current state of a page
350
+ - Document visual elements
351
+ - Verify page appearance
352
+
353
+ Set fullPage: true to capture the entire page (may be large).
354
+ Default captures only the visible viewport.
355
+
356
+ Example: browser_screenshot({ fullPage: false })`,
357
+ schema: BrowserScreenshotSchema,
358
+ });
359
+ }
360
+ /**
361
+ * Create all browser automation tools
362
+ *
363
+ * IMPORTANT: These tools should ONLY be registered when:
364
+ * 1. The request comes from a browser extension that can execute them
365
+ * 2. The client has indicated browser capability (e.g., via header or parameter)
366
+ *
367
+ * DO NOT register these for normal web UI users - they cannot execute browser actions.
368
+ *
369
+ * Detection in Ranger API:
370
+ * - Check for `X-Ranger-Browser-Extension: true` header
371
+ * - Or check for `browserCapable: true` in request body
372
+ * - Or check user agent for extension identifier
373
+ *
374
+ * @example
375
+ * // In Ranger API endpoint:
376
+ * const hasBrowserExtension = req.headers['x-ranger-browser-extension'] === 'true';
377
+ * const tools = hasBrowserExtension
378
+ * ? [...normalTools, ...createBrowserTools()]
379
+ * : normalTools;
380
+ */
381
+ function createBrowserTools(config = {}) {
382
+ const tools = [];
383
+ // Enable all by default
384
+ const { enableClick = true, enableType = true, enableNavigate = true, enableScroll = true, enableExtract = true, enableHover = true, enableWait = true, enableBack = true, enableScreenshot = true, } = config;
385
+ if (enableClick)
386
+ tools.push(createBrowserClickTool());
387
+ if (enableType)
388
+ tools.push(createBrowserTypeTool());
389
+ if (enableNavigate)
390
+ tools.push(createBrowserNavigateTool());
391
+ if (enableScroll)
392
+ tools.push(createBrowserScrollTool());
393
+ if (enableExtract)
394
+ tools.push(createBrowserExtractTool());
395
+ if (enableHover)
396
+ tools.push(createBrowserHoverTool());
397
+ if (enableWait)
398
+ tools.push(createBrowserWaitTool());
399
+ if (enableBack)
400
+ tools.push(createBrowserGoBackTool());
401
+ if (enableScreenshot)
402
+ tools.push(createBrowserScreenshotTool());
403
+ return tools;
404
+ }
405
+ /**
406
+ * Browser tool name constants
407
+ * Use these instead of magic strings
408
+ */
409
+ const EBrowserTools = {
410
+ CLICK: 'browser_click',
411
+ TYPE: 'browser_type',
412
+ NAVIGATE: 'browser_navigate',
413
+ SCROLL: 'browser_scroll',
414
+ EXTRACT: 'browser_extract',
415
+ HOVER: 'browser_hover',
416
+ WAIT: 'browser_wait',
417
+ BACK: 'browser_back',
418
+ SCREENSHOT: 'browser_screenshot',
419
+ };
420
+ /**
421
+ * Get browser tool names for filtering/identification
422
+ */
423
+ const BROWSER_TOOL_NAMES = [
424
+ EBrowserTools.CLICK,
425
+ EBrowserTools.TYPE,
426
+ EBrowserTools.NAVIGATE,
427
+ EBrowserTools.SCROLL,
428
+ EBrowserTools.EXTRACT,
429
+ EBrowserTools.HOVER,
430
+ EBrowserTools.WAIT,
431
+ EBrowserTools.BACK,
432
+ EBrowserTools.SCREENSHOT,
433
+ ];
434
+ /**
435
+ * Check if a tool call is a browser action
436
+ */
437
+ function isBrowserToolCall(toolName) {
438
+ return BROWSER_TOOL_NAMES.includes(toolName);
439
+ }
440
+ /**
441
+ * Check if request indicates browser extension capability
442
+ * Use this to conditionally register browser tools
443
+ *
444
+ * @example
445
+ * // In Express middleware or endpoint:
446
+ * if (hasBrowserCapability(req.headers)) {
447
+ * tools.push(...createBrowserTools());
448
+ * }
449
+ */
450
+ function hasBrowserCapability(headers) {
451
+ const extensionHeader = headers['x-ranger-browser-extension'];
452
+ const capableHeader = headers['x-ranger-browser-capable'];
453
+ return (extensionHeader === 'true' ||
454
+ capableHeader === 'true' ||
455
+ (Array.isArray(extensionHeader) && extensionHeader.includes('true')) ||
456
+ (Array.isArray(capableHeader) && capableHeader.includes('true')));
457
+ }
458
+
459
+ exports.BROWSER_TOOL_NAMES = BROWSER_TOOL_NAMES;
460
+ exports.EBrowserTools = EBrowserTools;
461
+ exports.createBrowserClickTool = createBrowserClickTool;
462
+ exports.createBrowserExtractTool = createBrowserExtractTool;
463
+ exports.createBrowserGoBackTool = createBrowserGoBackTool;
464
+ exports.createBrowserHoverTool = createBrowserHoverTool;
465
+ exports.createBrowserNavigateTool = createBrowserNavigateTool;
466
+ exports.createBrowserScreenshotTool = createBrowserScreenshotTool;
467
+ exports.createBrowserScrollTool = createBrowserScrollTool;
468
+ exports.createBrowserTools = createBrowserTools;
469
+ exports.createBrowserTypeTool = createBrowserTypeTool;
470
+ exports.createBrowserWaitTool = createBrowserWaitTool;
471
+ exports.hasBrowserCapability = hasBrowserCapability;
472
+ exports.isBrowserToolCall = isBrowserToolCall;
473
+ //# sourceMappingURL=BrowserTools.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserTools.cjs","sources":["../../../src/tools/BrowserTools.ts"],"sourcesContent":["/**\r\n * Browser Automation Tools for Ranger Browser Extension\r\n * \r\n * These tools allow the LLM to interact with the browser through the \r\n * ranger-browser extension. They generate structured actions that are\r\n * sent to the extension via SSE streaming for execution.\r\n * \r\n * The extension handles:\r\n * - DOM extraction with element indexing\r\n * - Click, type, hover, scroll actions\r\n * - Navigation and page context\r\n * - Visual element highlighting\r\n */\r\n\r\nimport { z } from 'zod';\r\nimport { tool, DynamicStructuredTool } from '@langchain/core/tools';\r\n\r\n// ============================================\r\n// Tool Schemas\r\n// ============================================\r\n\r\n/**\r\n * Enhanced click schema that supports both index-based and coordinate-based clicking\r\n */\r\nconst BrowserClickSchema = z.object({\r\n index: z.number().optional().describe(\r\n 'The index of the element to click, as shown in the page context (e.g., [0], [1], [2]). ' +\r\n 'Use the element index from the interactive elements list provided in the page context. ' +\r\n 'Either index OR coordinates must be provided.'\r\n ),\r\n coordinates: z.object({\r\n x: z.number().describe('X coordinate in viewport pixels'),\r\n y: z.number().describe('Y coordinate in viewport pixels'),\r\n }).optional().describe(\r\n 'Coordinates for clicking elements that lack semantic info (marked with ⚠️). ' +\r\n 'The coordinates are provided in the element listing as coords:(x,y). ' +\r\n 'Either index OR coordinates must be provided.'\r\n ),\r\n visualDescription: z.string().optional().describe(\r\n 'Description of what the element looks like visually. Used when clicking by appearance ' +\r\n '(e.g., \"blue button in top right corner\", \"hamburger menu icon\")'\r\n ),\r\n reason: z.string().optional().describe(\r\n 'Brief explanation of why you are clicking this element (for user transparency)'\r\n ),\r\n});\r\n\r\nconst BrowserTypeSchema = z.object({\r\n index: z.number().describe(\r\n 'The index of the input element to type into, as shown in the page context'\r\n ),\r\n text: z.string().describe(\r\n 'The text to type into the input field'\r\n ),\r\n clear: z.boolean().optional().describe(\r\n 'Whether to clear the existing content before typing (default: false)'\r\n ),\r\n pressEnter: z.boolean().optional().describe(\r\n 'Whether to press Enter after typing (useful for search fields, default: false)'\r\n ),\r\n});\r\n\r\nconst BrowserNavigateSchema = z.object({\r\n url: z.string().describe(\r\n 'The URL to navigate to. Can be a full URL or a relative path.'\r\n ),\r\n reason: z.string().optional().describe(\r\n 'Brief explanation of why you are navigating to this URL'\r\n ),\r\n});\r\n\r\nconst BrowserScrollSchema = z.object({\r\n direction: z.enum(['up', 'down', 'left', 'right']).describe(\r\n 'The direction to scroll'\r\n ),\r\n amount: z.number().optional().describe(\r\n 'The amount to scroll in pixels (default: 500)'\r\n ),\r\n});\r\n\r\nconst BrowserExtractSchema = z.object({\r\n query: z.string().optional().describe(\r\n 'Optional query to filter extracted content. If provided, only content related to the query will be extracted.'\r\n ),\r\n selector: z.string().optional().describe(\r\n 'Optional CSS selector to extract content from a specific element'\r\n ),\r\n});\r\n\r\nconst BrowserHoverSchema = z.object({\r\n index: z.number().describe(\r\n 'The index of the element to hover over, as shown in the page context'\r\n ),\r\n});\r\n\r\nconst BrowserWaitSchema = z.object({\r\n duration: z.number().optional().describe(\r\n 'Duration to wait in milliseconds (default: 1000)'\r\n ),\r\n reason: z.string().optional().describe(\r\n 'Why we are waiting (e.g., \"for page to load\", \"for animation to complete\")'\r\n ),\r\n});\r\n\r\nconst BrowserGoBackSchema = z.object({\r\n reason: z.string().optional().describe(\r\n 'Brief explanation of why you are going back'\r\n ),\r\n});\r\n\r\nconst BrowserScreenshotSchema = z.object({\r\n fullPage: z.boolean().optional().describe(\r\n 'Whether to capture the full page or just the viewport (default: viewport only)'\r\n ),\r\n reason: z.string().optional().describe(\r\n 'Why you need a screenshot (e.g., \"to identify visual elements\", \"to analyze page layout\")'\r\n ),\r\n});\r\n\r\n// ============================================\r\n// Tool Implementations\r\n// ============================================\r\n\r\n/**\r\n * Browser click tool - clicks an element by index or coordinates\r\n * Supports both semantic (index-based) and vision (coordinate-based) clicking\r\n */\r\nexport function createBrowserClickTool(): DynamicStructuredTool<typeof BrowserClickSchema> {\r\n return tool<typeof BrowserClickSchema>(\r\n async ({ index, coordinates, visualDescription, reason }) => {\r\n // Validate that at least one targeting method is provided\r\n if (index === undefined && !coordinates) {\r\n return JSON.stringify({\r\n type: 'error',\r\n error: 'Either index or coordinates must be provided to click an element',\r\n });\r\n }\r\n\r\n // Return a structured action for the extension to execute\r\n // The actual execution happens in the browser extension\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'click',\r\n ...(index !== undefined && { index }),\r\n ...(coordinates && { coordinates }),\r\n ...(visualDescription && { visualDescription }),\r\n reason,\r\n },\r\n // Signal that this requires browser execution\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.CLICK,\r\n description: `Click an interactive element on the current page.\r\n\r\n**Two ways to target elements:**\r\n\r\n1. **By index (preferred)**: Use the element's index number from the interactive elements list\r\n - Format: [index] {semantic role} <tag>text</tag>\r\n - Example: browser_click({ index: 5 }) to click element [5]\r\n\r\n2. **By coordinates (vision fallback)**: For elements marked with ⚠️ that lack semantic info\r\n - Use the coords:(x,y) shown after the ⚠️ marker\r\n - Example: browser_click({ coordinates: { x: 150, y: 200 } })\r\n\r\n**When to use coordinates:**\r\n- Elements marked with ⚠️ have poor semantic understanding\r\n- Icon-only buttons without labels\r\n- Custom canvas/SVG elements\r\n- When you identify an element visually in a screenshot\r\n\r\nExample: If element shows \\`[12] {button} <div>⚠️ [left side, small, clickable] coords:(45,120)\\`\r\nUse either: browser_click({ index: 12 }) or browser_click({ coordinates: { x: 45, y: 120 } })`,\r\n schema: BrowserClickSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser type tool - types text into an input field\r\n */\r\nexport function createBrowserTypeTool(): DynamicStructuredTool<typeof BrowserTypeSchema> {\r\n return tool<typeof BrowserTypeSchema>(\r\n async ({ index, text, clear, pressEnter }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'type',\r\n index,\r\n text,\r\n clear: clear ?? false,\r\n pressEnter: pressEnter ?? false,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.TYPE,\r\n description: `Type text into an input field on the current page.\r\n\r\nUse this tool when you need to:\r\n- Fill in a text input or textarea\r\n- Enter a search query\r\n- Fill out form fields\r\n\r\nThe element index comes from the page context's interactive elements list.\r\nSet 'clear: true' to clear existing content before typing.\r\nSet 'pressEnter: true' to submit after typing (useful for search fields).\r\n\r\nExample: To type \"hello world\" into a search field shown as \"[2]<input>Search...</input>\",\r\nuse index: 2, text: \"hello world\"`,\r\n schema: BrowserTypeSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser navigate tool - navigates to a URL\r\n */\r\nexport function createBrowserNavigateTool(): DynamicStructuredTool<typeof BrowserNavigateSchema> {\r\n return tool<typeof BrowserNavigateSchema>(\r\n async ({ url, reason }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'navigate',\r\n url,\r\n reason,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.NAVIGATE,\r\n description: `Navigate to a specific URL in the browser.\r\n\r\nUse this tool when you need to:\r\n- Go to a specific website\r\n- Navigate to a different page\r\n- Open a new URL\r\n\r\nProvide the full URL including the protocol (https://).\r\n\r\nExample: browser_navigate({ url: \"https://www.google.com\" })`,\r\n schema: BrowserNavigateSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser scroll tool - scrolls the page\r\n */\r\nexport function createBrowserScrollTool(): DynamicStructuredTool<typeof BrowserScrollSchema> {\r\n return tool<typeof BrowserScrollSchema>(\r\n async ({ direction, amount }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'scroll',\r\n scroll: {\r\n direction,\r\n amount: amount ?? 500,\r\n },\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.SCROLL,\r\n description: `Scroll the current page in a specified direction.\r\n\r\nUse this tool when you need to:\r\n- See more content on the page\r\n- Scroll to find elements not currently visible\r\n- Navigate long pages\r\n\r\nDefault scroll amount is 500 pixels. Adjust as needed.\r\n\r\nExample: browser_scroll({ direction: \"down\", amount: 800 })`,\r\n schema: BrowserScrollSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser extract tool - extracts content from the page\r\n */\r\nexport function createBrowserExtractTool(): DynamicStructuredTool<typeof BrowserExtractSchema> {\r\n return tool<typeof BrowserExtractSchema>(\r\n async ({ query, selector }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'extract',\r\n query,\r\n selector,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.EXTRACT,\r\n description: `Extract text content from the current page.\r\n\r\nUse this tool when you need to:\r\n- Get specific information from the page\r\n- Extract text that matches a query\r\n- Read content from a specific element\r\n\r\nIf no query or selector is provided, extracts the main page content.\r\nUse a CSS selector to extract from a specific element.\r\nUse a query to filter for relevant content.\r\n\r\nExample: browser_extract({ query: \"price\" }) - extracts content related to pricing`,\r\n schema: BrowserExtractSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser hover tool - hovers over an element\r\n */\r\nexport function createBrowserHoverTool(): DynamicStructuredTool<typeof BrowserHoverSchema> {\r\n return tool<typeof BrowserHoverSchema>(\r\n async ({ index }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'hover',\r\n index,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.HOVER,\r\n description: `Hover over an element to reveal tooltips or dropdown menus.\r\n\r\nUse this tool when you need to:\r\n- Reveal a dropdown menu\r\n- Show a tooltip\r\n- Trigger hover effects\r\n\r\nExample: browser_hover({ index: 3 }) - hovers over element at index 3`,\r\n schema: BrowserHoverSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser wait tool - waits for a specified duration\r\n */\r\nexport function createBrowserWaitTool(): DynamicStructuredTool<typeof BrowserWaitSchema> {\r\n return tool<typeof BrowserWaitSchema>(\r\n async ({ duration, reason }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'wait',\r\n duration: duration ?? 1000,\r\n reason,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.WAIT,\r\n description: `Wait for a specified duration before the next action.\r\n\r\nUse this tool when you need to:\r\n- Wait for a page to load\r\n- Wait for an animation to complete\r\n- Add delay between actions\r\n\r\nDefault wait time is 1000ms (1 second).\r\n\r\nExample: browser_wait({ duration: 2000, reason: \"waiting for page to load\" })`,\r\n schema: BrowserWaitSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser go back tool - navigates back in history\r\n */\r\nexport function createBrowserGoBackTool(): DynamicStructuredTool<typeof BrowserGoBackSchema> {\r\n return tool<typeof BrowserGoBackSchema>(\r\n async ({ reason }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'back',\r\n reason,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.BACK,\r\n description: `Navigate back to the previous page in browser history.\r\n\r\nUse this tool when you need to:\r\n- Return to a previous page\r\n- Undo a navigation\r\n\r\nExample: browser_back({ reason: \"returning to search results\" })`,\r\n schema: BrowserGoBackSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser screenshot tool - captures a screenshot\r\n */\r\nexport function createBrowserScreenshotTool(): DynamicStructuredTool<typeof BrowserScreenshotSchema> {\r\n return tool<typeof BrowserScreenshotSchema>(\r\n async ({ fullPage }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'screenshot',\r\n fullPage: fullPage ?? false,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.SCREENSHOT,\r\n description: `Capture a screenshot of the current page.\r\n\r\nUse this tool when you need to:\r\n- Capture the current state of a page\r\n- Document visual elements\r\n- Verify page appearance\r\n\r\nSet fullPage: true to capture the entire page (may be large).\r\nDefault captures only the visible viewport.\r\n\r\nExample: browser_screenshot({ fullPage: false })`,\r\n schema: BrowserScreenshotSchema,\r\n }\r\n );\r\n}\r\n\r\n// ============================================\r\n// Tool Collection\r\n// ============================================\r\n\r\nexport type BrowserToolsConfig = {\r\n /** Enable click tool */\r\n enableClick?: boolean;\r\n /** Enable type tool */\r\n enableType?: boolean;\r\n /** Enable navigate tool */\r\n enableNavigate?: boolean;\r\n /** Enable scroll tool */\r\n enableScroll?: boolean;\r\n /** Enable extract tool */\r\n enableExtract?: boolean;\r\n /** Enable hover tool */\r\n enableHover?: boolean;\r\n /** Enable wait tool */\r\n enableWait?: boolean;\r\n /** Enable back tool */\r\n enableBack?: boolean;\r\n /** Enable screenshot tool */\r\n enableScreenshot?: boolean;\r\n};\r\n\r\n/**\r\n * Create all browser automation tools\r\n * \r\n * IMPORTANT: These tools should ONLY be registered when:\r\n * 1. The request comes from a browser extension that can execute them\r\n * 2. The client has indicated browser capability (e.g., via header or parameter)\r\n * \r\n * DO NOT register these for normal web UI users - they cannot execute browser actions.\r\n * \r\n * Detection in Ranger API:\r\n * - Check for `X-Ranger-Browser-Extension: true` header\r\n * - Or check for `browserCapable: true` in request body\r\n * - Or check user agent for extension identifier\r\n * \r\n * @example\r\n * // In Ranger API endpoint:\r\n * const hasBrowserExtension = req.headers['x-ranger-browser-extension'] === 'true';\r\n * const tools = hasBrowserExtension \r\n * ? [...normalTools, ...createBrowserTools()]\r\n * : normalTools;\r\n */\r\nexport function createBrowserTools(config: BrowserToolsConfig = {}): DynamicStructuredTool[] {\r\n const tools: DynamicStructuredTool[] = [];\r\n \r\n // Enable all by default\r\n const {\r\n enableClick = true,\r\n enableType = true,\r\n enableNavigate = true,\r\n enableScroll = true,\r\n enableExtract = true,\r\n enableHover = true,\r\n enableWait = true,\r\n enableBack = true,\r\n enableScreenshot = true,\r\n } = config;\r\n \r\n if (enableClick) tools.push(createBrowserClickTool());\r\n if (enableType) tools.push(createBrowserTypeTool());\r\n if (enableNavigate) tools.push(createBrowserNavigateTool());\r\n if (enableScroll) tools.push(createBrowserScrollTool());\r\n if (enableExtract) tools.push(createBrowserExtractTool());\r\n if (enableHover) tools.push(createBrowserHoverTool());\r\n if (enableWait) tools.push(createBrowserWaitTool());\r\n if (enableBack) tools.push(createBrowserGoBackTool());\r\n if (enableScreenshot) tools.push(createBrowserScreenshotTool());\r\n \r\n return tools;\r\n}\r\n\r\n/**\r\n * Browser tool name constants\r\n * Use these instead of magic strings\r\n */\r\nexport const EBrowserTools = {\r\n CLICK: 'browser_click',\r\n TYPE: 'browser_type',\r\n NAVIGATE: 'browser_navigate',\r\n SCROLL: 'browser_scroll',\r\n EXTRACT: 'browser_extract',\r\n HOVER: 'browser_hover',\r\n WAIT: 'browser_wait',\r\n BACK: 'browser_back',\r\n SCREENSHOT: 'browser_screenshot',\r\n} as const;\r\n\r\n/**\r\n * Get browser tool names for filtering/identification\r\n */\r\nexport const BROWSER_TOOL_NAMES = [\r\n EBrowserTools.CLICK,\r\n EBrowserTools.TYPE,\r\n EBrowserTools.NAVIGATE,\r\n EBrowserTools.SCROLL,\r\n EBrowserTools.EXTRACT,\r\n EBrowserTools.HOVER,\r\n EBrowserTools.WAIT,\r\n EBrowserTools.BACK,\r\n EBrowserTools.SCREENSHOT,\r\n] as const;\r\n\r\nexport type BrowserToolName = typeof BROWSER_TOOL_NAMES[number];\r\n\r\n/**\r\n * Check if a tool call is a browser action\r\n */\r\nexport function isBrowserToolCall(toolName: string): toolName is BrowserToolName {\r\n return BROWSER_TOOL_NAMES.includes(toolName as BrowserToolName);\r\n}\r\n\r\n/**\r\n * Check if request indicates browser extension capability\r\n * Use this to conditionally register browser tools\r\n * \r\n * @example\r\n * // In Express middleware or endpoint:\r\n * if (hasBrowserCapability(req.headers)) {\r\n * tools.push(...createBrowserTools());\r\n * }\r\n */\r\nexport function hasBrowserCapability(headers: Record<string, string | string[] | undefined>): boolean {\r\n const extensionHeader = headers['x-ranger-browser-extension'];\r\n const capableHeader = headers['x-ranger-browser-capable'];\r\n \r\n return (\r\n extensionHeader === 'true' || \r\n capableHeader === 'true' ||\r\n (Array.isArray(extensionHeader) && extensionHeader.includes('true')) ||\r\n (Array.isArray(capableHeader) && capableHeader.includes('true'))\r\n );\r\n}\r\n"],"names":["z","tool"],"mappings":";;;;;AAAA;;;;;;;;;;;;AAYG;AAKH;AACA;AACA;AAEA;;AAEG;AACH,MAAM,kBAAkB,GAAGA,KAAC,CAAC,MAAM,CAAC;IAClC,KAAK,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACnC,yFAAyF;QACzF,yFAAyF;AACzF,QAAA,+CAA+C,CAChD;AACD,IAAA,WAAW,EAAEA,KAAC,CAAC,MAAM,CAAC;QACpB,CAAC,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QACzD,CAAC,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;AAC1D,KAAA,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpB,8EAA8E;QAC9E,uEAAuE;AACvE,QAAA,+CAA+C,CAChD;IACD,iBAAiB,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC/C,wFAAwF;AACxF,QAAA,kEAAkE,CACnE;AACD,IAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,gFAAgF,CACjF;AACF,CAAA,CAAC;AAEF,MAAM,iBAAiB,GAAGA,KAAC,CAAC,MAAM,CAAC;IACjC,KAAK,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACxB,2EAA2E,CAC5E;IACD,IAAI,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACvB,uCAAuC,CACxC;AACD,IAAA,KAAK,EAAEA,KAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,sEAAsE,CACvE;AACD,IAAA,UAAU,EAAEA,KAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACzC,gFAAgF,CACjF;AACF,CAAA,CAAC;AAEF,MAAM,qBAAqB,GAAGA,KAAC,CAAC,MAAM,CAAC;IACrC,GAAG,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACtB,+DAA+D,CAChE;AACD,IAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,yDAAyD,CAC1D;AACF,CAAA,CAAC;AAEF,MAAM,mBAAmB,GAAGA,KAAC,CAAC,MAAM,CAAC;AACnC,IAAA,SAAS,EAAEA,KAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CACzD,yBAAyB,CAC1B;AACD,IAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,+CAA+C,CAChD;AACF,CAAA,CAAC;AAEF,MAAM,oBAAoB,GAAGA,KAAC,CAAC,MAAM,CAAC;AACpC,IAAA,KAAK,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACnC,+GAA+G,CAChH;AACD,IAAA,QAAQ,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACtC,kEAAkE,CACnE;AACF,CAAA,CAAC;AAEF,MAAM,kBAAkB,GAAGA,KAAC,CAAC,MAAM,CAAC;IAClC,KAAK,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACxB,sEAAsE,CACvE;AACF,CAAA,CAAC;AAEF,MAAM,iBAAiB,GAAGA,KAAC,CAAC,MAAM,CAAC;AACjC,IAAA,QAAQ,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACtC,kDAAkD,CACnD;AACD,IAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,4EAA4E,CAC7E;AACF,CAAA,CAAC;AAEF,MAAM,mBAAmB,GAAGA,KAAC,CAAC,MAAM,CAAC;AACnC,IAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,6CAA6C,CAC9C;AACF,CAAA,CAAC;AAEF,MAAM,uBAAuB,GAAGA,KAAC,CAAC,MAAM,CAAC;AACvC,IAAA,QAAQ,EAAEA,KAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACvC,gFAAgF,CACjF;AACD,IAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,2FAA2F,CAC5F;AACF,CAAA,CAAC;AAEF;AACA;AACA;AAEA;;;AAGG;SACa,sBAAsB,GAAA;AACpC,IAAA,OAAOC,UAAI,CACT,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,KAAI;;AAE1D,QAAA,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,WAAW,EAAE;YACvC,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,KAAK,EAAE,kEAAkE;AAC1E,aAAA,CAAC;;;;QAKJ,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,OAAO;gBACb,IAAI,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC;AACrC,gBAAA,IAAI,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC;AACnC,gBAAA,IAAI,iBAAiB,IAAI,EAAE,iBAAiB,EAAE,CAAC;gBAC/C,MAAM;AACP,aAAA;;AAED,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,KAAK;AACzB,QAAA,WAAW,EAAE,CAAA;;;;;;;;;;;;;;;;;;;AAmB2E,6FAAA,CAAA;AACxF,QAAA,MAAM,EAAE,kBAAkB;AAC3B,KAAA,CACF;AACH;AAEA;;AAEG;SACa,qBAAqB,GAAA;AACnC,IAAA,OAAOA,UAAI,CACT,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAI;QAC3C,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,MAAM;gBACZ,KAAK;gBACL,IAAI;gBACJ,KAAK,EAAE,KAAK,IAAI,KAAK;gBACrB,UAAU,EAAE,UAAU,IAAI,KAAK;AAChC,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,IAAI;AACxB,QAAA,WAAW,EAAE,CAAA;;;;;;;;;;;;AAYe,iCAAA,CAAA;AAC5B,QAAA,MAAM,EAAE,iBAAiB;AAC1B,KAAA,CACF;AACH;AAEA;;AAEG;SACa,yBAAyB,GAAA;IACvC,OAAOA,UAAI,CACT,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAI;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,UAAU;gBAChB,GAAG;gBACH,MAAM;AACP,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,QAAQ;AAC5B,QAAA,WAAW,EAAE,CAAA;;;;;;;;;AAS0C,4DAAA,CAAA;AACvD,QAAA,MAAM,EAAE,qBAAqB;AAC9B,KAAA,CACF;AACH;AAEA;;AAEG;SACa,uBAAuB,GAAA;IACrC,OAAOA,UAAI,CACT,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAI;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,MAAM,EAAE;oBACN,SAAS;oBACT,MAAM,EAAE,MAAM,IAAI,GAAG;AACtB,iBAAA;AACF,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,MAAM;AAC1B,QAAA,WAAW,EAAE,CAAA;;;;;;;;;AASyC,2DAAA,CAAA;AACtD,QAAA,MAAM,EAAE,mBAAmB;AAC5B,KAAA,CACF;AACH;AAEA;;AAEG;SACa,wBAAwB,GAAA;IACtC,OAAOA,UAAI,CACT,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAI;QAC5B,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,SAAS;gBACf,KAAK;gBACL,QAAQ;AACT,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,OAAO;AAC3B,QAAA,WAAW,EAAE,CAAA;;;;;;;;;;;AAWgE,kFAAA,CAAA;AAC7E,QAAA,MAAM,EAAE,oBAAoB;AAC7B,KAAA,CACF;AACH;AAEA;;AAEG;SACa,sBAAsB,GAAA;IACpC,OAAOA,UAAI,CACT,OAAO,EAAE,KAAK,EAAE,KAAI;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,OAAO;gBACb,KAAK;AACN,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,KAAK;AACzB,QAAA,WAAW,EAAE,CAAA;;;;;;;AAOmD,qEAAA,CAAA;AAChE,QAAA,MAAM,EAAE,kBAAkB;AAC3B,KAAA,CACF;AACH;AAEA;;AAEG;SACa,qBAAqB,GAAA;IACnC,OAAOA,UAAI,CACT,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAI;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,QAAQ,IAAI,IAAI;gBAC1B,MAAM;AACP,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,IAAI;AACxB,QAAA,WAAW,EAAE,CAAA;;;;;;;;;AAS2D,6EAAA,CAAA;AACxE,QAAA,MAAM,EAAE,iBAAiB;AAC1B,KAAA,CACF;AACH;AAEA;;AAEG;SACa,uBAAuB,GAAA;IACrC,OAAOA,UAAI,CACT,OAAO,EAAE,MAAM,EAAE,KAAI;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,MAAM;gBACZ,MAAM;AACP,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,IAAI;AACxB,QAAA,WAAW,EAAE,CAAA;;;;;;AAM8C,gEAAA,CAAA;AAC3D,QAAA,MAAM,EAAE,mBAAmB;AAC5B,KAAA,CACF;AACH;AAEA;;AAEG;SACa,2BAA2B,GAAA;IACzC,OAAOA,UAAI,CACT,OAAO,EAAE,QAAQ,EAAE,KAAI;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,QAAQ,IAAI,KAAK;AAC5B,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,UAAU;AAC9B,QAAA,WAAW,EAAE,CAAA;;;;;;;;;;AAU8B,gDAAA,CAAA;AAC3C,QAAA,MAAM,EAAE,uBAAuB;AAChC,KAAA,CACF;AACH;AA2BA;;;;;;;;;;;;;;;;;;;;AAoBG;AACa,SAAA,kBAAkB,CAAC,MAAA,GAA6B,EAAE,EAAA;IAChE,MAAM,KAAK,GAA4B,EAAE;;AAGzC,IAAA,MAAM,EACJ,WAAW,GAAG,IAAI,EAClB,UAAU,GAAG,IAAI,EACjB,cAAc,GAAG,IAAI,EACrB,YAAY,GAAG,IAAI,EACnB,aAAa,GAAG,IAAI,EACpB,WAAW,GAAG,IAAI,EAClB,UAAU,GAAG,IAAI,EACjB,UAAU,GAAG,IAAI,EACjB,gBAAgB,GAAG,IAAI,GACxB,GAAG,MAAM;AAEV,IAAA,IAAI,WAAW;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;AACrD,IAAA,IAAI,UAAU;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;AACnD,IAAA,IAAI,cAAc;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAC3D,IAAA,IAAI,YAAY;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;AACvD,IAAA,IAAI,aAAa;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC;AACzD,IAAA,IAAI,WAAW;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;AACrD,IAAA,IAAI,UAAU;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;AACnD,IAAA,IAAI,UAAU;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;AACrD,IAAA,IAAI,gBAAgB;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC;AAE/D,IAAA,OAAO,KAAK;AACd;AAEA;;;AAGG;AACU,MAAA,aAAa,GAAG;AAC3B,IAAA,KAAK,EAAE,eAAe;AACtB,IAAA,IAAI,EAAE,cAAc;AACpB,IAAA,QAAQ,EAAE,kBAAkB;AAC5B,IAAA,MAAM,EAAE,gBAAgB;AACxB,IAAA,OAAO,EAAE,iBAAiB;AAC1B,IAAA,KAAK,EAAE,eAAe;AACtB,IAAA,IAAI,EAAE,cAAc;AACpB,IAAA,IAAI,EAAE,cAAc;AACpB,IAAA,UAAU,EAAE,oBAAoB;;AAGlC;;AAEG;AACU,MAAA,kBAAkB,GAAG;AAChC,IAAA,aAAa,CAAC,KAAK;AACnB,IAAA,aAAa,CAAC,IAAI;AAClB,IAAA,aAAa,CAAC,QAAQ;AACtB,IAAA,aAAa,CAAC,MAAM;AACpB,IAAA,aAAa,CAAC,OAAO;AACrB,IAAA,aAAa,CAAC,KAAK;AACnB,IAAA,aAAa,CAAC,IAAI;AAClB,IAAA,aAAa,CAAC,IAAI;AAClB,IAAA,aAAa,CAAC,UAAU;;AAK1B;;AAEG;AACG,SAAU,iBAAiB,CAAC,QAAgB,EAAA;AAChD,IAAA,OAAO,kBAAkB,CAAC,QAAQ,CAAC,QAA2B,CAAC;AACjE;AAEA;;;;;;;;;AASG;AACG,SAAU,oBAAoB,CAAC,OAAsD,EAAA;AACzF,IAAA,MAAM,eAAe,GAAG,OAAO,CAAC,4BAA4B,CAAC;AAC7D,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAEzD,QACE,eAAe,KAAK,MAAM;AAC1B,QAAA,aAAa,KAAK,MAAM;AACxB,SAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACpE,SAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAEpE;;;;;;;;;;;;;;;;;"}
package/dist/esm/main.mjs CHANGED
@@ -15,6 +15,7 @@ export { Calculator } from './tools/Calculator.mjs';
15
15
  export { createCodeExecutionTool, getCodeBaseURL, imageExtRegex } from './tools/CodeExecutor.mjs';
16
16
  export { createProgrammaticToolCallingTool, executeTools, extractUsedToolNames, fetchSessionFiles, filterToolsByUsage, formatCompletedResponse, makeRequest, normalizeToPythonIdentifier, unwrapToolResponse } from './tools/ProgrammaticToolCalling.mjs';
17
17
  export { countNestedGroups, createToolSearchRegexTool, escapeRegexSpecialChars, hasNestedQuantifiers, isDangerousPattern, sanitizeRegex } from './tools/ToolSearchRegex.mjs';
18
+ export { BROWSER_TOOL_NAMES, EBrowserTools, createBrowserClickTool, createBrowserExtractTool, createBrowserGoBackTool, createBrowserHoverTool, createBrowserNavigateTool, createBrowserScreenshotTool, createBrowserScrollTool, createBrowserTools, createBrowserTypeTool, createBrowserWaitTool, hasBrowserCapability, isBrowserToolCall } from './tools/BrowserTools.mjs';
18
19
  export { handleServerToolResult, handleToolCallChunks, handleToolCalls, toolResultTypes } from './tools/handlers.mjs';
19
20
  export { createSearchTool } from './tools/search/tool.mjs';
20
21
  export { Callback, CommonEvents, Constants, ContentTypes, EnvVar, GraphEvents, GraphNodeActions, GraphNodeKeys, MessageTypes, Providers, StepTypes, TitleMethod, ToolCallTypes } from './common/enum.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"main.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"main.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}