豆豆友情提示:这是一个非官方 GitHub 代理镜像,主要用于网络测试或访问加速。请勿在此进行登录、注册或处理任何敏感信息。进行这些操作请务必访问官方网站 github.com。 Raw 内容也通过此代理提供。
Skip to content

Commit b72a9ea

Browse files
committed
chore: extract issue formatter in preparation to structured content
1 parent 1e0ee69 commit b72a9ea

File tree

8 files changed

+448
-354
lines changed

8 files changed

+448
-354
lines changed

src/DevtoolsUtils.ts

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
*/
66

77
import {PuppeteerDevToolsConnection} from './DevToolsConnectionAdapter.js';
8-
import {ISSUE_UTILS} from './issue-descriptions.js';
9-
import {logger} from './logger.js';
108
import {Mutex} from './Mutex.js';
119
import {DevTools} from './third_party/index.js';
1210
import type {
@@ -81,50 +79,6 @@ export class FakeIssuesManager extends DevTools.Common.ObjectWrapper
8179
}
8280
}
8381

84-
export function mapIssueToMessageObject(issue: DevTools.AggregatedIssue) {
85-
const count = issue.getAggregatedIssuesCount();
86-
const markdownDescription = issue.getDescription();
87-
const filename = markdownDescription?.file;
88-
if (!markdownDescription) {
89-
logger(`no description found for issue:` + issue.code);
90-
return null;
91-
}
92-
const rawMarkdown = filename
93-
? ISSUE_UTILS.getIssueDescription(filename)
94-
: null;
95-
if (!rawMarkdown) {
96-
logger(`no markdown ${filename} found for issue:` + issue.code);
97-
return null;
98-
}
99-
let processedMarkdown: string;
100-
let title: string | null;
101-
102-
try {
103-
processedMarkdown =
104-
DevTools.MarkdownIssueDescription.substitutePlaceholders(
105-
rawMarkdown,
106-
markdownDescription.substitutions,
107-
);
108-
const markdownAst = DevTools.Marked.Marked.lexer(processedMarkdown);
109-
title =
110-
DevTools.MarkdownIssueDescription.findTitleFromMarkdownAst(markdownAst);
111-
} catch {
112-
logger('error parsing markdown for issue ' + issue.code());
113-
return null;
114-
}
115-
if (!title) {
116-
logger('cannot read issue title from ' + filename);
117-
return null;
118-
}
119-
return {
120-
type: 'issue',
121-
item: issue,
122-
message: title,
123-
count,
124-
description: processedMarkdown,
125-
};
126-
}
127-
12882
// DevTools CDP errors can get noisy.
12983
DevTools.ProtocolClient.InspectorBackend.test.suppressRequestErrors = true;
13084

src/McpResponse.ts

Lines changed: 61 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7-
import {mapIssueToMessageObject} from './DevtoolsUtils.js';
87
import type {ConsoleMessageData} from './formatters/consoleFormatter.js';
98
import {
109
formatConsoleEventShort,
1110
formatConsoleEventVerbose,
1211
} from './formatters/consoleFormatter.js';
12+
import {IssueFormatter} from './formatters/IssueFormatter.js';
1313
import {NetworkFormatter} from './formatters/NetworkFormatter.js';
1414
import {SnapshotFormatter} from './formatters/SnapshotFormatter.js';
1515
import type {McpContext} from './McpContext.js';
@@ -222,7 +222,7 @@ export class McpResponse implements Response {
222222
detailedNetworkRequest = formatter;
223223
}
224224

225-
let consoleData: ConsoleMessageData | undefined;
225+
let consoleData: ConsoleMessageData | IssueFormatter | undefined;
226226

