mcp-accessibility-scanner 3.0.1 → 3.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 (85) hide show
  1. package/README.md +265 -12
  2. package/index.d.ts +1 -1
  3. package/lib/browserContextFactory.js +1161 -94
  4. package/lib/browserContextFactory.js.map +1 -1
  5. package/lib/browserServerBackend.js +199 -22
  6. package/lib/browserServerBackend.js.map +1 -1
  7. package/lib/browserSessions.js +172 -0
  8. package/lib/browserSessions.js.map +1 -0
  9. package/lib/config.js +48 -7
  10. package/lib/config.js.map +1 -1
  11. package/lib/context.js +321 -71
  12. package/lib/context.js.map +1 -1
  13. package/lib/extension/cdpRelay.js +5 -0
  14. package/lib/extension/cdpRelay.js.map +1 -1
  15. package/lib/extension/extensionContextFactory.js +12 -1
  16. package/lib/extension/extensionContextFactory.js.map +1 -1
  17. package/lib/index.js +5 -1
  18. package/lib/index.js.map +1 -1
  19. package/lib/mcp/http.js +194 -44
  20. package/lib/mcp/http.js.map +1 -1
  21. package/lib/mcp/inProcessTransport.js.map +1 -1
  22. package/lib/mcp/mdb.js +7 -9
  23. package/lib/mcp/mdb.js.map +1 -1
  24. package/lib/mcp/proxyBackend.js +76 -18
  25. package/lib/mcp/proxyBackend.js.map +1 -1
  26. package/lib/mcp/server.js +70 -41
  27. package/lib/mcp/server.js.map +1 -1
  28. package/lib/mcp/sharedClientSlot.js +134 -0
  29. package/lib/mcp/sharedClientSlot.js.map +1 -0
  30. package/lib/mcp/tool.js +3 -0
  31. package/lib/mcp/tool.js.map +1 -1
  32. package/lib/networkPolicy.js +73 -0
  33. package/lib/networkPolicy.js.map +1 -0
  34. package/lib/program.js +91 -12
  35. package/lib/program.js.map +1 -1
  36. package/lib/response.js +16 -3
  37. package/lib/response.js.map +1 -1
  38. package/lib/sessionLog.js +36 -6
  39. package/lib/sessionLog.js.map +1 -1
  40. package/lib/tab.js +149 -18
  41. package/lib/tab.js.map +1 -1
  42. package/lib/tools/auditKeyboard.js +204 -4
  43. package/lib/tools/auditKeyboard.js.map +1 -1
  44. package/lib/tools/auditScreenReader.js +823 -0
  45. package/lib/tools/auditScreenReader.js.map +1 -0
  46. package/lib/tools/auditSite.js +268 -90
  47. package/lib/tools/auditSite.js.map +1 -1
  48. package/lib/tools/axe.js +479 -21
  49. package/lib/tools/axe.js.map +1 -1
  50. package/lib/tools/dialogs.js +18 -4
  51. package/lib/tools/dialogs.js.map +1 -1
  52. package/lib/tools/evaluate.js +34 -5
  53. package/lib/tools/evaluate.js.map +1 -1
  54. package/lib/tools/network.js +136 -8
  55. package/lib/tools/network.js.map +1 -1
  56. package/lib/tools/pdf.js +5 -2
  57. package/lib/tools/pdf.js.map +1 -1
  58. package/lib/tools/scanPageMatrix.js +135 -47
  59. package/lib/tools/scanPageMatrix.js.map +1 -1
  60. package/lib/tools/screenshot.js +8 -4
  61. package/lib/tools/screenshot.js.map +1 -1
  62. package/lib/tools/session.js +53 -0
  63. package/lib/tools/session.js.map +1 -0
  64. package/lib/tools/snapshot.js +266 -8
  65. package/lib/tools/snapshot.js.map +1 -1
  66. package/lib/tools/tool.js.map +1 -1
  67. package/lib/tools/utils.js +62 -6
  68. package/lib/tools/utils.js.map +1 -1
  69. package/lib/tools.js +11 -2
  70. package/lib/tools.js.map +1 -1
  71. package/lib/utils/dataUrl.js +58 -35
  72. package/lib/utils/dataUrl.js.map +1 -1
  73. package/lib/utils/fileUtils.js +35 -0
  74. package/lib/utils/fileUtils.js.map +1 -1
  75. package/lib/utils/guid.js +8 -0
  76. package/lib/utils/guid.js.map +1 -1
  77. package/lib/utils/jsSource.js +187 -0
  78. package/lib/utils/jsSource.js.map +1 -0
  79. package/lib/vscode/browserContextFactory.js +87 -0
  80. package/lib/vscode/browserContextFactory.js.map +1 -0
  81. package/lib/vscode/host.js +189 -33
  82. package/lib/vscode/host.js.map +1 -1
  83. package/lib/vscode/main.js +3 -35
  84. package/lib/vscode/main.js.map +1 -1
  85. package/package.json +13 -9
