@cogitator-ai/browser 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +58 -32
  2. package/dist/index.d.ts +6 -4
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +3 -3
  5. package/dist/index.js.map +1 -1
  6. package/dist/session.d.ts +18 -0
  7. package/dist/session.d.ts.map +1 -1
  8. package/dist/session.js +201 -72
  9. package/dist/session.js.map +1 -1
  10. package/dist/stealth/evasions.d.ts +7 -1
  11. package/dist/stealth/evasions.d.ts.map +1 -1
  12. package/dist/stealth/evasions.js +159 -64
  13. package/dist/stealth/evasions.js.map +1 -1
  14. package/dist/stealth/human-like.d.ts +27 -3
  15. package/dist/stealth/human-like.d.ts.map +1 -1
  16. package/dist/stealth/human-like.js +76 -23
  17. package/dist/stealth/human-like.js.map +1 -1
  18. package/dist/stealth/index.d.ts +8 -2
  19. package/dist/stealth/index.d.ts.map +1 -1
  20. package/dist/stealth/index.js +10 -6
  21. package/dist/stealth/index.js.map +1 -1
  22. package/dist/stealth/user-agents.d.ts.map +1 -1
  23. package/dist/stealth/user-agents.js +33 -34
  24. package/dist/stealth/user-agents.js.map +1 -1
  25. package/dist/tools/extraction.d.ts.map +1 -1
  26. package/dist/tools/extraction.js +37 -27
  27. package/dist/tools/extraction.js.map +1 -1
  28. package/dist/tools/index.d.ts +1 -1
  29. package/dist/tools/index.d.ts.map +1 -1
  30. package/dist/tools/index.js +4 -3
  31. package/dist/tools/index.js.map +1 -1
  32. package/dist/tools/interaction.d.ts +10 -2
  33. package/dist/tools/interaction.d.ts.map +1 -1
  34. package/dist/tools/interaction.js +86 -42
  35. package/dist/tools/interaction.js.map +1 -1
  36. package/dist/tools/navigation.d.ts +6 -4
  37. package/dist/tools/navigation.d.ts.map +1 -1
  38. package/dist/tools/navigation.js +9 -4
  39. package/dist/tools/navigation.js.map +1 -1
  40. package/dist/tools/network.d.ts +29 -26
  41. package/dist/tools/network.d.ts.map +1 -1
  42. package/dist/tools/network.js +394 -102
  43. package/dist/tools/network.js.map +1 -1
  44. package/dist/tools/vision.d.ts +10 -6
  45. package/dist/tools/vision.d.ts.map +1 -1
  46. package/dist/tools/vision.js +66 -19
  47. package/dist/tools/vision.js.map +1 -1
  48. package/dist/utils/human-mode.d.ts +5 -0
  49. package/dist/utils/human-mode.d.ts.map +1 -0
  50. package/dist/utils/human-mode.js +10 -0
  51. package/dist/utils/human-mode.js.map +1 -0
  52. package/dist/utils/page-helpers.d.ts +1 -0
  53. package/dist/utils/page-helpers.d.ts.map +1 -1
  54. package/dist/utils/page-helpers.js +82 -22
  55. package/dist/utils/page-helpers.js.map +1 -1
  56. package/dist/utils/schemas.d.ts +7 -2
  57. package/dist/utils/schemas.d.ts.map +1 -1
  58. package/dist/utils/schemas.js +43 -16
  59. package/dist/utils/schemas.js.map +1 -1
  60. package/dist/utils/selectors.d.ts.map +1 -1
  61. package/dist/utils/selectors.js +27 -10
  62. package/dist/utils/selectors.js.map +1 -1
  63. package/package.json +4 -4
  64. package/dist/__tests__/browser-tools.test.d.ts +0 -2
  65. package/dist/__tests__/browser-tools.test.d.ts.map +0 -1
  66. package/dist/__tests__/browser-tools.test.js +0 -120
  67. package/dist/__tests__/browser-tools.test.js.map +0 -1
  68. package/dist/__tests__/extraction.test.d.ts +0 -2
  69. package/dist/__tests__/extraction.test.d.ts.map +0 -1
  70. package/dist/__tests__/extraction.test.js +0 -267
  71. package/dist/__tests__/extraction.test.js.map +0 -1
  72. package/dist/__tests__/interaction.test.d.ts +0 -2
  73. package/dist/__tests__/interaction.test.d.ts.map +0 -1
  74. package/dist/__tests__/interaction.test.js +0 -376
  75. package/dist/__tests__/interaction.test.js.map +0 -1
  76. package/dist/__tests__/navigation.test.d.ts +0 -2
  77. package/dist/__tests__/navigation.test.d.ts.map +0 -1
  78. package/dist/__tests__/navigation.test.js +0 -235
  79. package/dist/__tests__/navigation.test.js.map +0 -1
  80. package/dist/__tests__/network.test.d.ts +0 -2
  81. package/dist/__tests__/network.test.d.ts.map +0 -1
  82. package/dist/__tests__/network.test.js +0 -508
  83. package/dist/__tests__/network.test.js.map +0 -1
  84. package/dist/__tests__/page-helpers.test.d.ts +0 -2
  85. package/dist/__tests__/page-helpers.test.d.ts.map +0 -1
  86. package/dist/__tests__/page-helpers.test.js +0 -321
  87. package/dist/__tests__/page-helpers.test.js.map +0 -1
  88. package/dist/__tests__/schemas.test.d.ts +0 -2
  89. package/dist/__tests__/schemas.test.d.ts.map +0 -1
  90. package/dist/__tests__/schemas.test.js +0 -518
  91. package/dist/__tests__/schemas.test.js.map +0 -1
  92. package/dist/__tests__/selectors.test.d.ts +0 -2
  93. package/dist/__tests__/selectors.test.d.ts.map +0 -1
  94. package/dist/__tests__/selectors.test.js +0 -157
  95. package/dist/__tests__/selectors.test.js.map +0 -1
  96. package/dist/__tests__/session.test.d.ts +0 -2
  97. package/dist/__tests__/session.test.d.ts.map +0 -1
  98. package/dist/__tests__/session.test.js +0 -325
  99. package/dist/__tests__/session.test.js.map +0 -1
  100. package/dist/__tests__/stealth.test.d.ts +0 -2
  101. package/dist/__tests__/stealth.test.d.ts.map +0 -1
  102. package/dist/__tests__/stealth.test.js +0 -353
  103. package/dist/__tests__/stealth.test.js.map +0 -1
  104. package/dist/__tests__/vision.test.d.ts +0 -2
  105. package/dist/__tests__/vision.test.d.ts.map +0 -1
  106. package/dist/__tests__/vision.test.js +0 -226
  107. package/dist/__tests__/vision.test.js.map +0 -1
