e2e-pilot 0.0.69

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 (152) hide show
  1. package/bin.js +3 -0
  2. package/dist/aria-snapshot.d.ts +95 -0
  3. package/dist/aria-snapshot.d.ts.map +1 -0
  4. package/dist/aria-snapshot.js +490 -0
  5. package/dist/aria-snapshot.js.map +1 -0
  6. package/dist/bippy.js +971 -0
  7. package/dist/cdp-relay.d.ts +16 -0
  8. package/dist/cdp-relay.d.ts.map +1 -0
  9. package/dist/cdp-relay.js +715 -0
  10. package/dist/cdp-relay.js.map +1 -0
  11. package/dist/cdp-session.d.ts +42 -0
  12. package/dist/cdp-session.d.ts.map +1 -0
  13. package/dist/cdp-session.js +154 -0
  14. package/dist/cdp-session.js.map +1 -0
  15. package/dist/cdp-types.d.ts +63 -0
  16. package/dist/cdp-types.d.ts.map +1 -0
  17. package/dist/cdp-types.js +91 -0
  18. package/dist/cdp-types.js.map +1 -0
  19. package/dist/cli.d.ts +3 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +213 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/create-logger.d.ts +9 -0
  24. package/dist/create-logger.d.ts.map +1 -0
  25. package/dist/create-logger.js +25 -0
  26. package/dist/create-logger.js.map +1 -0
  27. package/dist/debugger-api.md +458 -0
  28. package/dist/debugger-examples-types.d.ts +24 -0
  29. package/dist/debugger-examples-types.d.ts.map +1 -0
  30. package/dist/debugger-examples-types.js +2 -0
  31. package/dist/debugger-examples-types.js.map +1 -0
  32. package/dist/debugger-examples.d.ts +6 -0
  33. package/dist/debugger-examples.d.ts.map +1 -0
  34. package/dist/debugger-examples.js +53 -0
  35. package/dist/debugger-examples.js.map +1 -0
  36. package/dist/debugger.d.ts +381 -0
  37. package/dist/debugger.d.ts.map +1 -0
  38. package/dist/debugger.js +633 -0
  39. package/dist/debugger.js.map +1 -0
  40. package/dist/editor-api.md +364 -0
  41. package/dist/editor-examples.d.ts +11 -0
  42. package/dist/editor-examples.d.ts.map +1 -0
  43. package/dist/editor-examples.js +124 -0
  44. package/dist/editor-examples.js.map +1 -0
  45. package/dist/editor.d.ts +203 -0
  46. package/dist/editor.d.ts.map +1 -0
  47. package/dist/editor.js +336 -0
  48. package/dist/editor.js.map +1 -0
  49. package/dist/execute.d.ts +50 -0
  50. package/dist/execute.d.ts.map +1 -0
  51. package/dist/execute.js +576 -0
  52. package/dist/execute.js.map +1 -0
  53. package/dist/index.d.ts +11 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +7 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/mcp-client.d.ts +20 -0
  58. package/dist/mcp-client.d.ts.map +1 -0
  59. package/dist/mcp-client.js +56 -0
  60. package/dist/mcp-client.js.map +1 -0
  61. package/dist/mcp.d.ts +5 -0
  62. package/dist/mcp.d.ts.map +1 -0
  63. package/dist/mcp.js +720 -0
  64. package/dist/mcp.js.map +1 -0
  65. package/dist/mcp.test.d.ts +10 -0
  66. package/dist/mcp.test.d.ts.map +1 -0
  67. package/dist/mcp.test.js +2999 -0
  68. package/dist/mcp.test.js.map +1 -0
  69. package/dist/network-capture.d.ts +23 -0
  70. package/dist/network-capture.d.ts.map +1 -0
  71. package/dist/network-capture.js +98 -0
  72. package/dist/network-capture.js.map +1 -0
  73. package/dist/protocol.d.ts +54 -0
  74. package/dist/protocol.d.ts.map +1 -0
  75. package/dist/protocol.js +2 -0
  76. package/dist/protocol.js.map +1 -0
  77. package/dist/react-source.d.ts +13 -0
  78. package/dist/react-source.d.ts.map +1 -0
  79. package/dist/react-source.js +68 -0
  80. package/dist/react-source.js.map +1 -0
  81. package/dist/scoped-fs.d.ts +94 -0
  82. package/dist/scoped-fs.d.ts.map +1 -0
  83. package/dist/scoped-fs.js +356 -0
  84. package/dist/scoped-fs.js.map +1 -0
  85. package/dist/selector-generator.js +8126 -0
  86. package/dist/start-relay-server.d.ts +6 -0
  87. package/dist/start-relay-server.d.ts.map +1 -0
  88. package/dist/start-relay-server.js +33 -0
  89. package/dist/start-relay-server.js.map +1 -0
  90. package/dist/styles-api.md +117 -0
  91. package/dist/styles-examples.d.ts +8 -0
  92. package/dist/styles-examples.d.ts.map +1 -0
  93. package/dist/styles-examples.js +64 -0
  94. package/dist/styles-examples.js.map +1 -0
  95. package/dist/styles.d.ts +27 -0
  96. package/dist/styles.d.ts.map +1 -0
  97. package/dist/styles.js +234 -0
  98. package/dist/styles.js.map +1 -0
  99. package/dist/trace-utils.d.ts +14 -0
  100. package/dist/trace-utils.d.ts.map +1 -0
  101. package/dist/trace-utils.js +21 -0
  102. package/dist/trace-utils.js.map +1 -0
  103. package/dist/utils.d.ts +20 -0
  104. package/dist/utils.d.ts.map +1 -0
  105. package/dist/utils.js +75 -0
  106. package/dist/utils.js.map +1 -0
  107. package/dist/wait-for-page-load.d.ts +16 -0
  108. package/dist/wait-for-page-load.d.ts.map +1 -0
  109. package/dist/wait-for-page-load.js +127 -0
  110. package/dist/wait-for-page-load.js.map +1 -0
  111. package/package.json +67 -0
  112. package/src/aria-snapshot.ts +610 -0
  113. package/src/assets/aria-labels-github-snapshot.txt +605 -0
  114. package/src/assets/aria-labels-github.png +0 -0
  115. package/src/assets/aria-labels-google-snapshot.txt +49 -0
  116. package/src/assets/aria-labels-google.png +0 -0
  117. package/src/assets/aria-labels-hacker-news-snapshot.txt +1023 -0
  118. package/src/assets/aria-labels-hacker-news.png +0 -0
  119. package/src/cdp-relay.ts +925 -0
  120. package/src/cdp-session.ts +203 -0
  121. package/src/cdp-timing.md +128 -0
  122. package/src/cdp-types.ts +155 -0
  123. package/src/cli.ts +250 -0
  124. package/src/create-logger.ts +36 -0
  125. package/src/debugger-examples-types.ts +13 -0
  126. package/src/debugger-examples.ts +66 -0
  127. package/src/debugger.md +453 -0
  128. package/src/debugger.ts +713 -0
  129. package/src/editor-examples.ts +148 -0
  130. package/src/editor.ts +390 -0
  131. package/src/execute.ts +763 -0
  132. package/src/index.ts +10 -0
  133. package/src/mcp-client.ts +78 -0
  134. package/src/mcp.test.ts +3596 -0
  135. package/src/mcp.ts +876 -0
  136. package/src/network-capture.ts +140 -0
  137. package/src/prompt.bak.md +323 -0
  138. package/src/prompt.md +7 -0
  139. package/src/protocol.ts +63 -0
  140. package/src/react-source.ts +94 -0
  141. package/src/resource.md +436 -0
  142. package/src/scoped-fs.ts +411 -0
  143. package/src/snapshots/hacker-news-focused-accessibility.md +202 -0
  144. package/src/snapshots/hacker-news-initial-accessibility.md +11 -0
  145. package/src/snapshots/hacker-news-tabbed-accessibility.md +202 -0
  146. package/src/snapshots/shadcn-ui-accessibility.md +11 -0
  147. package/src/start-relay-server.ts +43 -0
  148. package/src/styles-examples.ts +77 -0
  149. package/src/styles.ts +345 -0
  150. package/src/trace-utils.ts +43 -0
  151. package/src/utils.ts +91 -0
  152. package/src/wait-for-page-load.ts +174 -0
