diff --git a/src/McpContext.ts b/src/McpContext.ts index 76cbfdbd2..83cdb2fca 100644 --- a/src/McpContext.ts +++ b/src/McpContext.ts @@ -207,13 +207,12 @@ export class McpContext implements Context { return this.#requestPage?.pptrPage ?? this.getSelectedPptrPage(); } - resolveCdpRequestId(cdpRequestId: string): number | undefined { - const selectedPage = this.#resolveTargetPage(); + resolveCdpRequestId(page: McpPage, cdpRequestId: string): number | undefined { if (!cdpRequestId) { this.logger('no network request'); return; } - const request = this.#networkCollector.find(selectedPage, request => { + const request = this.#networkCollector.find(page.pptrPage, request => { // @ts-expect-error id is internal. return request.id === cdpRequestId; }); @@ -225,31 +224,27 @@ export class McpContext implements Context { } resolveCdpElementId( + page: McpPage, cdpBackendNodeId: number, - page?: Page, ): string | undefined { if (!cdpBackendNodeId) { this.logger('no cdpBackendNodeId'); return; } - const snapshots = page - ? [this.#mcpPages.get(page)?.textSnapshot].filter(Boolean) - : [...this.#mcpPages.values()].map(mp => mp.textSnapshot).filter(Boolean); - if (!snapshots.length) { + const snapshot = page.textSnapshot; + if (!snapshot) { this.logger('no text snapshot'); return; } // TODO: index by backendNodeId instead. - for (const snapshot of snapshots) { - const queue = [snapshot!.root]; - while (queue.length) { - const current = queue.pop()!; - if (current.backendNodeId === cdpBackendNodeId) { - return current.id; - } - for (const child of current.children) { - queue.push(child); - } + const queue = [snapshot.root]; + while (queue.length) { + const current = queue.pop()!; + if (current.backendNodeId === cdpBackendNodeId) { + return current.id; + } + for (const child of current.children) { + queue.push(child); } } return; @@ -971,8 +966,8 @@ export class McpContext implements Context { if (data?.cdpBackendNodeId) { snapshot.hasSelectedElement = true; snapshot.selectedElementUid = this.resolveCdpElementId( + mcpPage, data?.cdpBackendNodeId, - page, ); } diff --git a/src/McpResponse.ts b/src/McpResponse.ts index 9a0f19134..bfc7b98b2 100644 --- a/src/McpResponse.ts +++ b/src/McpResponse.ts @@ -320,10 +320,19 @@ export class McpResponse implements Response { devTools: devTools ?? undefined, }); } else if (message instanceof DevTools.AggregatedIssue) { + if (!this.#page) { + throw new Error(`Response must have an McpPage`); + } const formatter = new IssueFormatter(message, { id: consoleMessageStableId, - requestIdResolver: context.resolveCdpRequestId.bind(context), - elementIdResolver: context.resolveCdpElementId.bind(context), + requestIdResolver: context.resolveCdpRequestId.bind( + context, + this.#page, + ), + elementIdResolver: context.resolveCdpElementId.bind( + context, + this.#page, + ), }); if (!formatter.isValid()) { throw new Error( diff --git a/src/tools/ToolDefinition.ts b/src/tools/ToolDefinition.ts index 982cf9b75..fc364e47f 100644 --- a/src/tools/ToolDefinition.ts +++ b/src/tools/ToolDefinition.ts @@ -179,7 +179,10 @@ export type Context = Readonly<{ /** * Returns a reqid for a cdpRequestId. */ - resolveCdpRequestId(cdpRequestId: string): number | undefined; + resolveCdpRequestId( + page: ContextPage, + cdpRequestId: string, + ): number | undefined; getScreenRecorder(): {recorder: ScreenRecorder; filePath: string} | null; setScreenRecorder( data: {recorder: ScreenRecorder; filePath: string} | null, diff --git a/src/tools/network.ts b/src/tools/network.ts index 15fbe0a7c..f399f7098 100644 --- a/src/tools/network.ts +++ b/src/tools/network.ts @@ -74,7 +74,7 @@ export const listNetworkRequests = definePageTool({ const data = await context.getDevToolsData(); response.attachDevToolsData(data); const reqid = data?.cdpRequestId - ? context.resolveCdpRequestId(data.cdpRequestId) + ? context.resolveCdpRequestId(request.page, data.cdpRequestId) : undefined; response.setIncludeNetworkRequests(true, { pageSize: request.params.pageSize, @@ -123,7 +123,7 @@ export const getNetworkRequest = definePageTool({ const data = await context.getDevToolsData(); response.attachDevToolsData(data); const reqid = data?.cdpRequestId - ? context.resolveCdpRequestId(data.cdpRequestId) + ? context.resolveCdpRequestId(request.page, data.cdpRequestId) : undefined; if (reqid) { response.attachNetworkRequest(reqid, { diff --git a/tests/tools/console.test.ts b/tests/tools/console.test.ts index 09754cadb..979853587 100644 --- a/tests/tools/console.test.ts +++ b/tests/tools/console.test.ts @@ -212,6 +212,7 @@ describe('console', () => { context, ); const response2 = new McpResponse({} as ParsedArguments); + response2.setPage(context.getSelectedMcpPage()); await getConsoleMessage.handler( {params: {msgid: 1}, page: context.getSelectedMcpPage()}, response2, @@ -267,6 +268,7 @@ describe('console', () => { context, ); const response2 = new McpResponse({} as ParsedArguments); + response2.setPage(context.getSelectedMcpPage()); await getConsoleMessage.handler( {params: {msgid: id}, page: context.getSelectedMcpPage()}, response2,