@superblocksteam/vite-plugin-file-sync 2.0.67-next.1 → 2.0.68-next.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.
- package/dist/ai-service/agent/tools/apis/analysis.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/analysis.js +4 -0
- package/dist/ai-service/agent/tools/apis/analysis.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-executor.d.ts +9 -1
- package/dist/ai-service/agent/tools/apis/api-executor.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-executor.js +4 -1
- package/dist/ai-service/agent/tools/apis/api-executor.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.d.ts +1 -0
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.js +1 -1
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.d.ts +5 -0
- package/dist/ai-service/agent/tools/apis/test-api.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.js +9 -1
- package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/read.d.ts +1 -1
- package/dist/ai-service/index.d.ts +23 -2
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +99 -0
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/judge/debug-browser.d.ts +8 -0
- package/dist/ai-service/judge/debug-browser.d.ts.map +1 -0
- package/dist/ai-service/judge/debug-browser.js +79 -0
- package/dist/ai-service/judge/debug-browser.js.map +1 -0
- package/dist/ai-service/judge/index.d.ts +12 -0
- package/dist/ai-service/judge/index.d.ts.map +1 -0
- package/dist/ai-service/judge/index.js +11 -0
- package/dist/ai-service/judge/index.js.map +1 -0
- package/dist/ai-service/judge/integration/mcp-client.d.ts +82 -0
- package/dist/ai-service/judge/integration/mcp-client.d.ts.map +1 -0
- package/dist/ai-service/judge/integration/mcp-client.js +276 -0
- package/dist/ai-service/judge/integration/mcp-client.js.map +1 -0
- package/dist/ai-service/judge/integration/playwright-bridge.d.ts +142 -0
- package/dist/ai-service/judge/integration/playwright-bridge.d.ts.map +1 -0
- package/dist/ai-service/judge/integration/playwright-bridge.js +217 -0
- package/dist/ai-service/judge/integration/playwright-bridge.js.map +1 -0
- package/dist/ai-service/judge/judge-eval-http.d.ts +3 -0
- package/dist/ai-service/judge/judge-eval-http.d.ts.map +1 -0
- package/dist/ai-service/judge/judge-eval-http.js +541 -0
- package/dist/ai-service/judge/judge-eval-http.js.map +1 -0
- package/dist/ai-service/judge/judge-eval-service-runner.d.ts +35 -0
- package/dist/ai-service/judge/judge-eval-service-runner.d.ts.map +1 -0
- package/dist/ai-service/judge/judge-eval-service-runner.js +124 -0
- package/dist/ai-service/judge/judge-eval-service-runner.js.map +1 -0
- package/dist/ai-service/judge/judge-executor.d.ts +65 -0
- package/dist/ai-service/judge/judge-executor.d.ts.map +1 -0
- package/dist/ai-service/judge/judge-executor.js +334 -0
- package/dist/ai-service/judge/judge-executor.js.map +1 -0
- package/dist/ai-service/judge/judge-service.d.ts +161 -0
- package/dist/ai-service/judge/judge-service.d.ts.map +1 -0
- package/dist/ai-service/judge/judge-service.js +241 -0
- package/dist/ai-service/judge/judge-service.js.map +1 -0
- package/dist/ai-service/judge/prompts/evaluation-criteria.d.ts +37 -0
- package/dist/ai-service/judge/prompts/evaluation-criteria.d.ts.map +1 -0
- package/dist/ai-service/judge/prompts/evaluation-criteria.js +283 -0
- package/dist/ai-service/judge/prompts/evaluation-criteria.js.map +1 -0
- package/dist/ai-service/judge/prompts/system-prompt.d.ts +30 -0
- package/dist/ai-service/judge/prompts/system-prompt.d.ts.map +1 -0
- package/dist/ai-service/judge/prompts/system-prompt.js +212 -0
- package/dist/ai-service/judge/prompts/system-prompt.js.map +1 -0
- package/dist/ai-service/judge/storage/csv-storage.d.ts +99 -0
- package/dist/ai-service/judge/storage/csv-storage.d.ts.map +1 -0
- package/dist/ai-service/judge/storage/csv-storage.js +274 -0
- package/dist/ai-service/judge/storage/csv-storage.js.map +1 -0
- package/dist/ai-service/judge/storage/index.d.ts +9 -0
- package/dist/ai-service/judge/storage/index.d.ts.map +1 -0
- package/dist/ai-service/judge/storage/index.js +7 -0
- package/dist/ai-service/judge/storage/index.js.map +1 -0
- package/dist/ai-service/judge/storage/interface.d.ts +51 -0
- package/dist/ai-service/judge/storage/interface.d.ts.map +1 -0
- package/dist/ai-service/judge/storage/interface.js +8 -0
- package/dist/ai-service/judge/storage/interface.js.map +1 -0
- package/dist/ai-service/judge/storage/types.d.ts +54 -0
- package/dist/ai-service/judge/storage/types.d.ts.map +1 -0
- package/dist/ai-service/judge/storage/types.js +7 -0
- package/dist/ai-service/judge/storage/types.js.map +1 -0
- package/dist/ai-service/judge/tools/index.d.ts +22 -0
- package/dist/ai-service/judge/tools/index.d.ts.map +1 -0
- package/dist/ai-service/judge/tools/index.js +29 -0
- package/dist/ai-service/judge/tools/index.js.map +1 -0
- package/dist/ai-service/judge/tools/playwright-action.d.ts +18 -0
- package/dist/ai-service/judge/tools/playwright-action.d.ts.map +1 -0
- package/dist/ai-service/judge/tools/playwright-action.js +171 -0
- package/dist/ai-service/judge/tools/playwright-action.js.map +1 -0
- package/dist/ai-service/judge/tools/submit-feedback.d.ts +41 -0
- package/dist/ai-service/judge/tools/submit-feedback.d.ts.map +1 -0
- package/dist/ai-service/judge/tools/submit-feedback.js +150 -0
- package/dist/ai-service/judge/tools/submit-feedback.js.map +1 -0
- package/dist/ai-service/judge/types.d.ts +169 -0
- package/dist/ai-service/judge/types.d.ts.map +1 -0
- package/dist/ai-service/judge/types.js +8 -0
- package/dist/ai-service/judge/types.js.map +1 -0
- package/dist/ai-service/llm/interaction/adapters/vercel.d.ts.map +1 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.js.map +1 -1
- package/dist/ai-service/llm/interaction/provider.d.ts +10 -9
- package/dist/ai-service/llm/interaction/provider.d.ts.map +1 -1
- package/dist/ai-service/llmobs/middleware/stream-text.d.ts +8 -8
- package/dist/ai-service/llmobs/middleware/stream-text.d.ts.map +1 -1
- package/dist/ai-service/llmobs/middleware/stream-text.js.map +1 -1
- package/dist/ai-service/llmobs/tracer.d.ts.map +1 -1
- package/dist/ai-service/llmobs/tracer.js +2 -1
- package/dist/ai-service/llmobs/tracer.js.map +1 -1
- package/dist/ai-service/mcp/embedded-playwright-mcp-server.d.ts +53 -0
- package/dist/ai-service/mcp/embedded-playwright-mcp-server.d.ts.map +1 -0
- package/dist/ai-service/mcp/embedded-playwright-mcp-server.js +541 -0
- package/dist/ai-service/mcp/embedded-playwright-mcp-server.js.map +1 -0
- package/dist/ai-service/mcp/playwright-server.d.ts +114 -0
- package/dist/ai-service/mcp/playwright-server.d.ts.map +1 -0
- package/dist/ai-service/mcp/playwright-server.js +109 -0
- package/dist/ai-service/mcp/playwright-server.js.map +1 -0
- package/dist/server-rpc/client.js +1 -1
- package/dist/server-rpc/client.js.map +1 -1
- package/dist/socket-manager.d.ts.map +1 -1
- package/dist/socket-manager.js +8 -0
- package/dist/socket-manager.js.map +1 -1
- package/package.json +7 -6
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
import { once } from "node:events";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import http from "node:http";
|
|
4
|
+
import { chromium, firefox, webkit, } from "playwright";
|
|
5
|
+
const PLAYWRIGHT_ACTIONS = [
|
|
6
|
+
"navigate",
|
|
7
|
+
"click",
|
|
8
|
+
"fill",
|
|
9
|
+
"screenshot",
|
|
10
|
+
"getText",
|
|
11
|
+
"waitForSelector",
|
|
12
|
+
"evaluate",
|
|
13
|
+
"getUrl",
|
|
14
|
+
"reload",
|
|
15
|
+
];
|
|
16
|
+
export async function startEmbeddedPlaywrightMcpServer(options) {
|
|
17
|
+
let browser;
|
|
18
|
+
let context = null;
|
|
19
|
+
let shouldCloseBrowser = true;
|
|
20
|
+
if (options?.connectWsEndpoint) {
|
|
21
|
+
console.log(`🎬 MCP Server: Connecting to existing browser at ${options.connectWsEndpoint}`);
|
|
22
|
+
browser = await chromium.connect({ wsEndpoint: options.connectWsEndpoint });
|
|
23
|
+
shouldCloseBrowser = false;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
console.log("🎬 MCP Server: Launching new browser with storage state");
|
|
27
|
+
browser = await launchBrowser();
|
|
28
|
+
}
|
|
29
|
+
console.log(`🎬 MCP Server: Browser contexts available before selection: ${browser.contexts().length}`);
|
|
30
|
+
// Reuse an existing context when connecting to an existing browser
|
|
31
|
+
if (options?.connectWsEndpoint) {
|
|
32
|
+
const existing = browser.contexts();
|
|
33
|
+
if (existing.length > 0) {
|
|
34
|
+
context = existing[0];
|
|
35
|
+
console.log("🎬 MCP Server: Reusing existing browser context");
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.warn("🎬 MCP Server: No existing context found on shared browser; falling back to new context with storage/JWT");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (!context) {
|
|
42
|
+
const contextOptions = {};
|
|
43
|
+
if (options?.storageStateData) {
|
|
44
|
+
console.log("🎬 MCP Server: Using provided storageStateData");
|
|
45
|
+
contextOptions.storageState = options.storageStateData;
|
|
46
|
+
// Duplicate auth cookies onto app host if needed (e.g., when original domain is auth0)
|
|
47
|
+
if (options.appUrl && options.storageStateData.cookies?.length) {
|
|
48
|
+
const appHost = new URL(options.appUrl).hostname;
|
|
49
|
+
const duplicateCookies = options.storageStateData.cookies
|
|
50
|
+
.filter((c) => ["auth0", "auth0_compat", "did", "did_compat"].includes(c.name))
|
|
51
|
+
.map((c) => ({
|
|
52
|
+
...c,
|
|
53
|
+
domain: appHost,
|
|
54
|
+
secure: false,
|
|
55
|
+
sameSite: "Lax",
|
|
56
|
+
}));
|
|
57
|
+
contextOptions.storageState.cookies = [
|
|
58
|
+
...(contextOptions.storageState.cookies || []),
|
|
59
|
+
...duplicateCookies,
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else if (options?.storageStatePath) {
|
|
64
|
+
if (fs.existsSync(options.storageStatePath)) {
|
|
65
|
+
console.log(`🎬 MCP Server: Loading storage state from ${options.storageStatePath}`);
|
|
66
|
+
contextOptions.storageState = options.storageStatePath;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.warn(`🎬 MCP Server: Storage state not found at ${options.storageStatePath}, starting without it`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
context = await browser.newContext(contextOptions);
|
|
73
|
+
}
|
|
74
|
+
// Ensure context exists
|
|
75
|
+
if (!context) {
|
|
76
|
+
throw new Error("Failed to create or reuse a Playwright context");
|
|
77
|
+
}
|
|
78
|
+
// Seed a cookie/localStorage with JWT for app domain if provided
|
|
79
|
+
if (options?.jwt && options?.appUrl) {
|
|
80
|
+
try {
|
|
81
|
+
const appUrl = new URL(options.appUrl);
|
|
82
|
+
const authDomains = new Set([
|
|
83
|
+
appUrl.hostname,
|
|
84
|
+
"login-dev.superblocks.com",
|
|
85
|
+
"login.superblocks.com",
|
|
86
|
+
]);
|
|
87
|
+
await context.addInitScript(({ token, domains }) => {
|
|
88
|
+
try {
|
|
89
|
+
localStorage.setItem("sb_jwt", token);
|
|
90
|
+
sessionStorage.setItem("sb_jwt", token);
|
|
91
|
+
localStorage.setItem("access_token", token);
|
|
92
|
+
sessionStorage.setItem("access_token", token);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// ignore storage errors
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
domains.forEach((domain) => {
|
|
99
|
+
document.cookie = `x-superblocks-authorization=Bearer ${token}; Path=/; SameSite=None; ${domain === "localhost" ? "" : "Secure;"} Domain=${domain}`;
|
|
100
|
+
document.cookie = `sb_jwt=${token}; Path=/; SameSite=None; ${domain === "localhost" ? "" : "Secure;"} Domain=${domain}`;
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// ignore cookie errors
|
|
105
|
+
}
|
|
106
|
+
}, { token: options.jwt, domains: Array.from(authDomains) });
|
|
107
|
+
const cookieBase = {
|
|
108
|
+
value: `Bearer ${options.jwt}`,
|
|
109
|
+
path: "/",
|
|
110
|
+
httpOnly: false,
|
|
111
|
+
sameSite: "None",
|
|
112
|
+
};
|
|
113
|
+
const cookies = [
|
|
114
|
+
{
|
|
115
|
+
...cookieBase,
|
|
116
|
+
name: "x-superblocks-authorization",
|
|
117
|
+
domain: appUrl.hostname,
|
|
118
|
+
secure: appUrl.protocol === "https:",
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
...cookieBase,
|
|
122
|
+
name: "sb_jwt",
|
|
123
|
+
value: options.jwt,
|
|
124
|
+
domain: appUrl.hostname,
|
|
125
|
+
secure: appUrl.protocol === "https:",
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
authDomains.forEach((domain) => {
|
|
129
|
+
if (domain !== appUrl.hostname) {
|
|
130
|
+
cookies.push({
|
|
131
|
+
...cookieBase,
|
|
132
|
+
name: "x-superblocks-authorization",
|
|
133
|
+
domain,
|
|
134
|
+
secure: true,
|
|
135
|
+
});
|
|
136
|
+
cookies.push({
|
|
137
|
+
...cookieBase,
|
|
138
|
+
name: "sb_jwt",
|
|
139
|
+
value: options.jwt,
|
|
140
|
+
domain,
|
|
141
|
+
secure: true,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
await context.addCookies(cookies);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
console.warn(`🎬 MCP Server: Failed to seed JWT cookie/localStorage: ${String(error)}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Seed session storage for app origin if provided
|
|
152
|
+
if (options?.sessionStorageData?.items?.length) {
|
|
153
|
+
const { origin, items } = options.sessionStorageData;
|
|
154
|
+
try {
|
|
155
|
+
await context.addInitScript(({ targetOrigin, entries, }) => {
|
|
156
|
+
if (location.origin === targetOrigin) {
|
|
157
|
+
try {
|
|
158
|
+
entries.forEach(({ name, value }) => {
|
|
159
|
+
sessionStorage.setItem(name, value);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// ignore
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}, { targetOrigin: origin, entries: items });
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
console.warn(`🎬 MCP Server: Failed to seed sessionStorage: ${String(error)}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Seed additional origins storage (local/session) if provided
|
|
173
|
+
if (options?.extraOrigins?.length) {
|
|
174
|
+
for (const originData of options.extraOrigins) {
|
|
175
|
+
const { origin, localStorage = [], sessionStorage = [] } = originData;
|
|
176
|
+
const seedLocal = localStorage;
|
|
177
|
+
const seedSession = sessionStorage;
|
|
178
|
+
if (seedLocal.length > 0 || seedSession.length > 0) {
|
|
179
|
+
try {
|
|
180
|
+
await context.addInitScript(({ targetOrigin, lsEntries, ssEntries, }) => {
|
|
181
|
+
if (location.origin === targetOrigin) {
|
|
182
|
+
lsEntries.forEach(({ name, value }) => {
|
|
183
|
+
try {
|
|
184
|
+
globalThis.localStorage?.setItem(name, value);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
/* ignore */
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
ssEntries.forEach(({ name, value }) => {
|
|
191
|
+
try {
|
|
192
|
+
globalThis.sessionStorage?.setItem(name, value);
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
/* ignore */
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}, {
|
|
200
|
+
targetOrigin: origin,
|
|
201
|
+
lsEntries: seedLocal,
|
|
202
|
+
ssEntries: seedSession,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
console.warn(`🎬 MCP Server: Failed to seed extra origin storage for ${origin}: ${String(error)}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const page = await context.newPage();
|
|
212
|
+
// Prefer an existing page in the reused context (e.g., the CLI-authenticated one)
|
|
213
|
+
const existingPages = context.pages();
|
|
214
|
+
const activePage = existingPages.length > 0 ? existingPages[0] : page;
|
|
215
|
+
const server = http.createServer((req, res) => {
|
|
216
|
+
void (async () => {
|
|
217
|
+
try {
|
|
218
|
+
if (req.method !== "POST") {
|
|
219
|
+
res.writeHead(405, { "Content-Type": "application/json" });
|
|
220
|
+
res.end(JSON.stringify({
|
|
221
|
+
jsonrpc: "2.0",
|
|
222
|
+
id: null,
|
|
223
|
+
error: {
|
|
224
|
+
code: -32600,
|
|
225
|
+
message: "Only POST requests are supported",
|
|
226
|
+
},
|
|
227
|
+
}));
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const body = await readRequestBody(req);
|
|
231
|
+
let request;
|
|
232
|
+
try {
|
|
233
|
+
request = JSON.parse(body);
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
res.writeHead(400, { "Content-Type": "application/json" });
|
|
237
|
+
res.end(JSON.stringify({
|
|
238
|
+
jsonrpc: "2.0",
|
|
239
|
+
id: null,
|
|
240
|
+
error: {
|
|
241
|
+
code: -32700,
|
|
242
|
+
message: `Invalid JSON: ${String(error)}`,
|
|
243
|
+
},
|
|
244
|
+
}));
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
const response = await handleJsonRpcRequest(request, activePage);
|
|
248
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
249
|
+
res.end(JSON.stringify(response));
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
res.writeHead(500, { "Content-Type": "application/json" });
|
|
253
|
+
res.end(JSON.stringify({
|
|
254
|
+
jsonrpc: "2.0",
|
|
255
|
+
id: null,
|
|
256
|
+
error: {
|
|
257
|
+
code: -32603,
|
|
258
|
+
message: `Server error: ${String(error)}`,
|
|
259
|
+
},
|
|
260
|
+
}));
|
|
261
|
+
}
|
|
262
|
+
})();
|
|
263
|
+
});
|
|
264
|
+
server.listen(0, "127.0.0.1");
|
|
265
|
+
await once(server, "listening");
|
|
266
|
+
const address = server.address();
|
|
267
|
+
const url = `http://${address.address}:${address.port}/mcp`;
|
|
268
|
+
return {
|
|
269
|
+
url,
|
|
270
|
+
close: async () => {
|
|
271
|
+
await Promise.allSettled([
|
|
272
|
+
new Promise((resolve, reject) => {
|
|
273
|
+
server.close((error) => {
|
|
274
|
+
if (error) {
|
|
275
|
+
reject(error);
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
resolve();
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
}),
|
|
282
|
+
page.close().catch(() => { }),
|
|
283
|
+
context.close().catch(() => { }),
|
|
284
|
+
shouldCloseBrowser
|
|
285
|
+
? browser.close().catch(() => { })
|
|
286
|
+
: Promise.resolve(),
|
|
287
|
+
]);
|
|
288
|
+
},
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
async function launchBrowser() {
|
|
292
|
+
const browserName = (process.env.PLAYWRIGHT_MCP_BROWSER ??
|
|
293
|
+
"chromium");
|
|
294
|
+
const headless = process.env.HEADLESS !== "false";
|
|
295
|
+
switch (browserName) {
|
|
296
|
+
case "chromium":
|
|
297
|
+
return chromium.launch({ headless });
|
|
298
|
+
case "firefox":
|
|
299
|
+
return firefox.launch({ headless });
|
|
300
|
+
case "webkit":
|
|
301
|
+
return webkit.launch({ headless });
|
|
302
|
+
default:
|
|
303
|
+
throw new Error(`Unsupported PLAYWRIGHT_MCP_BROWSER: ${browserName}`);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
async function readRequestBody(req) {
|
|
307
|
+
const chunks = [];
|
|
308
|
+
for await (const chunk of req) {
|
|
309
|
+
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
|
|
310
|
+
}
|
|
311
|
+
return Buffer.concat(chunks).toString("utf-8");
|
|
312
|
+
}
|
|
313
|
+
async function handleJsonRpcRequest(request, page) {
|
|
314
|
+
const { method, id } = request;
|
|
315
|
+
console.log("🎬 MCP Server: Received request", {
|
|
316
|
+
method,
|
|
317
|
+
id,
|
|
318
|
+
hasParams: !!request.params,
|
|
319
|
+
});
|
|
320
|
+
try {
|
|
321
|
+
if (method === "tools/list") {
|
|
322
|
+
console.log("🎬 MCP Server: Listing tools");
|
|
323
|
+
return {
|
|
324
|
+
jsonrpc: "2.0",
|
|
325
|
+
id,
|
|
326
|
+
result: {
|
|
327
|
+
tools: [
|
|
328
|
+
{
|
|
329
|
+
name: "playwright_action",
|
|
330
|
+
description: "Execute Playwright browser automation actions (navigate, click, fill, screenshot, etc.)",
|
|
331
|
+
inputSchema: {
|
|
332
|
+
type: "object",
|
|
333
|
+
properties: {
|
|
334
|
+
action: {
|
|
335
|
+
type: "string",
|
|
336
|
+
enum: PLAYWRIGHT_ACTIONS,
|
|
337
|
+
},
|
|
338
|
+
},
|
|
339
|
+
required: ["action"],
|
|
340
|
+
},
|
|
341
|
+
},
|
|
342
|
+
],
|
|
343
|
+
},
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
if (method === "tools/call") {
|
|
347
|
+
console.log("🎬 MCP Server: tools/call method");
|
|
348
|
+
const params = request.params;
|
|
349
|
+
console.log("🎬 MCP Server: Tool call params", {
|
|
350
|
+
toolName: params?.name,
|
|
351
|
+
hasArguments: !!params?.arguments,
|
|
352
|
+
action: params?.arguments?.action,
|
|
353
|
+
});
|
|
354
|
+
if (!params || params.name !== "playwright_action") {
|
|
355
|
+
throw new Error(`Unknown tool: ${params?.name ?? "undefined"}`);
|
|
356
|
+
}
|
|
357
|
+
const action = params.arguments?.action;
|
|
358
|
+
if (!action || !PLAYWRIGHT_ACTIONS.includes(action)) {
|
|
359
|
+
throw new Error(`Unsupported Playwright action: ${String(action)}`);
|
|
360
|
+
}
|
|
361
|
+
console.log(`🎬 MCP Server: Executing action: ${action}`);
|
|
362
|
+
const result = await executePlaywrightAction(action, page, params.arguments ?? {});
|
|
363
|
+
console.log(`🎬 MCP Server: Action ${action} completed`, {
|
|
364
|
+
success: result?.success,
|
|
365
|
+
hasResult: !!result,
|
|
366
|
+
});
|
|
367
|
+
return {
|
|
368
|
+
jsonrpc: "2.0",
|
|
369
|
+
id,
|
|
370
|
+
result: {
|
|
371
|
+
content: result,
|
|
372
|
+
},
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
if (method === "disconnect") {
|
|
376
|
+
return {
|
|
377
|
+
jsonrpc: "2.0",
|
|
378
|
+
id,
|
|
379
|
+
result: {},
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
throw new Error(`Unsupported method: ${method}`);
|
|
383
|
+
}
|
|
384
|
+
catch (error) {
|
|
385
|
+
return {
|
|
386
|
+
jsonrpc: "2.0",
|
|
387
|
+
id,
|
|
388
|
+
error: {
|
|
389
|
+
code: -32603,
|
|
390
|
+
message: String(error),
|
|
391
|
+
},
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
async function executePlaywrightAction(action, page, params) {
|
|
396
|
+
console.log("🎬 MCP Server: executePlaywrightAction called", {
|
|
397
|
+
action,
|
|
398
|
+
paramKeys: Object.keys(params),
|
|
399
|
+
url: page.url(),
|
|
400
|
+
});
|
|
401
|
+
switch (action) {
|
|
402
|
+
case "navigate": {
|
|
403
|
+
const url = params.url;
|
|
404
|
+
if (!url)
|
|
405
|
+
throw new Error("Missing url parameter for navigate action");
|
|
406
|
+
console.log(`🎬 MCP Server: Navigating to ${url}`);
|
|
407
|
+
try {
|
|
408
|
+
await page.goto(url, {
|
|
409
|
+
waitUntil: "load",
|
|
410
|
+
timeout: 60000, // 60 second timeout
|
|
411
|
+
});
|
|
412
|
+
console.log(`🎬 MCP Server: Navigation complete`);
|
|
413
|
+
return { success: true, url };
|
|
414
|
+
}
|
|
415
|
+
catch (error) {
|
|
416
|
+
console.error(`🎬 MCP Server: Navigation failed: ${String(error)}`);
|
|
417
|
+
// Return error but don't throw - let the judge handle it
|
|
418
|
+
return {
|
|
419
|
+
success: false,
|
|
420
|
+
error: `Navigation to ${url} failed: ${String(error)}`,
|
|
421
|
+
url,
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
case "click": {
|
|
426
|
+
const selector = params.selector;
|
|
427
|
+
if (!selector)
|
|
428
|
+
throw new Error("Missing selector for click action");
|
|
429
|
+
// Always target elements inside the iframe
|
|
430
|
+
const frame = page.frameLocator('[data-test="sb-iframe"]');
|
|
431
|
+
await frame.locator(selector).click({ timeout: params.timeout });
|
|
432
|
+
return { success: true };
|
|
433
|
+
}
|
|
434
|
+
case "fill": {
|
|
435
|
+
const selector = params.selector;
|
|
436
|
+
const value = params.value ?? "";
|
|
437
|
+
if (!selector)
|
|
438
|
+
throw new Error("Missing selector for fill action");
|
|
439
|
+
// Always target elements inside the iframe
|
|
440
|
+
const frame = page.frameLocator('[data-test="sb-iframe"]');
|
|
441
|
+
await frame.locator(selector).fill(value, { timeout: params.timeout });
|
|
442
|
+
return { success: true };
|
|
443
|
+
}
|
|
444
|
+
case "screenshot": {
|
|
445
|
+
const buffer = await page.screenshot({
|
|
446
|
+
fullPage: Boolean(params.fullPage),
|
|
447
|
+
});
|
|
448
|
+
return {
|
|
449
|
+
success: true,
|
|
450
|
+
screenshot: buffer.toString("base64"),
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
case "getText": {
|
|
454
|
+
const selector = params.selector;
|
|
455
|
+
if (!selector)
|
|
456
|
+
throw new Error("Missing selector for getText action");
|
|
457
|
+
// Always target elements inside the iframe
|
|
458
|
+
const frame = page.frameLocator('[data-test="sb-iframe"]');
|
|
459
|
+
const text = await frame.locator(selector).textContent({
|
|
460
|
+
timeout: params.timeout,
|
|
461
|
+
});
|
|
462
|
+
return { success: true, text };
|
|
463
|
+
}
|
|
464
|
+
case "waitForSelector": {
|
|
465
|
+
const selector = params.selector;
|
|
466
|
+
if (!selector) {
|
|
467
|
+
throw new Error("Missing selector for waitForSelector action");
|
|
468
|
+
}
|
|
469
|
+
// Always target elements inside the iframe
|
|
470
|
+
const frame = page.frameLocator('[data-test="sb-iframe"]');
|
|
471
|
+
await frame.locator(selector).waitFor({
|
|
472
|
+
timeout: params.timeout ?? 30_000,
|
|
473
|
+
});
|
|
474
|
+
return { success: true };
|
|
475
|
+
}
|
|
476
|
+
case "evaluate": {
|
|
477
|
+
const script = params.script;
|
|
478
|
+
if (typeof script !== "string") {
|
|
479
|
+
throw new Error("Missing script for evaluate action");
|
|
480
|
+
}
|
|
481
|
+
// Check for import/export/require statements that can't be used in browser context
|
|
482
|
+
if (script.includes("import ") ||
|
|
483
|
+
script.includes("export ") ||
|
|
484
|
+
script.includes("require(")) {
|
|
485
|
+
throw new Error("Cannot use import/export/require statements in browser evaluate context. " +
|
|
486
|
+
"Please use plain JavaScript that can run in a browser console. " +
|
|
487
|
+
"For example, use 'document.querySelector' instead of importing libraries.");
|
|
488
|
+
}
|
|
489
|
+
try {
|
|
490
|
+
// Wrap the script in a function to ensure it's evaluated as a function body
|
|
491
|
+
// This prevents Node.js from trying to parse it as a module
|
|
492
|
+
const wrappedScript = `(() => {
|
|
493
|
+
try {
|
|
494
|
+
${script}
|
|
495
|
+
} catch (e) {
|
|
496
|
+
return { error: e.toString(), stack: e.stack };
|
|
497
|
+
}
|
|
498
|
+
})()`;
|
|
499
|
+
// Always execute JavaScript inside the iframe
|
|
500
|
+
const frameElement = await page
|
|
501
|
+
.locator('[data-test="sb-iframe"]')
|
|
502
|
+
.elementHandle();
|
|
503
|
+
const frame = await frameElement?.contentFrame();
|
|
504
|
+
if (!frame) {
|
|
505
|
+
throw new Error("Could not find iframe [data-test='sb-iframe'] or iframe not loaded");
|
|
506
|
+
}
|
|
507
|
+
const result = await frame.evaluate(wrappedScript);
|
|
508
|
+
// Check if the evaluation returned an error
|
|
509
|
+
if (result && typeof result === "object" && "error" in result) {
|
|
510
|
+
throw new Error(`Browser evaluation failed: ${result.error}`);
|
|
511
|
+
}
|
|
512
|
+
return { success: true, result };
|
|
513
|
+
}
|
|
514
|
+
catch (error) {
|
|
515
|
+
// If the error looks like a syntax error, provide helpful guidance
|
|
516
|
+
const errorMsg = String(error);
|
|
517
|
+
if (errorMsg.includes("SyntaxError") ||
|
|
518
|
+
errorMsg.includes("import") ||
|
|
519
|
+
errorMsg.includes("module")) {
|
|
520
|
+
throw new Error("JavaScript evaluation failed. Make sure your code is browser-compatible " +
|
|
521
|
+
"(no import/export statements). Error: " +
|
|
522
|
+
errorMsg);
|
|
523
|
+
}
|
|
524
|
+
throw error;
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
case "getUrl": {
|
|
528
|
+
return { success: true, url: page.url() };
|
|
529
|
+
}
|
|
530
|
+
case "reload": {
|
|
531
|
+
await page.reload({
|
|
532
|
+
waitUntil: params.waitUntil ?? "load",
|
|
533
|
+
timeout: params.timeout,
|
|
534
|
+
});
|
|
535
|
+
return { success: true };
|
|
536
|
+
}
|
|
537
|
+
default:
|
|
538
|
+
throw new Error(`Unhandled Playwright action: ${action}`);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
//# sourceMappingURL=embedded-playwright-mcp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedded-playwright-mcp-server.js","sourceRoot":"","sources":["../../../src/ai-service/mcp/embedded-playwright-mcp-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedded Playwright MCP server for ai-service.
|
|
3
|
+
*
|
|
4
|
+
* Manages lifecycle of the Playwright MCP server that enables
|
|
5
|
+
* judge evaluations to interact with browsers.
|
|
6
|
+
*/
|
|
7
|
+
import type { Logger } from "../../util/logger.js";
|
|
8
|
+
/**
|
|
9
|
+
* Handle for the embedded MCP server.
|
|
10
|
+
*/
|
|
11
|
+
export interface PlaywrightMcpServer {
|
|
12
|
+
/** Server URL for client connections */
|
|
13
|
+
url: string;
|
|
14
|
+
/** Stops the server and cleans up resources */
|
|
15
|
+
close: () => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Options for starting the MCP server.
|
|
19
|
+
*/
|
|
20
|
+
export interface PlaywrightMcpServerOptions {
|
|
21
|
+
/**
|
|
22
|
+
* Optional path to a Playwright storage state file for authentication.
|
|
23
|
+
* This allows the MCP server's browser to use the same auth cookies/localStorage.
|
|
24
|
+
*/
|
|
25
|
+
storageStatePath?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Optional JWT to inject via Authorization headers for all requests.
|
|
28
|
+
*/
|
|
29
|
+
jwt?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Optional appUrl for deriving cookie domains when seeding auth.
|
|
32
|
+
*/
|
|
33
|
+
appUrl?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Browser to use (chromium, firefox, webkit).
|
|
36
|
+
* Defaults to chromium.
|
|
37
|
+
*/
|
|
38
|
+
browser?: "chromium" | "firefox" | "webkit";
|
|
39
|
+
/**
|
|
40
|
+
* Whether to run in headless mode.
|
|
41
|
+
* Defaults to true.
|
|
42
|
+
*/
|
|
43
|
+
headless?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Optional websocket endpoint for connecting to an existing Playwright browser.
|
|
46
|
+
*/
|
|
47
|
+
connectWsEndpoint?: string;
|
|
48
|
+
/**
|
|
49
|
+
* Optional raw storage state data to seed the context.
|
|
50
|
+
*/
|
|
51
|
+
storageStateData?: any;
|
|
52
|
+
/**
|
|
53
|
+
* Optional session storage items to seed for the app origin.
|
|
54
|
+
*/
|
|
55
|
+
sessionStorageData?: {
|
|
56
|
+
origin: string;
|
|
57
|
+
items: Array<{
|
|
58
|
+
name: string;
|
|
59
|
+
value: string;
|
|
60
|
+
}>;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Additional origins storage to seed (e.g., auth domain).
|
|
64
|
+
*/
|
|
65
|
+
extraOrigins?: Array<{
|
|
66
|
+
origin: string;
|
|
67
|
+
localStorage: Array<{
|
|
68
|
+
name: string;
|
|
69
|
+
value: string;
|
|
70
|
+
}>;
|
|
71
|
+
sessionStorage?: Array<{
|
|
72
|
+
name: string;
|
|
73
|
+
value: string;
|
|
74
|
+
}>;
|
|
75
|
+
}>;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Lifecycle manager for the embedded Playwright MCP server.
|
|
79
|
+
*
|
|
80
|
+
* Handles starting, stopping, and status checking of the server.
|
|
81
|
+
* The server runs in the same process as the ai-service.
|
|
82
|
+
*/
|
|
83
|
+
export declare class PlaywrightMcpServerManager {
|
|
84
|
+
private server;
|
|
85
|
+
private logger;
|
|
86
|
+
constructor(logger: Logger);
|
|
87
|
+
/**
|
|
88
|
+
* Starts the MCP server if not already running.
|
|
89
|
+
*
|
|
90
|
+
* @param options - Server configuration options
|
|
91
|
+
* @returns Server URL for client connections
|
|
92
|
+
* @throws Error if server fails to start
|
|
93
|
+
*/
|
|
94
|
+
start(options?: PlaywrightMcpServerOptions): Promise<string>;
|
|
95
|
+
/**
|
|
96
|
+
* Stops the MCP server if running.
|
|
97
|
+
*
|
|
98
|
+
* Gracefully shuts down the server and cleans up browser resources.
|
|
99
|
+
*/
|
|
100
|
+
stop(): Promise<void>;
|
|
101
|
+
/**
|
|
102
|
+
* Checks if the server is currently running.
|
|
103
|
+
*
|
|
104
|
+
* @returns True if server is running
|
|
105
|
+
*/
|
|
106
|
+
isRunning(): boolean;
|
|
107
|
+
/**
|
|
108
|
+
* Gets the server URL if running.
|
|
109
|
+
*
|
|
110
|
+
* @returns Server URL or null if not running
|
|
111
|
+
*/
|
|
112
|
+
getUrl(): string | null;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=playwright-server.d.ts.map
|