package/bin.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ import './dist/cli.js'
@@ -0,0 +1,95 @@
1
+ import type { Page, Locator, ElementHandle } from 'playwright-core';
2
+ export interface AriaRef {
3
+ role: string;
4
+ name: string;
5
+ ref: string;
6
+ }
7
+ export interface ScreenshotResult {
8
+ path: string;
9
+ base64: string;
10
+ mimeType: 'image/jpeg';
11
+ snapshot: string;
12
+ labelCount: number;
13
+ }
14
+ export interface AriaSnapshotResult {
15
+ snapshot: string;
16
+ refToElement: Map<string, {
17
+ role: string;
18
+ name: string;
19
+ }>;
20
+ refHandles: Array<{
21
+ ref: string;
22
+ handle: ElementHandle;
23
+ }>;
24
+ getRefsForLocators: (locators: Array<Locator | ElementHandle>) => Promise<Array<AriaRef | null>>;
25
+ getRefForLocator: (locator: Locator | ElementHandle) => Promise<AriaRef | null>;
26
+ getRefStringForLocator: (locator: Locator | ElementHandle) => Promise<string | null>;
27
+ }
28
+ /**
29
+ * Get an accessibility snapshot with utilities to look up aria refs for elements.
30
+ * Uses Playwright's internal aria-ref selector engine.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * const { snapshot, getRefsForLocators } = await getAriaSnapshot({ page })
35
+ * const refs = await getRefsForLocators([page.locator('button'), page.locator('a')])
36
+ * // refs[0].ref is e.g. "e5" - use page.locator('aria-ref=e5') to select
37
+ * ```
38
+ */
39
+ export declare function getAriaSnapshot({ page }: {
40
+ page: Page;
41
+ }): Promise<AriaSnapshotResult>;
42
+ /**
43
+ * Show Vimium-style labels on interactive elements.
44
+ * Labels are yellow badges positioned above each element showing the aria ref (e.g., "e1", "e2").
45
+ * Use with screenshots so agents can see which elements are interactive.
46
+ *
47
+ * Labels auto-hide after 30 seconds to prevent stale labels remaining on the page.
48
+ * Call this function again if the page HTML changes to get fresh labels.
49
+ *
50
+ * By default, only shows labels for truly interactive roles (button, link, textbox, etc.)
51
+ * to reduce visual clutter. Set `interactiveOnly: false` to show all elements with refs.
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * const { snapshot, labelCount } = await showAriaRefLabels({ page })
56
+ * await page.screenshot({ path: '/tmp/screenshot.png' })
57
+ * // Agent sees [e5] label on "Submit" button
58
+ * await page.locator('aria-ref=e5').click()
59
+ * // Labels auto-hide after 30 seconds, or call hideAriaRefLabels() manually
60
+ * ```
61
+ */
62
+ export declare function showAriaRefLabels({ page, interactiveOnly }: {
63
+ page: Page;
64
+ interactiveOnly?: boolean;
65
+ }): Promise<{
66
+ snapshot: string;
67
+ labelCount: number;
68
+ }>;
69
+ /**
70
+ * Remove all aria ref labels from the page.
71
+ */
72
+ export declare function hideAriaRefLabels({ page }: {
73
+ page: Page;
74
+ }): Promise<void>;
75
+ /**
76
+ * Take a screenshot with accessibility labels overlaid on interactive elements.
77
+ * Shows Vimium-style labels, captures the screenshot, then removes the labels.
78
+ * The screenshot is automatically included in the MCP response.
79
+ *
80
+ * @param collector - Array to collect screenshots (passed by MCP execute tool)
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * await screenshotWithAccessibilityLabels({ page })
85
+ * // Screenshot is automatically included in the MCP response
86
+ * // Use aria-ref from the snapshot to interact with elements
87
+ * await page.locator('aria-ref=e5').click()
88
+ * ```
89
+ */
90
+ export declare function screenshotWithAccessibilityLabels({ page, interactiveOnly, collector }: {
91
+ page: Page;
92
+ interactiveOnly?: boolean;
93
+ collector: ScreenshotResult[];
94
+ }): Promise<void>;
95
+ //# sourceMappingURL=aria-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aria-snapshot.d.ts","sourceRoot":"","sources":["../src/aria-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAKnE,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,YAAY,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACzD,UAAU,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE,CAAC,CAAA;IACzD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,GAAG,aAAa,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAA;IAChG,gBAAgB,EAAE,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;IAC/E,sBAAsB,EAAE,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;CACrF;AAsFD;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0F3F;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,IAAI,EAAE,eAAsB,EAAE,EAAE;IACxE,IAAI,EAAE,IAAI,CAAA;IACV,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,GAAG,OAAO,CAAC;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAC,CA4RD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAc/E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iCAAiC,CAAC,EAAE,IAAI,EAAE,eAAsB,EAAE,SAAS,EAAE,EAAE;IACnG,IAAI,EAAE,IAAI,CAAA;IACV,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,SAAS,EAAE,gBAAgB,EAAE,CAAA;CAC9B,GAAG,OAAO,CAAC,IAAI,CAAC,CA4ChB"}
@@ -0,0 +1,490 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ const LABELS_CONTAINER_ID = '__e2e_pilot_labels__';
4
+ // Roles that represent interactive elements (clickable, typeable) and media elements
5
+ const INTERACTIVE_ROLES = new Set([
6
+ 'button',
7
+ 'link',
8
+ 'textbox',
9
+ 'combobox',
10
+ 'searchbox',
11
+ 'checkbox',
12
+ 'radio',
13
+ 'slider',
14
+ 'spinbutton',
15
+ 'switch',
16
+ 'menuitem',
17
+ 'menuitemcheckbox',
18
+ 'menuitemradio',
19
+ 'option',
20
+ 'tab',
21
+ 'treeitem',
22
+ // Media elements - useful for visual tasks
23
+ 'img',
24
+ 'video',
25
+ 'audio',
26
+ ]);
27
+ // Color categories for different role types - warm color scheme
28
+ // Format: [gradient-top, gradient-bottom, border]
29
+ const ROLE_COLORS = {
30
+ // Links - yellow (Vimium-style)
31
+ link: ['#FFF785', '#FFC542', '#E3BE23'],
32
+ // Buttons - orange
33
+ button: ['#FFE0B2', '#FFCC80', '#FFB74D'],
34
+ // Text inputs - coral/red
35
+ textbox: ['#FFCDD2', '#EF9A9A', '#E57373'],
36
+ combobox: ['#FFCDD2', '#EF9A9A', '#E57373'],
37
+ searchbox: ['#FFCDD2', '#EF9A9A', '#E57373'],
38
+ spinbutton: ['#FFCDD2', '#EF9A9A', '#E57373'],
39
+ // Checkboxes/Radios/Switches - warm pink
40
+ checkbox: ['#F8BBD0', '#F48FB1', '#EC407A'],
41
+ radio: ['#F8BBD0', '#F48FB1', '#EC407A'],
42
+ switch: ['#F8BBD0', '#F48FB1', '#EC407A'],
43
+ // Sliders - peach
44
+ slider: ['#FFCCBC', '#FFAB91', '#FF8A65'],
45
+ // Menu items - salmon
46
+ menuitem: ['#FFAB91', '#FF8A65', '#FF7043'],
47
+ menuitemcheckbox: ['#FFAB91', '#FF8A65', '#FF7043'],
48
+ menuitemradio: ['#FFAB91', '#FF8A65', '#FF7043'],
49
+ // Tabs/Options - amber
50
+ tab: ['#FFE082', '#FFD54F', '#FFC107'],
51
+ option: ['#FFE082', '#FFD54F', '#FFC107'],
52
+ treeitem: ['#FFE082', '#FFD54F', '#FFC107'],
53
+ // Media elements - light blue
54
+ img: ['#B3E5FC', '#81D4FA', '#4FC3F7'],
55
+ video: ['#B3E5FC', '#81D4FA', '#4FC3F7'],
56
+ audio: ['#B3E5FC', '#81D4FA', '#4FC3F7'],
57
+ };
58
+ // Default yellow for unknown roles
59
+ const DEFAULT_COLORS = ['#FFF785', '#FFC542', '#E3BE23'];
60
+ // Use String.raw for CSS syntax highlighting in editors
61
+ const css = String.raw;
62
+ const LABEL_STYLES = css `
63
+ .__pw_label__ {
64
+ position: absolute;
65
+ font: bold 12px Helvetica, Arial, sans-serif;
66
+ padding: 1px 4px;
67
+ border-radius: 3px;
68
+ color: black;
69
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6);
70
+ white-space: nowrap;
71
+ }
72
+ `;
73
+ const CONTAINER_STYLES = css `
74
+ position: absolute;
75
+ left: 0;
76
+ top: 0;
77
+ z-index: 2147483647;
78
+ pointer-events: none;
79
+ `;
80
+ /**
81
+ * Get an accessibility snapshot with utilities to look up aria refs for elements.
82
+ * Uses Playwright's internal aria-ref selector engine.
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * const { snapshot, getRefsForLocators } = await getAriaSnapshot({ page })
87
+ * const refs = await getRefsForLocators([page.locator('button'), page.locator('a')])
88
+ * // refs[0].ref is e.g. "e5" - use page.locator('aria-ref=e5') to select
89
+ * ```
90
+ */
91
+ export async function getAriaSnapshot({ page }) {
92
+ const snapshotMethod = page._snapshotForAI;
93
+ if (!snapshotMethod) {
94
+ throw new Error('_snapshotForAI not available. Ensure you are using Playwright.');
95
+ }
96
+ const snapshot = await snapshotMethod.call(page);
97
+ // Sanitize to remove unpaired surrogates that break JSON encoding for Claude API
98
+ const rawStr = typeof snapshot === 'string' ? snapshot : (snapshot.full || JSON.stringify(snapshot, null, 2));
99
+ const snapshotStr = rawStr.toWellFormed?.() ?? rawStr;
100
+ // Discover refs by probing aria-ref=e1, e2, e3... until 10 consecutive misses
101
+ const refToElement = new Map();
102
+ const refHandles = [];
103
+ let consecutiveMisses = 0;
104
+ let refNum = 1;
105
+ while (consecutiveMisses < 10) {
106
+ const ref = `e${refNum++}`;
107
+ try {
108
+ const locator = page.locator(`aria-ref=${ref}`);
109
+ if (await locator.count() === 1) {
110
+ consecutiveMisses = 0;
111
+ const [info, handle] = await Promise.all([
112
+ locator.evaluate((el) => ({
113
+ role: el.getAttribute('role') || {
114
+ a: el.hasAttribute('href') ? 'link' : 'generic',
115
+ button: 'button', input: { button: 'button', checkbox: 'checkbox', radio: 'radio',
116
+ text: 'textbox', search: 'searchbox', number: 'spinbutton', range: 'slider',
117
+ }[el.type] || 'textbox', select: 'combobox', textarea: 'textbox', img: 'img',
118
+ nav: 'navigation', main: 'main', header: 'banner', footer: 'contentinfo',
119
+ }[el.tagName.toLowerCase()] || 'generic',
120
+ name: el.getAttribute('aria-label') || el.textContent?.trim() || el.placeholder || '',
121
+ })),
122
+ locator.elementHandle({ timeout: 1000 }),
123
+ ]);
124
+ refToElement.set(ref, info);
125
+ if (handle) {
126
+ refHandles.push({ ref, handle });
127
+ }
128
+ }
129
+ else {
130
+ consecutiveMisses++;
131
+ }
132
+ }
133
+ catch {
134
+ consecutiveMisses++;
135
+ }
136
+ }
137
+ // Find refs for multiple locators in a single evaluate call
138
+ const getRefsForLocators = async (locators) => {
139
+ if (locators.length === 0 || refHandles.length === 0) {
140
+ return locators.map(() => null);
141
+ }
142
+ const targetHandles = await Promise.all(locators.map(async (loc) => {
143
+ try {
144
+ return 'elementHandle' in loc
145
+ ? await loc.elementHandle({ timeout: 1000 })
146
+ : loc;
147
+ }
148
+ catch {
149
+ return null;
150
+ }
151
+ }));
152
+ const matchingRefs = await page.evaluate(({ targets, candidates }) => targets.map((target) => {
153
+ if (!target)
154
+ return null;
155
+ return candidates.find(({ element }) => element === target)?.ref ?? null;
156
+ }), { targets: targetHandles, candidates: refHandles.map(({ ref, handle }) => ({ ref, element: handle })) });
157
+ return matchingRefs.map((ref) => {
158
+ if (!ref)
159
+ return null;
160
+ const info = refToElement.get(ref);
161
+ return info ? { ...info, ref } : null;
162
+ });
163
+ };
164
+ return {
165
+ snapshot: snapshotStr,
166
+ refToElement,
167
+ refHandles,
168
+ getRefsForLocators,
169
+ getRefForLocator: async (loc) => (await getRefsForLocators([loc]))[0],
170
+ getRefStringForLocator: async (loc) => (await getRefsForLocators([loc]))[0]?.ref ?? null,
171
+ };
172
+ }
173
+ /**
174
+ * Show Vimium-style labels on interactive elements.
175
+ * Labels are yellow badges positioned above each element showing the aria ref (e.g., "e1", "e2").
176
+ * Use with screenshots so agents can see which elements are interactive.
177
+ *
178
+ * Labels auto-hide after 30 seconds to prevent stale labels remaining on the page.
179
+ * Call this function again if the page HTML changes to get fresh labels.
180
+ *
181
+ * By default, only shows labels for truly interactive roles (button, link, textbox, etc.)
182
+ * to reduce visual clutter. Set `interactiveOnly: false` to show all elements with refs.
183
+ *
184
+ * @example
185
+ * ```ts
186
+ * const { snapshot, labelCount } = await showAriaRefLabels({ page })
187
+ * await page.screenshot({ path: '/tmp/screenshot.png' })
188
+ * // Agent sees [e5] label on "Submit" button
189
+ * await page.locator('aria-ref=e5').click()
190
+ * // Labels auto-hide after 30 seconds, or call hideAriaRefLabels() manually
191
+ * ```
192
+ */
193
+ export async function showAriaRefLabels({ page, interactiveOnly = true }) {
194
+ const { snapshot, refHandles, refToElement } = await getAriaSnapshot({ page });
195
+ // Filter to only interactive elements if requested
196
+ const filteredRefs = interactiveOnly
197
+ ? refHandles.filter(({ ref }) => {
198
+ const info = refToElement.get(ref);
199
+ return info && INTERACTIVE_ROLES.has(info.role);
200
+ })
201
+ : refHandles;
202
+ // Build refs with role info for color coding
203
+ const refsWithRoles = filteredRefs.map(({ ref, handle }) => ({
204
+ ref,
205
+ element: handle,
206
+ role: refToElement.get(ref)?.role || 'generic',
207
+ }));
208
+ // Single evaluate call: create container, styles, and all labels
209
+ // ElementHandles get unwrapped to DOM elements in browser context
210
+ const labelCount = await page.evaluate(
211
+ // Using 'any' for browser types since this runs in browser context
212
+ function ({ refs, containerId, containerStyles, labelStyles, roleColors, defaultColors }) {
213
+ // Polyfill esbuild's __name helper which gets injected by vite-node but doesn't exist in browser
214
+ ;
215
+ globalThis.__name ||= (fn) => fn;
216
+ const doc = globalThis.document;
217
+ const win = globalThis;
218
+ // Cancel any pending auto-hide timer from previous call
219
+ const timerKey = '__e2e_pilot_labels_timer__';
220
+ if (win[timerKey]) {
221
+ win.clearTimeout(win[timerKey]);
222
+ win[timerKey] = null;
223
+ }
224
+ // Remove existing labels if present (idempotent)
225
+ doc.getElementById(containerId)?.remove();
226
+ // Create container - absolute positioned, max z-index, no pointer events
227
+ const container = doc.createElement('div');
228
+ container.id = containerId;
229
+ container.style.cssText = containerStyles;
230
+ // Inject base label CSS
231
+ const style = doc.createElement('style');
232
+ style.textContent = labelStyles;
233
+ container.appendChild(style);
234
+ // Track placed label rectangles for overlap detection
235
+ // Each rect is { left, top, right, bottom } in viewport coordinates
236
+ const placedLabels = [];
237
+ // Estimate label dimensions (12px font + padding)
238
+ const LABEL_HEIGHT = 17;
239
+ const LABEL_CHAR_WIDTH = 7; // approximate width per character
240
+ // Parse alpha from rgb/rgba color string (getComputedStyle always returns these formats)
241
+ function getColorAlpha(color) {
242
+ if (color === 'transparent') {
243
+ return 0;
244
+ }
245
+ // Match rgba(r, g, b, a) or rgb(r, g, b)
246
+ const match = color.match(/rgba?\(\s*[\d.]+\s*,\s*[\d.]+\s*,\s*[\d.]+\s*(?:,\s*([\d.]+)\s*)?\)/);
247
+ if (match) {
248
+ return match[1] !== undefined ? parseFloat(match[1]) : 1;
249
+ }
250
+ return 1; // Default to opaque for unrecognized formats
251
+ }
252
+ // Check if an element has an opaque background that would block elements behind it
253
+ function isOpaqueElement(el) {
254
+ const style = win.getComputedStyle(el);
255
+ // Check element opacity
256
+ const opacity = parseFloat(style.opacity);
257
+ if (opacity < 0.1) {
258
+ return false;
259
+ }
260
+ // Check background-color alpha
261
+ const bgAlpha = getColorAlpha(style.backgroundColor);
262
+ if (bgAlpha > 0.1) {
263
+ return true;
264
+ }
265
+ // Check if has background-image (usually opaque)
266
+ if (style.backgroundImage !== 'none') {
267
+ return true;
268
+ }
269
+ return false;
270
+ }
271
+ // Check if element is visible (not covered by opaque overlay)
272
+ function isElementVisible(element, rect) {
273
+ const centerX = rect.left + rect.width / 2;
274
+ const centerY = rect.top + rect.height / 2;
275
+ // Get all elements at this point, from top to bottom
276
+ const stack = doc.elementsFromPoint(centerX, centerY);
277
+ // Find our target element in the stack
278
+ let targetIndex = -1;
279
+ for (let i = 0; i < stack.length; i++) {
280
+ if (element.contains(stack[i]) || stack[i].contains(element)) {
281
+ targetIndex = i;
282
+ break;
283
+ }
284
+ }
285
+ // Element not in stack at all - not visible
286
+ if (targetIndex === -1) {
287
+ return false;
288
+ }
289
+ // Check if any opaque element is above our target
290
+ for (let i = 0; i < targetIndex; i++) {
291
+ const el = stack[i];
292
+ // Skip our own overlay container
293
+ if (el.id === containerId) {
294
+ continue;
295
+ }
296
+ // Skip pointer-events: none elements (decorative overlays)
297
+ if (win.getComputedStyle(el).pointerEvents === 'none') {
298
+ continue;
299
+ }
300
+ // If this element is opaque, our target is blocked
301
+ if (isOpaqueElement(el)) {
302
+ return false;
303
+ }
304
+ }
305
+ return true;
306
+ }
307
+ // Check if two rectangles overlap
308
+ function rectsOverlap(a, b) {
309
+ return a.left < b.right && a.right > b.left && a.top < b.bottom && a.bottom > b.top;
310
+ }
311
+ // Create SVG for connector lines
312
+ const svg = doc.createElementNS('http://www.w3.org/2000/svg', 'svg');
313
+ svg.style.cssText = 'position:absolute;left:0;top:0;pointer-events:none;overflow:visible;';
314
+ svg.setAttribute('width', `${doc.documentElement.scrollWidth}`);
315
+ svg.setAttribute('height', `${doc.documentElement.scrollHeight}`);
316
+ // Create defs for arrow markers (one per color)
317
+ const defs = doc.createElementNS('http://www.w3.org/2000/svg', 'defs');
318
+ svg.appendChild(defs);
319
+ const markerCache = {};
320
+ function getArrowMarkerId(color) {
321
+ if (markerCache[color]) {
322
+ return markerCache[color];
323
+ }
324
+ const markerId = `arrow-${color.replace('#', '')}`;
325
+ const marker = doc.createElementNS('http://www.w3.org/2000/svg', 'marker');
326
+ marker.setAttribute('id', markerId);
327
+ marker.setAttribute('viewBox', '0 0 10 10');
328
+ marker.setAttribute('refX', '9');
329
+ marker.setAttribute('refY', '5');
330
+ marker.setAttribute('markerWidth', '6');
331
+ marker.setAttribute('markerHeight', '6');
332
+ marker.setAttribute('orient', 'auto-start-reverse');
333
+ const path = doc.createElementNS('http://www.w3.org/2000/svg', 'path');
334
+ path.setAttribute('d', 'M 0 0 L 10 5 L 0 10 z');
335
+ path.setAttribute('fill', color);
336
+ marker.appendChild(path);
337
+ defs.appendChild(marker);
338
+ markerCache[color] = markerId;
339
+ return markerId;
340
+ }
341
+ container.appendChild(svg);
342
+ // Create label for each interactive element
343
+ let count = 0;
344
+ for (const { ref, role, element } of refs) {
345
+ const rect = element.getBoundingClientRect();
346
+ // Skip elements with no size (hidden)
347
+ if (rect.width === 0 || rect.height === 0) {
348
+ continue;
349
+ }
350
+ // Skip elements that are covered by opaque overlays
351
+ if (!isElementVisible(element, rect)) {
352
+ continue;
353
+ }
354
+ // Calculate label position and dimensions
355
+ const labelWidth = ref.length * LABEL_CHAR_WIDTH + 8; // +8 for padding
356
+ const labelLeft = rect.left;
357
+ const labelTop = Math.max(0, rect.top - LABEL_HEIGHT);
358
+ const labelRect = {
359
+ left: labelLeft,
360
+ top: labelTop,
361
+ right: labelLeft + labelWidth,
362
+ bottom: labelTop + LABEL_HEIGHT,
363
+ };
364
+ // Skip if this label would overlap with any already-placed label
365
+ let overlaps = false;
366
+ for (const placed of placedLabels) {
367
+ if (rectsOverlap(labelRect, placed)) {
368
+ overlaps = true;
369
+ break;
370
+ }
371
+ }
372
+ if (overlaps) {
373
+ continue;
374
+ }
375
+ // Get colors for this role
376
+ const [gradTop, gradBottom, border] = roleColors[role] || defaultColors;
377
+ // Place the label
378
+ const label = doc.createElement('div');
379
+ label.className = '__pw_label__';
380
+ label.textContent = ref;
381
+ label.style.background = `linear-gradient(to bottom, ${gradTop} 0%, ${gradBottom} 100%)`;
382
+ label.style.border = `1px solid ${border}`;
383
+ // Position above element, accounting for scroll
384
+ label.style.left = `${win.scrollX + labelLeft}px`;
385
+ label.style.top = `${win.scrollY + labelTop}px`;
386
+ container.appendChild(label);
387
+ // Draw connector line from label bottom-center to element center with arrow
388
+ const line = doc.createElementNS('http://www.w3.org/2000/svg', 'line');
389
+ const labelCenterX = win.scrollX + labelLeft + labelWidth / 2;
390
+ const labelBottomY = win.scrollY + labelTop + LABEL_HEIGHT;
391
+ const elementCenterX = win.scrollX + rect.left + rect.width / 2;
392
+ const elementCenterY = win.scrollY + rect.top + rect.height / 2;
393
+ line.setAttribute('x1', `${labelCenterX}`);
394
+ line.setAttribute('y1', `${labelBottomY}`);
395
+ line.setAttribute('x2', `${elementCenterX}`);
396
+ line.setAttribute('y2', `${elementCenterY}`);
397
+ line.setAttribute('stroke', border);
398
+ line.setAttribute('stroke-width', '1.5');
399
+ line.setAttribute('marker-end', `url(#${getArrowMarkerId(border)})`);
400
+ svg.appendChild(line);
401
+ placedLabels.push(labelRect);
402
+ count++;
403
+ }
404
+ doc.documentElement.appendChild(container);
405
+ // Auto-hide labels after 30 seconds to prevent stale labels
406
+ // Store timer ID so it can be cancelled if showAriaRefLabels is called again
407
+ win[timerKey] = win.setTimeout(function () {
408
+ doc.getElementById(containerId)?.remove();
409
+ win[timerKey] = null;
410
+ }, 30000);
411
+ return count;
412
+ }, {
413
+ refs: refsWithRoles.map(({ ref, role, element }) => ({ ref, role, element })),
414
+ containerId: LABELS_CONTAINER_ID,
415
+ containerStyles: CONTAINER_STYLES,
416
+ labelStyles: LABEL_STYLES,
417
+ roleColors: ROLE_COLORS,
418
+ defaultColors: DEFAULT_COLORS,
419
+ });
420
+ return { snapshot, labelCount };
421
+ }
422
+ /**
423
+ * Remove all aria ref labels from the page.
424
+ */
425
+ export async function hideAriaRefLabels({ page }) {
426
+ await page.evaluate((id) => {
427
+ const doc = globalThis.document;
428
+ const win = globalThis;
429
+ // Cancel any pending auto-hide timer
430
+ const timerKey = '__e2e_pilot_labels_timer__';
431
+ if (win[timerKey]) {
432
+ win.clearTimeout(win[timerKey]);
433
+ win[timerKey] = null;
434
+ }
435
+ doc.getElementById(id)?.remove();
436
+ }, LABELS_CONTAINER_ID);
437
+ }
438
+ /**
439
+ * Take a screenshot with accessibility labels overlaid on interactive elements.
440
+ * Shows Vimium-style labels, captures the screenshot, then removes the labels.
441
+ * The screenshot is automatically included in the MCP response.
442
+ *
443
+ * @param collector - Array to collect screenshots (passed by MCP execute tool)
444
+ *
445
+ * @example
446
+ * ```ts
447
+ * await screenshotWithAccessibilityLabels({ page })
448
+ * // Screenshot is automatically included in the MCP response
449
+ * // Use aria-ref from the snapshot to interact with elements
450
+ * await page.locator('aria-ref=e5').click()
451
+ * ```
452
+ */
453
+ export async function screenshotWithAccessibilityLabels({ page, interactiveOnly = true, collector }) {
454
+ // Show labels and get snapshot
455
+ const { snapshot, labelCount } = await showAriaRefLabels({ page, interactiveOnly });
456
+ // Generate unique filename with timestamp
457
+ const timestamp = Date.now();
458
+ const random = Math.random().toString(36).slice(2, 6);
459
+ const filename = `e2e-pilot-screenshot-${timestamp}-${random}.jpg`;
460
+ // Use ./tmp folder (gitignored) instead of system temp
461
+ const tmpDir = path.join(process.cwd(), 'tmp');
462
+ if (!fs.existsSync(tmpDir)) {
463
+ fs.mkdirSync(tmpDir, { recursive: true });
464
+ }
465
+ const screenshotPath = path.join(tmpDir, filename);
466
+ // Get actual viewport size (innerWidth/innerHeight, not outer window size)
467
+ const viewport = await page.evaluate('(() => ({ width: window.innerWidth, height: window.innerHeight }))()');
468
+ // Take screenshot clipped to actual viewport (excludes browser chrome)
469
+ const buffer = await page.screenshot({
470
+ type: 'jpeg',
471
+ quality: 80,
472
+ scale: 'css',
473
+ clip: { x: 0, y: 0, width: viewport.width, height: viewport.height },
474
+ });
475
+ // Save to file
476
+ fs.writeFileSync(screenshotPath, buffer);
477
+ // Convert to base64
478
+ const base64 = buffer.toString('base64');
479
+ // Hide labels
480
+ await hideAriaRefLabels({ page });
481
+ // Add to collector array
482
+ collector.push({
483
+ path: screenshotPath,
484
+ base64,
485
+ mimeType: 'image/jpeg',
486
+ snapshot,
487
+ labelCount,
488
+ });
489
+ }
490
+ //# sourceMappingURL=aria-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aria-snapshot.js","sourceRoot":"","sources":["../src/aria-snapshot.ts"],"names":[],"mappings":"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"}