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.
- package/bin.js +3 -0
- package/dist/aria-snapshot.d.ts +95 -0
- package/dist/aria-snapshot.d.ts.map +1 -0
- package/dist/aria-snapshot.js +490 -0
- package/dist/aria-snapshot.js.map +1 -0
- package/dist/bippy.js +971 -0
- package/dist/cdp-relay.d.ts +16 -0
- package/dist/cdp-relay.d.ts.map +1 -0
- package/dist/cdp-relay.js +715 -0
- package/dist/cdp-relay.js.map +1 -0
- package/dist/cdp-session.d.ts +42 -0
- package/dist/cdp-session.d.ts.map +1 -0
- package/dist/cdp-session.js +154 -0
- package/dist/cdp-session.js.map +1 -0
- package/dist/cdp-types.d.ts +63 -0
- package/dist/cdp-types.d.ts.map +1 -0
- package/dist/cdp-types.js +91 -0
- package/dist/cdp-types.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +213 -0
- package/dist/cli.js.map +1 -0
- package/dist/create-logger.d.ts +9 -0
- package/dist/create-logger.d.ts.map +1 -0
- package/dist/create-logger.js +25 -0
- package/dist/create-logger.js.map +1 -0
- package/dist/debugger-api.md +458 -0
- package/dist/debugger-examples-types.d.ts +24 -0
- package/dist/debugger-examples-types.d.ts.map +1 -0
- package/dist/debugger-examples-types.js +2 -0
- package/dist/debugger-examples-types.js.map +1 -0
- package/dist/debugger-examples.d.ts +6 -0
- package/dist/debugger-examples.d.ts.map +1 -0
- package/dist/debugger-examples.js +53 -0
- package/dist/debugger-examples.js.map +1 -0
- package/dist/debugger.d.ts +381 -0
- package/dist/debugger.d.ts.map +1 -0
- package/dist/debugger.js +633 -0
- package/dist/debugger.js.map +1 -0
- package/dist/editor-api.md +364 -0
- package/dist/editor-examples.d.ts +11 -0
- package/dist/editor-examples.d.ts.map +1 -0
- package/dist/editor-examples.js +124 -0
- package/dist/editor-examples.js.map +1 -0
- package/dist/editor.d.ts +203 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/editor.js +336 -0
- package/dist/editor.js.map +1 -0
- package/dist/execute.d.ts +50 -0
- package/dist/execute.d.ts.map +1 -0
- package/dist/execute.js +576 -0
- package/dist/execute.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-client.d.ts +20 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +56 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/mcp.d.ts +5 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +720 -0
- package/dist/mcp.js.map +1 -0
- package/dist/mcp.test.d.ts +10 -0
- package/dist/mcp.test.d.ts.map +1 -0
- package/dist/mcp.test.js +2999 -0
- package/dist/mcp.test.js.map +1 -0
- package/dist/network-capture.d.ts +23 -0
- package/dist/network-capture.d.ts.map +1 -0
- package/dist/network-capture.js +98 -0
- package/dist/network-capture.js.map +1 -0
- package/dist/protocol.d.ts +54 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +2 -0
- package/dist/protocol.js.map +1 -0
- package/dist/react-source.d.ts +13 -0
- package/dist/react-source.d.ts.map +1 -0
- package/dist/react-source.js +68 -0
- package/dist/react-source.js.map +1 -0
- package/dist/scoped-fs.d.ts +94 -0
- package/dist/scoped-fs.d.ts.map +1 -0
- package/dist/scoped-fs.js +356 -0
- package/dist/scoped-fs.js.map +1 -0
- package/dist/selector-generator.js +8126 -0
- package/dist/start-relay-server.d.ts +6 -0
- package/dist/start-relay-server.d.ts.map +1 -0
- package/dist/start-relay-server.js +33 -0
- package/dist/start-relay-server.js.map +1 -0
- package/dist/styles-api.md +117 -0
- package/dist/styles-examples.d.ts +8 -0
- package/dist/styles-examples.d.ts.map +1 -0
- package/dist/styles-examples.js +64 -0
- package/dist/styles-examples.js.map +1 -0
- package/dist/styles.d.ts +27 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +234 -0
- package/dist/styles.js.map +1 -0
- package/dist/trace-utils.d.ts +14 -0
- package/dist/trace-utils.d.ts.map +1 -0
- package/dist/trace-utils.js +21 -0
- package/dist/trace-utils.js.map +1 -0
- package/dist/utils.d.ts +20 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +75 -0
- package/dist/utils.js.map +1 -0
- package/dist/wait-for-page-load.d.ts +16 -0
- package/dist/wait-for-page-load.d.ts.map +1 -0
- package/dist/wait-for-page-load.js +127 -0
- package/dist/wait-for-page-load.js.map +1 -0
- package/package.json +67 -0
- package/src/aria-snapshot.ts +610 -0
- package/src/assets/aria-labels-github-snapshot.txt +605 -0
- package/src/assets/aria-labels-github.png +0 -0
- package/src/assets/aria-labels-google-snapshot.txt +49 -0
- package/src/assets/aria-labels-google.png +0 -0
- package/src/assets/aria-labels-hacker-news-snapshot.txt +1023 -0
- package/src/assets/aria-labels-hacker-news.png +0 -0
- package/src/cdp-relay.ts +925 -0
- package/src/cdp-session.ts +203 -0
- package/src/cdp-timing.md +128 -0
- package/src/cdp-types.ts +155 -0
- package/src/cli.ts +250 -0
- package/src/create-logger.ts +36 -0
- package/src/debugger-examples-types.ts +13 -0
- package/src/debugger-examples.ts +66 -0
- package/src/debugger.md +453 -0
- package/src/debugger.ts +713 -0
- package/src/editor-examples.ts +148 -0
- package/src/editor.ts +390 -0
- package/src/execute.ts +763 -0
- package/src/index.ts +10 -0
- package/src/mcp-client.ts +78 -0
- package/src/mcp.test.ts +3596 -0
- package/src/mcp.ts +876 -0
- package/src/network-capture.ts +140 -0
- package/src/prompt.bak.md +323 -0
- package/src/prompt.md +7 -0
- package/src/protocol.ts +63 -0
- package/src/react-source.ts +94 -0
- package/src/resource.md +436 -0
- package/src/scoped-fs.ts +411 -0
- package/src/snapshots/hacker-news-focused-accessibility.md +202 -0
- package/src/snapshots/hacker-news-initial-accessibility.md +11 -0
- package/src/snapshots/hacker-news-tabbed-accessibility.md +202 -0
- package/src/snapshots/shadcn-ui-accessibility.md +11 -0
- package/src/start-relay-server.ts +43 -0
- package/src/styles-examples.ts +77 -0
- package/src/styles.ts +345 -0
- package/src/trace-utils.ts +43 -0
- package/src/utils.ts +91 -0
- package/src/wait-for-page-load.ts +174 -0
package/dist/execute.js
ADDED
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
import { expect } from '@playwright/test';
|
|
2
|
+
import crypto from 'node:crypto';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { createRequire } from 'node:module';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import vm from 'node:vm';
|
|
8
|
+
import { waitForPageLoad } from './wait-for-page-load.js';
|
|
9
|
+
import { getCDPSessionForPage } from './cdp-session.js';
|
|
10
|
+
import { Debugger } from './debugger.js';
|
|
11
|
+
import { Editor } from './editor.js';
|
|
12
|
+
import { getStylesForLocator, formatStylesAsText } from './styles.js';
|
|
13
|
+
import { getReactSource } from './react-source.js';
|
|
14
|
+
import { ScopedFS } from './scoped-fs.js';
|
|
15
|
+
import { screenshotWithAccessibilityLabels } from './aria-snapshot.js';
|
|
16
|
+
import { formatAsCommentLines, formatDateTimeForPath } from './utils.js';
|
|
17
|
+
import { setupNetworkCapture, saveNetworkRequests } from './network-capture.js';
|
|
18
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
19
|
+
const __dirname = path.dirname(__filename);
|
|
20
|
+
const require = createRequire(import.meta.url);
|
|
21
|
+
// Extracts all unique aria-ref patterns (e.g., 'aria-ref=e12') from code
|
|
22
|
+
function extractAriaRefs(code) {
|
|
23
|
+
const pattern = /['"`]aria-ref=(e\d+)['"`]/g;
|
|
24
|
+
const refs = new Set();
|
|
25
|
+
let match;
|
|
26
|
+
while ((match = pattern.exec(code)) !== null) {
|
|
27
|
+
refs.add(match[1]);
|
|
28
|
+
}
|
|
29
|
+
return [...refs];
|
|
30
|
+
}
|
|
31
|
+
class CodeExecutionTimeoutError extends Error {
|
|
32
|
+
constructor(timeout) {
|
|
33
|
+
super(`Code execution timed out after ${timeout}ms`);
|
|
34
|
+
this.name = 'CodeExecutionTimeoutError';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const usefulGlobals = {
|
|
38
|
+
setTimeout,
|
|
39
|
+
setInterval,
|
|
40
|
+
clearTimeout,
|
|
41
|
+
clearInterval,
|
|
42
|
+
URL,
|
|
43
|
+
URLSearchParams,
|
|
44
|
+
fetch,
|
|
45
|
+
Buffer,
|
|
46
|
+
TextEncoder,
|
|
47
|
+
TextDecoder,
|
|
48
|
+
crypto,
|
|
49
|
+
AbortController,
|
|
50
|
+
AbortSignal,
|
|
51
|
+
structuredClone,
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Allowlist of Node.js built-in modules that are safe to use in the sandbox.
|
|
55
|
+
*/
|
|
56
|
+
const ALLOWED_MODULES = new Set([
|
|
57
|
+
'path',
|
|
58
|
+
'node:path',
|
|
59
|
+
'url',
|
|
60
|
+
'node:url',
|
|
61
|
+
'querystring',
|
|
62
|
+
'node:querystring',
|
|
63
|
+
'punycode',
|
|
64
|
+
'node:punycode',
|
|
65
|
+
'crypto',
|
|
66
|
+
'node:crypto',
|
|
67
|
+
'buffer',
|
|
68
|
+
'node:buffer',
|
|
69
|
+
'string_decoder',
|
|
70
|
+
'node:string_decoder',
|
|
71
|
+
'util',
|
|
72
|
+
'node:util',
|
|
73
|
+
'assert',
|
|
74
|
+
'node:assert',
|
|
75
|
+
'events',
|
|
76
|
+
'node:events',
|
|
77
|
+
'timers',
|
|
78
|
+
'node:timers',
|
|
79
|
+
'stream',
|
|
80
|
+
'node:stream',
|
|
81
|
+
'zlib',
|
|
82
|
+
'node:zlib',
|
|
83
|
+
'http',
|
|
84
|
+
'node:http',
|
|
85
|
+
'https',
|
|
86
|
+
'node:https',
|
|
87
|
+
'http2',
|
|
88
|
+
'node:http2',
|
|
89
|
+
'os',
|
|
90
|
+
'node:os',
|
|
91
|
+
'fs',
|
|
92
|
+
'node:fs',
|
|
93
|
+
]);
|
|
94
|
+
function createSandboxedRequire(originalRequire, scopedFs) {
|
|
95
|
+
const sandboxedRequire = ((id) => {
|
|
96
|
+
if (!ALLOWED_MODULES.has(id)) {
|
|
97
|
+
const error = new Error(`Module "${id}" is not allowed in the sandbox. ` +
|
|
98
|
+
`Only safe Node.js built-ins are permitted: ${[...ALLOWED_MODULES].filter((m) => !m.startsWith('node:')).join(', ')}`);
|
|
99
|
+
error.name = 'ModuleNotAllowedError';
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
if (id === 'fs' || id === 'node:fs') {
|
|
103
|
+
return scopedFs;
|
|
104
|
+
}
|
|
105
|
+
return originalRequire(id);
|
|
106
|
+
});
|
|
107
|
+
sandboxedRequire.resolve = originalRequire.resolve;
|
|
108
|
+
sandboxedRequire.cache = originalRequire.cache;
|
|
109
|
+
sandboxedRequire.extensions = originalRequire.extensions;
|
|
110
|
+
sandboxedRequire.main = originalRequire.main;
|
|
111
|
+
return sandboxedRequire;
|
|
112
|
+
}
|
|
113
|
+
function isRegExp(value) {
|
|
114
|
+
return (typeof value === 'object' &&
|
|
115
|
+
value !== null &&
|
|
116
|
+
typeof value.test === 'function' &&
|
|
117
|
+
typeof value.exec === 'function');
|
|
118
|
+
}
|
|
119
|
+
async function snapshot(options) {
|
|
120
|
+
const { page, timeout } = options;
|
|
121
|
+
if (!page._snapshotForAI) {
|
|
122
|
+
console.error('snapshotForAI is not available on this page');
|
|
123
|
+
return { full: null, incremental: null };
|
|
124
|
+
}
|
|
125
|
+
// use fixed `track` so it always compare to previous run.
|
|
126
|
+
const snapshot = await page._snapshotForAI({ timeout, track: 'track' });
|
|
127
|
+
if (!snapshot) {
|
|
128
|
+
console.error('_snapshotForAI returned null/undefined');
|
|
129
|
+
return { full: null, incremental: null };
|
|
130
|
+
}
|
|
131
|
+
const fullSnapshot = snapshot.full?.toWellFormed?.() ?? snapshot.full ?? null;
|
|
132
|
+
const incrementalSnapshot = snapshot.incremental?.toWellFormed?.() ?? snapshot.incremental ?? null;
|
|
133
|
+
return { full: fullSnapshot, incremental: incrementalSnapshot };
|
|
134
|
+
}
|
|
135
|
+
export async function savePageSnapshots({ page, lastSnapshots, timeout, }) {
|
|
136
|
+
try {
|
|
137
|
+
const { full, incremental } = await snapshot({ page, timeout });
|
|
138
|
+
const now = new Date();
|
|
139
|
+
const dateTimeStr = formatDateTimeForPath(now);
|
|
140
|
+
const snapshotDir = path.join(process.cwd(), '.e2e-pilot', 'snapshots', dateTimeStr);
|
|
141
|
+
fs.mkdirSync(snapshotDir, { recursive: true });
|
|
142
|
+
const fullPath = path.join(snapshotDir, 'full.txt');
|
|
143
|
+
const incrementalPath = path.join(snapshotDir, 'incremental.txt');
|
|
144
|
+
if (full) {
|
|
145
|
+
lastSnapshots.set(page, full);
|
|
146
|
+
fs.writeFileSync(fullPath, full, 'utf-8');
|
|
147
|
+
}
|
|
148
|
+
if (incremental) {
|
|
149
|
+
fs.writeFileSync(incrementalPath, incremental, 'utf-8');
|
|
150
|
+
}
|
|
151
|
+
return { fullPath, incrementalPath, full, incremental };
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
console.error('savePageSnapshots error:', err);
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
export async function executeCode({ code, timeout, deps, }) {
|
|
159
|
+
const { page, context, userState, browserLogs, lastSnapshots, cdpSessionCache, getPageTargetId, getCdpUrl, resetConnection, logger, sendLogToRelayServer, intend, activeRecordingPath, } = deps;
|
|
160
|
+
// Will be populated before VM execution with resolved aria-ref -> stable locator mappings
|
|
161
|
+
// See docs/recording.md for the recording design and why pre-resolution is needed
|
|
162
|
+
// All refs include html for debugging; resolved refs also have the stable locator
|
|
163
|
+
let ariaRefResolutions = null;
|
|
164
|
+
const appendToRecording = (options) => {
|
|
165
|
+
if (!activeRecordingPath || !intend) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
let recordedCode = code;
|
|
170
|
+
const ariaRefComments = [];
|
|
171
|
+
// Replace aria-ref locators with stable locators, collect HTML comments for all refs
|
|
172
|
+
if (ariaRefResolutions && ariaRefResolutions.size > 0) {
|
|
173
|
+
for (const [ref, resolution] of ariaRefResolutions) {
|
|
174
|
+
const patterns = [
|
|
175
|
+
new RegExp(`locator\\(['"]aria-ref=${ref}['"]\\)`, 'g'),
|
|
176
|
+
new RegExp(`locator\\(\`aria-ref=${ref}\`\\)`, 'g'),
|
|
177
|
+
];
|
|
178
|
+
if (resolution.resolved) {
|
|
179
|
+
// Replace with stable locator, add .first() to avoid strict mode violations
|
|
180
|
+
for (const pattern of patterns) {
|
|
181
|
+
recordedCode = recordedCode.replace(pattern, `${resolution.locator}.first()`);
|
|
182
|
+
}
|
|
183
|
+
// // Add comment with HTML for debugging
|
|
184
|
+
// ariaRefComments.push(`// aria-ref=${ref} resolved - element HTML: ${resolution.html}`)
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
// Keep aria-ref, add comment with HTML for manual resolution
|
|
188
|
+
ariaRefComments.push(`// UNRESOLVED aria-ref=${ref} - element HTML: ${resolution.html}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
let entry = `// ${intend}\n`;
|
|
193
|
+
if (ariaRefComments.length > 0) {
|
|
194
|
+
entry += ariaRefComments.join('\n') + '\n';
|
|
195
|
+
}
|
|
196
|
+
entry += `${recordedCode}\n`;
|
|
197
|
+
if (options.failed) {
|
|
198
|
+
entry += formatAsCommentLines(`FAILED: ${options.failed}`) + '\n';
|
|
199
|
+
}
|
|
200
|
+
entry += '\n';
|
|
201
|
+
fs.appendFileSync(activeRecordingPath, entry, 'utf-8');
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// Silently fail if we can't write to the recording
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
const consoleLogs = [];
|
|
208
|
+
const scopedFs = new ScopedFS();
|
|
209
|
+
const sandboxedRequire = createSandboxedRequire(require, scopedFs);
|
|
210
|
+
const formatConsoleLogs = (logs, prefix = 'Console output') => {
|
|
211
|
+
if (logs.length === 0) {
|
|
212
|
+
return '';
|
|
213
|
+
}
|
|
214
|
+
let text = `${prefix}:\n`;
|
|
215
|
+
logs.forEach(({ method, args }) => {
|
|
216
|
+
const formattedArgs = args
|
|
217
|
+
.map((arg) => {
|
|
218
|
+
if (typeof arg === 'object') {
|
|
219
|
+
return JSON.stringify(arg, null, 2);
|
|
220
|
+
}
|
|
221
|
+
return String(arg);
|
|
222
|
+
})
|
|
223
|
+
.join(' ');
|
|
224
|
+
text += `[${method}] ${formattedArgs}\n`;
|
|
225
|
+
});
|
|
226
|
+
return text + '\n';
|
|
227
|
+
};
|
|
228
|
+
// Network request capture during code execution (attach to all pages in context)
|
|
229
|
+
const networkCapture = setupNetworkCapture({ context });
|
|
230
|
+
try {
|
|
231
|
+
logger('Executing code:', code);
|
|
232
|
+
const customConsole = {
|
|
233
|
+
log: (...args) => {
|
|
234
|
+
consoleLogs.push({ method: 'log', args });
|
|
235
|
+
},
|
|
236
|
+
info: (...args) => {
|
|
237
|
+
consoleLogs.push({ method: 'info', args });
|
|
238
|
+
},
|
|
239
|
+
warn: (...args) => {
|
|
240
|
+
consoleLogs.push({ method: 'warn', args });
|
|
241
|
+
},
|
|
242
|
+
error: (...args) => {
|
|
243
|
+
consoleLogs.push({ method: 'error', args });
|
|
244
|
+
},
|
|
245
|
+
debug: (...args) => {
|
|
246
|
+
consoleLogs.push({ method: 'debug', args });
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
const accessibilitySnapshot = async (options) => {
|
|
250
|
+
const { page: targetPage, search, contextLines = 10, showDiffSinceLastCall = false, timeout = 5000 } = options;
|
|
251
|
+
if (targetPage._snapshotForAI) {
|
|
252
|
+
const { full, incremental } = await snapshot({ page: targetPage, timeout });
|
|
253
|
+
if (!full) {
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
lastSnapshots.set(targetPage, full);
|
|
257
|
+
if (showDiffSinceLastCall) {
|
|
258
|
+
return incremental;
|
|
259
|
+
}
|
|
260
|
+
if (!search) {
|
|
261
|
+
return full;
|
|
262
|
+
}
|
|
263
|
+
// XXX: consider remove search. just let it grep.
|
|
264
|
+
const lines = full.split('\n');
|
|
265
|
+
const matches = [];
|
|
266
|
+
for (let i = 0; i < lines.length; i++) {
|
|
267
|
+
const line = lines[i];
|
|
268
|
+
let isMatch = false;
|
|
269
|
+
if (isRegExp(search)) {
|
|
270
|
+
isMatch = search.test(line);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
isMatch = line.includes(search);
|
|
274
|
+
}
|
|
275
|
+
if (isMatch) {
|
|
276
|
+
matches.push({ line, index: i });
|
|
277
|
+
if (matches.length >= 10)
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
if (matches.length === 0) {
|
|
282
|
+
return 'No matches found';
|
|
283
|
+
}
|
|
284
|
+
return matches
|
|
285
|
+
.map((m) => {
|
|
286
|
+
const start = Math.max(0, m.index - contextLines);
|
|
287
|
+
const end = Math.min(lines.length, m.index + contextLines + 1);
|
|
288
|
+
return lines.slice(start, end).join('\n');
|
|
289
|
+
})
|
|
290
|
+
.join('\n\n---\n\n');
|
|
291
|
+
}
|
|
292
|
+
throw new Error('accessibilitySnapshot is not available on this page');
|
|
293
|
+
};
|
|
294
|
+
// Uses Playwright's own InjectedScript to generate locators from elements
|
|
295
|
+
const getLocatorStringForElement = async (element) => {
|
|
296
|
+
if (!element || typeof element.evaluate !== 'function') {
|
|
297
|
+
throw new Error('getLocatorStringForElement: argument must be a Playwright Locator or ElementHandle');
|
|
298
|
+
}
|
|
299
|
+
const elementPage = element.page ? element.page() : page;
|
|
300
|
+
const hasGenerator = await elementPage.evaluate(() => !!globalThis.__selectorGenerator);
|
|
301
|
+
if (!hasGenerator) {
|
|
302
|
+
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
303
|
+
// TODO: is it possible to avoid building separate selector-generator.js? can we just use playwright's injectedScript.js?
|
|
304
|
+
const scriptPath = path.join(currentDir, '..', 'dist', 'selector-generator.js');
|
|
305
|
+
const scriptContent = fs.readFileSync(scriptPath, 'utf-8');
|
|
306
|
+
const cdp = await getCDPSessionFn({ page: elementPage });
|
|
307
|
+
await cdp.send('Runtime.evaluate', { expression: scriptContent });
|
|
308
|
+
}
|
|
309
|
+
return await element.evaluate((el) => {
|
|
310
|
+
return globalThis.__selectorGenerator.generateLocator(el);
|
|
311
|
+
});
|
|
312
|
+
};
|
|
313
|
+
const getLatestLogs = async (options) => {
|
|
314
|
+
const { page: filterPage, count, search } = options || {};
|
|
315
|
+
let allLogs = [];
|
|
316
|
+
if (filterPage) {
|
|
317
|
+
const targetId = await getPageTargetId(filterPage);
|
|
318
|
+
const pageLogs = browserLogs.get(targetId) || [];
|
|
319
|
+
allLogs = [...pageLogs];
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
for (const pageLogs of browserLogs.values()) {
|
|
323
|
+
allLogs.push(...pageLogs);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
if (search) {
|
|
327
|
+
allLogs = allLogs.filter((log) => {
|
|
328
|
+
if (typeof search === 'string') {
|
|
329
|
+
return log.includes(search);
|
|
330
|
+
}
|
|
331
|
+
else if (isRegExp(search)) {
|
|
332
|
+
return search.test(log);
|
|
333
|
+
}
|
|
334
|
+
return false;
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
return count !== undefined ? allLogs.slice(-count) : allLogs;
|
|
338
|
+
};
|
|
339
|
+
const clearAllLogs = () => {
|
|
340
|
+
browserLogs.clear();
|
|
341
|
+
};
|
|
342
|
+
const getCDPSessionFn = async (options) => {
|
|
343
|
+
const cached = cdpSessionCache.get(options.page);
|
|
344
|
+
if (cached) {
|
|
345
|
+
return cached;
|
|
346
|
+
}
|
|
347
|
+
const wsUrl = getCdpUrl();
|
|
348
|
+
const session = await getCDPSessionForPage({ page: options.page, wsUrl });
|
|
349
|
+
cdpSessionCache.set(options.page, session);
|
|
350
|
+
return session;
|
|
351
|
+
};
|
|
352
|
+
const createDebuggerFn = (options) => {
|
|
353
|
+
return new Debugger(options);
|
|
354
|
+
};
|
|
355
|
+
const createEditorFn = (options) => {
|
|
356
|
+
return new Editor(options);
|
|
357
|
+
};
|
|
358
|
+
const getStylesForLocatorFn = async (options) => {
|
|
359
|
+
const cdp = await getCDPSessionFn({ page: options.locator.page() });
|
|
360
|
+
return getStylesForLocator({ locator: options.locator, cdp });
|
|
361
|
+
};
|
|
362
|
+
const getReactSourceFn = async (options) => {
|
|
363
|
+
const cdp = await getCDPSessionFn({ page: options.locator.page() });
|
|
364
|
+
return getReactSource({ locator: options.locator, cdp });
|
|
365
|
+
};
|
|
366
|
+
const screenshotCollector = [];
|
|
367
|
+
const screenshotWithAccessibilityLabelsFn = async (options) => {
|
|
368
|
+
return screenshotWithAccessibilityLabels({ ...options, collector: screenshotCollector });
|
|
369
|
+
};
|
|
370
|
+
// Pre-resolve aria-refs to stable locators before VM execution (for recording)
|
|
371
|
+
if (activeRecordingPath) {
|
|
372
|
+
const ariaRefs = extractAriaRefs(code);
|
|
373
|
+
ariaRefResolutions = new Map();
|
|
374
|
+
for (const ref of ariaRefs) {
|
|
375
|
+
try {
|
|
376
|
+
const locator = page.locator(`aria-ref=${ref}`);
|
|
377
|
+
const count = await locator.count();
|
|
378
|
+
if (count === 1) {
|
|
379
|
+
const stableLocator = await getLocatorStringForElement(locator);
|
|
380
|
+
const html = await locator.evaluate((el) => el.outerHTML.slice(0, 200));
|
|
381
|
+
ariaRefResolutions.set(ref, { resolved: true, locator: stableLocator, html });
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
// Element not found or multiple matches - capture what we can
|
|
385
|
+
const html = count === 0 ? '<element not found>' : '<multiple elements matched>';
|
|
386
|
+
ariaRefResolutions.set(ref, { resolved: false, html });
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
catch (err) {
|
|
390
|
+
// Try to get HTML even if resolution failed
|
|
391
|
+
try {
|
|
392
|
+
const locator = page.locator(`aria-ref=${ref}`);
|
|
393
|
+
const html = await locator.evaluate((el) => el.outerHTML.slice(0, 200));
|
|
394
|
+
ariaRefResolutions.set(ref, { resolved: false, html });
|
|
395
|
+
}
|
|
396
|
+
catch {
|
|
397
|
+
ariaRefResolutions.set(ref, { resolved: false, html: '<failed to get element>' });
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
let vmContextObj = {
|
|
403
|
+
page,
|
|
404
|
+
context,
|
|
405
|
+
state: userState,
|
|
406
|
+
expect,
|
|
407
|
+
console: customConsole,
|
|
408
|
+
accessibilitySnapshot,
|
|
409
|
+
getLocatorStringForElement,
|
|
410
|
+
getLatestLogs,
|
|
411
|
+
clearAllLogs,
|
|
412
|
+
waitForPageLoad,
|
|
413
|
+
getCDPSession: getCDPSessionFn,
|
|
414
|
+
createDebugger: createDebuggerFn,
|
|
415
|
+
createEditor: createEditorFn,
|
|
416
|
+
getStylesForLocator: getStylesForLocatorFn,
|
|
417
|
+
formatStylesAsText,
|
|
418
|
+
getReactSource: getReactSourceFn,
|
|
419
|
+
screenshotWithAccessibilityLabels: screenshotWithAccessibilityLabelsFn,
|
|
420
|
+
resetPlaywright: async () => {
|
|
421
|
+
const { page: newPage, context: newContext } = await resetConnection();
|
|
422
|
+
const resetObj = {
|
|
423
|
+
page: newPage,
|
|
424
|
+
context: newContext,
|
|
425
|
+
state: userState,
|
|
426
|
+
expect,
|
|
427
|
+
console: customConsole,
|
|
428
|
+
accessibilitySnapshot,
|
|
429
|
+
getLocatorStringForElement,
|
|
430
|
+
getLatestLogs,
|
|
431
|
+
clearAllLogs,
|
|
432
|
+
waitForPageLoad,
|
|
433
|
+
getCDPSession: getCDPSessionFn,
|
|
434
|
+
createDebugger: createDebuggerFn,
|
|
435
|
+
createEditor: createEditorFn,
|
|
436
|
+
getStylesForLocator: getStylesForLocatorFn,
|
|
437
|
+
formatStylesAsText,
|
|
438
|
+
getReactSource: getReactSourceFn,
|
|
439
|
+
screenshotWithAccessibilityLabels: screenshotWithAccessibilityLabelsFn,
|
|
440
|
+
resetPlaywright: vmContextObj.resetPlaywright,
|
|
441
|
+
require: sandboxedRequire,
|
|
442
|
+
import: vmContextObj.import,
|
|
443
|
+
...usefulGlobals,
|
|
444
|
+
};
|
|
445
|
+
Object.keys(vmContextObj).forEach((key) => delete vmContextObj[key]);
|
|
446
|
+
Object.assign(vmContextObj, resetObj);
|
|
447
|
+
return { page: newPage, context: newContext };
|
|
448
|
+
},
|
|
449
|
+
require: sandboxedRequire,
|
|
450
|
+
import: (specifier) => import(specifier),
|
|
451
|
+
...usefulGlobals,
|
|
452
|
+
};
|
|
453
|
+
const vmContext = vm.createContext(vmContextObj);
|
|
454
|
+
const wrappedCode = `(async () => { ${code} })()`;
|
|
455
|
+
const result = await Promise.race([
|
|
456
|
+
vm.runInContext(wrappedCode, vmContext, {
|
|
457
|
+
timeout,
|
|
458
|
+
displayErrors: true,
|
|
459
|
+
}),
|
|
460
|
+
new Promise((_, reject) => setTimeout(() => reject(new CodeExecutionTimeoutError(timeout)), timeout)),
|
|
461
|
+
]);
|
|
462
|
+
let responseText = formatConsoleLogs(consoleLogs);
|
|
463
|
+
if (result !== undefined) {
|
|
464
|
+
responseText += 'Return value:\n';
|
|
465
|
+
if (typeof result === 'string') {
|
|
466
|
+
responseText += result;
|
|
467
|
+
}
|
|
468
|
+
else {
|
|
469
|
+
responseText += JSON.stringify(result, null, 2);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
else if (consoleLogs.length === 0) {
|
|
473
|
+
responseText += 'Code executed successfully (no output)';
|
|
474
|
+
}
|
|
475
|
+
for (const screenshot of screenshotCollector) {
|
|
476
|
+
responseText += `\nScreenshot saved to: ${screenshot.path}\n`;
|
|
477
|
+
responseText += `Labels shown: ${screenshot.labelCount}\n\n`;
|
|
478
|
+
responseText += `Accessibility snapshot:\n${screenshot.snapshot}\n`;
|
|
479
|
+
}
|
|
480
|
+
const MAX_LENGTH = 5000;
|
|
481
|
+
let finalText = responseText.trim();
|
|
482
|
+
if (finalText.length > MAX_LENGTH) {
|
|
483
|
+
finalText =
|
|
484
|
+
finalText.slice(0, MAX_LENGTH) +
|
|
485
|
+
`\n\n[Truncated to ${MAX_LENGTH} characters. Better manage your logs or paginate them to read the full logs]`;
|
|
486
|
+
}
|
|
487
|
+
const content = [
|
|
488
|
+
{
|
|
489
|
+
type: 'text',
|
|
490
|
+
text: finalText,
|
|
491
|
+
},
|
|
492
|
+
];
|
|
493
|
+
for (const screenshot of screenshotCollector) {
|
|
494
|
+
content.push({
|
|
495
|
+
type: 'image',
|
|
496
|
+
data: screenshot.base64,
|
|
497
|
+
mimeType: screenshot.mimeType,
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
// Remove network listeners after code execution
|
|
501
|
+
networkCapture.cleanup();
|
|
502
|
+
const snapshotPaths = await savePageSnapshots({ page, lastSnapshots, timeout });
|
|
503
|
+
if (snapshotPaths) {
|
|
504
|
+
const firstItem = content[0];
|
|
505
|
+
if (firstItem.type === 'text') {
|
|
506
|
+
let prependedText = `Full snapshot: ${snapshotPaths.fullPath}`;
|
|
507
|
+
// Save captured network requests to the same snapshot folder
|
|
508
|
+
const snapshotDir = path.dirname(snapshotPaths.fullPath);
|
|
509
|
+
const networksPath = saveNetworkRequests({ requests: networkCapture.requests, snapshotDir });
|
|
510
|
+
if (networksPath) {
|
|
511
|
+
prependedText += `\nNetworks: ${networksPath}`;
|
|
512
|
+
}
|
|
513
|
+
let appendedText = '';
|
|
514
|
+
if (snapshotPaths.incremental) {
|
|
515
|
+
if (snapshotPaths.incremental.length > 2000) {
|
|
516
|
+
appendedText = `\n\nIncremental snapshot (truncated, full content at ${snapshotPaths.incrementalPath}):\n${snapshotPaths.incremental.slice(0, 2000)}...`;
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
appendedText = `\n\nIncremental snapshot:\n${snapshotPaths.incremental}`;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
content[0] = {
|
|
523
|
+
type: 'text',
|
|
524
|
+
text: `${prependedText}\n\n${firstItem.text}${appendedText}`,
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
appendToRecording({});
|
|
529
|
+
return { content };
|
|
530
|
+
}
|
|
531
|
+
catch (error) {
|
|
532
|
+
const errorStack = error.stack || error.message;
|
|
533
|
+
const isTimeoutError = error instanceof CodeExecutionTimeoutError || error.name === 'TimeoutError';
|
|
534
|
+
console.error('Error in execute:', errorStack);
|
|
535
|
+
if (!isTimeoutError) {
|
|
536
|
+
sendLogToRelayServer('error', 'Error in execute:', errorStack);
|
|
537
|
+
}
|
|
538
|
+
const logsText = formatConsoleLogs(consoleLogs, 'Console output (before error)');
|
|
539
|
+
const resetHint = isTimeoutError
|
|
540
|
+
? ''
|
|
541
|
+
: '\n\n[HINT: If this is an internal Playwright error, page/browser closed, or connection issue, call the `reset` tool to reconnect. Do NOT reset for other non-connection non-internal errors.]';
|
|
542
|
+
let errorText = `${logsText}\nError executing code: ${error.message}\n${errorStack}${resetHint}`;
|
|
543
|
+
// Remove network listeners on error
|
|
544
|
+
networkCapture.cleanup();
|
|
545
|
+
const snapshotPaths = await savePageSnapshots({ page, lastSnapshots, timeout });
|
|
546
|
+
if (snapshotPaths) {
|
|
547
|
+
let snapshotText = `Full snapshot: ${snapshotPaths.fullPath}`;
|
|
548
|
+
// Save captured network requests on error too
|
|
549
|
+
const snapshotDir = path.dirname(snapshotPaths.fullPath);
|
|
550
|
+
const networksPath = saveNetworkRequests({ requests: networkCapture.requests, snapshotDir });
|
|
551
|
+
if (networksPath) {
|
|
552
|
+
snapshotText += `\nNetworks: ${networksPath}`;
|
|
553
|
+
}
|
|
554
|
+
if (snapshotPaths.incremental) {
|
|
555
|
+
if (snapshotPaths.incremental.length > 2000) {
|
|
556
|
+
snapshotText += `\n\nIncremental snapshot (truncated, full content at ${snapshotPaths.incrementalPath}):\n${snapshotPaths.incremental.slice(0, 2000)}...`;
|
|
557
|
+
}
|
|
558
|
+
else {
|
|
559
|
+
snapshotText += `\n\nIncremental snapshot:\n${snapshotPaths.incremental}`;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
errorText = `${snapshotText}\n\n${errorText}`;
|
|
563
|
+
}
|
|
564
|
+
appendToRecording({ failed: error.message });
|
|
565
|
+
return {
|
|
566
|
+
content: [
|
|
567
|
+
{
|
|
568
|
+
type: 'text',
|
|
569
|
+
text: errorText,
|
|
570
|
+
},
|
|
571
|
+
],
|
|
572
|
+
isError: true,
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../src/execute.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './cdp-relay.js';
|
|
2
|
+
export * from './utils.js';
|
|
3
|
+
export { CDPSession, getCDPSessionForPage } from './cdp-session.js';
|
|
4
|
+
export type { ICDPSession } from './cdp-session.js';
|
|
5
|
+
export { Editor } from './editor.js';
|
|
6
|
+
export type { ReadResult, SearchMatch, EditResult } from './editor.js';
|
|
7
|
+
export { Debugger } from './debugger.js';
|
|
8
|
+
export type { BreakpointInfo, LocationInfo, EvaluateResult, ScriptInfo } from './debugger.js';
|
|
9
|
+
export { getAriaSnapshot, showAriaRefLabels, hideAriaRefLabels } from './aria-snapshot.js';
|
|
10
|
+
export type { AriaRef, AriaSnapshotResult } from './aria-snapshot.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACnE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC7F,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC1F,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './cdp-relay.js';
|
|
2
|
+
export * from './utils.js';
|
|
3
|
+
export { CDPSession, getCDPSessionForPage } from './cdp-session.js';
|
|
4
|
+
export { Editor } from './editor.js';
|
|
5
|
+
export { Debugger } from './debugger.js';
|
|
6
|
+
export { getAriaSnapshot, showAriaRefLabels, hideAriaRefLabels } from './aria-snapshot.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAEnE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
3
|
+
import { Stream } from 'node:stream';
|
|
4
|
+
export interface CreateTransportOptions {
|
|
5
|
+
clientName?: string;
|
|
6
|
+
port?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function createTransport({ args, port }?: {
|
|
9
|
+
args?: string[];
|
|
10
|
+
port?: number;
|
|
11
|
+
}): Promise<{
|
|
12
|
+
transport: Transport;
|
|
13
|
+
stderr: Stream | null;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function createMCPClient(options?: CreateTransportOptions): Promise<{
|
|
16
|
+
client: Client;
|
|
17
|
+
stderr: string;
|
|
18
|
+
cleanup: () => Promise<void>;
|
|
19
|
+
}>;
|
|
20
|
+
//# sourceMappingURL=mcp-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAA;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAMpC,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAsB,eAAe,CAAC,EAAE,IAAS,EAAE,IAAI,EAAE,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC;IAC3G,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB,CAAC,CAsBD;AAED,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC;IAC/E,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B,CAAC,CAgCD"}
|