@cogitator-ai/browser 0.1.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.
Files changed (106) hide show
  1. package/README.md +329 -0
  2. package/dist/__tests__/browser-tools.test.d.ts +2 -0
  3. package/dist/__tests__/browser-tools.test.d.ts.map +1 -0
  4. package/dist/__tests__/browser-tools.test.js +120 -0
  5. package/dist/__tests__/browser-tools.test.js.map +1 -0
  6. package/dist/__tests__/extraction.test.d.ts +2 -0
  7. package/dist/__tests__/extraction.test.d.ts.map +1 -0
  8. package/dist/__tests__/extraction.test.js +267 -0
  9. package/dist/__tests__/extraction.test.js.map +1 -0
  10. package/dist/__tests__/interaction.test.d.ts +2 -0
  11. package/dist/__tests__/interaction.test.d.ts.map +1 -0
  12. package/dist/__tests__/interaction.test.js +376 -0
  13. package/dist/__tests__/interaction.test.js.map +1 -0
  14. package/dist/__tests__/navigation.test.d.ts +2 -0
  15. package/dist/__tests__/navigation.test.d.ts.map +1 -0
  16. package/dist/__tests__/navigation.test.js +235 -0
  17. package/dist/__tests__/navigation.test.js.map +1 -0
  18. package/dist/__tests__/network.test.d.ts +2 -0
  19. package/dist/__tests__/network.test.d.ts.map +1 -0
  20. package/dist/__tests__/network.test.js +508 -0
  21. package/dist/__tests__/network.test.js.map +1 -0
  22. package/dist/__tests__/page-helpers.test.d.ts +2 -0
  23. package/dist/__tests__/page-helpers.test.d.ts.map +1 -0
  24. package/dist/__tests__/page-helpers.test.js +321 -0
  25. package/dist/__tests__/page-helpers.test.js.map +1 -0
  26. package/dist/__tests__/schemas.test.d.ts +2 -0
  27. package/dist/__tests__/schemas.test.d.ts.map +1 -0
  28. package/dist/__tests__/schemas.test.js +518 -0
  29. package/dist/__tests__/schemas.test.js.map +1 -0
  30. package/dist/__tests__/selectors.test.d.ts +2 -0
  31. package/dist/__tests__/selectors.test.d.ts.map +1 -0
  32. package/dist/__tests__/selectors.test.js +157 -0
  33. package/dist/__tests__/selectors.test.js.map +1 -0
  34. package/dist/__tests__/session.test.d.ts +2 -0
  35. package/dist/__tests__/session.test.d.ts.map +1 -0
  36. package/dist/__tests__/session.test.js +325 -0
  37. package/dist/__tests__/session.test.js.map +1 -0
  38. package/dist/__tests__/stealth.test.d.ts +2 -0
  39. package/dist/__tests__/stealth.test.d.ts.map +1 -0
  40. package/dist/__tests__/stealth.test.js +353 -0
  41. package/dist/__tests__/stealth.test.js.map +1 -0
  42. package/dist/__tests__/vision.test.d.ts +2 -0
  43. package/dist/__tests__/vision.test.d.ts.map +1 -0
  44. package/dist/__tests__/vision.test.js +226 -0
  45. package/dist/__tests__/vision.test.js.map +1 -0
  46. package/dist/index.d.ts +10 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +8 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/session.d.ts +29 -0
  51. package/dist/session.d.ts.map +1 -0
  52. package/dist/session.js +190 -0
  53. package/dist/session.js.map +1 -0
  54. package/dist/stealth/evasions.d.ts +2 -0
  55. package/dist/stealth/evasions.d.ts.map +1 -0
  56. package/dist/stealth/evasions.js +83 -0
  57. package/dist/stealth/evasions.js.map +1 -0
  58. package/dist/stealth/human-like.d.ts +5 -0
  59. package/dist/stealth/human-like.d.ts.map +1 -0
  60. package/dist/stealth/human-like.js +52 -0
  61. package/dist/stealth/human-like.js.map +1 -0
  62. package/dist/stealth/index.d.ts +8 -0
  63. package/dist/stealth/index.d.ts.map +1 -0
  64. package/dist/stealth/index.js +24 -0
  65. package/dist/stealth/index.js.map +1 -0
  66. package/dist/stealth/user-agents.d.ts +3 -0
  67. package/dist/stealth/user-agents.d.ts.map +1 -0
  68. package/dist/stealth/user-agents.js +55 -0
  69. package/dist/stealth/user-agents.js.map +1 -0
  70. package/dist/tools/extraction.d.ts +96 -0
  71. package/dist/tools/extraction.d.ts.map +1 -0
  72. package/dist/tools/extraction.js +196 -0
  73. package/dist/tools/extraction.js.map +1 -0
  74. package/dist/tools/index.d.ts +15 -0
  75. package/dist/tools/index.d.ts.map +1 -0
  76. package/dist/tools/index.js +40 -0
  77. package/dist/tools/index.js.map +1 -0
  78. package/dist/tools/interaction.d.ts +128 -0
  79. package/dist/tools/interaction.d.ts.map +1 -0
  80. package/dist/tools/interaction.js +229 -0
  81. package/dist/tools/interaction.js.map +1 -0
  82. package/dist/tools/navigation.d.ts +63 -0
  83. package/dist/tools/navigation.d.ts.map +1 -0
  84. package/dist/tools/navigation.js +140 -0
  85. package/dist/tools/navigation.js.map +1 -0
  86. package/dist/tools/network.d.ts +122 -0
  87. package/dist/tools/network.d.ts.map +1 -0
  88. package/dist/tools/network.js +223 -0
  89. package/dist/tools/network.js.map +1 -0
  90. package/dist/tools/vision.d.ts +83 -0
  91. package/dist/tools/vision.d.ts.map +1 -0
  92. package/dist/tools/vision.js +134 -0
  93. package/dist/tools/vision.js.map +1 -0
  94. package/dist/utils/page-helpers.d.ts +11 -0
  95. package/dist/utils/page-helpers.d.ts.map +1 -0
  96. package/dist/utils/page-helpers.js +73 -0
  97. package/dist/utils/page-helpers.js.map +1 -0
  98. package/dist/utils/schemas.d.ts +209 -0
  99. package/dist/utils/schemas.d.ts.map +1 -0
  100. package/dist/utils/schemas.js +156 -0
  101. package/dist/utils/schemas.js.map +1 -0
  102. package/dist/utils/selectors.d.ts +4 -0
  103. package/dist/utils/selectors.d.ts.map +1 -0
  104. package/dist/utils/selectors.js +39 -0
  105. package/dist/utils/selectors.js.map +1 -0
  106. package/package.json +45 -0