@@ -1,95 +1,406 @@
1
+ import { createRequire } from 'node:module';
1
2
  import { tool } from '@cogitator-ai/core';
2
- import { interceptRequestSchema, waitForResponseSchema, blockResourcesSchema, captureHarSchema, getApiCallsSchema, } from '../utils/schemas.js';
3
+ import { interceptRequestSchema, removeInterceptorSchema, waitForResponseSchema, blockResourcesSchema, captureHarSchema, getApiCallsSchema, } from '../utils/schemas.js';
4
+ const MAX_API_CALLS = 1000;
5
+ const MAX_HAR_ENTRIES = 5000;
6
+ const HAR_SETTLE_TIMEOUT_MS = 2000;
7
+ const MAX_HAR_BODY_BYTES = 1_000_000;
8
+ const REGEX_LITERAL = /^\/(.+)\/([dgimsuvy]*)$/;
9
+ const TEXTUAL_MIME = /^(text\/|application\/(json|javascript|ecmascript|xml|x-www-form-urlencoded|graphql)|application\/[\w.+-]+\+(json|xml)|image\/svg\+xml)/i;
10
+ function packageVersion() {
11
+ try {
12
+ const require = createRequire(import.meta.url);
13
+ const pkg = require('../../package.json');
14
+ return pkg.version ?? '0.0.0';
15
+ }
16
+ catch {
17
+ return '0.0.0';
18
+ }
19
+ }
20
+ export function toUrlMatcher(pattern) {
21
+ const literal = REGEX_LITERAL.exec(pattern);
22
+ if (!literal)
23
+ return pattern;
24
+ try {
25
+ return new RegExp(literal[1], literal[2].replace(/[gy]/g, ''));
26
+ }
27
+ catch {
28
+ throw new Error(`Invalid regular expression in urlPattern: ${pattern}`);
29
+ }
30
+ }
31
+ function createUrlPredicate(pattern) {
32
+ const matcher = toUrlMatcher(pattern);
33
+ return typeof matcher === 'string' ? (url) => url.includes(matcher) : (url) => matcher.test(url);
34
+ }
35
+ function networkTimingMs(request) {
36
+ let timing;
37
+ try {
38
+ timing = request.timing();
39
+ }
40
+ catch {
41
+ return 0;
42
+ }
43
+ const end = timing.responseEnd;
44
+ if (!Number.isFinite(end) || end < 0)
45
+ return 0;
46
+ return end;
47
+ }
48
+ function startedDateTime(request) {
49
+ try {
50
+ const { startTime } = request.timing();
51
+ if (Number.isFinite(startTime) && startTime > 0) {
52
+ return new Date(startTime).toISOString();
53
+ }
54
+ }
55
+ catch { }
56
+ return new Date().toISOString();
57
+ }
58
+ function isApiRequest(request) {
59
+ const type = request.resourceType();
60
+ return type === 'xhr' || type === 'fetch';
61
+ }
62
+ async function readTextBody(response, mimeType) {
63
+ try {
64
+ const body = await response.body();
65
+ if (!TEXTUAL_MIME.test(mimeType) || body.byteLength > MAX_HAR_BODY_BYTES) {
66
+ return { size: body.byteLength };
67
+ }
68
+ return { text: body.toString('utf-8'), size: body.byteLength };
69
+ }
70
+ catch {
71
+ return { size: -1 };
72
+ }
73
+ }
74
+ function toNameValue(headers) {
75
+ return Object.entries(headers).map(([name, value]) => ({ name, value }));
76
+ }
77
+ function queryStringOf(url) {
78
+ try {
79
+ return Array.from(new URL(url).searchParams, ([name, value]) => ({ name, value }));
80
+ }
81
+ catch {
82
+ return [];
83
+ }
84
+ }
85
+ function toHarLog(entries) {
86
+ return {
87
+ log: {
88
+ version: '1.2',
89
+ creator: { name: '@cogitator-ai/browser', version: packageVersion() },
90
+ pages: [],
91
+ entries: entries.map((entry) => ({
92
+ startedDateTime: entry.startedDateTime,
93
+ time: entry.timing,
94
+ request: {
95
+ method: entry.method,
96
+ url: entry.url,
97
+ httpVersion: 'HTTP/1.1',
98
+ cookies: [],
99
+ headers: toNameValue(entry.requestHeaders),
100
+ queryString: queryStringOf(entry.url),
101
+ headersSize: -1,
102
+ bodySize: entry.requestBody ? Buffer.byteLength(entry.requestBody) : 0,
103
+ ...(entry.requestBody !== undefined
104
+ ? {
105
+ postData: {
106
+ mimeType: entry.requestHeaders['content-type'] ?? '',
107
+ text: entry.requestBody,
108
+ },
109
+ }
110
+ : {}),
111
+ },
112
+ response: {
113
+ status: entry.status,
114
+ statusText: entry.statusText,
115
+ httpVersion: 'HTTP/1.1',
116
+ cookies: [],
117
+ headers: toNameValue(entry.responseHeaders),
118
+ content: {
119
+ size: entry.bodySize,
120
+ mimeType: entry.mimeType,
121
+ ...(entry.responseBody !== undefined ? { text: entry.responseBody } : {}),
122
+ },
123
+ redirectURL: entry.responseHeaders.location ?? '',
124
+ headersSize: -1,
125
+ bodySize: entry.bodySize,
126
+ ...(entry.error ? { _error: entry.error } : {}),
127
+ },
128
+ cache: {},
129
+ timings: { send: 0, wait: entry.timing, receive: 0 },
130
+ })),
131
+ },
132
+ };
133
+ }
134
+ function toPublicHarEntry(entry) {
135
+ const result = {
136
+ url: entry.url,
137
+ method: entry.method,
138
+ status: entry.status,
139
+ timing: entry.timing,
140
+ requestHeaders: entry.requestHeaders,
141
+ responseHeaders: entry.responseHeaders,
142
+ };
143
+ if (entry.requestBody !== undefined)
144
+ result.requestBody = entry.requestBody;
145
+ if (entry.responseBody !== undefined)
146
+ result.responseBody = entry.responseBody;
147
+ return result;
148
+ }
3
149
  class NetworkState {
150
+ _session;
4
151
  _interceptors = new Map();
5
152
  _apiCalls = [];
6
- _listening = false;
7
153
  _interceptorCounter = 0;
154
+ _context = null;
155
+ _har = null;
156
+ _harSlots = new WeakMap();
157
+ constructor(_session) {
158
+ this._session = _session;
159
+ _session.onStart((context) => this._attach(context));
160
+ }
8
161
  get apiCalls() {
9
162
  return this._apiCalls;
10
163
  }
11
- async addInterceptor(_page, id, remover) {
12
- this._interceptors.set(id, remover);
164
+ get harCapturing() {
165
+ return this._har !== null;
166
+ }
167
+ clearApiCalls() {
168
+ this._apiCalls = [];
169
+ }
170
+ async addRoute(pattern, handler) {
171
+ const context = this._requireContext();
172
+ await context.route(pattern, handler);
173
+ const id = `interceptor_${++this._interceptorCounter}`;
174
+ this._interceptors.set(id, async () => {
175
+ await context.unroute(pattern, handler);
176
+ });
177
+ return id;
13
178
  }
14
179
  async removeInterceptor(id) {
15
180
  const remover = this._interceptors.get(id);
16
- if (remover) {
17
- await remover();
18
- this._interceptors.delete(id);
181
+ if (!remover)
182
+ return false;
183
+ this._interceptors.delete(id);
184
+ await remover();
185
+ return true;
186
+ }
187
+ async removeAllInterceptors() {
188
+ const ids = [...this._interceptors.keys()];
189
+ for (const id of ids) {
190
+ await this.removeInterceptor(id);
19
191
  }
192
+ return ids;
193
+ }
194
+ startHar() {
195
+ this._requireContext();
196
+ this._har = { entries: [], inflight: new Set(), truncated: false };
197
+ }
198
+ async stopHar() {
199
+ const har = this._har;
200
+ this._har = null;
201
+ if (!har)
202
+ return null;
203
+ if (har.inflight.size > 0) {
204
+ let timer;
205
+ await Promise.race([
206
+ Promise.allSettled([...har.inflight]),
207
+ new Promise((resolve) => {
208
+ timer = setTimeout(resolve, HAR_SETTLE_TIMEOUT_MS);
209
+ }),
210
+ ]);
211
+ clearTimeout(timer);
212
+ }
213
+ return {
214
+ entries: har.entries.filter((entry) => entry !== null),
215
+ truncated: har.truncated,
216
+ };
217
+ }
218
+ _requireContext() {
219
+ const context = this._session.context;
220
+ if (!context) {
221
+ throw new Error('BrowserSession not started');
222
+ }
223
+ if (context !== this._context) {
224
+ this._attach(context);
225
+ }
226
+ return context;
227
+ }
228
+ _attach(context) {
229
+ if (this._context === context)
230
+ return;
231
+ this._context = context;
232
+ this._interceptors.clear();
233
+ this._har = null;
234
+ context.on('request', (request) => {
235
+ if (this._context !== context)
236
+ return;
237
+ this._reserveHarSlot(request);
238
+ });
239
+ context.on('requestfinished', (request) => {
240
+ if (this._context !== context)
241
+ return;
242
+ this._observe(request, null);
243
+ });
244
+ context.on('requestfailed', (request) => {
245
+ if (this._context !== context)
246
+ return;
247
+ this._observe(request, request.failure()?.errorText ?? 'Request failed');
248
+ });
20
249
  }
21
- startListening(page) {
22
- if (this._listening)
250
+ _reserveHarSlot(request) {
251
+ const har = this._har;
252
+ if (!har)
23
253
  return;
24
- this._listening = true;
25
- page.on('response', async (response) => {
26
- const request = response.request();
27
- const resourceType = request.resourceType();
28
- if (resourceType === 'xhr' || resourceType === 'fetch') {
254
+ if (har.entries.length >= MAX_HAR_ENTRIES) {
255
+ har.truncated = true;
256
+ return;
257
+ }
258
+ let settle;
259
+ const settled = new Promise((resolve) => {
260
+ settle = () => {
261
+ har.inflight.delete(settled);
262
+ resolve();
263
+ };
264
+ });
265
+ har.inflight.add(settled);
266
+ this._harSlots.set(request, { har, index: har.entries.push(null) - 1, settle });
267
+ }
268
+ _observe(request, error) {
269
+ const slot = this._harSlots.get(request) ?? null;
270
+ this._harSlots.delete(request);
271
+ if (!slot && !isApiRequest(request))
272
+ return;
273
+ const work = this._record(request, error, slot);
274
+ if (slot) {
275
+ void work.finally(slot.settle);
276
+ }
277
+ }
278
+ async _record(request, error, slot) {
279
+ try {
280
+ const response = error ? null : await request.response();
281
+ const responseHeaders = response?.headers() ?? {};
282
+ const status = response?.status() ?? 0;
283
+ const timing = networkTimingMs(request);
284
+ if (isApiRequest(request)) {
29
285
  this._apiCalls.push({
30
286
  url: request.url(),
31
287
  method: request.method(),
32
- status: response.status(),
33
- timing: 0,
288
+ status,
289
+ timing,
34
290
  requestHeaders: request.headers(),
35
- responseHeaders: response.headers(),
291
+ responseHeaders,
292
+ ...(error ? { error } : {}),
36
293
  });
294
+ if (this._apiCalls.length > MAX_API_CALLS) {
295
+ this._apiCalls.splice(0, this._apiCalls.length - MAX_API_CALLS);
296
+ }
37
297
  }
38
- });
39
- }
40
- nextId() {
41
- return `interceptor_${++this._interceptorCounter}`;
298
+ if (!slot)
299
+ return;
300
+ const mimeType = responseHeaders['content-type'] ?? '';
301
+ const body = response ? await readTextBody(response, mimeType) : { size: 0 };
302
+ const entry = {
303
+ url: request.url(),
304
+ method: request.method(),
305
+ status,
306
+ statusText: response?.statusText() ?? '',
307
+ timing,
308
+ startedDateTime: startedDateTime(request),
309
+ requestHeaders: request.headers(),
310
+ responseHeaders,
311
+ mimeType,
312
+ bodySize: body.size,
313
+ };
314
+ const postData = request.postData();
315
+ if (postData !== null)
316
+ entry.requestBody = postData;
317
+ if (body.text !== undefined)
318
+ entry.responseBody = body.text;
319
+ if (error)
320
+ entry.error = error;
321
+ slot.har.entries[slot.index] = entry;
322
+ }
323
+ catch { }
42
324
  }
43
- clearApiCalls() {
44
- this._apiCalls = [];
325
+ }
326
+ const networkStates = new WeakMap();
327
+ function networkStateFor(session) {
328
+ let state = networkStates.get(session);
329
+ if (!state) {
330
+ state = new NetworkState(session);
331
+ networkStates.set(session, state);
45
332
  }
333
+ return state;
46
334
  }
47
- export function createInterceptRequestTool(session, state) {
335
+ export function createInterceptRequestTool(session) {
336
+ const state = networkStateFor(session);
48
337
  return tool({
49
338
  name: 'browser_intercept_request',
50
- description: 'Intercept and modify, block, or continue HTTP requests matching a URL pattern.',
339
+ description: 'Intercept and modify, block, or continue HTTP requests matching a URL pattern in all tabs. Returns an interceptorId that can be passed to browser_remove_interceptor.',
51
340
  category: 'web',
52
341
  tags: ['browser', 'network'],
53
342
  parameters: interceptRequestSchema,
54
343
  execute: async (params) => {
55
- const page = session.page;
56
- const id = state.nextId();
344
+ if (params.action === 'modify' && !params.modify) {
345
+ return {
346
+ interceptorId: null,
347
+ warning: "action 'modify' requires a 'modify' object with headers, body, or url; no interceptor was registered",
348
+ };
349
+ }
57
350
  const handler = async (route) => {
58
351
  if (params.action === 'block') {
59
352
  await route.abort();
353
+ return;
60
354
  }
61
- else if (params.action === 'modify' && params.modify) {
355
+ if (params.action === 'modify' && params.modify) {
62
356
  const overrides = {};
63
- if (params.modify.headers)
64
- overrides.headers = params.modify.headers;
65
- if (params.modify.body)
357
+ if (params.modify.headers) {
358
+ overrides.headers = { ...route.request().headers(), ...params.modify.headers };
359
+ }
360
+ if (params.modify.body !== undefined)
66
361
  overrides.postData = params.modify.body;
67
- if (params.modify.url)
362
+ if (params.modify.url !== undefined)
68
363
  overrides.url = params.modify.url;
69
- await route.continue(overrides);
70
- }
71
- else {
72
- await route.continue();
364
+ await route.fallback(overrides);
365
+ return;
73
366
  }
367
+ await route.fallback();
74
368
  };
75
- await page.route(params.urlPattern, handler);
76
- await state.addInterceptor(page, id, async () => {
77
- await page.unroute(params.urlPattern, handler);
78
- });
79
- return { interceptorId: id };
369
+ const interceptorId = await state.addRoute(toUrlMatcher(params.urlPattern), handler);
370
+ return { interceptorId };
371
+ },
372
+ });
373
+ }
374
+ export function createRemoveInterceptorTool(session) {
375
+ const state = networkStateFor(session);
376
+ return tool({
377
+ name: 'browser_remove_interceptor',
378
+ description: 'Remove a request interceptor created by browser_intercept_request or browser_block_resources. Omit interceptorId to remove all interceptors.',
379
+ category: 'web',
380
+ tags: ['browser', 'network'],
381
+ parameters: removeInterceptorSchema,
382
+ execute: async (params) => {
383
+ if (params.interceptorId === undefined) {
384
+ return { removed: await state.removeAllInterceptors() };
385
+ }
386
+ const removed = await state.removeInterceptor(params.interceptorId);
387
+ return { removed: removed ? [params.interceptorId] : [] };
80
388
  },
81
389
  });
82
390
  }
83
391
  export function createWaitForResponseTool(session) {
84
392
  return tool({
85
393
  name: 'browser_wait_for_response',
86
- description: 'Wait for an HTTP response matching a URL pattern. Returns status, headers, and body.',
394
+ description: 'Wait for an HTTP response whose URL contains the given substring (or matches /regex/flags). Returns status, headers, and body.',
87
395
  category: 'web',
88
396
  tags: ['browser', 'network'],
89
397
  parameters: waitForResponseSchema,
90
398
  execute: async (params) => {
91
399
  const page = session.page;
92
- const response = await page.waitForResponse((resp) => resp.url().includes(params.urlPattern), { timeout: params.timeout });
400
+ const matches = createUrlPredicate(params.urlPattern);
401
+ const response = await page.waitForResponse((resp) => matches(resp.url()), {
402
+ timeout: params.timeout,
403
+ });
93
404
  let body;
94
405
  try {
95
406
  body = await response.text();
@@ -106,118 +417,99 @@ export function createWaitForResponseTool(session) {
106
417
  },
107
418
  });
108
419
  }
109
- export function createBlockResourcesTool(session, state) {
420
+ export function createBlockResourcesTool(session) {
421
+ const state = networkStateFor(session);
110
422
  return tool({
111
423
  name: 'browser_block_resources',
112
- description: 'Block specific resource types (images, stylesheets, fonts, media, scripts) from loading.',
424
+ description: 'Block specific resource types (images, stylesheets, fonts, media, scripts) from loading in all tabs.',
113
425
  category: 'web',
114
426
  tags: ['browser', 'network'],
115
427
  parameters: blockResourcesSchema,
116
428
  execute: async (params) => {
117
- const page = session.page;
118
429
  const types = new Set(params.types);
119
430
  const handler = async (route) => {
120
431
  if (types.has(route.request().resourceType())) {
121
432
  await route.abort();
122
433
  }
123
434
  else {
124
- await route.continue();
435
+ await route.fallback();
125
436
  }
126
437
  };
127
- const id = state.nextId();
128
- await page.route('**/*', handler);
129
- await state.addInterceptor(page, id, async () => {
130
- await page.unroute('**/*', handler);
131
- });
132
- return { blocking: true, interceptorId: id, types: params.types };
438
+ const interceptorId = await state.addRoute('**/*', handler);
439
+ return { blocking: true, interceptorId, types: params.types };
133
440
  },
134
441
  });
135
442
  }
136
443
  export function createCaptureHarTool(session) {
137
- let harEntries = [];
138
- let harCapturing = false;
139
- let responseHandler = null;
444
+ const state = networkStateFor(session);
140
445
  return tool({
141
446
  name: 'browser_capture_har',
142
- description: 'Start or stop capturing HTTP traffic in HAR format. On stop, returns all captured entries.',
447
+ description: 'Start or stop capturing HTTP traffic of all tabs. On stop, returns the captured entries and optionally writes a HAR 1.2 file.',
143
448
  category: 'web',
144
449
  tags: ['browser', 'network'],
145
450
  parameters: captureHarSchema,
146
451
  execute: async (params) => {
147
- const page = session.page;
148
452
  if (params.action === 'start') {
149
- harEntries = [];
150
- harCapturing = true;
151
- responseHandler = async (response) => {
152
- if (!harCapturing)
153
- return;
154
- const startTime = Date.now();
155
- const resp = response;
156
- const request = resp.request();
157
- let body = '';
158
- try {
159
- body = await resp.text();
160
- }
161
- catch {
162
- /* response body may not be available */
163
- }
164
- harEntries.push({
165
- url: request.url(),
166
- method: request.method(),
167
- status: resp.status(),
168
- timing: Date.now() - startTime,
169
- requestHeaders: request.headers(),
170
- responseHeaders: resp.headers(),
171
- responseBody: body,
172
- });
173
- };
174
- page.on('response', responseHandler);
453
+ state.startHar();
175
454
  return { capturing: true, entries: 0 };
176
455
  }
177
- harCapturing = false;
178
- if (responseHandler) {
179
- page.removeListener('response', responseHandler);
180
- responseHandler = null;
181
- }
456
+ const har = await state.stopHar();
457
+ const entries = har?.entries ?? [];
458
+ let savedPath;
182
459
  if (params.path) {
183
460
  const { writeFile } = await import('node:fs/promises');
184
- await writeFile(params.path, JSON.stringify({ entries: harEntries }, null, 2));
461
+ const path = await import('node:path');
462
+ const basePath = process.cwd();
463
+ const target = path.resolve(basePath, path.normalize(params.path));
464
+ if (target !== basePath && !target.startsWith(basePath + path.sep)) {
465
+ throw new Error(`HAR output path must be within the working directory: ${params.path}`);
466
+ }
467
+ await writeFile(target, JSON.stringify(toHarLog(entries), null, 2));
468
+ savedPath = target;
185
469
  }
186
- const entries = [...harEntries];
187
- harEntries = [];
188
- return { capturing: false, entries: entries.length, har: entries };
470
+ return {
471
+ capturing: false,
472
+ entries: entries.length,
473
+ truncated: har?.truncated ?? false,
474
+ har: entries.map(toPublicHarEntry),
475
+ ...(savedPath ? { path: savedPath } : {}),
476
+ };
189
477
  },
190
478
  });
191
479
  }
192
- export function createGetApiCallsTool(session, state) {
480
+ export function createGetApiCallsTool(session) {
481
+ const state = networkStateFor(session);
193
482
  return tool({
194
483
  name: 'browser_get_api_calls',
195
- description: 'Get captured XHR/fetch API calls, optionally filtered by URL pattern or HTTP method.',
484
+ description: 'Get XHR/fetch API calls captured since the session started, optionally filtered by URL substring (or /regex/flags) and HTTP method.',
196
485
  category: 'web',
197
486
  tags: ['browser', 'network'],
198
487
  parameters: getApiCallsSchema,
199
488
  execute: async (params) => {
200
- state.startListening(session.page);
201
489
  let calls = state.apiCalls;
202
490
  if (params.urlPattern) {
203
- calls = calls.filter((c) => c.url.includes(params.urlPattern));
491
+ const matches = createUrlPredicate(params.urlPattern);
492
+ calls = calls.filter((c) => matches(c.url));
204
493
  }
205
494
  if (params.method) {
206
495
  const method = params.method.toUpperCase();
207
496
  calls = calls.filter((c) => c.method === method);
208
497
  }
209
- return { calls };
498
+ const result = { calls: [...calls] };
499
+ if (params.clear)
500
+ state.clearApiCalls();
501
+ return result;
210
502
  },
211
503
  });
212
504
  }
213
505
  export function createNetworkTools(session) {
214
- const state = new NetworkState();
215
506
  return [
216
- createInterceptRequestTool(session, state),
507
+ createInterceptRequestTool(session),
217
508
  createWaitForResponseTool(session),
218
- createBlockResourcesTool(session, state),
509
+ createBlockResourcesTool(session),
219
510
  createCaptureHarTool(session),
220
- createGetApiCallsTool(session, state),
511
+ createGetApiCallsTool(session),
512
+ createRemoveInterceptorTool(session),
221
513
  ];
222
514
  }
223
515
  //# sourceMappingURL=network.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/tools/network.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/tools/network.ts"],"names":[],"mappings":"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"}