@@ -1,8 +1,8 @@
1
1
  import fs from 'node:fs';
2
2
  import { z } from 'zod';
3
3
  import { defineTabTool } from './tool.js';
4
- import { sanitizeForFilePath } from '../utils/fileUtils.js';
5
- import { axeTagValues, dedupeAxeNodes, runAxeScan, summarizeAxeViolations, trimAxeResults } from './axe.js';
4
+ import { safeIsoTimestampForFileName, sanitizeForFilePath } from '../utils/fileUtils.js';
5
+ import { assertRuleOptionsValid, axeRuleSchemaShape, axeScopeSchemaShape, axeTagValues, defaultAxeTags, prepareAxeResults, runAxeScan, summarizeAxeViolations, } from './axe.js';
6
6
  const variantSchema = z.object({
7
7
  name: z.string().min(1).describe('Variant name.'),
8
8
  viewport: z.object({
@@ -44,23 +44,52 @@ const defaultVariants = [
44
44
  ];
45
45
  const scanPageMatrixSchema = z.object({
46
46
  variants: z.array(variantSchema).min(1).optional().describe('Variant list to run. Defaults to baseline/mobile/desktop/forced-colors/reduced-motion/zoom-200.'),
47
- violationsTag: z.array(z.enum(axeTagValues)).min(1).default([...axeTagValues]).describe('Axe tags to include in scans.'),
47
+ violationsTag: z.array(z.enum(axeTagValues)).min(1).default([...defaultAxeTags]).describe('Axe tags to include in scans.'),
48
+ includeIncomplete: z.boolean().default(true).describe('Also collect Axe "incomplete" results per variant — checks Axe could not decide automatically.'),
48
49
  maxNodesPerViolation: z.number().int().min(1).max(50).default(10).describe('Maximum nodes kept per violation in the report.'),
49
50
  waitAfterApplyMs: z.number().int().min(0).max(5000).default(250).describe('Wait after applying each variant before scanning.'),
50
51
  reloadBetweenVariants: z.boolean().default(false).describe('Reload page between variants.'),
51
52
  reportFile: z.string().optional().describe('Output JSON report file name.'),
53
+ ...axeScopeSchemaShape,
54
+ ...axeRuleSchemaShape,
52
55
  });
53
- function normalizeMedia(variantMedia) {
56
+ // Playwright has no getter for a page's media emulation, and passing null to
57
+ // emulateMedia resets a feature to the browser default rather than to whatever
58
+ // the context was created with: a context made with `colorScheme: 'dark'` reads
59
+ // light again after a null. So the effective state is measured from the page
60
+ // before the first variant and used both as the per-variant fallback and to put
61
+ // the page back afterwards - the same way the viewport and zoom already are.
62
+ async function readPageState(page) {
63
+ return await page.evaluate(() => ({
64
+ zoom: document.documentElement.style.zoom || '',
65
+ media: {
66
+ // Neither query matching is a third state, not light. Pinning it to light
67
+ // would emulate a preference the page never had, so it is left
68
+ // un-emulated - the same treatment the unrepresentable contrast values get.
69
+ colorScheme: matchMedia('(prefers-color-scheme: dark)').matches
70
+ ? 'dark'
71
+ : matchMedia('(prefers-color-scheme: light)').matches ? 'light' : null,
72
+ forcedColors: matchMedia('(forced-colors: active)').matches ? 'active' : 'none',
73
+ reducedMotion: matchMedia('(prefers-reduced-motion: reduce)').matches ? 'reduce' : 'no-preference',
74
+ // `less` and `custom` are values emulateMedia cannot express. Leaving the
75
+ // feature un-emulated reproduces them exactly, naming a value cannot.
76
+ contrast: matchMedia('(prefers-contrast: more)').matches
77
+ ? 'more'
78
+ : matchMedia('(prefers-contrast: no-preference)').matches ? 'no-preference' : null,
79
+ },
80
+ }));
81
+ }
82
+ // An unset property means "whatever this page had before the scan started", not
83
+ // "the browser default" - undoing the previous variant must not also undo the
84
+ // media emulation the session was configured with.
85
+ function normalizeMedia(variantMedia, original) {
54
86
  return {
55
- colorScheme: variantMedia?.colorScheme ?? null,
56
- forcedColors: variantMedia?.forcedColors ?? null,
57
- contrast: variantMedia?.contrast ?? null,
58
- reducedMotion: variantMedia?.reducedMotion ?? null,
87
+ colorScheme: variantMedia?.colorScheme ?? original.colorScheme,
88
+ forcedColors: variantMedia?.forcedColors ?? original.forcedColors,
89
+ contrast: variantMedia?.contrast ?? original.contrast,
90
+ reducedMotion: variantMedia?.reducedMotion ?? original.reducedMotion,
59
91
  };
60
92
  }
61
- function safeIsoTimestampForFileName() {
62
- return sanitizeForFilePath(new Date().toISOString());
63
- }
64
93
  function countNodesByRule(violations) {
65
94
  const counts = {};
66
95
  for (const violation of violations)
@@ -92,47 +121,65 @@ const scanPageMatrix = defineTabTool({
92
121
  type: 'destructive',
93
122
  },
94
123
  handle: async (tab, params, response) => {
124
+ // Rule ids apply to the whole run, so a bad one must fail before the first
125
+ // variant is applied. The finally block restores viewport/media/zoom, but
126
+ // reloadBetweenVariants has already thrown away form and application state
127
+ // by the time the per-scan check would reject the argument.
128
+ assertRuleOptionsValid({ rules: params.withRules, disableRules: params.disableRules });
95
129
  const variants = params.variants ?? defaultVariants;
96
130
  const originalViewport = tab.page.viewportSize() ?? await tab.page.evaluate(() => ({
97
131
  width: window.innerWidth,
98
132
  height: window.innerHeight,
99
133
  }));
100
- const originalZoom = await tab.page.evaluate(() => document.documentElement.style.zoom || '');
134
+ const { zoom: originalZoom, media: originalMedia } = await readPageState(tab.page);
101
135
  const variantResults = [];
102
136
  try {
103
137
  for (const variant of variants) {
104
138
  // Apply each property once per variant: the variant value when set,
105
139
  // otherwise the original page state (undoing the previous variant).
140
+ // Strictly in this order, not in parallel: a page that reacts to a
141
+ // viewport or media change by writing document.documentElement.style.zoom
142
+ // would overwrite a zoom applied alongside it, and the variant would be
143
+ // scanned - and reported - at a zoom it never actually had.
106
144
  await tab.page.setViewportSize(variant.viewport ?? originalViewport);
107
- await tab.page.emulateMedia(normalizeMedia(variant.media));
145
+ // One value, applied and then reported, so `applied.media` cannot drift
146
+ // from what the variant was actually scanned under.
147
+ const media = normalizeMedia(variant.media, originalMedia);
148
+ await tab.page.emulateMedia(media);
149
+ // Before the zoom, not after it. Viewport and media emulation survive a
150
+ // reload, but the zoom is an inline style on documentElement and the new
151
+ // document does not have it - applying it first would scan the variant
152
+ // unzoomed while `applied.zoomPercent` still claimed the requested zoom.
153
+ if (params.reloadBetweenVariants)
154
+ await tab.page.reload({ waitUntil: 'domcontentloaded' });
108
155
  await tab.page.evaluate(zoom => {
109
156
  document.documentElement.style.zoom = zoom;
110
157
  }, variant.zoomPercent !== undefined ? `${variant.zoomPercent}%` : originalZoom);
111
- if (params.reloadBetweenVariants)
112
- await tab.page.reload({ waitUntil: 'domcontentloaded' });
113
158
  await tab.waitForTimeout(params.waitAfterApplyMs);
114
- const axeResult = await runAxeScan(tab.page, params.violationsTag);
115
- const dedupedViolations = axeResult.violations.map(violation => ({
116
- ...violation,
117
- nodes: dedupeAxeNodes(violation.nodes),
118
- }));
119
- const trimmedViolations = trimAxeResults({ violations: dedupedViolations }, { maxNodesPerViolation: params.maxNodesPerViolation, dedupe: false });
120
- const nodeCountByRuleId = countNodesByRule(dedupedViolations);
159
+ const axeResult = await runAxeScan(tab.page, {
160
+ tags: params.violationsTag,
161
+ rules: params.withRules,
162
+ disableRules: params.disableRules,
163
+ include: params.includeSelectors,
164
+ exclude: params.excludeSelectors,
165
+ });
166
+ const violations = prepareAxeResults(axeResult.violations, params.maxNodesPerViolation);
167
+ const nodeCountByRuleId = countNodesByRule(violations.deduped);
121
168
  variantResults.push({
122
169
  name: variant.name,
123
170
  applied: {
124
171
  viewport: variant.viewport ?? null,
125
- media: normalizeMedia(variant.media),
172
+ media,
126
173
  zoomPercent: variant.zoomPercent ?? null,
127
174
  },
128
- summary: summarizeAxeViolations(trimmedViolations),
129
- violations: trimmedViolations,
175
+ summary: summarizeAxeViolations(violations.trimmed),
176
+ unscannedFrames: axeResult.unscannedFrames,
177
+ violations: violations.trimmed,
178
+ incomplete: params.includeIncomplete
179
+ ? prepareAxeResults(axeResult.incomplete, params.maxNodesPerViolation).trimmed
180
+ : [],
130
181
  nodeCountByRuleId,
131
- diffFromBaseline: {
132
- newViolationIds: [],
133
- resolvedViolationIds: [],
134
- changedCounts: {},
135
- },
182
+ diffFromBaseline: null,
136
183
  });
137
184
  await response.reportProgress({
138
185
  progress: variantResults.length,
@@ -140,29 +187,42 @@ const scanPageMatrix = defineTabTool({
140
187
  message: `Scanned variant ${variantResults.length}/${variants.length}: ${variant.name}`,
141
188
  });
142
189
  }
143
- const baselineCounts = variantResults[0]?.nodeCountByRuleId ?? {};
144
- for (const result of variantResults)
145
- result.diffFromBaseline = computeDiffFromBaseline(baselineCounts, result.nodeCountByRuleId);
190
+ const baseline = variantResults[0];
191
+ const baselineCounts = baseline?.nodeCountByRuleId ?? {};
192
+ for (const result of variantResults) {
193
+ // Only comparable when both sides scanned the same documents. With a
194
+ // frame missed on either side, a rule absent from one run may simply
195
+ // live in the document that went unscanned, and calling that "resolved"
196
+ // - or its reappearance "new" - states an accessibility outcome the run
197
+ // cannot support. The warning already says coverage differs; the
198
+ // numbers must not quietly contradict it.
199
+ const comparable = !result.unscannedFrames.length && !baseline?.unscannedFrames.length;
200
+ result.diffFromBaseline = comparable
201
+ ? computeDiffFromBaseline(baselineCounts, result.nodeCountByRuleId)
202
+ : null;
203
+ }
146
204
  }
147
205
  finally {
206
+ // Same ordering as the apply path, and for the same reason.
148
207
  await tab.page.setViewportSize(originalViewport);
149
- await tab.page.emulateMedia({
150
- colorScheme: null,
151
- forcedColors: null,
152
- contrast: null,
153
- reducedMotion: null,
154
- });
208
+ await tab.page.emulateMedia(originalMedia);
155
209
  await tab.page.evaluate(zoom => {
156
210
  document.documentElement.style.zoom = zoom;
157
211
  }, originalZoom);
158
212
  }
159
213
  const report = {
160
- version: 'v1',
214
+ // v2 allows diffFromBaseline to be null when scan coverage differs.
215
+ version: 'v2',
161
216
  metadata: {
162
217
  url: tab.page.url(),
163
218
  baselineVariant: variantResults[0]?.name ?? 'baseline',
164
219
  options: {
165
220
  violationsTag: params.violationsTag,
221
+ includeIncomplete: params.includeIncomplete,
222
+ includeSelectors: params.includeSelectors ?? null,
223
+ excludeSelectors: params.excludeSelectors ?? null,
224
+ withRules: params.withRules ?? null,
225
+ disableRules: params.disableRules ?? null,
166
226
  maxNodesPerViolation: params.maxNodesPerViolation,
167
227
  waitAfterApplyMs: params.waitAfterApplyMs,
168
228
  reloadBetweenVariants: params.reloadBetweenVariants,
@@ -182,6 +242,7 @@ const scanPageMatrix = defineTabTool({
182
242
  });
183
243
  response.setStructuredContent({
184
244
  kind: 'scan_page_matrix',
245
+ version: 'v2',
185
246
  report: {
186
247
  path: reportPath,
187
248
  uri: reportResourceLink.uri,
@@ -197,18 +258,45 @@ const scanPageMatrix = defineTabTool({
197
258
  name: result.name,
198
259
  totalViolations: result.summary.totalRules,
199
260
  totalNodes: result.summary.totalNodes,
200
- newViolationIds: result.diffFromBaseline.newViolationIds,
201
- resolvedViolationIds: result.diffFromBaseline.resolvedViolationIds,
202
- changedRuleIds: Object.keys(result.diffFromBaseline.changedCounts),
261
+ // null, not 0, when collection is off: structuredContent does not carry
262
+ // includeIncomplete, so a 0 here is indistinguishable from a variant
263
+ // with no needs-review findings. Matches the "-" in the markdown table.
264
+ totalIncomplete: params.includeIncomplete ? result.incomplete.length : null,
265
+ // Without this a client reading only structured output cannot tell a
266
+ // partly-scanned variant from a clean one.
267
+ unscannedFrames: result.unscannedFrames,
268
+ // null, not [], when the coverage differs from the baseline's: an empty
269
+ // list reads as "nothing changed", which is the one thing an incomplete
270
+ // pair of scans cannot establish.
271
+ newViolationIds: result.diffFromBaseline?.newViolationIds ?? null,
272
+ resolvedViolationIds: result.diffFromBaseline?.resolvedViolationIds ?? null,
273
+ changedRuleIds: result.diffFromBaseline ? Object.keys(result.diffFromBaseline.changedCounts) : null,
203
274
  reportUri: reportResourceLink.uri,
204
275
  })),
205
276
  });
277
+ const variantsWithUnscannedFrames = variantResults.filter(result => result.unscannedFrames.length);
206
278
  const lines = [
207
- 'Variant | Violations | Nodes | Top new vs baseline',
208
- '--- | --- | --- | ---',
279
+ ...(variantsWithUnscannedFrames.length ? [
280
+ `WARNING: Axe could not be installed in frames on ${variantsWithUnscannedFrames.length} variant(s); their contents were not scanned and contribute no findings below.`,
281
+ ...variantsWithUnscannedFrames.map(result => `- ${result.name}: ${result.unscannedFrames.join(', ')}`),
282
+ 'Baseline deltas are reported as "n/a" wherever the two scans did not cover the same documents.',
283
+ '',
284
+ ] : []),
285
+ 'Variant | Violations | Nodes | Incomplete | Top new vs baseline',
286
+ '--- | --- | --- | --- | ---',
209
287
  ...variantResults.map(result => {
210
- const topNew = result.diffFromBaseline.newViolationIds.slice(0, 5).join(', ') || '-';
211
- return `${result.name} | ${result.summary.totalRules} | ${result.summary.totalNodes} | ${topNew}`;
288
+ // "n/a" rather than "-": "-" means "compared, nothing new", which is a
289
+ // claim a pair of scans with differing coverage cannot make. The reason
290
+ // names neither side, because the gap may be in the baseline - in which
291
+ // case every other row is uncomparable through no fault of its own.
292
+ const topNew = result.diffFromBaseline
293
+ ? result.diffFromBaseline.newViolationIds.slice(0, 5).join(', ') || '-'
294
+ : 'n/a (coverage differs)';
295
+ // "-" rather than 0: with collection off, 0 is indistinguishable from
296
+ // "no needs-review findings". audit_site omits its section for the same
297
+ // reason.
298
+ const incomplete = params.includeIncomplete ? String(result.incomplete.length) : '-';
299
+ return `${result.name} | ${result.summary.totalRules} | ${result.summary.totalNodes} | ${incomplete} | ${topNew}`;
212
300
  }),
213
301
  '',
214
302
  `JSON report: ${reportPath}`,
@@ -1 +1 @@
1
- {"version":3,"file":"scanPageMatrix.js","sourceRoot":"","sources":["../../src/tools/scanPageMatrix.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scanPageMatrix.js","sourceRoot":"","sources":["../../src/tools/scanPageMatrix.ts"],"names":[],"mappings":"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"}
@@ -16,11 +16,12 @@
16
16
  import { z } from 'zod';
17
17
  import { defineTabTool } from './tool.js';
18
18
  import * as javascript from '../utils/codegen.js';
19
+ import { safeIsoTimestampForFileName } from '../utils/fileUtils.js';
19
20
  import { generateLocator } from './utils.js';
20
21
  const screenshotSchema = z.object({
21
- type: z.enum(['png', 'jpeg']).default('png').describe('Image format for the screenshot. Default is png.'),
22
+ type: z.enum(['png', 'jpeg', 'webp']).default('png').describe('Image format for the screenshot. Default is png.'),
22
23
  scale: z.enum(['css', 'device']).default('css').describe(`Image resolution scale. 'css' produces a screenshot sized in CSS pixels (smaller, consistent across devices). 'device' produces a high-resolution screenshot using device pixels (larger, accounts for the device pixel ratio). Default is css.`),
23
- filename: z.string().optional().describe('File name to save the screenshot to. Defaults to `page-{timestamp}.{png|jpeg}` if not specified.'),
24
+ filename: z.string().optional().describe('File name to save the screenshot to. Defaults to `page-{timestamp}-{token}.{png|jpeg|webp}` if not specified (the random token keeps concurrent sessions from overwriting each other).'),
24
25
  element: z.string().optional().describe('Human-readable element description used to obtain permission to screenshot the element. If not provided, the screenshot will be taken of viewport. If element is provided, ref must be provided too.'),
25
26
  ref: z.string().optional().describe('Exact target element reference from the page snapshot. If not provided, the screenshot will be taken of viewport. If ref is provided, element must be provided too.'),
26
27
  fullPage: z.boolean().optional().describe('When true, takes a screenshot of the full scrollable page, instead of the currently visible viewport. Cannot be used with element screenshots.'),
@@ -46,7 +47,10 @@ const screenshot = defineTabTool({
46
47
  },
47
48
  handle: async (tab, params, response) => {
48
49
  const fileType = params.type || 'png';
49
- const fileName = await tab.context.outputFile(params.filename ?? `page-${new Date().toISOString()}.${fileType}`);
50
+ // The default name carries a random token besides the timestamp: sessions
51
+ // share one output directory, and two same-millisecond screenshots would
52
+ // otherwise overwrite each other. User-specified filenames stay untouched.
53
+ const fileName = await tab.context.outputFile(params.filename ?? `page-${safeIsoTimestampForFileName()}.${fileType}`);
50
54
  const options = {
51
55
  type: fileType,
52
56
  quality: fileType === 'png' ? undefined : 90,
@@ -69,7 +73,7 @@ const screenshot = defineTabTool({
69
73
  // Never return large images to LLM, saving them to the file system is enough.
70
74
  if (!params.fullPage) {
71
75
  response.addImage({
72
- contentType: fileType === 'png' ? 'image/png' : 'image/jpeg',
76
+ contentType: `image/${fileType}`,
73
77
  data: buffer
74
78
  });
75
79
  }
@@ -1 +1 @@
1
- {"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/tools/screenshot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/tools/screenshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { z } from 'zod';
17
+ import { defineTool } from './tool.js';
18
+ const open = defineTool({
19
+ capability: 'core',
20
+ schema: {
21
+ name: 'browser_session_open',
22
+ title: 'Open browser session',
23
+ description: 'Open a separate browser session — its own browser context with its own tabs, cookies and storage — and return its browserSessionId. Pass that id as the optional browserSessionId argument of the non-session browser tools to run them in this session instead of the default one. Unavailable in modes that share one live browser context (non-isolated CDP attach, extension); such modes reject the call instead of handing out a session that is not separate. Idle sessions expire automatically, so close the session with browser_session_close when done.',
24
+ inputSchema: z.object({}),
25
+ type: 'stateChanging',
26
+ },
27
+ handle: async (context, _params, response) => {
28
+ const browserSessionId = await context.browserSessions().open();
29
+ response.addResult(`Opened browser session "${browserSessionId}". Pass browserSessionId: "${browserSessionId}" to other browser tools to use it.`);
30
+ response.setStructuredContent({ browserSessionId });
31
+ },
32
+ });
33
+ const close = defineTool({
34
+ capability: 'core',
35
+ schema: {
36
+ name: 'browser_session_close',
37
+ title: 'Close browser session',
38
+ description: 'Close a browser session previously opened with browser_session_open and release its browser resources. The default session cannot be closed this way.',
39
+ inputSchema: z.object({
40
+ browserSessionId: z.string().describe('The browser session handle to close, as returned by browser_session_open'),
41
+ }),
42
+ type: 'destructive',
43
+ },
44
+ handle: async (context, params, response) => {
45
+ await context.browserSessions().close(params.browserSessionId);
46
+ response.addResult(`Closed browser session "${params.browserSessionId}".`);
47
+ },
48
+ });
49
+ export default [
50
+ open,
51
+ close,
52
+ ];
53
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/tools/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,IAAI,GAAG,UAAU,CAAC;IACtB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE;QACN,IAAI,EAAE,sBAAsB;QAC5B,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,qiBAAqiB;QACljB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,IAAI,EAAE,eAAe;KACtB;IACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;QAC3C,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,CAAC;QAChE,QAAQ,CAAC,SAAS,CAAC,2BAA2B,gBAAgB,8BAA8B,gBAAgB,qCAAqC,CAAC,CAAC;QACnJ,QAAQ,CAAC,oBAAoB,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACtD,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,KAAK,GAAG,UAAU,CAAC;IACvB,UAAU,EAAE,MAAM;IAClB,MAAM,EAAE;QACN,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,uJAAuJ;QACpK,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0EAA0E,CAAC;SAClH,CAAC;QACF,IAAI,EAAE,aAAa;KACpB;IACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QAC1C,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC/D,QAAQ,CAAC,SAAS,CAAC,2BAA2B,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;IAC7E,CAAC;CACF,CAAC,CAAC;AAEH,eAAe;IACb,IAAI;IACJ,KAAK;CACN,CAAC"}