227227
if (this.#attachedConsoleMessageId) {
228228
const message = context.getConsoleMessageById(
@@ -247,16 +247,17 @@ export class McpResponse implements Response {
247247
),
248248
};
249249
} else if (message instanceof DevTools.AggregatedIssue) {
250-
const mappedIssueMessage = mapIssueToMessageObject(message);
251-
if (!mappedIssueMessage) {
250+
const formatter = new IssueFormatter(message, {
251+
id: consoleMessageStableId,
252+
requestIdResolver: context.resolveCdpRequestId.bind(context),
253+
elementIdResolver: context.resolveCdpElementId.bind(context),
254+
});
255+
if (!formatter.isValid()) {
252256
throw new Error(
253257
"Can't provide detals for the msgid " + consoleMessageStableId,
254258
);
255259
}
256-
consoleData = {
257-
consoleMessageStableId,
258-
...mappedIssueMessage,
259-
};
260+
consoleData = formatter;
260261
} else {
261262
consoleData = {
262263
consoleMessageStableId,
@@ -267,7 +268,7 @@ export class McpResponse implements Response {
267268
}
268269
}
269270

270-
let consoleListData: ConsoleMessageData[] | undefined;
271+
let consoleListData: Array<ConsoleMessageData | IssueFormatter> | undefined;
271272
if (this.#consoleDataOptions?.include) {
272273
let messages = context.getConsoleData(
273274
this.#consoleDataOptions.includePreservedMessages,
@@ -288,44 +289,47 @@ export class McpResponse implements Response {
288289

289290
consoleListData = (
290291
await Promise.all(
291-
messages.map(async (item): Promise<ConsoleMessageData | null> => {
292-
const consoleMessageStableId =
293-
context.getConsoleMessageStableId(item);
294-
if ('args' in item) {
295-
const consoleMessage = item as ConsoleMessage;
296-
return {
297-
consoleMessageStableId,
298-
type: consoleMessage.type(),
299-
message: consoleMessage.text(),
300-
args: await Promise.all(
301-
consoleMessage.args().map(async arg => {
302-
const stringArg = await arg.jsonValue().catch(() => {
303-
// Ignore errors.
304-
});
305-
return typeof stringArg === 'object'
306-
? JSON.stringify(stringArg)
307-
: String(stringArg);
308-
}),
309-
),
310-
};
311-
}
312-
if (item instanceof DevTools.AggregatedIssue) {
313-
const mappedIssueMessage = mapIssueToMessageObject(item);
314-
if (!mappedIssueMessage) {
315-
return null;
292+
messages.map(
293+
async (
294+
item,
295+
): Promise<ConsoleMessageData | IssueFormatter | null> => {
296+
const consoleMessageStableId =
297+
context.getConsoleMessageStableId(item);
298+
if ('args' in item) {
299+
const consoleMessage = item as ConsoleMessage;
300+
return {
301+
consoleMessageStableId,
302+
type: consoleMessage.type(),
303+
message: consoleMessage.text(),
304+
args: await Promise.all(
305+
consoleMessage.args().map(async arg => {
306+
const stringArg = await arg.jsonValue().catch(() => {
307+
// Ignore errors.
308+
});
309+
return typeof stringArg === 'object'
310+
? JSON.stringify(stringArg)
311+
: String(stringArg);
312+
}),
313+
),
314+
};
315+
}
316+
if (item instanceof DevTools.AggregatedIssue) {
317+
const formatter = new IssueFormatter(item, {
318+
id: consoleMessageStableId,
319+
});
320+
if (!formatter.isValid()) {
321+
return null;
322+
}
323+
return formatter;
316324
}
317325
return {
318326
consoleMessageStableId,
319-
...mappedIssueMessage,
327+
type: 'error',
328+
message: (item as Error).message,
329+
args: [],
320330
};
321-
}
322-
return {
323-
consoleMessageStableId,
324-
type: 'error',
325-
message: (item as Error).message,
326-
args: [],
327-
};
328-
}),
331+
},
332+
),
329333
)
330334
).filter(item => item !== null);
331335
}
@@ -380,8 +384,8 @@ export class McpResponse implements Response {
380384
toolName: string,
381385
context: McpContext,
382386
data: {
383-
consoleData: ConsoleMessageData | undefined;
384-
consoleListData: ConsoleMessageData[] | undefined;
387+
consoleData: ConsoleMessageData | IssueFormatter | undefined;
388+
consoleListData: Array<ConsoleMessageData | IssueFormatter> | undefined;
385389
snapshot: SnapshotFormatter | string | undefined;
386390
detailedNetworkRequest?: NetworkFormatter;
387391
networkRequests?: NetworkFormatter[];
@@ -504,7 +508,12 @@ Call ${handleDialog.name} to handle it before continuing.`);
504508
);
505509
response.push(...data.info);
506510
response.push(
507-
...data.items.map(message => formatConsoleEventShort(message)),
511+
...data.items.map(message => {
512+
if (message instanceof IssueFormatter) {
513+
return message.toString();
514+
}
515+
return formatConsoleEventShort(message);
516+
}),
508517
);
509518
} else {
510519
response.push('<no console messages found>');
@@ -556,14 +565,18 @@ Call ${handleDialog.name} to handle it before continuing.`);
556565

557566
#formatConsoleData(
558567
context: McpContext,
559-
data: ConsoleMessageData | undefined,
568+
data: ConsoleMessageData | IssueFormatter | undefined,
560569
): string[] {
561570
const response: string[] = [];
562571
if (!data) {
563572
return response;
564573
}
565574

566-
response.push(formatConsoleEventVerbose(data, context));
575+
if (data instanceof IssueFormatter) {
576+
response.push(data.toStringDetailed());
577+
} else {
578+
response.push(formatConsoleEventVerbose(data, context));
579+
}
567580
return response;
568581
}
569582

0 commit comments

Comments
 (0)