Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 0 additions & 46 deletions src/DevtoolsUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
*/

import {PuppeteerDevToolsConnection} from './DevToolsConnectionAdapter.js';
import {ISSUE_UTILS} from './issue-descriptions.js';
import {logger} from './logger.js';
import {Mutex} from './Mutex.js';
import {DevTools} from './third_party/index.js';
import type {
Expand Down Expand Up @@ -81,50 +79,6 @@ export class FakeIssuesManager extends DevTools.Common.ObjectWrapper
}
}

export function mapIssueToMessageObject(issue: DevTools.AggregatedIssue) {
const count = issue.getAggregatedIssuesCount();
const markdownDescription = issue.getDescription();
const filename = markdownDescription?.file;
if (!markdownDescription) {
logger(`no description found for issue:` + issue.code);
return null;
}
const rawMarkdown = filename
? ISSUE_UTILS.getIssueDescription(filename)
: null;
if (!rawMarkdown) {
logger(`no markdown ${filename} found for issue:` + issue.code);
return null;
}
let processedMarkdown: string;
let title: string | null;

try {
processedMarkdown =
DevTools.MarkdownIssueDescription.substitutePlaceholders(
rawMarkdown,
markdownDescription.substitutions,
);
const markdownAst = DevTools.Marked.Marked.lexer(processedMarkdown);
title =
DevTools.MarkdownIssueDescription.findTitleFromMarkdownAst(markdownAst);
} catch {
logger('error parsing markdown for issue ' + issue.code());
return null;
}
if (!title) {
logger('cannot read issue title from ' + filename);
return null;
}
return {
type: 'issue',
item: issue,
message: title,
count,
description: processedMarkdown,
};
}

// DevTools CDP errors can get noisy.
DevTools.ProtocolClient.InspectorBackend.test.suppressRequestErrors = true;

Expand Down
109 changes: 61 additions & 48 deletions src/McpResponse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
* SPDX-License-Identifier: Apache-2.0
*/

import {mapIssueToMessageObject} from './DevtoolsUtils.js';
import type {ConsoleMessageData} from './formatters/consoleFormatter.js';
import {
formatConsoleEventShort,
formatConsoleEventVerbose,
} from './formatters/consoleFormatter.js';
import {IssueFormatter} from './formatters/IssueFormatter.js';
import {NetworkFormatter} from './formatters/NetworkFormatter.js';
import {SnapshotFormatter} from './formatters/SnapshotFormatter.js';
import type {McpContext} from './McpContext.js';
Expand Down Expand Up @@ -222,7 +222,7 @@ export class McpResponse implements Response {
detailedNetworkRequest = formatter;
}

let consoleData: ConsoleMessageData | undefined;
let consoleData: ConsoleMessageData | IssueFormatter | undefined;

if (this.#attachedConsoleMessageId) {
const message = context.getConsoleMessageById(
Expand All @@ -247,16 +247,17 @@ export class McpResponse implements Response {
),
};
} else if (message instanceof DevTools.AggregatedIssue) {
const mappedIssueMessage = mapIssueToMessageObject(message);
if (!mappedIssueMessage) {
const formatter = new IssueFormatter(message, {
id: consoleMessageStableId,
requestIdResolver: context.resolveCdpRequestId.bind(context),
elementIdResolver: context.resolveCdpElementId.bind(context),
});
if (!formatter.isValid()) {
throw new Error(
"Can't provide detals for the msgid " + consoleMessageStableId,
);
}
consoleData = {
consoleMessageStableId,
...mappedIssueMessage,
};
consoleData = formatter;
} else {
consoleData = {
consoleMessageStableId,
Expand All @@ -267,7 +268,7 @@ export class McpResponse implements Response {
}
}

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

consoleListData = (
await Promise.all(
messages.map(async (item): Promise<ConsoleMessageData | null> => {
const consoleMessageStableId =
context.getConsoleMessageStableId(item);
if ('args' in item) {
const consoleMessage = item as ConsoleMessage;
return {
consoleMessageStableId,
type: consoleMessage.type(),
message: consoleMessage.text(),
args: await Promise.all(
consoleMessage.args().map(async arg => {
const stringArg = await arg.jsonValue().catch(() => {
// Ignore errors.
});
return typeof stringArg === 'object'
? JSON.stringify(stringArg)
: String(stringArg);
}),
),
};
}
if (item instanceof DevTools.AggregatedIssue) {
const mappedIssueMessage = mapIssueToMessageObject(item);
if (!mappedIssueMessage) {
return null;
messages.map(
async (
item,
): Promise<ConsoleMessageData | IssueFormatter | null> => {
const consoleMessageStableId =
context.getConsoleMessageStableId(item);
if ('args' in item) {
const consoleMessage = item as ConsoleMessage;
return {
consoleMessageStableId,
type: consoleMessage.type(),
message: consoleMessage.text(),
args: await Promise.all(
consoleMessage.args().map(async arg => {
const stringArg = await arg.jsonValue().catch(() => {
// Ignore errors.
});
return typeof stringArg === 'object'
? JSON.stringify(stringArg)
: String(stringArg);
}),
),
};
}
if (item instanceof DevTools.AggregatedIssue) {
const formatter = new IssueFormatter(item, {
id: consoleMessageStableId,
});
if (!formatter.isValid()) {
return null;
}
return formatter;
}
return {
consoleMessageStableId,
...mappedIssueMessage,
type: 'error',
message: (item as Error).message,
args: [],
};
}
return {
consoleMessageStableId,
type: 'error',
message: (item as Error).message,
args: [],
};
}),
},
),
)
).filter(item => item !== null);
}
Expand Down Expand Up @@ -380,8 +384,8 @@ export class McpResponse implements Response {
toolName: string,
context: McpContext,
data: {
consoleData: ConsoleMessageData | undefined;
consoleListData: ConsoleMessageData[] | undefined;
consoleData: ConsoleMessageData | IssueFormatter | undefined;
consoleListData: Array<ConsoleMessageData | IssueFormatter> | undefined;
snapshot: SnapshotFormatter | string | undefined;
detailedNetworkRequest?: NetworkFormatter;
networkRequests?: NetworkFormatter[];
Expand Down Expand Up @@ -504,7 +508,12 @@ Call ${handleDialog.name} to handle it before continuing.`);
);
response.push(...data.info);
response.push(
...data.items.map(message => formatConsoleEventShort(message)),
...data.items.map(message => {
if (message instanceof IssueFormatter) {
return message.toString();
}
return formatConsoleEventShort(message);
}),
);
} else {
response.push('<no console messages found>');
Expand Down Expand Up @@ -556,14 +565,18 @@ Call ${handleDialog.name} to handle it before continuing.`);

#formatConsoleData(
context: McpContext,
data: ConsoleMessageData | undefined,
data: ConsoleMessageData | IssueFormatter | undefined,
): string[] {
const response: string[] = [];
if (!data) {
return response;
}

response.push(formatConsoleEventVerbose(data, context));
if (data instanceof IssueFormatter) {
response.push(data.toStringDetailed());
} else {
response.push(formatConsoleEventVerbose(data, context));
}
return response;
}

Expand Down
Loading