@pyrokine/mcp-chrome 2.3.2 → 2.4.1
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/README.md +40 -13
- package/README_zh.md +30 -11
- package/dist/anti-detection/behavior.d.ts.map +1 -1
- package/dist/anti-detection/behavior.js.map +1 -1
- package/dist/anti-detection/injection.js.map +1 -1
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js.map +1 -1
- package/dist/cdp/launcher.d.ts.map +1 -1
- package/dist/cdp/launcher.js.map +1 -1
- package/dist/core/auto-wait.d.ts.map +1 -1
- package/dist/core/auto-wait.js.map +1 -1
- package/dist/core/browser-driver.d.ts +6 -1
- package/dist/core/browser-driver.d.ts.map +1 -1
- package/dist/core/browser-driver.js.map +1 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/extension-errors.d.ts.map +1 -1
- package/dist/core/locator.d.ts.map +1 -1
- package/dist/core/locator.js.map +1 -1
- package/dist/core/retry.js.map +1 -1
- package/dist/core/session.d.ts +2 -2
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +1 -1
- package/dist/core/session.js.map +1 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/unified-session.d.ts +17 -2
- package/dist/core/unified-session.d.ts.map +1 -1
- package/dist/core/unified-session.js +44 -6
- package/dist/core/unified-session.js.map +1 -1
- package/dist/extension/bridge.d.ts +8 -2
- package/dist/extension/bridge.d.ts.map +1 -1
- package/dist/extension/bridge.js +5 -1
- package/dist/extension/bridge.js.map +1 -1
- package/dist/extension/http-server.d.ts +17 -0
- package/dist/extension/http-server.d.ts.map +1 -1
- package/dist/extension/http-server.js +63 -8
- package/dist/extension/http-server.js.map +1 -1
- package/dist/extension/index.d.ts +1 -0
- package/dist/extension/index.d.ts.map +1 -1
- package/dist/extension/index.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/browse.d.ts.map +1 -1
- package/dist/tools/browse.js +13 -37
- package/dist/tools/browse.js.map +1 -1
- package/dist/tools/cookies.js.map +1 -1
- package/dist/tools/diagnostics.d.ts +31 -0
- package/dist/tools/diagnostics.d.ts.map +1 -0
- package/dist/tools/diagnostics.js +93 -0
- package/dist/tools/diagnostics.js.map +1 -0
- package/dist/tools/evaluate.d.ts +15 -0
- package/dist/tools/evaluate.d.ts.map +1 -1
- package/dist/tools/evaluate.js +136 -84
- package/dist/tools/evaluate.js.map +1 -1
- package/dist/tools/extract.d.ts.map +1 -1
- package/dist/tools/extract.js +36 -17
- package/dist/tools/extract.js.map +1 -1
- package/dist/tools/input.d.ts +6 -0
- package/dist/tools/input.d.ts.map +1 -1
- package/dist/tools/input.js +394 -248
- package/dist/tools/input.js.map +1 -1
- package/dist/tools/logs.d.ts +17 -0
- package/dist/tools/logs.d.ts.map +1 -1
- package/dist/tools/logs.js +41 -10
- package/dist/tools/logs.js.map +1 -1
- package/dist/tools/network-sanitizer.d.ts +15 -0
- package/dist/tools/network-sanitizer.d.ts.map +1 -0
- package/dist/tools/network-sanitizer.js +61 -0
- package/dist/tools/network-sanitizer.js.map +1 -0
- package/dist/tools/post-condition.d.ts +18 -1
- package/dist/tools/post-condition.d.ts.map +1 -1
- package/dist/tools/post-condition.js +52 -94
- package/dist/tools/post-condition.js.map +1 -1
- package/dist/tools/target-diagnostics.d.ts +31 -0
- package/dist/tools/target-diagnostics.d.ts.map +1 -0
- package/dist/tools/target-diagnostics.js +91 -0
- package/dist/tools/target-diagnostics.js.map +1 -0
- package/dist/tools/wait.d.ts.map +1 -1
- package/dist/tools/wait.js +183 -209
- package/dist/tools/wait.js.map +1 -1
- package/extension/dist/assets/content.ts-Cj_iiU2s.js +25 -0
- package/extension/dist/assets/{index.ts-CJXGbOcp.js → index.ts-GG6dPUPX.js} +569 -347
- package/extension/dist/manifest.json +3 -3
- package/extension/dist/service-worker-loader.js +1 -1
- package/package.json +14 -10
- package/extension/dist/assets/content.ts-pEASbjEL.js +0 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/tools/evaluate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;
|
|
1
|
+
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/tools/evaluate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAaxE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAExE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AA8F3D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAE1E;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,uBAAuB,GAAG,SAAS,GAAG,uBAAuB,CAEnH;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG;IACzD,cAAc,EAAE,OAAO,CAAA;IACvB,YAAY,EAAE,QAAQ,GAAG,SAAS,CAAA;IAClC,SAAS,EAAE,OAAO,CAAA;CACrB,CAeA;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG;IACrD,cAAc,EAAE,OAAO,CAAA;IACvB,YAAY,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAA;IAChD,YAAY,EAAE,QAAQ,GAAG,QAAQ,CAAA;IACjC,SAAS,EAAE,OAAO,CAAA;CACrB,CAaA;AAmKD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAS5D"}
|
package/dist/tools/evaluate.js
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
import { readFile } from 'fs/promises';
|
|
7
7
|
import { z } from 'zod';
|
|
8
8
|
import { CWD_PATH_PREFIX, formatErrorResponse, formatResponse, getUnifiedSession, resolveScopedInputPath, resolveScopedOutputPath, TMP_PATH_PREFIX, writePrivateFile, } from '../core/index.js';
|
|
9
|
+
import { EvaluateResultTooLargeError, NonSerializableEvaluateResultError } from '../core/types.js';
|
|
10
|
+
import { appendDiagnostics, finishDiagnostics, startDiagnostics } from './diagnostics.js';
|
|
9
11
|
import { postConditionSchema, waitForPostCondition } from './post-condition.js';
|
|
10
12
|
/**
|
|
11
13
|
* evaluate 参数 schema
|
|
@@ -32,6 +34,10 @@ const evaluateSchema = z.object({
|
|
|
32
34
|
.enum(['stealth', 'precise'])
|
|
33
35
|
.optional()
|
|
34
36
|
.describe('执行模式,precise(默认)使用 debugger API,可绕过 CSP;stealth 使用 JS 注入,不触发调试提示但受 CSP 限制'),
|
|
37
|
+
staleContextRetry: z
|
|
38
|
+
.enum(['never', 'readOnly'])
|
|
39
|
+
.optional()
|
|
40
|
+
.describe('iframe precise 执行遇到 stale execution context 时的重试契约;默认 never 不重放,readOnly 表示脚本无副作用并允许重新解析 context 后重放一次'),
|
|
35
41
|
diagnostics: z.boolean().optional().describe('执行后返回新增 console error/warning 和失败网络请求摘要'),
|
|
36
42
|
postCondition: postConditionSchema
|
|
37
43
|
.optional()
|
|
@@ -45,27 +51,6 @@ const evaluateSchema = z.object({
|
|
|
45
51
|
.optional()
|
|
46
52
|
.describe('iframe 定位(可选,仅 Extension 模式),CSS 选择器(如 "iframe#main")或索引(如 0),不指定则在主框架执行'),
|
|
47
53
|
});
|
|
48
|
-
async function captureDiagnosticsStart(unifiedSession) {
|
|
49
|
-
await unifiedSession.enableConsole();
|
|
50
|
-
await unifiedSession.enableNetwork();
|
|
51
|
-
const consoleLogs = await unifiedSession.getConsoleLogs();
|
|
52
|
-
const network = await unifiedSession.getNetworkRequests();
|
|
53
|
-
return { consoleCount: consoleLogs.length, networkCount: network.length };
|
|
54
|
-
}
|
|
55
|
-
async function captureDiagnosticsDelta(unifiedSession, start) {
|
|
56
|
-
const consoleLogs = await unifiedSession.getConsoleLogs();
|
|
57
|
-
const network = await unifiedSession.getNetworkRequests();
|
|
58
|
-
return {
|
|
59
|
-
console: consoleLogs
|
|
60
|
-
.slice(start.consoleCount)
|
|
61
|
-
.filter((item) => ['error', 'warning', 'warn'].includes(item.level))
|
|
62
|
-
.slice(-20),
|
|
63
|
-
failedRequests: network
|
|
64
|
-
.slice(start.networkCount)
|
|
65
|
-
.filter((item) => item.errorText || (item.status !== undefined && item.status >= 400))
|
|
66
|
-
.slice(-20),
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
54
|
function cspErrorResponse() {
|
|
70
55
|
return {
|
|
71
56
|
content: [
|
|
@@ -83,38 +68,61 @@ function cspErrorResponse() {
|
|
|
83
68
|
isError: true,
|
|
84
69
|
};
|
|
85
70
|
}
|
|
86
|
-
function
|
|
87
|
-
const text = response.content[0]?.text;
|
|
88
|
-
if (!text) {
|
|
89
|
-
return response;
|
|
90
|
-
}
|
|
91
|
-
try {
|
|
92
|
-
const parsed = JSON.parse(text);
|
|
93
|
-
parsed.diagnostics = diagnostics;
|
|
94
|
-
return {
|
|
95
|
-
...response,
|
|
96
|
-
content: [{ type: 'text', text: JSON.stringify(parsed, null, 2) }],
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
catch {
|
|
100
|
-
return response;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
async function formatEvaluateErrorResponse(error, unifiedSession, diagnosticsStart) {
|
|
71
|
+
function formatEvaluateErrorResponse(error) {
|
|
104
72
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
105
|
-
|
|
73
|
+
return errorMessage.includes('CSP') ||
|
|
106
74
|
errorMessage.includes('Content Security Policy') ||
|
|
107
75
|
errorMessage.includes('unsafe-eval')
|
|
108
76
|
? cspErrorResponse()
|
|
109
77
|
: formatErrorResponse(error);
|
|
110
|
-
|
|
111
|
-
|
|
78
|
+
}
|
|
79
|
+
export function resolveEvaluateMode(mode) {
|
|
80
|
+
return mode ?? 'precise';
|
|
81
|
+
}
|
|
82
|
+
export function resolveStaleContextRetryPolicy(policy) {
|
|
83
|
+
return policy ?? 'never';
|
|
84
|
+
}
|
|
85
|
+
export function classifyEvaluateActionError(error) {
|
|
86
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
87
|
+
const preActionTimeout = /tim(?:eout|ed out) before/i.test(message);
|
|
88
|
+
const timedOut = !preActionTimeout && /Request timeout|timed out|timeout|超时/i.test(message);
|
|
89
|
+
const pageEvaluationStarted = /Evaluation failed|exception|ReferenceError|TypeError|SyntaxError|RangeError|URIError|(?:^|\n)Error:/i.test(message);
|
|
90
|
+
const executionStatusUnknown = timedOut || /FRAME_STALE_CONTEXT|FRAME_EVALUATION_FAILED|Execution context became stale/i.test(message);
|
|
91
|
+
return {
|
|
92
|
+
actionExecuted: executionStatusUnknown || pageEvaluationStarted,
|
|
93
|
+
actionStatus: executionStatusUnknown ? 'unknown' : 'failed',
|
|
94
|
+
retryable: /timeout|timed out|超时|disconnect|未连接|context|debugger|attach/i.test(message),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export function classifyEvaluateFailure(error) {
|
|
98
|
+
if (error instanceof NonSerializableEvaluateResultError || error instanceof EvaluateResultTooLargeError) {
|
|
99
|
+
return {
|
|
100
|
+
actionExecuted: true,
|
|
101
|
+
actionStatus: 'completed',
|
|
102
|
+
failureStage: 'output',
|
|
103
|
+
retryable: false,
|
|
104
|
+
};
|
|
112
105
|
}
|
|
106
|
+
return {
|
|
107
|
+
...classifyEvaluateActionError(error),
|
|
108
|
+
failureStage: 'action',
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function appendEvaluateFailureMetadata(response, error, verificationRequested, overrides = {}) {
|
|
112
|
+
const text = response.content[0]?.text;
|
|
113
|
+
if (!text)
|
|
114
|
+
return undefined;
|
|
113
115
|
try {
|
|
114
|
-
|
|
116
|
+
const payload = JSON.parse(text);
|
|
117
|
+
Object.assign(payload, classifyEvaluateFailure(error), {
|
|
118
|
+
verificationRequested,
|
|
119
|
+
verificationStatus: 'unavailable',
|
|
120
|
+
...overrides,
|
|
121
|
+
});
|
|
122
|
+
return payload;
|
|
115
123
|
}
|
|
116
124
|
catch {
|
|
117
|
-
return
|
|
125
|
+
return undefined;
|
|
118
126
|
}
|
|
119
127
|
}
|
|
120
128
|
async function handleEvaluate(args) {
|
|
@@ -145,59 +153,103 @@ async function handleEvaluate(args) {
|
|
|
145
153
|
const unifiedSession = getUnifiedSession();
|
|
146
154
|
return await unifiedSession.withTabId(args.tabId, async () => {
|
|
147
155
|
return await unifiedSession.withFrame(args.frame, async () => {
|
|
148
|
-
const
|
|
156
|
+
const diagnostics = await startDiagnostics(unifiedSession, args.diagnostics);
|
|
157
|
+
const evaluationMode = resolveEvaluateMode(args.mode);
|
|
158
|
+
const staleContextRetry = resolveStaleContextRetryPolicy(args.staleContextRetry);
|
|
159
|
+
let result;
|
|
160
|
+
let evaluationMetadata;
|
|
161
|
+
try {
|
|
162
|
+
result = await unifiedSession.evaluate(script, evaluationMode, args.timeout, args.args, {
|
|
163
|
+
staleContextRetry,
|
|
164
|
+
});
|
|
165
|
+
evaluationMetadata = unifiedSession.consumeLastEvaluationMetadata();
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
evaluationMetadata = unifiedSession.consumeLastEvaluationMetadata();
|
|
169
|
+
const response = formatEvaluateErrorResponse(error);
|
|
170
|
+
const payload = appendEvaluateFailureMetadata(response, error, Boolean(args.postCondition), {
|
|
171
|
+
staleContextRetry,
|
|
172
|
+
...(evaluationMetadata ?? {}),
|
|
173
|
+
});
|
|
174
|
+
if (payload) {
|
|
175
|
+
appendDiagnostics(payload, await finishDiagnostics(unifiedSession, diagnostics));
|
|
176
|
+
response.content[0].text = JSON.stringify(payload, null, 2);
|
|
177
|
+
}
|
|
178
|
+
return response;
|
|
179
|
+
}
|
|
180
|
+
const normalizedResult = result === undefined ? null : result;
|
|
181
|
+
const postCondition = args.postCondition
|
|
182
|
+
? await waitForPostCondition(unifiedSession, args.postCondition, 'evaluate', evaluationMode)
|
|
183
|
+
: undefined;
|
|
184
|
+
const payload = {
|
|
185
|
+
success: postCondition ? postCondition.verificationStatus === 'matched' : true,
|
|
186
|
+
actionExecuted: true,
|
|
187
|
+
actionStatus: 'completed',
|
|
188
|
+
verificationRequested: Boolean(postCondition),
|
|
189
|
+
verificationStatus: postCondition?.verificationStatus ?? 'unavailable',
|
|
190
|
+
failureStage: postCondition && postCondition.verificationStatus !== 'matched' ? 'verification' : undefined,
|
|
191
|
+
retryable: postCondition?.retryable ?? false,
|
|
192
|
+
...(args.frame !== undefined ? { staleContextRetry } : {}),
|
|
193
|
+
...(evaluationMetadata ?? {}),
|
|
194
|
+
...(postCondition ? { postCondition } : {}),
|
|
195
|
+
};
|
|
149
196
|
try {
|
|
150
|
-
const result = await unifiedSession.evaluate(script, args.mode, args.timeout, args.args);
|
|
151
|
-
const normalizedResult = result === undefined ? null : result;
|
|
152
|
-
const postCondition = args.postCondition
|
|
153
|
-
? await waitForPostCondition(unifiedSession, args.postCondition, 'evaluate')
|
|
154
|
-
: undefined;
|
|
155
|
-
const diagnostics = diagnosticsStart
|
|
156
|
-
? await captureDiagnosticsDelta(unifiedSession, diagnosticsStart)
|
|
157
|
-
: undefined;
|
|
158
197
|
if (outputPath) {
|
|
159
|
-
// string 类型直接写入原始文本,其他类型 JSON 序列化
|
|
160
198
|
const content = typeof result === 'string' ? result : JSON.stringify(normalizedResult, null, 2);
|
|
161
199
|
await writePrivateFile(outputPath, content, 'utf-8');
|
|
162
|
-
|
|
163
|
-
success: true,
|
|
164
|
-
output: outputPath,
|
|
165
|
-
...(diagnostics ? { diagnostics } : {}),
|
|
166
|
-
...(postCondition ? { postCondition } : {}),
|
|
167
|
-
});
|
|
200
|
+
payload.output = outputPath;
|
|
168
201
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
202
|
+
else {
|
|
203
|
+
const serialized = JSON.stringify(normalizedResult, null, 2);
|
|
204
|
+
if (serialized.length > 100_000) {
|
|
205
|
+
const suffix = typeof result === 'string' ? 'txt' : 'json';
|
|
206
|
+
const autoSavedPath = (await resolveScopedOutputPath(`${TMP_PATH_PREFIX}evaluate/auto-${Date.now()}.${suffix}`, 'mcp-chrome')).absolutePath;
|
|
207
|
+
const fileContent = typeof result === 'string' ? result : serialized;
|
|
208
|
+
await writePrivateFile(autoSavedPath, fileContent, 'utf-8');
|
|
209
|
+
Object.assign(payload, {
|
|
210
|
+
autoSaved: true,
|
|
211
|
+
path: autoSavedPath,
|
|
212
|
+
size: fileContent.length,
|
|
213
|
+
hint: '结果过大已自动保存到受控临时目录,请使用 Read 工具读取',
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
payload.result = normalizedResult;
|
|
218
|
+
}
|
|
185
219
|
}
|
|
186
|
-
return formatResponse({
|
|
187
|
-
success: true,
|
|
188
|
-
result: normalizedResult,
|
|
189
|
-
...(diagnostics ? { diagnostics } : {}),
|
|
190
|
-
...(postCondition ? { postCondition } : {}),
|
|
191
|
-
});
|
|
192
220
|
}
|
|
193
221
|
catch (error) {
|
|
194
|
-
|
|
222
|
+
const response = formatEvaluateErrorResponse(error);
|
|
223
|
+
const failurePayload = appendEvaluateFailureMetadata(response, error, Boolean(postCondition), {
|
|
224
|
+
actionExecuted: true,
|
|
225
|
+
actionStatus: 'completed',
|
|
226
|
+
verificationStatus: postCondition?.verificationStatus ?? 'unavailable',
|
|
227
|
+
failureStage: 'output',
|
|
228
|
+
retryable: false,
|
|
229
|
+
...(postCondition ? { postCondition } : {}),
|
|
230
|
+
});
|
|
231
|
+
if (failurePayload) {
|
|
232
|
+
appendDiagnostics(failurePayload, await finishDiagnostics(unifiedSession, diagnostics));
|
|
233
|
+
response.content[0].text = JSON.stringify(failurePayload, null, 2);
|
|
234
|
+
}
|
|
235
|
+
return response;
|
|
195
236
|
}
|
|
237
|
+
appendDiagnostics(payload, await finishDiagnostics(unifiedSession, diagnostics));
|
|
238
|
+
return formatResponse(payload);
|
|
196
239
|
});
|
|
197
240
|
}); // withTabId
|
|
198
241
|
}
|
|
199
242
|
catch (error) {
|
|
200
|
-
|
|
243
|
+
const response = formatEvaluateErrorResponse(error);
|
|
244
|
+
const payload = appendEvaluateFailureMetadata(response, error, Boolean(args.postCondition));
|
|
245
|
+
if (payload) {
|
|
246
|
+
payload.diagnosticsStatus = args.diagnostics ? 'unavailable' : 'disabled';
|
|
247
|
+
if (args.diagnostics) {
|
|
248
|
+
payload.diagnosticsError = 'diagnostics 未能在 tab/frame 初始化失败前启动';
|
|
249
|
+
}
|
|
250
|
+
response.content[0].text = JSON.stringify(payload, null, 2);
|
|
251
|
+
}
|
|
252
|
+
return response;
|
|
201
253
|
}
|
|
202
254
|
}
|
|
203
255
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/tools/evaluate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EACH,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,EACvB,eAAe,EACf,gBAAgB,GACnB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/tools/evaluate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/tools/extract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/tools/extract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AA+6CxE;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAS3D"}
|
package/dist/tools/extract.js
CHANGED
|
@@ -16,6 +16,8 @@ import { z } from 'zod';
|
|
|
16
16
|
import { CWD_PATH_PREFIX, formatErrorResponse, formatResponse, getSession, getUnifiedSession, resolveScopedOutputPath, TMP_PATH_PREFIX, writePrivateFile, } from '../core/index.js';
|
|
17
17
|
import { comparePngImages, MAX_COMPARE_PIXELS, MAX_COMPARE_PNG_BYTES, readPngHeader } from './png.js';
|
|
18
18
|
import { targetToFindParams, targetZodSchema } from './schema.js';
|
|
19
|
+
import { sanitizeUrlRecords } from './network-sanitizer.js';
|
|
20
|
+
import { buildTargetDiagnostics, TargetTimeoutError } from './target-diagnostics.js';
|
|
19
21
|
/** 无 output 时附录返回的最大图片数 */
|
|
20
22
|
const MAX_APPENDIX_IMAGES = 20;
|
|
21
23
|
/**
|
|
@@ -81,18 +83,18 @@ const extractSchema = z.object({
|
|
|
81
83
|
async function handleExtract(args) {
|
|
82
84
|
try {
|
|
83
85
|
const unifiedSession = getUnifiedSession();
|
|
84
|
-
const useExtension = unifiedSession.isExtensionConnected();
|
|
85
|
-
const session = getSession();
|
|
86
|
-
const frameHtmlError = validateFrameHtmlArgs(args, useExtension);
|
|
87
|
-
if (frameHtmlError) {
|
|
88
|
-
return frameHtmlError;
|
|
89
|
-
}
|
|
90
86
|
// 多 tab 并行:临时切换到指定 tab
|
|
91
87
|
return await unifiedSession.withTabId(args.tabId, async () => {
|
|
92
88
|
return await unifiedSession.withFrame(args.frame, async () => {
|
|
89
|
+
const useExtension = unifiedSession.getMode() === 'extension';
|
|
90
|
+
const frameHtmlError = validateFrameHtmlArgs(args, useExtension);
|
|
91
|
+
if (frameHtmlError) {
|
|
92
|
+
return frameHtmlError;
|
|
93
|
+
}
|
|
94
|
+
const session = getSession();
|
|
93
95
|
// Extension 路径:等待目标元素出现(如果指定了 target + timeout)
|
|
94
96
|
if (useExtension && args.target && args.timeout !== undefined) {
|
|
95
|
-
await waitForTargetExtension(unifiedSession, args.target, args.timeout);
|
|
97
|
+
await waitForTargetExtension(unifiedSession, args.target, args.timeout, args.frame);
|
|
96
98
|
}
|
|
97
99
|
return handleExtractInFrame({ unifiedSession, session, useExtension }, args);
|
|
98
100
|
}); // withFrame
|
|
@@ -337,13 +339,13 @@ async function handleDomSnapshotState(unifiedSession, useExtension, args) {
|
|
|
337
339
|
return formatResponse({ success: true, type: 'state', mode: 'domsnapshot', snapshot });
|
|
338
340
|
}
|
|
339
341
|
async function handleDiagnosticBundleExtract({ unifiedSession, useExtension }, args) {
|
|
340
|
-
const state = unifiedSession.
|
|
342
|
+
const state = await unifiedSession.getLiveState().catch(() => null);
|
|
341
343
|
const metadata = await unifiedSession.getMetadata();
|
|
342
344
|
const frames = useExtension ? await unifiedSession.getFrames() : { frames: [] };
|
|
343
345
|
await unifiedSession.enableConsole();
|
|
344
346
|
await unifiedSession.enableNetwork();
|
|
345
|
-
const consoleLogs = await unifiedSession.getConsoleLogs();
|
|
346
|
-
const networkRequests = await unifiedSession.getNetworkRequests();
|
|
347
|
+
const consoleLogs = sanitizeUrlRecords(await unifiedSession.getConsoleLogs());
|
|
348
|
+
const networkRequests = sanitizeUrlRecords(await unifiedSession.getNetworkRequests());
|
|
347
349
|
const bundle = {
|
|
348
350
|
schema: 'mcp-chrome.diagnosticBundle.v1',
|
|
349
351
|
url: state?.url,
|
|
@@ -1093,7 +1095,7 @@ async function extractComputedStyleExtension(unifiedSession, selector, text, xpa
|
|
|
1093
1095
|
* 在 extract 操作前轮询 find(),直到找到匹配元素或超时,
|
|
1094
1096
|
* 用于实现 extract 的 timeout 参数语义
|
|
1095
1097
|
*/
|
|
1096
|
-
async function waitForTargetExtension(unifiedSession, target, timeout) {
|
|
1098
|
+
async function waitForTargetExtension(unifiedSession, target, timeout, frame) {
|
|
1097
1099
|
if ('x' in target && 'y' in target) {
|
|
1098
1100
|
return;
|
|
1099
1101
|
}
|
|
@@ -1102,20 +1104,31 @@ async function waitForTargetExtension(unifiedSession, target, timeout) {
|
|
|
1102
1104
|
const { selector, text, xpath, nth: nthParam } = targetToFindParams(target);
|
|
1103
1105
|
const nth = nthParam ?? 0;
|
|
1104
1106
|
let lastError = null;
|
|
1107
|
+
let matchCount = 0;
|
|
1108
|
+
let candidates = [];
|
|
1105
1109
|
while (true) {
|
|
1106
1110
|
const elapsed = Date.now() - startTime;
|
|
1107
1111
|
if (elapsed >= timeout) {
|
|
1108
|
-
|
|
1109
|
-
|
|
1112
|
+
throw new TargetTimeoutError(await buildTargetDiagnostics(unifiedSession, target, {
|
|
1113
|
+
nth,
|
|
1114
|
+
timeout,
|
|
1115
|
+
frame,
|
|
1116
|
+
matchCount,
|
|
1117
|
+
lastState: 'attached',
|
|
1118
|
+
lastError,
|
|
1119
|
+
candidates,
|
|
1120
|
+
}));
|
|
1110
1121
|
}
|
|
1122
|
+
const remaining = timeout - elapsed;
|
|
1111
1123
|
if (!unifiedSession.isExtensionConnected()) {
|
|
1112
1124
|
lastError = new Error('Extension 未连接');
|
|
1113
|
-
await new Promise((
|
|
1125
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(retryDelay, remaining)));
|
|
1114
1126
|
continue;
|
|
1115
1127
|
}
|
|
1116
1128
|
try {
|
|
1117
|
-
const remaining = timeout - elapsed;
|
|
1118
1129
|
const elements = await unifiedSession.find(selector, text, xpath, remaining);
|
|
1130
|
+
matchCount = elements.length;
|
|
1131
|
+
candidates = elements;
|
|
1119
1132
|
if (elements.length > nth) {
|
|
1120
1133
|
return;
|
|
1121
1134
|
}
|
|
@@ -1125,12 +1138,18 @@ async function waitForTargetExtension(unifiedSession, target, timeout) {
|
|
|
1125
1138
|
if (err instanceof Error &&
|
|
1126
1139
|
/Request timeout|Failed to send|disconnect|未连接|stopped|replaced/i.test(err.message)) {
|
|
1127
1140
|
lastError = err;
|
|
1128
|
-
|
|
1141
|
+
const retryRemaining = timeout - (Date.now() - startTime);
|
|
1142
|
+
if (retryRemaining > 0) {
|
|
1143
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(retryDelay, retryRemaining)));
|
|
1144
|
+
}
|
|
1129
1145
|
continue;
|
|
1130
1146
|
}
|
|
1131
1147
|
throw err;
|
|
1132
1148
|
}
|
|
1133
|
-
|
|
1149
|
+
const retryRemaining = timeout - (Date.now() - startTime);
|
|
1150
|
+
if (retryRemaining > 0) {
|
|
1151
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(retryDelay, retryRemaining)));
|
|
1152
|
+
}
|
|
1134
1153
|
}
|
|
1135
1154
|
}
|
|
1136
1155
|
/**
|