package/README.md ADDED
@@ -0,0 +1,329 @@
1
+ # @cogitator-ai/browser
2
+
3
+ Browser automation tools for Cogitator AI agents. Playwright-based with 32 tools across 5 modules, vision mode, stealth system, structured data extraction, and network control.
4
+
5
+ ## Features
6
+
7
+ - **32 Browser Tools** across 5 modules (navigation, interaction, extraction, vision, network)
8
+ - **BrowserSession** -- managed browser lifecycle with tabs, cookies, proxy
9
+ - **Stealth Mode** -- fingerprint evasion, human-like typing/mouse, UA rotation
10
+ - **Vision Mode** -- screenshot + accessibility tree for vision LLM navigation
11
+ - **Smart Extraction** -- tables, structured data, links, clean text
12
+ - **Network Control** -- request interception, HAR capture, resource blocking, API monitoring
13
+ - **Playwright-powered** -- Chromium, Firefox, WebKit support
14
+
15
+ ## Installation
16
+
17
+ ```bash
18
+ pnpm add @cogitator-ai/browser playwright
19
+ ```
20
+
21
+ ## Quick Start
22
+
23
+ ```typescript
24
+ import { BrowserSession, browserTools } from '@cogitator-ai/browser';
25
+ import { Agent, Cogitator } from '@cogitator-ai/core';
26
+
27
+ const session = new BrowserSession({ headless: true });
28
+ await session.start();
29
+
30
+ const agent = new Agent({
31
+ name: 'web-researcher',
32
+ model: 'gpt-4o',
33
+ instructions: 'You browse the web and extract information.',
34
+ tools: browserTools(session),
35
+ });
36
+
37
+ const cog = new Cogitator({ llm: { defaultProvider: 'openai' } });
38
+ const result = await cog.run(agent, {
39
+ input: 'Go to https://news.ycombinator.com and get the top 5 story titles',
40
+ });
41
+
42
+ console.log(result.output);
43
+ await session.close();
44
+ ```
45
+
46
+ ## Tool Modules
47
+
48
+ ### Navigation (7 tools)
49
+
50
+ | Tool | Description |
51
+ | ----------------------------- | ------------------------------------------------------------ |
52
+ | `browser_navigate` | Navigate to a URL. Returns final URL, title, and HTTP status |
53
+ | `browser_go_back` | Go back in browser history |
54
+ | `browser_go_forward` | Go forward in browser history |
55
+ | `browser_reload` | Reload the current page |
56
+ | `browser_wait_for_navigation` | Wait for navigation to a URL matching a pattern |
57
+ | `browser_get_current_url` | Get current page URL and title |
58
+ | `browser_wait_for_selector` | Wait for a CSS selector to appear on the page |
59
+
60
+ ### Interaction (9 tools)
61
+
62
+ | Tool | Description |
63
+ | ----------------------- | --------------------------------------------------------------------------------- |
64
+ | `browser_click` | Click an element by CSS selector. Supports button, clickCount, position |
65
+ | `browser_type` | Type text into an input. Stealth mode adds human-like keystroke delays |
66
+ | `browser_select_option` | Select from a `<select>` element by value, label, or index |
67
+ | `browser_hover` | Hover over an element |
68
+ | `browser_scroll` | Scroll the page or a specific element in any direction |
69
+ | `browser_press_key` | Press a keyboard key with optional modifier keys |
70
+ | `browser_drag_and_drop` | Drag an element onto another element |
71
+ | `browser_fill_form` | Smart form filler -- finds inputs by name, placeholder, aria-label, or label text |
72
+ | `browser_upload_file` | Upload files to a file input element |
73
+
74
+ ### Extraction (7 tools)
75
+
76
+ | Tool | Description |
77
+ | ---------------------------- | ------------------------------------------------------------------ |
78
+ | `browser_get_text` | Extract text from the page or a specific element |
79
+ | `browser_get_html` | Get inner or outer HTML of the page or an element |
80
+ | `browser_get_attribute` | Get the value of a DOM attribute |
81
+ | `browser_get_links` | Extract all links with text, href, and title |
82
+ | `browser_query_selector_all` | Query all matching elements with tag, text, attributes, visibility |
83
+ | `browser_extract_table` | Extract structured data from HTML tables (headers + rows) |
84
+ | `browser_extract_structured` | Extract clean readable text, stripping scripts/styles/SVG |
85
+
86
+ ### Vision (4 tools)
87
+
88
+ | Tool | Description |
89
+ | ------------------------------ | --------------------------------------------------------------------------------------- |
90
+ | `browser_screenshot` | Screenshot the page or element. Returns base64 PNG/JPEG |
91
+ | `browser_screenshot_element` | Screenshot a specific element with bounding box coordinates |
92
+ | `browser_find_by_description` | Find elements by natural language using the accessibility tree |
93
+ | `browser_click_by_description` | Click an element by natural language description (tries role, text, label, placeholder) |
94
+
95
+ ### Network (5 tools)
96
+
97
+ | Tool | Description |
98
+ | --------------------------- | -------------------------------------------------------------------- |
99
+ | `browser_intercept_request` | Intercept HTTP requests -- block, modify, or continue by URL pattern |
100
+ | `browser_wait_for_response` | Wait for an HTTP response matching a URL pattern |
101
+ | `browser_block_resources` | Block resource types (image, stylesheet, font, media, script) |
102
+ | `browser_capture_har` | Start/stop HAR traffic capture. Returns all captured entries on stop |
103
+ | `browser_get_api_calls` | Get captured XHR/fetch calls, filtered by URL pattern or method |
104
+
105
+ ## Stealth Mode
106
+
107
+ Stealth mode makes the browser harder to detect as automated. It applies evasion scripts on context creation and enables human-like input simulation.
108
+
109
+ ```typescript
110
+ const session = new BrowserSession({
111
+ stealth: true, // enable all defaults
112
+ });
113
+
114
+ // or configure individually
115
+ const session = new BrowserSession({
116
+ stealth: {
117
+ humanLikeTyping: true, // random delays between keystrokes (50-150ms)
118
+ humanLikeMouse: true, // bezier curve mouse movement
119
+ fingerprintRandomization: true, // canvas/WebGL/plugin spoofing
120
+ blockWebDriver: true, // navigator.webdriver = false
121
+ evasionScripts: [], // custom init scripts to inject
122
+ },
123
+ });
124
+ ```
125
+
126
+ What stealth mode does:
127
+
128
+ - Sets `navigator.webdriver` to `false`
129
+ - Spoofs `navigator.plugins` with realistic Chrome plugins
130
+ - Sets `navigator.languages` to `['en-US', 'en']`
131
+ - Randomizes canvas fingerprint (1-bit pixel noise)
132
+ - Spoofs WebGL vendor/renderer (Intel Iris)
133
+ - Injects `window.chrome` runtime stubs
134
+ - Overrides `Permissions.query` for notifications
135
+ - Rotates User-Agent strings per browser type
136
+ - Adds human-like typing delays (50-150ms per character)
137
+ - Uses bezier curve mouse movement for clicks
138
+
139
+ ## Vision Mode
140
+
141
+ Vision tools let agents interact with pages using natural language instead of CSS selectors:
142
+
143
+ ```typescript
144
+ import { BrowserSession, browserTools } from '@cogitator-ai/browser';
145
+
146
+ const session = new BrowserSession();
147
+ await session.start();
148
+
149
+ const tools = browserTools(session, { modules: ['navigation', 'vision'] });
150
+
151
+ // Agent can now use:
152
+ // browser_screenshot -- take a screenshot for visual analysis
153
+ // browser_find_by_description -- "find the login button"
154
+ // browser_click_by_description -- "click the Submit button"
155
+ ```
156
+
157
+ `browser_find_by_description` walks the accessibility tree and matches elements by role and name against the description. `browser_click_by_description` tries multiple strategies: role button, role link, text content, label, and placeholder.
158
+
159
+ ## Network Control
160
+
161
+ ```typescript
162
+ import { BrowserSession, createNavigationTools, createNetworkTools } from '@cogitator-ai/browser';
163
+
164
+ const session = new BrowserSession();
165
+ await session.start();
166
+
167
+ const tools = [...createNavigationTools(session), ...createNetworkTools(session)];
168
+
169
+ // Agent can intercept requests:
170
+ // browser_intercept_request({ urlPattern: "**/ads/**", action: "block" })
171
+
172
+ // Block resource types to speed up loading:
173
+ // browser_block_resources({ types: ["image", "font", "stylesheet"] })
174
+
175
+ // Monitor API calls made by the page:
176
+ // browser_get_api_calls({ urlPattern: "/api/", method: "POST" })
177
+
178
+ // Capture HAR traffic:
179
+ // browser_capture_har({ action: "start" })
180
+ // ... navigate and interact ...
181
+ // browser_capture_har({ action: "stop", path: "./traffic.har" })
182
+ ```
183
+
184
+ ## BrowserSession API
185
+
186
+ ### Constructor
187
+
188
+ ```typescript
189
+ const session = new BrowserSession(config?: BrowserSessionConfig);
190
+ ```
191
+
192
+ ### BrowserSessionConfig
193
+
194
+ ```typescript
195
+ interface BrowserSessionConfig {
196
+ headless?: boolean; // default: true
197
+ browser?: 'chromium' | 'firefox' | 'webkit'; // default: 'chromium'
198
+ stealth?: boolean | StealthConfig; // enable stealth mode
199
+ proxy?: string | ProxyConfig; // proxy server
200
+ viewport?: { width: number; height: number }; // default: 1280x720
201
+ userAgent?: string; // custom UA (stealth rotates automatically)
202
+ locale?: string; // browser locale (e.g., 'en-US')
203
+ timezone?: string; // timezone ID (e.g., 'America/New_York')
204
+ geolocation?: { latitude: number; longitude: number };
205
+ cookies?: BrowserCookie[]; // pre-load cookies
206
+ timeout?: number; // navigation timeout, default: 30000ms
207
+ actionTimeout?: number; // action timeout, default: 10000ms
208
+ }
209
+ ```
210
+
211
+ ### Lifecycle
212
+
213
+ ```typescript
214
+ await session.start(); // launch browser, create context and first page
215
+ await session.close(); // close browser and cleanup
216
+ ```
217
+
218
+ ### Properties
219
+
220
+ ```typescript
221
+ session.page; // active Playwright Page
222
+ session.tabs; // all open Page[]
223
+ session.browser; // Playwright Browser instance
224
+ session.context; // Playwright BrowserContext
225
+ session.config; // current config
226
+ session.stealthEnabled; // whether stealth is on
227
+ session.stealthConfig; // resolved StealthConfig or null
228
+ ```
229
+
230
+ ### Tab Management
231
+
232
+ ```typescript
233
+ const page = await session.newTab('https://example.com'); // open new tab
234
+ session.switchTab(1); // switch to tab by index
235
+ await session.closeTab(0); // close tab by index
236
+ ```
237
+
238
+ ### Cookie Management
239
+
240
+ ```typescript
241
+ const cookies = await session.getCookies();
242
+ await session.setCookies([{ name: 'token', value: 'abc', domain: '.example.com' }]);
243
+ await session.saveCookies('./cookies.json');
244
+ await session.loadCookies('./cookies.json');
245
+ ```
246
+
247
+ ## Module Selection
248
+
249
+ Load only the tool modules you need:
250
+
251
+ ```typescript
252
+ // all 32 tools
253
+ const tools = browserTools(session);
254
+
255
+ // only navigation + extraction (14 tools)
256
+ const tools = browserTools(session, {
257
+ modules: ['navigation', 'extraction'],
258
+ });
259
+
260
+ // or use individual factory functions
261
+ import {
262
+ createNavigationTools,
263
+ createExtractionTools,
264
+ createScreenshotTool,
265
+ } from '@cogitator-ai/browser';
266
+
267
+ const tools = [
268
+ ...createNavigationTools(session),
269
+ ...createExtractionTools(session),
270
+ createScreenshotTool(session),
271
+ ];
272
+ ```
273
+
274
+ Available modules: `navigation`, `interaction`, `extraction`, `vision`, `network`.
275
+
276
+ ## Utility Helpers
277
+
278
+ Standalone helpers for advanced use cases:
279
+
280
+ ```typescript
281
+ import {
282
+ smartSelect,
283
+ findFormField,
284
+ getReadableText,
285
+ getAccessibilityTree,
286
+ elementToInfo,
287
+ } from '@cogitator-ai/browser';
288
+
289
+ // smartSelect tries CSS, XPath, then text matching
290
+ const locator = await smartSelect(page, 'Submit');
291
+
292
+ // findFormField tries name, placeholder, aria-label, label text
293
+ const input = await findFormField(page, 'Email');
294
+
295
+ // getReadableText strips scripts/styles and returns clean text
296
+ const text = await getReadableText(page);
297
+
298
+ // getAccessibilityTree returns simplified a11y tree
299
+ const tree = await getAccessibilityTree(page);
300
+ ```
301
+
302
+ ## Stealth Standalone Functions
303
+
304
+ Use stealth primitives directly outside of BrowserSession:
305
+
306
+ ```typescript
307
+ import {
308
+ humanLikeType,
309
+ humanLikeClick,
310
+ humanLikeScroll,
311
+ getRandomUserAgent,
312
+ getAllUserAgents,
313
+ getEvasionScripts,
314
+ applyStealthToContext,
315
+ getStealthLaunchOptions,
316
+ } from '@cogitator-ai/browser';
317
+
318
+ // human-like input on any Playwright page
319
+ await humanLikeType(page, '#search', 'cogitator ai');
320
+ await humanLikeClick(page, '.submit-btn');
321
+ await humanLikeScroll(page, 'down', 500);
322
+
323
+ // get a random UA for a browser type
324
+ const ua = getRandomUserAgent('chromium');
325
+ ```
326
+
327
+ ## License
328
+
329
+ MIT
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=browser-tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/browser-tools.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,120 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { browserTools } from '../tools/index.js';
3
+ vi.mock('playwright', () => ({
4
+ chromium: { launch: vi.fn() },
5
+ }));
6
+ function createMockSession() {
7
+ const mockPage = {
8
+ goto: vi.fn(),
9
+ goBack: vi.fn(),
10
+ goForward: vi.fn(),
11
+ reload: vi.fn(),
12
+ url: vi.fn().mockReturnValue('about:blank'),
13
+ title: vi.fn().mockResolvedValue(''),
14
+ waitForURL: vi.fn(),
15
+ waitForSelector: vi.fn(),
16
+ click: vi.fn(),
17
+ fill: vi.fn(),
18
+ type: vi.fn(),
19
+ selectOption: vi.fn(),
20
+ hover: vi.fn(),
21
+ evaluate: vi.fn(),
22
+ keyboard: { press: vi.fn(), type: vi.fn() },
23
+ dragAndDrop: vi.fn(),
24
+ setInputFiles: vi.fn(),
25
+ textContent: vi.fn(),
26
+ innerHTML: vi.fn(),
27
+ content: vi.fn(),
28
+ getAttribute: vi.fn(),
29
+ screenshot: vi.fn().mockResolvedValue(Buffer.from('')),
30
+ viewportSize: vi.fn().mockReturnValue({ width: 1280, height: 720 }),
31
+ accessibility: { snapshot: vi.fn().mockResolvedValue(null) },
32
+ locator: vi.fn().mockReturnValue({
33
+ screenshot: vi.fn(),
34
+ boundingBox: vi.fn(),
35
+ evaluate: vi.fn(),
36
+ count: vi.fn().mockResolvedValue(0),
37
+ nth: vi.fn(),
38
+ first: vi.fn(),
39
+ }),
40
+ getByRole: vi.fn().mockReturnValue({ count: vi.fn().mockResolvedValue(0) }),
41
+ getByText: vi.fn().mockReturnValue({ count: vi.fn().mockResolvedValue(0) }),
42
+ getByLabel: vi.fn().mockReturnValue({ count: vi.fn().mockResolvedValue(0) }),
43
+ getByPlaceholder: vi.fn().mockReturnValue({ count: vi.fn().mockResolvedValue(0) }),
44
+ route: vi.fn(),
45
+ unroute: vi.fn(),
46
+ waitForResponse: vi.fn(),
47
+ on: vi.fn(),
48
+ removeListener: vi.fn(),
49
+ mouse: { move: vi.fn(), click: vi.fn(), wheel: vi.fn() },
50
+ };
51
+ return {
52
+ page: mockPage,
53
+ stealthEnabled: false,
54
+ stealthConfig: null,
55
+ };
56
+ }
57
+ describe('browserTools', () => {
58
+ const session = createMockSession();
59
+ it('returns all 32 tools with no options', () => {
60
+ const tools = browserTools(session);
61
+ expect(tools).toHaveLength(32);
62
+ });
63
+ it('all tools have unique names', () => {
64
+ const tools = browserTools(session);
65
+ const names = tools.map((t) => t.name);
66
+ expect(new Set(names).size).toBe(names.length);
67
+ });
68
+ it('all tool names start with browser_', () => {
69
+ const tools = browserTools(session);
70
+ for (const t of tools) {
71
+ expect(t.name).toMatch(/^browser_/);
72
+ }
73
+ });
74
+ it('returns 7 navigation tools', () => {
75
+ const tools = browserTools(session, { modules: ['navigation'] });
76
+ expect(tools).toHaveLength(7);
77
+ });
78
+ it('returns 9 interaction tools', () => {
79
+ const tools = browserTools(session, { modules: ['interaction'] });
80
+ expect(tools).toHaveLength(9);
81
+ });
82
+ it('returns 7 extraction tools', () => {
83
+ const tools = browserTools(session, { modules: ['extraction'] });
84
+ expect(tools).toHaveLength(7);
85
+ });
86
+ it('returns 4 vision tools', () => {
87
+ const tools = browserTools(session, { modules: ['vision'] });
88
+ expect(tools).toHaveLength(4);
89
+ });
90
+ it('returns 5 network tools', () => {
91
+ const tools = browserTools(session, { modules: ['network'] });
92
+ expect(tools).toHaveLength(5);
93
+ });
94
+ it('combines modules correctly', () => {
95
+ const tools = browserTools(session, { modules: ['navigation', 'extraction'] });
96
+ expect(tools).toHaveLength(14);
97
+ });
98
+ it('all tools have valid toJSON()', () => {
99
+ const tools = browserTools(session);
100
+ for (const t of tools) {
101
+ const json = t.toJSON();
102
+ expect(json).toHaveProperty('name');
103
+ expect(json).toHaveProperty('description');
104
+ expect(json).toHaveProperty('parameters');
105
+ expect(typeof json.name).toBe('string');
106
+ expect(typeof json.description).toBe('string');
107
+ }
108
+ });
109
+ it('all tools have category web', () => {
110
+ const tools = browserTools(session);
111
+ for (const t of tools) {
112
+ expect(t.category).toBe('web');
113
+ }
114
+ });
115
+ it('returns 0 tools for empty modules array', () => {
116
+ const tools = browserTools(session, { modules: [] });
117
+ expect(tools).toHaveLength(0);
118
+ });
119
+ });
120
+ //# sourceMappingURL=browser-tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/browser-tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=extraction.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraction.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/extraction.test.ts"],"names":[],"mappings":""}