@narumitw/pi-chrome-devtools 0.53.2 → 0.53.4

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.
Files changed (40) hide show
  1. package/README.md +1 -0
  2. package/dist/chunks/{browser-settings-menu-IMB6HXSU.js → browser-settings-menu-FVMCCUPM.ts} +16 -42
  3. package/dist/chunks/browser-settings-menu-FVMCCUPM.ts.map +7 -0
  4. package/dist/chunks/{chunk-GTTYS5GT.js → chunk-4B3EQHOH.ts} +2 -2
  5. package/dist/chunks/chunk-4B3EQHOH.ts.map +7 -0
  6. package/dist/chunks/{chunk-SRT3UUIP.js → chunk-LSJSDY2M.ts} +23 -74
  7. package/dist/chunks/chunk-LSJSDY2M.ts.map +7 -0
  8. package/dist/chunks/{chunk-LLXOCRNF.js → chunk-V7N3WI5B.ts} +12 -33
  9. package/dist/chunks/chunk-V7N3WI5B.ts.map +7 -0
  10. package/dist/chunks/{menu-UJETYMSB.js → menu-MTPSLDHZ.ts} +10 -23
  11. package/dist/chunks/menu-MTPSLDHZ.ts.map +7 -0
  12. package/dist/chunks/{tools-6P7EUX37.js → tools-OVNH45IJ.ts} +17 -59
  13. package/dist/chunks/tools-OVNH45IJ.ts.map +7 -0
  14. package/dist/index.ts +18 -42
  15. package/dist/index.ts.map +2 -2
  16. package/package.json +54 -55
  17. package/src/browser-manager.ts +872 -942
  18. package/src/browser-settings-menu.ts +315 -350
  19. package/src/cdp-client.ts +381 -398
  20. package/src/chrome-devtools.ts +205 -232
  21. package/src/display.ts +26 -29
  22. package/src/lazy-tools.ts +158 -181
  23. package/src/menu.ts +409 -446
  24. package/src/render.ts +72 -81
  25. package/src/runtime.ts +137 -140
  26. package/src/screenshot.ts +170 -186
  27. package/src/settings.ts +472 -523
  28. package/src/tool-names.ts +8 -14
  29. package/src/tool-selector.ts +242 -271
  30. package/src/tools.ts +218 -226
  31. package/src/webmcp/discovery.ts +184 -188
  32. package/src/webmcp/policy.ts +296 -329
  33. package/src/webmcp/protocol.ts +324 -337
  34. package/src/webmcp/tools.ts +136 -147
  35. package/dist/chunks/browser-settings-menu-IMB6HXSU.js.map +0 -7
  36. package/dist/chunks/chunk-GTTYS5GT.js.map +0 -7
  37. package/dist/chunks/chunk-LLXOCRNF.js.map +0 -7
  38. package/dist/chunks/chunk-SRT3UUIP.js.map +0 -7
  39. package/dist/chunks/menu-UJETYMSB.js.map +0 -7
  40. package/dist/chunks/tools-6P7EUX37.js.map +0 -7
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/tool-names.ts", "../../src/settings.ts", "../../src/runtime.ts", "../../src/browser-manager.ts"],
4
- "sourcesContent": ["export const CORE_CHROME_DEVTOOLS_TOOL_NAMES = [\n\t\"chrome_devtools_list_pages\",\n\t\"chrome_devtools_select_page\",\n\t\"chrome_devtools_navigate\",\n\t\"chrome_devtools_evaluate\",\n\t\"chrome_devtools_screenshot\",\n] as const;\n\nexport const WEBMCP_TOOL_NAMES = [\n\t\"chrome_devtools_webmcp_list_tools\",\n\t\"chrome_devtools_webmcp_call_tool\",\n] as const;\n\nexport const CHROME_DEVTOOLS_TOOL_NAMES = [\n\t...CORE_CHROME_DEVTOOLS_TOOL_NAMES,\n\t...WEBMCP_TOOL_NAMES,\n] as const;\n\nexport type ChromeDevToolsToolName = (typeof CHROME_DEVTOOLS_TOOL_NAMES)[number];\nexport type WebMcpToolName = (typeof WEBMCP_TOOL_NAMES)[number];\n\nexport function isWebMcpToolName(value: string): value is WebMcpToolName {\n\treturn WEBMCP_TOOL_NAMES.includes(value as WebMcpToolName);\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport {\n\taccess,\n\tlstat,\n\tmkdir,\n\treadFile,\n\trealpath,\n\trename,\n\trm,\n\tstat,\n\twriteFile,\n} from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport { CHROME_DEVTOOLS_TOOL_NAMES, type ChromeDevToolsToolName } from \"./tool-names.js\";\n\nconst NEW_SETTINGS_FILE_NAME = \"pi-chrome-devtools.json\";\nconst LEGACY_SETTINGS_FILE_NAME = \"pi-chrome-devtools-settings.json\";\n\nexport interface ChromeDevToolsSettings {\n\ttools: ChromeDevToolsToolName[];\n\tupdatedAt: number;\n}\n\nexport const DEFAULT_BROWSER_HOST = \"127.0.0.1\";\nexport const DEFAULT_BROWSER_PORT = 9222;\nexport const DEFAULT_BROWSER_ENDPOINT = `http://${DEFAULT_BROWSER_HOST}:${DEFAULT_BROWSER_PORT}`;\n\nexport type BrowserSettingsSource = \"default\" | \"environment\" | \"project\" | \"user\";\n\nexport interface UserBrowserSettings {\n\tendpoint?: string;\n\tautoLaunch?: boolean;\n\texecutablePath?: string;\n\textensionPaths?: string[];\n}\n\nexport interface BrowserSettingsPatch {\n\tendpoint?: string | null;\n\tautoLaunch?: boolean | null;\n\texecutablePath?: string | null;\n}\n\nexport interface EffectiveBrowserSettings {\n\tendpoint: string;\n\thost: string;\n\tport: number;\n\thostConfigured: boolean;\n\tportConfigured: boolean;\n\tautoLaunchEnabled: boolean;\n\texecutablePath?: string;\n\textensionPaths: string[];\n\tendpointSource: BrowserSettingsSource;\n\tautoLaunchSource: BrowserSettingsSource;\n\texecutablePathSource: BrowserSettingsSource;\n\textensionPathsSource: BrowserSettingsSource;\n}\n\nexport interface ResolvedChromeDevToolsSettings {\n\ttools?: ChromeDevToolsToolName[];\n\tupdatedAt?: number;\n\tbrowser: EffectiveBrowserSettings;\n\twebmcp: { enabled: boolean };\n}\n\nexport interface SettingsLoadOptions {\n\tcwd?: string;\n\tprojectTrusted?: boolean;\n}\n\nexport type UserSettingsFileStatus =\n\t| { kind: \"missing\" | \"valid\" }\n\t| { kind: \"invalid\"; reason: string };\n\ninterface SettingsLoadBase {\n\teffectiveBrowser: EffectiveBrowserSettings;\n\teffectiveWebMcpEnabled: boolean;\n\tpaths: { user: string; project?: string };\n\tuserFile: UserSettingsFileStatus;\n\twarnings: string[];\n\tnotice?: string;\n}\n\nexport type SettingsLoadResult =\n\t| (SettingsLoadBase & { kind: \"missing\"; settings?: undefined })\n\t| (SettingsLoadBase & { kind: \"invalid\"; reason: string; settings?: undefined })\n\t| (SettingsLoadBase & { kind: \"loaded\"; settings: ResolvedChromeDevToolsSettings });\n\nexport interface SettingsFileOperations {\n\twrite(path: string, data: string): Promise<void>;\n\trename(source: string, destination: string): Promise<void>;\n}\n\ninterface NormalizedSettingsDocument {\n\ttools?: ChromeDevToolsToolName[];\n\tupdatedAt?: number;\n\tbrowser?: UserBrowserSettings;\n\twebmcp?: { enabled: boolean };\n}\n\ninterface SettingsDocumentResult {\n\tkind: \"missing\" | \"invalid\" | \"valid\";\n\treason?: string;\n\tdocument?: Record<string, unknown>;\n\tnormalized?: NormalizedSettingsDocument;\n\twarnings: string[];\n}\n\nconst DEFAULT_FILE_OPERATIONS: SettingsFileOperations = {\n\twrite: (path, data) => writeFile(path, data, \"utf8\").then(() => undefined),\n\trename,\n};\n\nlet settingsSaveQueue = Promise.resolve();\n\nexport async function waitForSettingsWrites() {\n\tawait settingsSaveQueue;\n}\n\nexport async function loadSettings(options: SettingsLoadOptions = {}): Promise<SettingsLoadResult> {\n\tawait settingsSaveQueue;\n\tconst userPath = settingsFilePath();\n\tconst projectPath = options.cwd ? projectSettingsFilePath(options.cwd) : undefined;\n\tconst paths = { user: userPath, ...(projectPath ? { project: projectPath } : {}) };\n\tconst warnings: string[] = [];\n\n\tlet user = await readSettingsDocument(userPath, \"user\");\n\tconst legacyExists = await fileExists(legacySettingsFilePath());\n\tif (user.kind !== \"missing\" && legacyExists) {\n\t\twarnings.push(\n\t\t\t`Chrome DevTools legacy settings ignored: ${legacySettingsFilePath()} exists, but ${userPath} takes precedence. Delete ${LEGACY_SETTINGS_FILE_NAME} after confirming your settings.`,\n\t\t);\n\t}\n\tif (user.kind === \"missing\") {\n\t\tconst legacy = await readSettingsDocument(legacySettingsFilePath(), \"user\");\n\t\tconst concurrentlyCreated = await readSettingsDocument(userPath, \"user\");\n\t\tif (concurrentlyCreated.kind !== \"missing\") {\n\t\t\tuser = concurrentlyCreated;\n\t\t\tif (legacy.kind !== \"missing\") {\n\t\t\t\twarnings.push(\n\t\t\t\t\t`Chrome DevTools legacy settings ignored: ${legacySettingsFilePath()} exists, but ${userPath} takes precedence. Delete ${LEGACY_SETTINGS_FILE_NAME} after confirming your settings.`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else if (legacy.kind !== \"missing\") {\n\t\t\tuser = legacy;\n\t\t\tif (legacy.kind === \"valid\") {\n\t\t\t\twarnings.push(\n\t\t\t\t\t`Using legacy ${LEGACY_SETTINGS_FILE_NAME}; rename it to ${NEW_SETTINGS_FILE_NAME}. Future saves write ${NEW_SETTINGS_FILE_NAME} without modifying the legacy file.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\twarnings.push(...user.warnings);\n\n\tlet project: SettingsDocumentResult = { kind: \"missing\", warnings: [] };\n\tif (projectPath && options.projectTrusted) {\n\t\tproject = await readSettingsDocument(projectPath, \"project\", options.cwd);\n\t\twarnings.push(...project.warnings);\n\t}\n\n\tconst environmentWarning = deprecatedEnvironmentWarning();\n\tif (environmentWarning) warnings.push(environmentWarning);\n\n\tconst userBrowser = user.normalized?.browser ?? {};\n\tconst effectiveBrowser = resolveEffectiveBrowser(userBrowser, project.normalized?.browser);\n\tconst settings = resolveSettings(user.normalized, project.normalized, effectiveBrowser);\n\tconst recognized =\n\t\tsettings.tools !== undefined ||\n\t\tuser.normalized?.browser !== undefined ||\n\t\tproject.normalized?.browser !== undefined ||\n\t\tuser.normalized?.webmcp !== undefined;\n\tconst invalidReasons = [user, project]\n\t\t.filter((result) => result.kind === \"invalid\")\n\t\t.map((result) => result.reason)\n\t\t.filter((reason): reason is string => Boolean(reason));\n\tconst userFile: UserSettingsFileStatus =\n\t\tuser.kind === \"invalid\"\n\t\t\t? {\n\t\t\t\t\tkind: \"invalid\",\n\t\t\t\t\treason: user.reason ?? `${userPath}: invalid settings`,\n\t\t\t\t}\n\t\t\t: { kind: user.kind };\n\tconst base = {\n\t\teffectiveBrowser,\n\t\teffectiveWebMcpEnabled: settings.webmcp.enabled,\n\t\tpaths,\n\t\tuserFile,\n\t\twarnings,\n\t\t...(warnings.length > 0 ? { notice: warnings.join(\"\\n\") } : {}),\n\t};\n\n\tif (recognized) return { ...base, kind: \"loaded\", settings };\n\tif (invalidReasons.length > 0) {\n\t\treturn { ...base, kind: \"invalid\", reason: invalidReasons.join(\"; \") };\n\t}\n\treturn { ...base, kind: \"missing\" };\n}\n\nfunction resolveSettings(\n\tuser: NormalizedSettingsDocument | undefined,\n\t_project: NormalizedSettingsDocument | undefined,\n\tbrowser: EffectiveBrowserSettings,\n): ResolvedChromeDevToolsSettings {\n\treturn {\n\t\t...(user?.tools ? { tools: user.tools, updatedAt: user.updatedAt } : {}),\n\t\tbrowser,\n\t\twebmcp: { enabled: user?.webmcp?.enabled ?? false },\n\t};\n}\n\nfunction resolveEffectiveBrowser(\n\tuser: UserBrowserSettings,\n\tproject: UserBrowserSettings | undefined,\n): EffectiveBrowserSettings {\n\tconst configuredEndpoint = parseBrowserEndpoint(user.endpoint ?? DEFAULT_BROWSER_ENDPOINT);\n\tconst environmentHost = process.env.PI_CHROME_DEVTOOLS_HOST;\n\tconst environmentPortValue = process.env.PI_CHROME_DEVTOOLS_PORT;\n\tconst environmentPort = parseConfiguredPort(environmentPortValue);\n\tconst environmentEndpointConfigured =\n\t\tenvironmentHost !== undefined || environmentPort !== undefined;\n\tconst host = environmentHost ?? configuredEndpoint.host;\n\tconst port = environmentPort ?? configuredEndpoint.port;\n\tconst environmentAutoLaunch = process.env.PI_CHROME_DEVTOOLS_AUTO_LAUNCH;\n\tconst environmentExecutable = process.env.PI_CHROME_DEVTOOLS_BROWSER;\n\tconst executablePath = environmentExecutable || user.executablePath;\n\tconst extensionPaths = project?.extensionPaths ?? user.extensionPaths ?? [];\n\tconst endpointSource: BrowserSettingsSource = environmentEndpointConfigured\n\t\t? \"environment\"\n\t\t: user.endpoint\n\t\t\t? \"user\"\n\t\t\t: \"default\";\n\treturn {\n\t\tendpoint: formatBrowserEndpoint(host, port),\n\t\thost,\n\t\tport,\n\t\thostConfigured: environmentHost !== undefined || user.endpoint !== undefined,\n\t\tportConfigured: environmentPort !== undefined || user.endpoint !== undefined,\n\t\tautoLaunchEnabled:\n\t\t\tenvironmentAutoLaunch === undefined\n\t\t\t\t? (user.autoLaunch ?? true)\n\t\t\t\t: environmentAutoLaunch !== \"0\",\n\t\t...(executablePath ? { executablePath } : {}),\n\t\textensionPaths: [...extensionPaths],\n\t\tendpointSource,\n\t\tautoLaunchSource:\n\t\t\tenvironmentAutoLaunch !== undefined\n\t\t\t\t? \"environment\"\n\t\t\t\t: user.autoLaunch !== undefined\n\t\t\t\t\t? \"user\"\n\t\t\t\t\t: \"default\",\n\t\texecutablePathSource: environmentExecutable\n\t\t\t? \"environment\"\n\t\t\t: user.executablePath\n\t\t\t\t? \"user\"\n\t\t\t\t: \"default\",\n\t\textensionPathsSource: project?.extensionPaths\n\t\t\t? \"project\"\n\t\t\t: user.extensionPaths\n\t\t\t\t? \"user\"\n\t\t\t\t: \"default\",\n\t};\n}\n\nfunction deprecatedEnvironmentWarning() {\n\tconst configuredNames = [\n\t\t\"PI_CHROME_DEVTOOLS_HOST\",\n\t\t\"PI_CHROME_DEVTOOLS_PORT\",\n\t\t\"PI_CHROME_DEVTOOLS_AUTO_LAUNCH\",\n\t\t\"PI_CHROME_DEVTOOLS_BROWSER\",\n\t].filter((name) => process.env[name] !== undefined);\n\tif (configuredNames.length === 0) return undefined;\n\treturn `Chrome DevTools environment settings are deprecated and will be removed in a future version: ${configuredNames.join(\", \")}. Move them to browser.endpoint, browser.autoLaunch, and browser.executablePath in ${settingsFilePath()}. Environment values remain active overrides during the deprecation period.`;\n}\n\nasync function readSettingsDocument(\n\tfilePath: string,\n\tscope: \"project\" | \"user\",\n\tcwd?: string,\n): Promise<SettingsDocumentResult> {\n\tlet text: string;\n\ttry {\n\t\ttext = await readFile(filePath, \"utf8\");\n\t} catch (error) {\n\t\tif (isNodeError(error) && error.code === \"ENOENT\") return { kind: \"missing\", warnings: [] };\n\t\tconst reason = `${filePath}: ${formatError(error)}`;\n\t\treturn { kind: \"invalid\", reason, warnings: [`Chrome DevTools settings ignored: ${reason}`] };\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(text) as unknown;\n\t} catch {\n\t\tconst reason = `${filePath}: invalid JSON`;\n\t\treturn { kind: \"invalid\", reason, warnings: [`Chrome DevTools settings ignored: ${reason}`] };\n\t}\n\tif (!isRecord(parsed)) {\n\t\tconst reason = `${filePath}: expected a JSON object`;\n\t\treturn { kind: \"invalid\", reason, warnings: [`Chrome DevTools settings ignored: ${reason}`] };\n\t}\n\n\tconst scopeWarnings = projectOwnedSettingsWarnings(parsed, scope, filePath);\n\ttry {\n\t\tconst normalized = await normalizeSettingsDocument(parsed, scope, filePath, cwd);\n\t\treturn { kind: \"valid\", document: { ...parsed }, normalized, warnings: scopeWarnings };\n\t} catch (error) {\n\t\tconst reason = `${filePath}: ${formatError(error)}`;\n\t\treturn {\n\t\t\tkind: \"invalid\",\n\t\t\treason,\n\t\t\twarnings: [...scopeWarnings, `Chrome DevTools settings ignored: ${reason}`],\n\t\t};\n\t}\n}\n\nfunction projectOwnedSettingsWarnings(\n\tdocument: Record<string, unknown>,\n\tscope: \"project\" | \"user\",\n\tfilePath: string,\n) {\n\tif (scope !== \"project\") return [];\n\tconst browser = isRecord(document.browser) ? document.browser : undefined;\n\tconst warnings = browser\n\t\t? [\"endpoint\", \"autoLaunch\", \"executablePath\"]\n\t\t\t\t.filter((field) => browser[field] !== undefined)\n\t\t\t\t.map(\n\t\t\t\t\t(field) =>\n\t\t\t\t\t\t`Chrome DevTools project browser.${field} ignored in ${filePath}; configure this machine-owned setting in ${settingsFilePath()}.`,\n\t\t\t\t)\n\t\t: [];\n\tif (document.webmcp !== undefined) {\n\t\twarnings.push(\n\t\t\t`Chrome DevTools project webmcp settings ignored in ${filePath}; only the user settings file may enable experimental WebMCP.`,\n\t\t);\n\t}\n\treturn warnings;\n}\n\nasync function normalizeSettingsDocument(\n\tdocument: Record<string, unknown>,\n\tscope: \"project\" | \"user\",\n\tfilePath: string,\n\tcwd?: string,\n): Promise<NormalizedSettingsDocument> {\n\tconst normalized: NormalizedSettingsDocument = {};\n\n\tif (scope === \"user\" && (document.tools !== undefined || document.updatedAt !== undefined)) {\n\t\tconst toolSettings = normalizeChromeDevtoolsSettings(document);\n\t\tif (!toolSettings) {\n\t\t\tthrow new Error(\n\t\t\t\t\"expected tools to be an array of Chrome DevTools tool names with numeric updatedAt\",\n\t\t\t);\n\t\t}\n\t\tnormalized.tools = toolSettings.tools;\n\t\tnormalized.updatedAt = toolSettings.updatedAt;\n\t}\n\n\tif (document.browser !== undefined) {\n\t\tif (!isRecord(document.browser)) throw new Error(\"expected browser to be an object\");\n\t\tnormalized.browser = await normalizeBrowserSection(document.browser, scope, filePath, cwd);\n\t}\n\n\tif (scope === \"user\" && document.webmcp !== undefined) {\n\t\tif (!isRecord(document.webmcp) || typeof document.webmcp.enabled !== \"boolean\") {\n\t\t\tthrow new Error(\"expected webmcp.enabled to be a boolean\");\n\t\t}\n\t\tnormalized.webmcp = { enabled: document.webmcp.enabled };\n\t}\n\n\treturn normalized;\n}\n\nasync function normalizeBrowserSection(\n\tbrowser: Record<string, unknown>,\n\tscope: \"project\" | \"user\",\n\t_filePath: string,\n\tcwd?: string,\n): Promise<UserBrowserSettings> {\n\tconst normalized: UserBrowserSettings = {};\n\tif (scope === \"user\" && browser.endpoint !== undefined) {\n\t\tif (typeof browser.endpoint !== \"string\") {\n\t\t\tthrow new Error(\"expected browser.endpoint to be an HTTP URL with an explicit port\");\n\t\t}\n\t\tnormalized.endpoint = parseBrowserEndpoint(browser.endpoint).endpoint;\n\t}\n\tif (scope === \"user\" && browser.autoLaunch !== undefined) {\n\t\tif (typeof browser.autoLaunch !== \"boolean\") {\n\t\t\tthrow new Error(\"expected browser.autoLaunch to be a boolean\");\n\t\t}\n\t\tnormalized.autoLaunch = browser.autoLaunch;\n\t}\n\tif (scope === \"user\" && browser.executablePath !== undefined) {\n\t\tif (typeof browser.executablePath !== \"string\" || browser.executablePath.length === 0) {\n\t\t\tthrow new Error(\"expected browser.executablePath to be a non-empty absolute path\");\n\t\t}\n\t\tif (!isAbsolute(browser.executablePath)) {\n\t\t\tthrow new Error(\"browser.executablePath in user settings must be absolute\");\n\t\t}\n\t\tnormalized.executablePath = resolve(browser.executablePath);\n\t}\n\n\tif (browser.extensionPaths !== undefined) {\n\t\tif (\n\t\t\t!Array.isArray(browser.extensionPaths) ||\n\t\t\t!browser.extensionPaths.every((entry) => typeof entry === \"string\" && entry.length > 0)\n\t\t) {\n\t\t\tthrow new Error(`expected ${scope} browser.extensionPaths to be an array of non-empty paths`);\n\t\t}\n\t\tconst resolvedPaths: string[] = [];\n\t\tfor (const configuredPath of browser.extensionPaths as string[]) {\n\t\t\tif (scope === \"user\" && !isAbsolute(configuredPath)) {\n\t\t\t\tthrow new Error(\"browser.extensionPaths in user settings must contain only absolute paths\");\n\t\t\t}\n\t\t\tconst absolutePath = isAbsolute(configuredPath)\n\t\t\t\t? resolve(configuredPath)\n\t\t\t\t: resolve(cwd ?? process.cwd(), configuredPath);\n\t\t\tresolvedPaths.push(await validateUnpackedExtensionPath(absolutePath));\n\t\t}\n\t\tnormalized.extensionPaths = orderedUnique(resolvedPaths);\n\t}\n\treturn normalized;\n}\n\nasync function validateUnpackedExtensionPath(extensionPath: string) {\n\tlet canonicalPath: string;\n\ttry {\n\t\tcanonicalPath = await realpath(extensionPath);\n\t\tconst extensionStat = await stat(canonicalPath);\n\t\tif (!extensionStat.isDirectory()) throw new Error(\"not a directory\");\n\t} catch (error) {\n\t\tthrow new Error(`unpacked extension path ${extensionPath} is invalid: ${formatError(error)}`);\n\t}\n\n\tconst manifestPath = join(canonicalPath, \"manifest.json\");\n\tlet manifest: unknown;\n\ttry {\n\t\tconst manifestStat = await lstat(manifestPath);\n\t\tif (!manifestStat.isFile()) throw new Error(\"not a regular file\");\n\t\tmanifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as unknown;\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`unpacked extension ${canonicalPath} has invalid manifest.json: ${formatError(error)}`,\n\t\t);\n\t}\n\tif (canonicalPath.includes(\",\")) {\n\t\tthrow new Error(\n\t\t\t`unpacked extension path ${canonicalPath} cannot contain a comma because Chrome separates multiple --load-extension paths with commas`,\n\t\t);\n\t}\n\tif (\n\t\t!isRecord(manifest) ||\n\t\t![2, 3].includes(manifest.manifest_version as number) ||\n\t\ttypeof manifest.name !== \"string\" ||\n\t\ttypeof manifest.version !== \"string\"\n\t) {\n\t\tthrow new Error(\n\t\t\t`unpacked extension ${canonicalPath} has invalid manifest.json: expected manifest_version, name, and version`,\n\t\t);\n\t}\n\treturn canonicalPath;\n}\n\nexport function parseBrowserEndpoint(value: string) {\n\tconst trimmedValue = value.trim();\n\tconst explicitPort = trimmedValue.match(/^http:\\/\\/(?:\\[[^\\]]+\\]|[^/:?#]+):(\\d+)\\/?$/i)?.[1];\n\tlet endpoint: URL;\n\ttry {\n\t\tendpoint = new URL(trimmedValue);\n\t} catch {\n\t\tthrow new Error(\"browser.endpoint must be a valid HTTP URL with an explicit port\");\n\t}\n\tif (\n\t\tendpoint.protocol !== \"http:\" ||\n\t\tendpoint.username ||\n\t\tendpoint.password ||\n\t\t!endpoint.hostname ||\n\t\t!explicitPort ||\n\t\t(endpoint.pathname !== \"/\" && endpoint.pathname !== \"\") ||\n\t\tendpoint.search ||\n\t\tendpoint.hash\n\t) {\n\t\tthrow new Error(\n\t\t\t\"browser.endpoint must be an HTTP origin with an explicit port and no credentials, path, query, or fragment\",\n\t\t);\n\t}\n\tconst port = parseConfiguredPort(explicitPort);\n\tif (port === undefined) {\n\t\tthrow new Error(\"browser.endpoint must use a port from 1 through 65535\");\n\t}\n\tconst host = endpoint.hostname;\n\treturn { endpoint: formatBrowserEndpoint(host, port), host, port };\n}\n\nexport function parseConfiguredPort(value: string | undefined) {\n\tif (value === undefined) return undefined;\n\tconst trimmedValue = value.trim();\n\tif (!/^\\d+$/.test(trimmedValue)) return undefined;\n\tconst port = Number(trimmedValue);\n\tif (!Number.isInteger(port) || port < 1 || port > 65_535) return undefined;\n\treturn port;\n}\n\nfunction formatBrowserEndpoint(host: string, port: number) {\n\tconst formattedHost =\n\t\thost.startsWith(\"[\") && host.endsWith(\"]\") ? host : host.includes(\":\") ? `[${host}]` : host;\n\treturn `http://${formattedHost}:${port}`;\n}\n\nexport function normalizeChromeDevtoolsSettings(\n\tvalue: unknown,\n): ChromeDevToolsSettings | undefined {\n\tif (!isRecord(value)) return undefined;\n\tif (typeof value.updatedAt !== \"number\" || !Number.isFinite(value.updatedAt)) return undefined;\n\n\tif (value.tools === \"enabled\") {\n\t\treturn { tools: [...CHROME_DEVTOOLS_TOOL_NAMES], updatedAt: value.updatedAt };\n\t}\n\tif (value.tools === \"disabled\") return { tools: [], updatedAt: value.updatedAt };\n\tif (!Array.isArray(value.tools) || !value.tools.every(isChromeDevtoolsToolName)) return undefined;\n\treturn { tools: orderedUniqueChromeDevtoolsTools(value.tools), updatedAt: value.updatedAt };\n}\n\nfunction isChromeDevtoolsToolName(value: unknown): value is ChromeDevToolsToolName {\n\treturn typeof value === \"string\" && CHROME_DEVTOOLS_TOOL_NAMES.includes(value as never);\n}\n\nfunction orderedUniqueChromeDevtoolsTools(tools: readonly ChromeDevToolsToolName[]) {\n\tconst selectedTools = new Set(tools);\n\treturn CHROME_DEVTOOLS_TOOL_NAMES.filter((toolName) => selectedTools.has(toolName));\n}\n\nfunction orderedUnique(values: readonly string[]) {\n\treturn [...new Set(values)];\n}\n\nexport function saveSettings(\n\tsettings: ChromeDevToolsSettings,\n\toperations: Partial<SettingsFileOperations> = {},\n): Promise<void> {\n\treturn queueSettingsMutation(\n\t\t(current) => ({\n\t\t\t...current,\n\t\t\ttools: [...settings.tools],\n\t\t\tupdatedAt: settings.updatedAt,\n\t\t}),\n\t\toperations,\n\t);\n}\n\nexport function saveWebMcpSettings(\n\tenabled: boolean,\n\toperations: Partial<SettingsFileOperations> = {},\n): Promise<void> {\n\treturn queueSettingsMutation(\n\t\t(current) => ({\n\t\t\t...current,\n\t\t\twebmcp: {\n\t\t\t\t...(isRecord(current.webmcp) ? current.webmcp : {}),\n\t\t\t\tenabled,\n\t\t\t},\n\t\t}),\n\t\toperations,\n\t);\n}\n\nexport function saveBrowserSettings(\n\tpatch: BrowserSettingsPatch,\n\toperations: Partial<SettingsFileOperations> = {},\n): Promise<void> {\n\treturn queueSettingsMutation(async (current) => {\n\t\tconst browser = isRecord(current.browser) ? { ...current.browser } : {};\n\t\tfor (const field of [\"endpoint\", \"autoLaunch\", \"executablePath\"] as const) {\n\t\t\tconst value = patch[field];\n\t\t\tif (value === undefined) continue;\n\t\t\tif (value === null) delete browser[field];\n\t\t\telse browser[field] = value;\n\t\t}\n\t\tawait normalizeBrowserSection(browser, \"user\", settingsFilePath());\n\t\treturn { ...current, browser };\n\t}, operations);\n}\n\nfunction queueSettingsMutation(\n\tmutate: (\n\t\tcurrent: Record<string, unknown>,\n\t) => Record<string, unknown> | Promise<Record<string, unknown>>,\n\toperations: Partial<SettingsFileOperations>,\n) {\n\tconst operation = settingsSaveQueue.then(() => saveSettingsMutationNow(mutate, operations));\n\tsettingsSaveQueue = operation.catch(() => undefined);\n\treturn operation;\n}\n\nasync function saveSettingsMutationNow(\n\tmutate: (\n\t\tcurrent: Record<string, unknown>,\n\t) => Record<string, unknown> | Promise<Record<string, unknown>>,\n\toperations: Partial<SettingsFileOperations>,\n): Promise<void> {\n\tconst filePath = settingsFilePath();\n\tlet current = await readSettingsDocument(filePath, \"user\");\n\tconst replaceCanonical = current.kind !== \"missing\";\n\tif (!replaceCanonical) current = await readSettingsDocument(legacySettingsFilePath(), \"user\");\n\tif (current.kind === \"invalid\") {\n\t\tthrow new Error(`Cannot save Chrome DevTools settings until you repair ${current.reason}`);\n\t}\n\tconst nextDocument = await mutate(current.document ?? {});\n\tawait mkdir(dirname(filePath), { recursive: true });\n\tconst tempFile = `${filePath}.${process.pid}.${randomUUID()}.tmp`;\n\ttry {\n\t\tawait (operations.write ?? DEFAULT_FILE_OPERATIONS.write)(\n\t\t\ttempFile,\n\t\t\t`${JSON.stringify(nextDocument, null, 2)}\\n`,\n\t\t);\n\t\tif (!replaceCanonical && (await pathEntryExists(filePath))) {\n\t\t\tthrow new Error(\n\t\t\t\t`${NEW_SETTINGS_FILE_NAME} was created concurrently; reopen settings and retry.`,\n\t\t\t);\n\t\t}\n\t\tawait (operations.rename ?? DEFAULT_FILE_OPERATIONS.rename)(tempFile, filePath);\n\t} catch (error) {\n\t\tawait rm(tempFile, { force: true }).catch(() => undefined);\n\t\tthrow error;\n\t}\n}\n\nexport function settingsFilePath() {\n\treturn join(getAgentDir(), NEW_SETTINGS_FILE_NAME);\n}\n\nexport function projectSettingsFilePath(cwd: string) {\n\treturn join(cwd, CONFIG_DIR_NAME, NEW_SETTINGS_FILE_NAME);\n}\n\nfunction legacySettingsFilePath() {\n\treturn join(getAgentDir(), LEGACY_SETTINGS_FILE_NAME);\n}\n\nasync function fileExists(filePath: string) {\n\ttry {\n\t\tawait access(filePath, constants.F_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function pathEntryExists(filePath: string) {\n\ttry {\n\t\tawait lstat(filePath);\n\t\treturn true;\n\t} catch (error) {\n\t\tif (isNodeError(error) && error.code === \"ENOENT\") return false;\n\t\tthrow error;\n\t}\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n\treturn error instanceof Error && \"code\" in error;\n}\n\nfunction formatError(error: unknown) {\n\treturn error instanceof Error ? error.message : String(error);\n}\n", "import type { ChildProcess } from \"node:child_process\";\nimport {\n\tDEFAULT_BROWSER_HOST,\n\tDEFAULT_BROWSER_PORT,\n\ttype EffectiveBrowserSettings,\n\tparseConfiguredPort,\n} from \"./settings.js\";\n\nexport const DEFAULT_HOST = DEFAULT_BROWSER_HOST;\nexport const DEFAULT_PORT = DEFAULT_BROWSER_PORT;\nexport const DEFAULT_TIMEOUT_MS = 10_000;\nexport const DEFAULT_HTTP_TIMEOUT_MS = 1_000;\nexport const DEFAULT_ENDPOINT_WAIT_MS = 5_000;\nexport const DEFAULT_ENDPOINT_RETRY_MS = 250;\nexport const MANAGED_BROWSER_PROFILE_PREFIX = \"pi-chrome-devtools-profile-\";\nexport const DEVTOOLS_ACTIVE_PORT_FILE = \"DevToolsActivePort\";\nexport const BROWSER_SHUTDOWN_WAIT_MS = 1_500;\n\nexport interface DevToolsPage {\n\tid: string;\n\ttype: string;\n\ttitle: string;\n\turl: string;\n\twebSocketDebuggerUrl?: string;\n}\n\nexport interface ChromeDevToolsState {\n\thost: string;\n\tport: number;\n\tconfiguredPort: number;\n\thostConfigured: boolean;\n\tportConfigured: boolean;\n\tautoLaunchEnabled: boolean;\n\tendpointSource: EffectiveBrowserSettings[\"endpointSource\"];\n\tautoLaunchSource: EffectiveBrowserSettings[\"autoLaunchSource\"];\n\tbrowserExecutable?: string;\n\textensionPaths: string[];\n\tbrowserExecutableSource: EffectiveBrowserSettings[\"executablePathSource\"];\n\textensionPathsSource: EffectiveBrowserSettings[\"extensionPathsSource\"];\n\tsettingsFilePath?: string;\n\tprojectSettingsFilePath?: string;\n\tprojectSettingsTrusted: boolean;\n\tactivePageId?: string;\n\tmanagedBrowser?: ManagedBrowser;\n\tlaunchPromise?: Promise<void>;\n\tlastLaunchAttempt?: BrowserLaunchAttempt;\n\tshuttingDown: boolean;\n\tsessionGeneration: number;\n\tsessionController: AbortController;\n\tsettingsNotice?: string;\n}\n\nexport interface ManagedBrowser {\n\tprocess: ChildProcess;\n\tuserDataDir: string;\n\tport?: number;\n\texited: boolean;\n\tready: boolean;\n\townerGeneration: number;\n\tsessionOwner?: object;\n\tcleanupPromise?: Promise<void>;\n}\n\nexport interface BrowserLaunchAttempt {\n\tcandidateLabels: string[];\n\tmode: \"dynamic-port\" | \"explicit-port\";\n\tselectedCandidate?: string;\n\tuserDataDir?: string;\n\tlastError?: string;\n}\n\nexport interface BrowserCandidateDefinition {\n\tlabel: string;\n\texecutable: string;\n\tsource: \"env\" | \"path\" | \"wellKnownPath\";\n}\n\nexport interface BrowserCandidate extends BrowserCandidateDefinition {\n\tresolvedExecutable: string;\n}\n\nexport { parseConfiguredPort };\n\nexport const state: ChromeDevToolsState = {\n\thost: DEFAULT_HOST,\n\tport: DEFAULT_PORT,\n\tconfiguredPort: DEFAULT_PORT,\n\thostConfigured: false,\n\tportConfigured: false,\n\tautoLaunchEnabled: true,\n\tendpointSource: \"default\",\n\tautoLaunchSource: \"default\",\n\textensionPaths: [],\n\tbrowserExecutableSource: \"default\",\n\textensionPathsSource: \"default\",\n\tprojectSettingsTrusted: false,\n\tshuttingDown: false,\n\tsessionGeneration: 0,\n\tsessionController: new AbortController(),\n};\n\ninterface WebMcpSessionRuntime {\n\tcontroller: AbortController;\n\tenabled: boolean;\n\tcontrollers: Set<AbortController>;\n\tgeneration: number;\n\tsessionGeneration: number;\n}\n\nconst webMcpRuntimeByOwner = new WeakMap<object, WebMcpSessionRuntime>();\n\nexport function setWebMcpSessionOwner(owner: object) {\n\tconst runtime = webMcpRuntime(owner);\n\truntime.enabled = false;\n\truntime.sessionGeneration += 1;\n}\n\nexport function beginWebMcpOperation(owner: object, toolSignal?: AbortSignal) {\n\tconst runtime = webMcpRuntime(owner);\n\tconst controller = new AbortController();\n\truntime.controllers.add(controller);\n\tconst signals = [controller.signal, runtime.controller.signal];\n\tif (toolSignal) signals.push(toolSignal);\n\tconst signal = AbortSignal.any(signals);\n\treturn {\n\t\tsignal,\n\t\towner,\n\t\tsessionGeneration: runtime.sessionGeneration,\n\t\twebMcpGeneration: runtime.generation,\n\t\tdispose() {\n\t\t\truntime.controllers.delete(controller);\n\t\t},\n\t};\n}\n\nexport function invalidateWebMcpOperations(owner: object, reason: string) {\n\tconst runtime = webMcpRuntime(owner);\n\truntime.generation += 1;\n\tconst controllers = [...runtime.controllers];\n\truntime.controllers.clear();\n\tconst error = new DOMException(reason, \"AbortError\");\n\truntime.controller.abort(error);\n\truntime.controller = new AbortController();\n\tfor (const controller of controllers) controller.abort(error);\n}\n\nexport function currentWebMcpGeneration(owner: object) {\n\treturn webMcpRuntime(owner).generation;\n}\n\nexport function webMcpSessionSignal(owner: object) {\n\treturn webMcpRuntime(owner).controller.signal;\n}\n\nexport function applyRuntimeWebMcpSetting(enabled: boolean, owner: object) {\n\tconst runtime = webMcpRuntime(owner);\n\tif (runtime.enabled !== enabled) {\n\t\tinvalidateWebMcpOperations(owner, `WebMCP ${enabled ? \"enabled\" : \"disabled\"}`);\n\t}\n\truntime.enabled = enabled;\n}\n\nexport function webMcpEnabled(owner: object) {\n\treturn webMcpRuntime(owner).enabled;\n}\n\nexport function webMcpOperationIsCurrent(operation: {\n\towner: object;\n\tsessionGeneration: number;\n\twebMcpGeneration: number;\n}) {\n\tconst runtime = webMcpRuntime(operation.owner);\n\treturn (\n\t\toperation.sessionGeneration === runtime.sessionGeneration &&\n\t\toperation.webMcpGeneration === runtime.generation\n\t);\n}\n\nfunction webMcpRuntime(owner: object) {\n\tconst existing = webMcpRuntimeByOwner.get(owner);\n\tif (existing) return existing;\n\tconst created: WebMcpSessionRuntime = {\n\t\tcontroller: new AbortController(),\n\t\tcontrollers: new Set(),\n\t\tenabled: false,\n\t\tgeneration: 0,\n\t\tsessionGeneration: 0,\n\t};\n\twebMcpRuntimeByOwner.set(owner, created);\n\treturn created;\n}\n\nexport function applyRuntimeBrowserSettings(\n\tbrowser: EffectiveBrowserSettings,\n\tpaths: { user: string; project?: string },\n\tprojectTrusted: boolean,\n) {\n\tstate.host = browser.host;\n\tstate.port = browser.port;\n\tstate.configuredPort = browser.port;\n\tstate.hostConfigured = browser.hostConfigured;\n\tstate.portConfigured = browser.portConfigured;\n\tstate.autoLaunchEnabled = browser.autoLaunchEnabled;\n\tstate.endpointSource = browser.endpointSource;\n\tstate.autoLaunchSource = browser.autoLaunchSource;\n\tstate.browserExecutable = browser.executablePath;\n\tstate.extensionPaths = [...browser.extensionPaths];\n\tstate.browserExecutableSource = browser.executablePathSource;\n\tstate.extensionPathsSource = browser.extensionPathsSource;\n\tstate.settingsFilePath = paths.user;\n\tstate.projectSettingsFilePath = paths.project;\n\tstate.projectSettingsTrusted = projectTrusted;\n}\n", "import { type ChildProcess, execFile, spawn } from \"node:child_process\";\nimport { constants } from \"node:fs\";\nimport { access, mkdtemp, readFile, rm } from \"node:fs/promises\";\nimport { createServer } from \"node:net\";\nimport { tmpdir } from \"node:os\";\nimport { delimiter, isAbsolute, join, resolve } from \"node:path\";\nimport {\n\tBROWSER_SHUTDOWN_WAIT_MS,\n\ttype BrowserCandidate,\n\ttype BrowserCandidateDefinition,\n\ttype BrowserLaunchAttempt,\n\tDEFAULT_ENDPOINT_RETRY_MS,\n\tDEFAULT_ENDPOINT_WAIT_MS,\n\tDEFAULT_HTTP_TIMEOUT_MS,\n\tDEVTOOLS_ACTIVE_PORT_FILE,\n\ttype DevToolsPage,\n\tinvalidateWebMcpOperations,\n\tMANAGED_BROWSER_PROFILE_PREFIX,\n\ttype ManagedBrowser,\n\tstate,\n} from \"./runtime.js\";\nimport type { EffectiveBrowserSettings } from \"./settings.js\";\n\n// Endpoint attachment, managed launch, dynamic-port publication, and shutdown intentionally remain\n// together because they form one ownership state machine behind the testable operations boundary.\ninterface BrowserSpawnOptions {\n\tshell: false;\n\tstdio: \"ignore\";\n}\n\nexport interface BrowserManagerOperations {\n\taccess(path: string, mode: number): Promise<void>;\n\tmkdtemp(prefix: string): Promise<string>;\n\treadFile(path: string, encoding: \"utf8\"): Promise<string>;\n\trm(path: string, options: { recursive: true; force: true }): Promise<void>;\n\tfetch(input: string, init?: RequestInit): Promise<Response>;\n\tspawn(executable: string, args: string[], options: BrowserSpawnOptions): ChildProcess;\n\tinspectBrowserVersion(executable: string, signal: AbortSignal): Promise<string>;\n\tisPortAvailable(host: string, port: number): Promise<boolean>;\n\tsleep(ms: number, signal?: AbortSignal): Promise<void>;\n}\n\nconst DEFAULT_BROWSER_MANAGER_OPERATIONS: BrowserManagerOperations = {\n\taccess,\n\tmkdtemp,\n\treadFile,\n\trm: (path, options) => rm(path, options),\n\tfetch: (input, init) => fetch(input, init),\n\tspawn,\n\tinspectBrowserVersion,\n\tisPortAvailable,\n\tsleep: abortableSleep,\n};\n\nlet browserManagerOperations = DEFAULT_BROWSER_MANAGER_OPERATIONS;\n\ninterface ManagedBrowserScope {\n\tbrowser: EffectiveBrowserSettings;\n\tcontroller: AbortController;\n\tgeneration: number;\n\tlaunchPromise?: Promise<void>;\n\tmanagedBrowser?: ManagedBrowser;\n\tport: number;\n\tlastLaunchAttempt?: BrowserLaunchAttempt;\n}\n\nconst managedBrowserScopes = new WeakMap<object, ManagedBrowserScope>();\n\nfunction cloneBrowserSettings(browser: EffectiveBrowserSettings): EffectiveBrowserSettings {\n\treturn { ...browser, extensionPaths: [...browser.extensionPaths] };\n}\n\nfunction runtimeBrowserSettings(): EffectiveBrowserSettings {\n\treturn {\n\t\tendpoint: `http://${formatHostForUrl(state.host)}:${state.configuredPort}`,\n\t\thost: state.host,\n\t\tport: state.configuredPort,\n\t\thostConfigured: state.hostConfigured,\n\t\tportConfigured: state.portConfigured,\n\t\tautoLaunchEnabled: state.autoLaunchEnabled,\n\t\t...(state.browserExecutable ? { executablePath: state.browserExecutable } : {}),\n\t\textensionPaths: [...state.extensionPaths],\n\t\tendpointSource: state.endpointSource,\n\t\tautoLaunchSource: state.autoLaunchSource,\n\t\texecutablePathSource: state.browserExecutableSource,\n\t\textensionPathsSource: state.extensionPathsSource,\n\t};\n}\n\nfunction managedBrowserScope(owner: object) {\n\tconst existing = managedBrowserScopes.get(owner);\n\tif (existing) return existing;\n\tconst browser = runtimeBrowserSettings();\n\tconst created: ManagedBrowserScope = {\n\t\tbrowser,\n\t\tcontroller: new AbortController(),\n\t\tgeneration: 0,\n\t\tport: browser.port,\n\t};\n\tmanagedBrowserScopes.set(owner, created);\n\treturn created;\n}\n\nexport function startManagedBrowserSession(owner: object) {\n\tconst scope = managedBrowserScope(owner);\n\tscope.controller.abort(new DOMException(\"Chrome DevTools session replaced\", \"AbortError\"));\n\tscope.controller = new AbortController();\n\tscope.generation += 1;\n\tscope.lastLaunchAttempt = undefined;\n}\n\nexport function syncManagedBrowserSettings(owner: object, browser: EffectiveBrowserSettings) {\n\tconst scope = managedBrowserScope(owner);\n\tscope.browser = cloneBrowserSettings(browser);\n\tscope.port = browser.port;\n}\n\nexport function browserSettingsForOwner(owner?: object) {\n\treturn owner ? managedBrowserScope(owner).browser : runtimeBrowserSettings();\n}\n\nexport function managedBrowserExtensionPaths(owner?: object) {\n\treturn browserSettingsForOwner(owner).extensionPaths;\n}\n\nexport function managedBrowserExtensionPathsSource(owner?: object) {\n\treturn browserSettingsForOwner(owner).extensionPathsSource;\n}\n\nexport function managedBrowserForOwner(owner?: object) {\n\tif (!owner) return state.managedBrowser;\n\tconst scopedBrowser = managedBrowserScope(owner).managedBrowser;\n\tif (scopedBrowser) return scopedBrowser;\n\treturn state.managedBrowser?.sessionOwner === owner ? state.managedBrowser : undefined;\n}\n\nfunction setManagedBrowser(owner: object | undefined, browser: ManagedBrowser | undefined) {\n\tif (owner) managedBrowserScope(owner).managedBrowser = browser;\n\telse state.managedBrowser = browser;\n}\n\nfunction launchPromiseForOwner(owner?: object) {\n\treturn owner ? managedBrowserScope(owner).launchPromise : state.launchPromise;\n}\n\nfunction setLaunchPromise(owner: object | undefined, launchPromise: Promise<void> | undefined) {\n\tif (owner) managedBrowserScope(owner).launchPromise = launchPromise;\n\telse state.launchPromise = launchPromise;\n}\n\nfunction managedBrowserPort(owner?: object) {\n\treturn owner ? managedBrowserScope(owner).port : state.port;\n}\n\nfunction managedBrowserConfiguredPort(owner?: object) {\n\treturn browserSettingsForOwner(owner).port;\n}\n\nfunction managedBrowserPortConfigured(owner?: object) {\n\treturn browserSettingsForOwner(owner).portConfigured;\n}\n\nfunction setManagedBrowserPort(owner: object | undefined, port: number) {\n\tif (owner) managedBrowserScope(owner).port = port;\n\telse state.port = port;\n}\n\nfunction lastLaunchAttempt(owner?: object) {\n\treturn owner ? managedBrowserScope(owner).lastLaunchAttempt : state.lastLaunchAttempt;\n}\n\nfunction setLastLaunchAttempt(\n\towner: object | undefined,\n\tattempt: BrowserLaunchAttempt | undefined,\n) {\n\tif (owner) managedBrowserScope(owner).lastLaunchAttempt = attempt;\n\telse state.lastLaunchAttempt = attempt;\n}\n\nexport function setBrowserManagerOperationsForTests(overrides: Partial<BrowserManagerOperations>) {\n\tconst previous = browserManagerOperations;\n\tbrowserManagerOperations = { ...DEFAULT_BROWSER_MANAGER_OPERATIONS, ...overrides };\n\treturn () => {\n\t\tbrowserManagerOperations = previous;\n\t};\n}\n\nfunction formatError(error: unknown) {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n\treturn error instanceof Error && \"code\" in error;\n}\n\nfunction normalizePathForComparison(value: string) {\n\treturn process.platform === \"win32\" ? value.toLowerCase() : value;\n}\n\nexport async function ensureDevToolsEndpoint(\n\twaitMs = DEFAULT_ENDPOINT_WAIT_MS,\n\tcallerSignal?: AbortSignal,\n\towner?: object,\n) {\n\tcallerSignal?.throwIfAborted();\n\tif (extensionsConfigured(owner)) {\n\t\tvalidateExtensionLaunchMode(owner);\n\t\tawait ensureManagedBrowserLaunched(waitMs, callerSignal, owner);\n\t\treturn;\n\t}\n\tif (canAutoLaunchBrowser(owner)) {\n\t\ttry {\n\t\t\tawait withEndpointRetry(\n\t\t\t\t() => fetchDevToolsJson<unknown>(\"/json/version\", { signal: callerSignal }, owner),\n\t\t\t\twaitMs,\n\t\t\t\tcallerSignal,\n\t\t\t);\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tif (shouldAutoLaunchAfterEndpointError(error, owner)) {\n\t\t\t\tawait ensureManagedBrowserLaunched(waitMs, callerSignal, owner);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\ttry {\n\t\tawait fetchDevToolsJson<unknown>(\"/json/version\", { signal: callerSignal }, owner);\n\t} catch (error) {\n\t\tif (isRetryableEndpointError(error)) return;\n\t\tthrow error;\n\t}\n}\n\nfunction validateExtensionLaunchMode(owner?: object) {\n\tconst browser = browserSettingsForOwner(owner);\n\tif (!isLocalDevToolsHost(browser.host)) {\n\t\tthrow new DevToolsEndpointError(\n\t\t\t\"Unpacked extensions require a local extension-owned managed browser; remote CDP endpoints cannot be modified.\",\n\t\t);\n\t}\n\tif (!browser.autoLaunchEnabled) {\n\t\tthrow new DevToolsEndpointError(\n\t\t\t\"Auto-launch is required for unpacked extensions so Pi can create an isolated managed browser.\",\n\t\t);\n\t}\n\tif (!browser.executablePath) {\n\t\tthrow new DevToolsEndpointError(\n\t\t\t\"Unpacked extensions require browser.executablePath for Chrome for Testing or Chromium in pi-chrome-devtools.json.\",\n\t\t);\n\t}\n}\n\nasync function ensureManagedBrowserLaunched(\n\twaitMs: number,\n\tcallerSignal?: AbortSignal,\n\towner?: object,\n) {\n\tconst existingLaunch = launchPromiseForOwner(owner);\n\tif (existingLaunch) {\n\t\tawait waitForCaller(existingLaunch, callerSignal);\n\t\treturn;\n\t}\n\tconst existingBrowser = managedBrowserForOwner(owner);\n\tif (existingBrowser && !existingBrowser.exited && existingBrowser.ready) return;\n\tconst generation = owner ? managedBrowserScope(owner).generation : state.sessionGeneration;\n\tconst signal = owner\n\t\t? managedBrowserScope(owner).controller.signal\n\t\t: state.sessionController.signal;\n\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\n\tconst launchPromise = prepareManagedBrowserLaunch(waitMs, generation, signal, owner);\n\tconst wrappedPromise = launchPromise.finally(() => {\n\t\tif (launchPromiseForOwner(owner) === wrappedPromise) setLaunchPromise(owner, undefined);\n\t});\n\tsetLaunchPromise(owner, wrappedPromise);\n\tawait waitForCaller(wrappedPromise, callerSignal);\n}\n\nfunction waitForCaller<T>(operation: Promise<T>, signal?: AbortSignal) {\n\tif (!signal) return operation;\n\tsignal.throwIfAborted();\n\treturn new Promise<T>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tconst onAbort = () => settle(() => reject(signal.reason));\n\t\tconst settle = (callback: () => void) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\tcallback();\n\t\t};\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\toperation.then(\n\t\t\t(value) => settle(() => resolve(value)),\n\t\t\t(error) => settle(() => reject(error)),\n\t\t);\n\t});\n}\n\nasync function prepareManagedBrowserLaunch(\n\twaitMs: number,\n\tgeneration: number,\n\tsignal: AbortSignal,\n\towner?: object,\n) {\n\tconst existingBrowser = managedBrowserForOwner(owner);\n\tif (existingBrowser) {\n\t\tawait shutdownManagedBrowser(existingBrowser, { awaitLaunch: false, owner });\n\t\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\t}\n\tif (managedBrowserPortConfigured(owner)) {\n\t\tconst available = await browserManagerOperations.isPortAvailable(\n\t\t\tbrowserSettingsForOwner(owner).host,\n\t\t\tmanagedBrowserPort(owner),\n\t\t);\n\t\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\t\tif (!available) {\n\t\t\tthrow new DevToolsEndpointError(\n\t\t\t\t`Cannot launch the extension-owned browser because explicit port ${managedBrowserPort(owner)} is already in use. Choose a free browser.endpoint port or reset the endpoint to use a dynamic managed port.`,\n\t\t\t);\n\t\t}\n\t}\n\treturn launchManagedBrowser(waitMs, generation, signal, owner);\n}\n\nasync function launchManagedBrowser(\n\twaitMs: number,\n\tgeneration: number,\n\tsignal: AbortSignal,\n\towner?: object,\n) {\n\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\tconst candidateDefinitions = browserCandidateDefinitions(owner);\n\tconst candidates = await resolveBrowserCandidates(\n\t\tcandidateDefinitions,\n\t\tgeneration,\n\t\tsignal,\n\t\towner,\n\t);\n\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\tsetLastLaunchAttempt(owner, {\n\t\tcandidateLabels: candidateDefinitions.map(formatBrowserCandidateDefinition),\n\t\tmode: managedBrowserPortConfigured(owner) ? \"explicit-port\" : \"dynamic-port\",\n\t});\n\n\tif (candidates.length === 0) {\n\t\tthrow new DevToolsEndpointError(noBrowserCandidateMessage(candidateDefinitions, owner));\n\t}\n\n\tlet lastError: unknown;\n\tfor (const candidate of candidates) {\n\t\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\t\ttry {\n\t\t\tif (extensionsConfigured(owner))\n\t\t\t\tawait requireSupportedExtensionBrowser(candidate, generation, signal, owner);\n\t\t\tawait launchBrowserCandidate(candidate, waitMs, generation, signal, owner);\n\t\t\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\t\t\tsetLastLaunchAttempt(owner, {\n\t\t\t\t...lastLaunchAttempt(owner),\n\t\t\t\tcandidateLabels: candidateDefinitions.map(formatBrowserCandidateDefinition),\n\t\t\t\tmode: managedBrowserPortConfigured(owner) ? \"explicit-port\" : \"dynamic-port\",\n\t\t\t\tselectedCandidate: formatBrowserCandidate(candidate),\n\t\t\t\tuserDataDir: managedBrowserForOwner(owner)?.userDataDir,\n\t\t\t});\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\ttry {\n\t\t\t\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\t\t\t} catch (cancellation) {\n\t\t\t\tsetLastLaunchAttempt(owner, {\n\t\t\t\t\t...(lastLaunchAttempt(owner) ?? {\n\t\t\t\t\t\tcandidateLabels: candidateDefinitions.map(formatBrowserCandidateDefinition),\n\t\t\t\t\t\tmode: managedBrowserPortConfigured(owner) ? \"explicit-port\" : \"dynamic-port\",\n\t\t\t\t\t}),\n\t\t\t\t\tlastError: formatError(cancellation),\n\t\t\t\t});\n\t\t\t\tthrow cancellation;\n\t\t\t}\n\t\t\tlastError = error;\n\t\t\tsetLastLaunchAttempt(owner, {\n\t\t\t\t...(lastLaunchAttempt(owner) ?? {\n\t\t\t\t\tcandidateLabels: candidateDefinitions.map(formatBrowserCandidateDefinition),\n\t\t\t\t\tmode: managedBrowserPortConfigured(owner) ? \"explicit-port\" : \"dynamic-port\",\n\t\t\t\t}),\n\t\t\t\tlastError: formatError(error),\n\t\t\t});\n\t\t}\n\t}\n\n\tif (lastError instanceof DevToolsEndpointError && extensionsConfigured(owner)) throw lastError;\n\tthrow new DevToolsEndpointError(\n\t\t[\n\t\t\t\"Unable to auto-launch a Chromium-family browser for Chrome DevTools.\",\n\t\t\t`Tried: ${candidates.map(formatBrowserCandidate).join(\", \")}`,\n\t\t\tlastError ? `Last error: ${formatError(lastError)}` : undefined,\n\t\t\tlaunchHint(owner),\n\t\t\tendpointConfigHint(),\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"\\n\"),\n\t);\n}\n\nasync function requireSupportedExtensionBrowser(\n\tcandidate: BrowserCandidate,\n\tgeneration: number,\n\tsignal: AbortSignal,\n\towner?: object,\n) {\n\tlet version: string;\n\ttry {\n\t\tversion = (\n\t\t\tawait browserManagerOperations.inspectBrowserVersion(candidate.resolvedExecutable, signal)\n\t\t).trim();\n\t} catch (error) {\n\t\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\t\tthrow new DevToolsEndpointError(\n\t\t\t`Unable to identify the configured extension browser ${candidate.resolvedExecutable}: ${formatError(error)}. Configure Chrome for Testing or Chromium.`,\n\t\t);\n\t}\n\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\tconst classification = classifyExtensionBrowserVersion(version);\n\tif (!classification.supported) {\n\t\tthrow new DevToolsEndpointError(\n\t\t\t`Unsupported browser for unpacked extensions: ${version || \"unknown product\"}. Configure Chrome for Testing or Chromium; branded Chrome may silently ignore extension startup flags.`,\n\t\t);\n\t}\n}\n\nexport function classifyExtensionBrowserVersion(version: string): {\n\tsupported: boolean;\n\tproduct: string;\n} {\n\tif (/^(?:Google )?Chrome for Testing\\b/i.test(version)) {\n\t\treturn { supported: true, product: \"Chrome for Testing\" };\n\t}\n\tif (/^Chromium\\b/i.test(version)) return { supported: true, product: \"Chromium\" };\n\tconst product = version.trim().replace(/\\s+\\d+(?:\\.\\d+)*.*$/, \"\") || \"Unknown\";\n\treturn { supported: false, product };\n}\n\nasync function launchBrowserCandidate(\n\tcandidate: BrowserCandidate,\n\twaitMs: number,\n\tgeneration: number,\n\tsignal: AbortSignal,\n\towner?: object,\n) {\n\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\tconst userDataDir = await browserManagerOperations.mkdtemp(\n\t\tjoin(tmpdir(), MANAGED_BROWSER_PROFILE_PREFIX),\n\t);\n\tlet managedBrowser: ManagedBrowser | undefined;\n\ttry {\n\t\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\t\tconst portArgument = managedBrowserPortConfigured(owner)\n\t\t\t? String(managedBrowserPort(owner))\n\t\t\t: \"0\";\n\t\tconst args = buildManagedBrowserLaunchArguments(\n\t\t\tuserDataDir,\n\t\t\tportArgument,\n\t\t\tmanagedBrowserExtensionPaths(owner),\n\t\t);\n\t\tconst child = browserManagerOperations.spawn(candidate.resolvedExecutable, args, {\n\t\t\tshell: false,\n\t\t\tstdio: \"ignore\",\n\t\t});\n\t\tconst launchedBrowser: ManagedBrowser = {\n\t\t\tprocess: child,\n\t\t\tuserDataDir,\n\t\t\texited: false,\n\t\t\tready: false,\n\t\t\townerGeneration: generation,\n\t\t\t...(owner ? { sessionOwner: owner } : {}),\n\t\t};\n\t\tmanagedBrowser = launchedBrowser;\n\t\tsetManagedBrowser(owner, launchedBrowser);\n\n\t\tchild.once(\"exit\", () => {\n\t\t\tif (managedBrowserForOwner(owner) === launchedBrowser && owner) {\n\t\t\t\tinvalidateWebMcpOperations(owner, \"Chrome DevTools managed browser exited\");\n\t\t\t}\n\t\t\tlaunchedBrowser.exited = true;\n\t\t\tlaunchedBrowser.ready = false;\n\t\t\tif (\n\t\t\t\t!managedBrowserPortConfigured(owner) &&\n\t\t\t\tlaunchedBrowser.port === managedBrowserPort(owner)\n\t\t\t) {\n\t\t\t\tsetManagedBrowserPort(owner, managedBrowserConfiguredPort(owner));\n\t\t\t}\n\t\t});\n\n\t\tawait waitForBrowserSpawn(child);\n\t\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\t\tif (managedBrowserPortConfigured(owner)) {\n\t\t\tlaunchedBrowser.port = managedBrowserPort(owner);\n\t\t} else {\n\t\t\tlaunchedBrowser.port = await readManagedBrowserPort(\n\t\t\t\tuserDataDir,\n\t\t\t\tlaunchedBrowser,\n\t\t\t\twaitMs,\n\t\t\t\tgeneration,\n\t\t\t\tsignal,\n\t\t\t\towner,\n\t\t\t);\n\t\t\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\t\t\tsetManagedBrowserPort(owner, launchedBrowser.port);\n\t\t}\n\t\tawait waitForDevToolsEndpoint(waitMs, launchedBrowser, generation, signal, owner);\n\t\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\t\tlaunchedBrowser.ready = true;\n\t} catch (error) {\n\t\tif (managedBrowser) await shutdownManagedBrowser(managedBrowser, { awaitLaunch: false, owner });\n\t\telse {\n\t\t\tawait browserManagerOperations\n\t\t\t\t.rm(userDataDir, { recursive: true, force: true })\n\t\t\t\t.catch(() => undefined);\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nexport function buildManagedBrowserLaunchArguments(\n\tuserDataDir: string,\n\tportArgument: string,\n\textensionPaths: readonly string[],\n) {\n\tconst extensionList = extensionPaths.join(\",\");\n\treturn [\n\t\t`--remote-debugging-port=${portArgument}`,\n\t\t`--user-data-dir=${userDataDir}`,\n\t\t...(extensionPaths.length > 0\n\t\t\t? [`--disable-extensions-except=${extensionList}`, `--load-extension=${extensionList}`]\n\t\t\t: []),\n\t\t// Chrome 138+ de-elevates when launched from an elevated process on Windows: the\n\t\t// spawned process relaunches a de-elevated child and exits immediately, which the\n\t\t// exit watchdog misreads as a failed launch.\n\t\t...(process.platform === \"win32\" ? [\"--do-not-de-elevate\"] : []),\n\t\t\"--no-first-run\",\n\t\t\"--no-default-browser-check\",\n\t\t\"about:blank\",\n\t];\n}\n\nfunction waitForBrowserSpawn(child: ChildProcess) {\n\treturn new Promise<void>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tconst settle = (callback: () => void) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tchild.off(\"error\", onError);\n\t\t\tchild.off(\"spawn\", onSpawn);\n\t\t\tcallback();\n\t\t};\n\t\tconst onError = (error: Error) => settle(() => reject(error));\n\t\tconst onSpawn = () => settle(resolve);\n\t\tchild.once(\"error\", onError);\n\t\tchild.once(\"spawn\", onSpawn);\n\t});\n}\n\nasync function readManagedBrowserPort(\n\tuserDataDir: string,\n\tmanagedBrowser: ManagedBrowser,\n\twaitMs: number,\n\tgeneration: number,\n\tsignal: AbortSignal,\n\towner?: object,\n) {\n\tconst activePortFile = join(userDataDir, DEVTOOLS_ACTIVE_PORT_FILE);\n\tconst deadline = Date.now() + waitMs;\n\twhile (true) {\n\t\tthrowIfManagedBrowserExited(managedBrowser);\n\t\tconst text = await browserManagerOperations\n\t\t\t.readFile(activePortFile, \"utf8\")\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tif (isNodeError(error) && error.code === \"ENOENT\") return undefined;\n\t\t\t\tthrow error;\n\t\t\t});\n\t\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\t\tconst portText = text?.split(/\\r?\\n/, 1)[0]?.trim();\n\t\tconst port = Number(portText);\n\t\tif (Number.isInteger(port) && port > 0) return port;\n\n\t\tconst remainingMs = deadline - Date.now();\n\t\tif (remainingMs <= 0) {\n\t\t\tthrow new DevToolsEndpointError(\n\t\t\t\t[\n\t\t\t\t\t\"Timed out waiting for auto-launched browser DevToolsActivePort.\",\n\t\t\t\t\t`Expected file: ${activePortFile}`,\n\t\t\t\t\tlaunchHint(owner),\n\t\t\t\t].join(\"\\n\"),\n\t\t\t);\n\t\t}\n\t\tawait browserManagerOperations.sleep(Math.min(DEFAULT_ENDPOINT_RETRY_MS, remainingMs), signal);\n\t}\n}\n\nasync function waitForDevToolsEndpoint(\n\twaitMs: number,\n\tmanagedBrowser: ManagedBrowser,\n\tgeneration: number,\n\tsignal: AbortSignal,\n\towner?: object,\n) {\n\tconst deadline = Date.now() + waitMs;\n\twhile (true) {\n\t\tthrowIfManagedBrowserExited(managedBrowser);\n\t\ttry {\n\t\t\tawait fetchDevToolsJson<unknown>(\"/json/version\", { signal }, owner);\n\t\t\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tif (!isRetryableEndpointError(error)) throw error;\n\t\t}\n\n\t\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\t\tconst remainingMs = deadline - Date.now();\n\t\tif (remainingMs <= 0) {\n\t\t\tthrow new DevToolsEndpointError(\n\t\t\t\t[\n\t\t\t\t\t`Timed out waiting for auto-launched browser at ${devToolsEndpoint(owner)}.`,\n\t\t\t\t\tlaunchHint(owner),\n\t\t\t\t].join(\"\\n\"),\n\t\t\t);\n\t\t}\n\t\tawait browserManagerOperations.sleep(Math.min(DEFAULT_ENDPOINT_RETRY_MS, remainingMs), signal);\n\t}\n}\n\nfunction throwIfManagedBrowserExited(managedBrowser: ManagedBrowser) {\n\tif (!managedBrowser.exited) return;\n\tthrow new DevToolsEndpointError(\"Auto-launched browser exited before DevTools became available.\");\n}\n\nfunction throwIfBrowserLaunchCancelled(generation: number, signal: AbortSignal, owner?: object) {\n\tconst currentGeneration = owner ? managedBrowserScope(owner).generation : state.sessionGeneration;\n\tconst shuttingDown = owner ? signal.aborted : state.shuttingDown;\n\tif (!shuttingDown && generation === currentGeneration && !signal.aborted) return;\n\tthrow new DevToolsEndpointError(\n\t\tgeneration === currentGeneration\n\t\t\t? \"Chrome DevTools browser launch cancelled during shutdown.\"\n\t\t\t: \"Chrome DevTools browser launch cancelled because the session was replaced.\",\n\t);\n}\n\nexport async function shutdownManagedBrowser(\n\tmanagedBrowser?: ManagedBrowser,\n\toptions: { awaitLaunch?: boolean; cancelLaunch?: boolean; owner?: object } = {},\n) {\n\tconst owner = options.owner ?? managedBrowser?.sessionOwner;\n\tif (options.cancelLaunch) {\n\t\tif (owner) {\n\t\t\tconst scope = managedBrowserScope(owner);\n\t\t\tscope.controller.abort(\n\t\t\t\tnew DOMException(\"Chrome DevTools browser launch cancelled during shutdown\", \"AbortError\"),\n\t\t\t);\n\t\t\tscope.generation += 1;\n\t\t} else {\n\t\t\tstate.shuttingDown = true;\n\t\t}\n\t}\n\tmanagedBrowser ??= managedBrowserForOwner(owner);\n\tif (options.awaitLaunch !== false) {\n\t\tawait launchPromiseForOwner(owner)?.catch(() => undefined);\n\t\tmanagedBrowser ??= managedBrowserForOwner(owner);\n\t}\n\tif (!managedBrowser) return;\n\tif (managedBrowser.cleanupPromise) return managedBrowser.cleanupPromise;\n\n\tconst cleanup = cleanupManagedBrowser(managedBrowser, owner);\n\tmanagedBrowser.cleanupPromise = cleanup;\n\treturn cleanup;\n}\n\nasync function cleanupManagedBrowser(managedBrowser: ManagedBrowser, owner?: object) {\n\tif (managedBrowserForOwner(owner) === managedBrowser) {\n\t\tif (owner) invalidateWebMcpOperations(owner, \"Chrome DevTools managed browser closed\");\n\t\tif (state.managedBrowser === managedBrowser) state.managedBrowser = undefined;\n\t\telse setManagedBrowser(owner, undefined);\n\t}\n\tif (!managedBrowser.exited) {\n\t\tkillManagedBrowserProcess(managedBrowser);\n\t\tawait waitForManagedBrowserExit(managedBrowser, BROWSER_SHUTDOWN_WAIT_MS).catch(async () => {\n\t\t\tkillManagedBrowserProcess(managedBrowser, \"SIGKILL\");\n\t\t\tawait waitForManagedBrowserExit(managedBrowser, BROWSER_SHUTDOWN_WAIT_MS).catch(\n\t\t\t\t() => undefined,\n\t\t\t);\n\t\t});\n\t}\n\tawait browserManagerOperations\n\t\t.rm(managedBrowser.userDataDir, { recursive: true, force: true })\n\t\t.catch(() => undefined);\n\tif (!managedBrowserPortConfigured(owner) && managedBrowser.port === managedBrowserPort(owner)) {\n\t\tsetManagedBrowserPort(owner, managedBrowserConfiguredPort(owner));\n\t}\n}\n\nfunction killManagedBrowserProcess(managedBrowser: ManagedBrowser, signal?: NodeJS.Signals) {\n\ttry {\n\t\tmanagedBrowser.process.kill(signal);\n\t} catch {\n\t\t// Best-effort shutdown: the browser may have already exited or failed to spawn.\n\t}\n}\n\nfunction waitForManagedBrowserExit(managedBrowser: ManagedBrowser, waitMs: number) {\n\tif (managedBrowser.exited) return Promise.resolve();\n\treturn new Promise<void>((resolve, reject) => {\n\t\tconst settle = (callback: () => void) => {\n\t\t\tclearTimeout(timeout);\n\t\t\tmanagedBrowser.process.off(\"exit\", onExitOrClose);\n\t\t\tmanagedBrowser.process.off(\"close\", onExitOrClose);\n\t\t\tcallback();\n\t\t};\n\t\tconst onExitOrClose = () => {\n\t\t\tmanagedBrowser.exited = true;\n\t\t\tsettle(resolve);\n\t\t};\n\t\tconst timeout = setTimeout(\n\t\t\t() => settle(() => reject(new Error(\"Timed out waiting for browser shutdown.\"))),\n\t\t\twaitMs,\n\t\t);\n\t\tmanagedBrowser.process.once(\"exit\", onExitOrClose);\n\t\tmanagedBrowser.process.once(\"close\", onExitOrClose);\n\t});\n}\n\nexport async function fetchDevToolsJson<T>(path: string, init?: RequestInit, owner?: object) {\n\tconst url = `${devToolsEndpoint(owner)}${path}`;\n\tlet response: Response;\n\ttry {\n\t\tconst timeoutSignal = AbortSignal.timeout(DEFAULT_HTTP_TIMEOUT_MS);\n\t\tresponse = await browserManagerOperations.fetch(url, {\n\t\t\t...init,\n\t\t\tsignal: init?.signal ? AbortSignal.any([init.signal, timeoutSignal]) : timeoutSignal,\n\t\t});\n\t} catch (error) {\n\t\tthrow new DevToolsEndpointError(endpointConnectionErrorMessage(error, owner), {\n\t\t\tlaunchable: true,\n\t\t\tretryable: true,\n\t\t});\n\t}\n\n\tif (!response.ok) {\n\t\tconst body = (await response.text().catch(() => \"\")).trim();\n\t\tconst suffix = body ? `: ${body.slice(0, 200)}` : \"\";\n\t\tthrow new DevToolsEndpointError(\n\t\t\t[\n\t\t\t\t`Chrome DevTools endpoint ${url} returned ${response.status} ${response.statusText}${suffix}.`,\n\t\t\t\tendpointConfigHint(),\n\t\t\t].join(\"\\n\"),\n\t\t\t{ retryable: response.status === 429 || response.status >= 500 },\n\t\t);\n\t}\n\n\ttry {\n\t\treturn (await response.json()) as T;\n\t} catch (error) {\n\t\tthrow new DevToolsEndpointError(\n\t\t\t[\n\t\t\t\t`Chrome DevTools endpoint ${url} returned invalid JSON: ${formatError(error)}.`,\n\t\t\t\tendpointConfigHint(),\n\t\t\t].join(\"\\n\"),\n\t\t);\n\t}\n}\n\nexport async function withEndpointRetry<T>(\n\toperation: () => Promise<T>,\n\twaitMs: number,\n\tsignal?: AbortSignal,\n) {\n\tconst deadline = Date.now() + waitMs;\n\twhile (true) {\n\t\tsignal?.throwIfAborted();\n\t\ttry {\n\t\t\treturn await operation();\n\t\t} catch (error) {\n\t\t\tif (!isRetryableEndpointError(error)) throw error;\n\n\t\t\tconst remainingMs = deadline - Date.now();\n\t\t\tif (remainingMs <= 0) throw error;\n\n\t\t\tawait browserManagerOperations.sleep(\n\t\t\t\tMath.min(DEFAULT_ENDPOINT_RETRY_MS, remainingMs),\n\t\t\t\tsignal,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction isRetryableEndpointError(error: unknown) {\n\treturn error instanceof DevToolsEndpointError && error.retryable;\n}\n\nfunction isLaunchableEndpointError(error: unknown) {\n\treturn error instanceof DevToolsEndpointError && error.launchable;\n}\n\nfunction shouldAutoLaunchAfterEndpointError(error: unknown, owner?: object) {\n\tif (!canAutoLaunchBrowser(owner)) return false;\n\tif (isLaunchableEndpointError(error)) return true;\n\n\t// After the attach-first attempt (including its retry window, when applicable) fails, treat any\n\t// DevTools endpoint error on an unpinned port as a conflict we can avoid with a dynamic port.\n\treturn !managedBrowserPortConfigured(owner) && error instanceof DevToolsEndpointError;\n}\n\nfunction canAutoLaunchBrowser(owner?: object) {\n\tconst browser = browserSettingsForOwner(owner);\n\treturn browser.autoLaunchEnabled && isLocalDevToolsHost(browser.host);\n}\n\nfunction extensionsConfigured(owner?: object) {\n\treturn managedBrowserExtensionPaths(owner).length > 0;\n}\n\nfunction endpointConnectionErrorMessage(error: unknown, owner?: object) {\n\tconst reason = isTimeoutError(error) ? \"request timed out\" : \"connection failed\";\n\treturn [\n\t\t`Cannot connect to Chrome DevTools endpoint at ${devToolsEndpoint(owner)} (${reason}).`,\n\t\tlaunchHint(owner),\n\t\tendpointConfigHint(),\n\t].join(\"\\n\");\n}\n\nfunction isTimeoutError(error: unknown) {\n\treturn error instanceof Error && [\"AbortError\", \"TimeoutError\"].includes(error.name);\n}\n\nexport function devToolsEndpoint(owner?: object) {\n\treturn `http://${formatHostForUrl(browserSettingsForOwner(owner).host)}:${managedBrowserPort(owner)}`;\n}\n\nexport function formatHostForUrl(host: string) {\n\tif (host.startsWith(\"[\") && host.endsWith(\"]\")) return host;\n\treturn host.includes(\":\") ? `[${host}]` : host;\n}\n\nexport function endpointSourceLabel(owner?: object) {\n\treturn browserSettingsForOwner(owner).endpointSource;\n}\n\nexport type BrowserLifecycleState = \"starting\" | \"running\" | \"exited\" | \"failed\" | \"unobserved\";\n\nexport function browserLifecycleState(owner?: object): BrowserLifecycleState {\n\tif (launchPromiseForOwner(owner)) return \"starting\";\n\tif (managedBrowserForOwner(owner)?.exited) return \"exited\";\n\tif (managedBrowserForOwner(owner)?.ready) return \"running\";\n\tif (lastLaunchAttempt(owner)?.lastError) return \"failed\";\n\treturn \"unobserved\";\n}\n\nexport function launchModeLabel(owner?: object) {\n\tconst browser = browserSettingsForOwner(owner);\n\tconst managedBrowser = managedBrowserForOwner(owner);\n\tif (extensionsConfigured(owner)) {\n\t\tif (!isLocalDevToolsHost(browser.host)) return \"invalid; extensions require a local endpoint\";\n\t\tif (!browser.autoLaunchEnabled) return \"invalid; extensions require auto-launch\";\n\t\tif (managedBrowser && !managedBrowser.exited) {\n\t\t\treturn managedBrowserPortConfigured(owner)\n\t\t\t\t? \"extension-owned browser on explicit port\"\n\t\t\t\t: \"extension-owned browser on dynamic port\";\n\t\t}\n\t\treturn managedBrowserPortConfigured(owner)\n\t\t\t? \"force extension-owned launch on explicit port\"\n\t\t\t: \"force extension-owned launch on dynamic port\";\n\t}\n\tif (!isLocalDevToolsHost(browser.host)) return \"manual remote endpoint\";\n\tif (!browser.autoLaunchEnabled) return \"manual; auto-launch disabled\";\n\tif (managedBrowser && !managedBrowser.exited) {\n\t\treturn managedBrowserPortConfigured(owner)\n\t\t\t? \"auto-launched on explicit port\"\n\t\t\t: \"auto-launched on dynamic port\";\n\t}\n\treturn managedBrowserPortConfigured(owner)\n\t\t? \"attach first; auto-launch explicit port\"\n\t\t: \"attach first; auto-launch dynamic port\";\n}\n\nexport function launchAttemptLines(owner?: object) {\n\tconst attempt = lastLaunchAttempt(owner);\n\tif (!attempt) return [];\n\n\tconst lines = [`Last launch attempt: ${attempt.mode}`];\n\tif (attempt.selectedCandidate) {\n\t\tlines.push(`Launched browser: ${attempt.selectedCandidate}`);\n\t} else {\n\t\tlines.push(`Tried browser candidates: ${attempt.candidateLabels.join(\", \")}`);\n\t}\n\tif (attempt.userDataDir) lines.push(`Managed browser profile: ${attempt.userDataDir}`);\n\tif (attempt.lastError) lines.push(`Last launch error: ${attempt.lastError}`);\n\treturn lines;\n}\n\nexport function launchHint(owner?: object) {\n\tconst browser = browserSettingsForOwner(owner);\n\tif (extensionsConfigured(owner)) {\n\t\treturn \"Configured unpacked extensions force an isolated extension-owned launch; existing CDP browsers are never reused, modified, or closed.\";\n\t}\n\tif (!isLocalDevToolsHost(browser.host)) {\n\t\treturn `Remote/non-local endpoints are not auto-launched. Start a browser with CDP enabled at ${devToolsEndpoint(owner)}.`;\n\t}\n\tif (!browser.autoLaunchEnabled) {\n\t\treturn `Auto-launch is disabled. Start a browser manually: ${chromeLaunchCommand(owner)}`;\n\t}\n\tconst managedMode = managedBrowserPortConfigured(owner)\n\t\t? `port ${managedBrowserPort(owner)}`\n\t\t: \"a dynamic DevTools port\";\n\treturn `If no endpoint is available, Pi will auto-launch a Chromium-family browser with ${managedMode} and an isolated temp profile. Manual command: ${chromeLaunchCommand(owner)}`;\n}\n\nexport function browserCandidateHint(owner?: object) {\n\tif (extensionsConfigured(owner)) {\n\t\treturn \"Extension browser requirement: configure Chrome for Testing or Chromium with browser.executablePath; branded Chrome is rejected because it may ignore unpacked-extension flags.\";\n\t}\n\treturn `Browser candidates: ${browserCandidateDefinitions(owner)\n\t\t.map((candidate) => candidate.label)\n\t\t.join(\", \")}`;\n}\n\nexport function chromeLaunchCommand(owner?: object) {\n\tconst executable =\n\t\tbrowserSettingsForOwner(owner).executablePath ?? defaultManualBrowserExecutable();\n\tconst dataDir =\n\t\tprocess.platform === \"win32\" ? \"%TEMP%\\\\pi-chrome-devtools\" : \"/tmp/pi-chrome-devtools\";\n\treturn `${quoteCommandPart(executable)} --remote-debugging-port=${managedBrowserPort(owner)} --user-data-dir=${dataDir}`;\n}\n\nfunction defaultManualBrowserExecutable() {\n\treturn process.platform === \"darwin\"\n\t\t? \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\"\n\t\t: process.platform === \"win32\"\n\t\t\t? \"chrome.exe\"\n\t\t\t: \"google-chrome\";\n}\n\nexport function quoteCommandPart(value: string) {\n\treturn /\\s/.test(value) ? `\"${value.replaceAll('\"', '\\\\\"')}\"` : value;\n}\n\nexport function endpointConfigHint() {\n\treturn \"Configure browser.endpoint, browser.executablePath, and browser.autoLaunch in pi-chrome-devtools.json or the /chrome-devtools Settings flow.\";\n}\n\nexport function isLocalDevToolsHost(host: string) {\n\tconst normalizedHost = host.toLowerCase().replace(/^\\[(.*)]$/, \"$1\");\n\treturn [\"localhost\", \"127.0.0.1\", \"::1\", \"0:0:0:0:0:0:0:1\"].includes(normalizedHost);\n}\n\nfunction browserCandidateDefinitions(owner?: object): BrowserCandidateDefinition[] {\n\tconst explicitCandidate = explicitBrowserCandidateDefinition(owner);\n\tif (explicitCandidate.length > 0) return explicitCandidate;\n\n\treturn uniqueBrowserCandidates(platformBrowserCandidateDefinitions());\n}\n\nfunction explicitBrowserCandidateDefinition(owner?: object): BrowserCandidateDefinition[] {\n\tconst browser = browserSettingsForOwner(owner);\n\tif (!browser.executablePath) return [];\n\treturn [\n\t\t{\n\t\t\tlabel:\n\t\t\t\tbrowser.executablePathSource === \"environment\"\n\t\t\t\t\t? \"PI_CHROME_DEVTOOLS_BROWSER\"\n\t\t\t\t\t: \"browser.executablePath\",\n\t\t\texecutable: browser.executablePath,\n\t\t\tsource: \"env\",\n\t\t},\n\t];\n}\n\nfunction platformBrowserCandidateDefinitions(): BrowserCandidateDefinition[] {\n\tif (process.platform === \"darwin\") {\n\t\treturn [\n\t\t\t{\n\t\t\t\tlabel: \"Google Chrome\",\n\t\t\t\texecutable: \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n\t\t\t\tsource: \"wellKnownPath\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"Chromium\",\n\t\t\t\texecutable: \"/Applications/Chromium.app/Contents/MacOS/Chromium\",\n\t\t\t\tsource: \"wellKnownPath\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"Brave Browser\",\n\t\t\t\texecutable: \"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser\",\n\t\t\t\tsource: \"wellKnownPath\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"Microsoft Edge\",\n\t\t\t\texecutable: \"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge\",\n\t\t\t\tsource: \"wellKnownPath\",\n\t\t\t},\n\t\t];\n\t}\n\n\tif (process.platform === \"win32\") {\n\t\treturn windowsBrowserCandidateDefinitions();\n\t}\n\n\treturn [\n\t\t{ label: \"Google Chrome\", executable: \"google-chrome\", source: \"path\" },\n\t\t{ label: \"Google Chrome Stable\", executable: \"google-chrome-stable\", source: \"path\" },\n\t\t{ label: \"Chromium\", executable: \"chromium\", source: \"path\" },\n\t\t{ label: \"Chromium Browser\", executable: \"chromium-browser\", source: \"path\" },\n\t\t{ label: \"Brave Browser\", executable: \"brave-browser\", source: \"path\" },\n\t\t{ label: \"Brave\", executable: \"brave\", source: \"path\" },\n\t\t{ label: \"Microsoft Edge\", executable: \"microsoft-edge\", source: \"path\" },\n\t\t{ label: \"Microsoft Edge Stable\", executable: \"microsoft-edge-stable\", source: \"path\" },\n\t];\n}\n\nfunction windowsBrowserCandidateDefinitions(): BrowserCandidateDefinition[] {\n\tconst programFiles = [\n\t\tprocess.env.PROGRAMFILES,\n\t\tprocess.env[\"PROGRAMFILES(X86)\"],\n\t\tprocess.env.LOCALAPPDATA,\n\t].filter((value): value is string => typeof value === \"string\" && value.length > 0);\n\tconst wellKnownPaths = programFiles.flatMap((root) => [\n\t\tjoin(root, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n\t\tjoin(root, \"Chromium\", \"Application\", \"chrome.exe\"),\n\t\tjoin(root, \"BraveSoftware\", \"Brave-Browser\", \"Application\", \"brave.exe\"),\n\t\tjoin(root, \"Microsoft\", \"Edge\", \"Application\", \"msedge.exe\"),\n\t]);\n\treturn [\n\t\t...wellKnownPaths.map((executable) => ({\n\t\t\tlabel: browserLabelFromExecutable(executable),\n\t\t\texecutable,\n\t\t\tsource: \"wellKnownPath\" as const,\n\t\t})),\n\t\t{ label: \"Google Chrome\", executable: \"chrome.exe\", source: \"path\" },\n\t\t{ label: \"Chromium\", executable: \"chromium.exe\", source: \"path\" },\n\t\t{ label: \"Brave Browser\", executable: \"brave.exe\", source: \"path\" },\n\t\t{ label: \"Microsoft Edge\", executable: \"msedge.exe\", source: \"path\" },\n\t];\n}\n\nfunction browserLabelFromExecutable(executable: string) {\n\tconst normalizedExecutable = normalizePathForComparison(executable);\n\tif (normalizedExecutable.includes(\"brave\")) return \"Brave Browser\";\n\tif (normalizedExecutable.includes(\"edge\") || normalizedExecutable.includes(\"msedge\")) {\n\t\treturn \"Microsoft Edge\";\n\t}\n\tif (normalizedExecutable.includes(\"chromium\")) return \"Chromium\";\n\treturn \"Google Chrome\";\n}\n\nfunction uniqueBrowserCandidates(candidates: BrowserCandidateDefinition[]) {\n\tconst seen = new Set<string>();\n\treturn candidates.filter((candidate) => {\n\t\tconst key = normalizePathForComparison(candidate.executable);\n\t\tif (seen.has(key)) return false;\n\t\tseen.add(key);\n\t\treturn true;\n\t});\n}\n\nasync function resolveBrowserCandidates(\n\tdefinitions: BrowserCandidateDefinition[],\n\tgeneration: number,\n\tsignal: AbortSignal,\n\towner?: object,\n) {\n\tconst candidates: BrowserCandidate[] = [];\n\tfor (const definition of definitions) {\n\t\tconst resolvedExecutable = await resolveBrowserExecutable(definition.executable);\n\t\tthrowIfBrowserLaunchCancelled(generation, signal, owner);\n\t\tif (!resolvedExecutable) continue;\n\t\tcandidates.push({ ...definition, resolvedExecutable });\n\t}\n\treturn uniqueBrowserCandidatesByResolvedPath(candidates);\n}\n\nfunction uniqueBrowserCandidatesByResolvedPath(candidates: BrowserCandidate[]) {\n\tconst seen = new Set<string>();\n\treturn candidates.filter((candidate) => {\n\t\tconst key = normalizePathForComparison(resolve(candidate.resolvedExecutable));\n\t\tif (seen.has(key)) return false;\n\t\tseen.add(key);\n\t\treturn true;\n\t});\n}\n\nasync function resolveBrowserExecutable(executable: string) {\n\tif (hasPathSeparator(executable) || isAbsolute(executable)) {\n\t\tconst resolvedExecutable = isAbsolute(executable) ? executable : resolve(executable);\n\t\treturn (await canAccessExecutable(resolvedExecutable)) ? resolvedExecutable : undefined;\n\t}\n\n\tfor (const directory of executableSearchPath()) {\n\t\tfor (const executableName of executableSearchNames(executable)) {\n\t\t\tconst candidate = join(directory, executableName);\n\t\t\tif (await canAccessExecutable(candidate)) return candidate;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction hasPathSeparator(path: string) {\n\treturn path.includes(\"/\") || path.includes(\"\\\\\");\n}\n\nfunction executableSearchPath() {\n\treturn (process.env.PATH ?? \"\").split(delimiter).filter((part) => part.length > 0);\n}\n\nfunction executableSearchNames(executable: string) {\n\tif (process.platform !== \"win32\" || /\\.[a-z0-9]+$/i.test(executable)) return [executable];\n\treturn [executable, `${executable}.exe`, `${executable}.cmd`, `${executable}.bat`];\n}\n\nasync function canAccessExecutable(path: string) {\n\ttry {\n\t\tawait browserManagerOperations.access(\n\t\t\tpath,\n\t\t\tprocess.platform === \"win32\" ? constants.F_OK : constants.X_OK,\n\t\t);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction formatBrowserCandidate(candidate: BrowserCandidate) {\n\treturn `${candidate.label} (${candidate.resolvedExecutable})`;\n}\n\nfunction formatBrowserCandidateDefinition(candidate: BrowserCandidateDefinition) {\n\treturn `${candidate.label} (${candidate.executable})`;\n}\n\nfunction noBrowserCandidateMessage(\n\tcandidateDefinitions: BrowserCandidateDefinition[],\n\towner?: object,\n) {\n\tif (extensionsConfigured(owner)) {\n\t\treturn [\n\t\t\t\"Cannot launch unpacked extensions because the configured browser executable was not found or is not executable.\",\n\t\t\t`Tried: ${candidateDefinitions.map(formatBrowserCandidateDefinition).join(\", \")}`,\n\t\t\t\"Set browser.executablePath to an executable Chrome for Testing or Chromium binary.\",\n\t\t].join(\"\\n\");\n\t}\n\treturn [\n\t\t\"Cannot auto-launch Chrome DevTools because no Chromium-family browser executable was found.\",\n\t\t`Tried: ${candidateDefinitions.map(formatBrowserCandidateDefinition).join(\", \")}`,\n\t\tendpointConfigHint(),\n\t].join(\"\\n\");\n}\n\nexport function formatPageListItem(page: DevToolsPage) {\n\treturn `- ${page.id}: ${page.title || \"(untitled)\"} ${page.url}`;\n}\n\nfunction abortableSleep(ms: number, signal?: AbortSignal) {\n\treturn new Promise<void>((resolveSleep, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(signal.reason);\n\t\t\treturn;\n\t\t}\n\t\tconst timeout = setTimeout(settleResolve, ms);\n\t\tconst onAbort = () => settleReject(signal?.reason);\n\t\tfunction cleanup() {\n\t\t\tclearTimeout(timeout);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t\tfunction settleResolve() {\n\t\t\tcleanup();\n\t\t\tresolveSleep();\n\t\t}\n\t\tfunction settleReject(reason: unknown) {\n\t\t\tcleanup();\n\t\t\treject(reason);\n\t\t}\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\nfunction inspectBrowserVersion(executable: string, signal: AbortSignal) {\n\treturn new Promise<string>((resolveVersion, reject) => {\n\t\texecFile(executable, [\"--version\"], { signal, timeout: 5_000 }, (error, stdout, stderr) => {\n\t\t\tif (error) {\n\t\t\t\treject(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresolveVersion(`${stdout}${stderr}`.trim());\n\t\t});\n\t});\n}\n\nfunction isPortAvailable(host: string, port: number) {\n\treturn new Promise<boolean>((resolveAvailability, reject) => {\n\t\tconst server = createServer();\n\t\tconst normalizedHost = host.replace(/^\\[(.*)]$/, \"$1\");\n\t\tserver.unref();\n\t\tserver.once(\"error\", (error: NodeJS.ErrnoException) => {\n\t\t\tif (error.code === \"EADDRINUSE\") resolveAvailability(false);\n\t\t\telse reject(error);\n\t\t});\n\t\tserver.listen(port, normalizedHost, () => {\n\t\t\tserver.close((error) => {\n\t\t\t\tif (error) reject(error);\n\t\t\t\telse resolveAvailability(true);\n\t\t\t});\n\t\t});\n\t});\n}\n\nclass DevToolsEndpointError extends Error {\n\treadonly retryable: boolean;\n\treadonly launchable: boolean;\n\n\tconstructor(message: string, options: { retryable?: boolean; launchable?: boolean } = {}) {\n\t\tsuper(message);\n\t\tthis.name = \"DevToolsEndpointError\";\n\t\tthis.retryable = options.retryable ?? false;\n\t\tthis.launchable = options.launchable ?? false;\n\t}\n}\n"],
5
- "mappings": "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",
6
- "names": ["constants", "access", "readFile", "rm", "isAbsolute", "join", "resolve", "access", "readFile", "rm", "formatError", "isNodeError", "resolve", "join", "isAbsolute", "constants"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/menu.ts"],
4
- "sourcesContent": ["import type { ExtensionAPI, ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu, runTask } from \"@narumitw/pi-tui-kit\";\nimport {\n\tbrowserLifecycleState,\n\tdevToolsEndpoint,\n\tlaunchAttemptLines,\n\tlaunchModeLabel,\n} from \"./browser-manager.js\";\nimport { availableChromeDevtoolsTools } from \"./lazy-tools.js\";\nimport { state, webMcpEnabled } from \"./runtime.js\";\nimport { loadSettings, type SettingsLoadResult } from \"./settings.js\";\nimport {\n\tCHROME_DEVTOOLS_TOOL_NAMES,\n\ttype ChromeDevToolsToolName,\n\tCORE_CHROME_DEVTOOLS_TOOL_NAMES,\n} from \"./tool-names.js\";\nimport {\n\tbuildBrowserStatusMessage,\n\tbuildCommandGuide,\n\tsanitizeChromeDevtoolsDisplay,\n\tsetSelectedChromeDevtoolsTools,\n} from \"./tool-selector.js\";\n\ntype CommandContext = ExtensionCommandContext;\ntype MainScreen = \"main\" | \"browserStatus\" | \"help\";\ntype MainAction = \"tools\" | \"bulk\" | \"settings\";\ntype ToolScreen = \"tools\" | \"review\";\ntype ToolAction = \"toggle\" | \"selectAll\" | \"selectNone\" | \"review\" | \"apply\" | \"cancel\";\n\ninterface MenuSnapshot {\n\tactiveTools: ChromeDevToolsToolName[];\n\tpersistenceLabel: string;\n\tmutationBlockedReason?: string;\n\tsettingsWarning?: string;\n}\n\ninterface ToolWorkflowState {\n\taccepted: Set<ChromeDevToolsToolName>;\n\tdraft: Set<ChromeDevToolsToolName>;\n\tmutationBlockedReason?: string;\n\tgeneration: number;\n\tapplied: boolean;\n}\n\nconst TOOL_PRESENTATION: Record<ChromeDevToolsToolName, { label: string; description: string }> = {\n\tchrome_devtools_list_pages: {\n\t\tlabel: \"List open pages\",\n\t\tdescription: \"List inspectable Chrome tabs and pages (chrome_devtools_list_pages).\",\n\t},\n\tchrome_devtools_select_page: {\n\t\tlabel: \"Select the active page\",\n\t\tdescription: \"Choose the page later browser actions use (chrome_devtools_select_page).\",\n\t},\n\tchrome_devtools_navigate: {\n\t\tlabel: \"Navigate a page\",\n\t\tdescription: \"Open a URL, creating a page when needed (chrome_devtools_navigate).\",\n\t},\n\tchrome_devtools_evaluate: {\n\t\tlabel: \"Run JavaScript\",\n\t\tdescription: \"Evaluate JavaScript in the selected page (chrome_devtools_evaluate).\",\n\t},\n\tchrome_devtools_screenshot: {\n\t\tlabel: \"Capture a screenshot\",\n\t\tdescription: \"Save a PNG of the selected page (chrome_devtools_screenshot).\",\n\t},\n\tchrome_devtools_webmcp_list_tools: {\n\t\tlabel: \"List page WebMCP tools \u00B7 Experimental\",\n\t\tdescription: \"Discover page-provided WebMCP capabilities (chrome_devtools_webmcp_list_tools).\",\n\t},\n\tchrome_devtools_webmcp_call_tool: {\n\t\tlabel: \"Call a page WebMCP tool \u00B7 Experimental\",\n\t\tdescription: \"Invoke a listed page tool after confirmation (chrome_devtools_webmcp_call_tool).\",\n\t},\n};\n\nexport async function showChromeDevtoolsMenu(\n\tpi: ExtensionAPI,\n\tctx: CommandContext,\n\tgeneration: number,\n) {\n\tconst snapshot = await loadSnapshotWithFeedback(pi, ctx, generation);\n\tif (!snapshot) return;\n\tconst menuSignal = state.sessionController.signal;\n\tconst isCurrent = () => generation === state.sessionGeneration && !menuSignal.aborted;\n\tconst menu = defineMenu<MenuSnapshot, MainScreen, MainAction>({\n\t\tstart: \"main\",\n\t\tscreens: {\n\t\t\tmain: ({ state: current }) => ({\n\t\t\t\tkind: \"actions\",\n\t\t\t\ttitle: \"Chrome DevTools\",\n\t\t\t\tlines: mainStateLines(current, ctx.sessionManager),\n\t\t\t\titems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"tools\",\n\t\t\t\t\t\tlabel: \"Choose available browser tools\u2026\",\n\t\t\t\t\t\tdescription: \"Choose which capabilities the loader may expose.\",\n\t\t\t\t\t\tdisabled: Boolean(current.mutationBlockedReason),\n\t\t\t\t\t\tdisabledReason: current.mutationBlockedReason,\n\t\t\t\t\t\taction: \"tools\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"bulk\",\n\t\t\t\t\t\tlabel:\n\t\t\t\t\t\t\tcurrent.activeTools.length === availableCatalogNames(ctx.sessionManager).length\n\t\t\t\t\t\t\t\t? \"Make all browser tools unavailable\u2026\"\n\t\t\t\t\t\t\t\t: \"Make all browser tools available\u2026\",\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\tcurrent.activeTools.length === availableCatalogNames(ctx.sessionManager).length\n\t\t\t\t\t\t\t\t? `Preview 0 of ${availableCatalogNames(ctx.sessionManager).length}; other active tools stay enabled.`\n\t\t\t\t\t\t\t\t: `Preview ${availableCatalogNames(ctx.sessionManager).length} of ${availableCatalogNames(ctx.sessionManager).length}; other active tools stay enabled.`,\n\t\t\t\t\t\tdisabled: Boolean(current.mutationBlockedReason),\n\t\t\t\t\t\tdisabledReason: current.mutationBlockedReason,\n\t\t\t\t\t\taction: \"bulk\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"browser-status\",\n\t\t\t\t\t\tlabel: \"Browser status\",\n\t\t\t\t\t\tdescription: \"Runtime, endpoint, and last launch attempt.\",\n\t\t\t\t\t\tto: \"browserStatus\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"settings\",\n\t\t\t\t\t\tlabel: \"Browser settings\",\n\t\t\t\t\t\tdescription: \"Edit endpoint, auto-launch, and browser executable settings.\",\n\t\t\t\t\t\taction: \"settings\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"help\",\n\t\t\t\t\t\tlabel: \"Help\",\n\t\t\t\t\t\tdescription: \"Commands and usage.\",\n\t\t\t\t\t\tto: \"help\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\thint: \"close\",\n\t\t\t}),\n\t\t\tbrowserStatus: () => ({\n\t\t\t\tkind: \"review\",\n\t\t\t\ttitle: \"Browser status\",\n\t\t\t\tcontent: buildBrowserStatusMessage(ctx.sessionManager),\n\t\t\t\tformat: { kind: \"text\" },\n\t\t\t\tviewportSize: \"adaptive\",\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t\thelp: () => ({\n\t\t\t\tkind: \"review\",\n\t\t\t\ttitle: \"Chrome DevTools help\",\n\t\t\t\tcontent: buildCommandGuide(ctx.sessionManager),\n\t\t\t\tformat: { kind: \"text\" },\n\t\t\t\tviewportSize: \"adaptive\",\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t},\n\t\tactions: {\n\t\t\ttools: async ({ state: current }) => {\n\t\t\t\tconst result = await showChromeDevtoolsToolWorkflow(pi, ctx, generation, {\n\t\t\t\t\tsnapshot: current,\n\t\t\t\t});\n\t\t\t\tif (result?.applied && isCurrent()) updateSnapshotAfterApply(current, result.selectedTools);\n\t\t\t\treturn result?.closeParent ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\tbulk: async ({ state: current }) => {\n\t\t\t\tconst selectedTools =\n\t\t\t\t\tcurrent.activeTools.length === availableCatalogNames(ctx.sessionManager).length\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: availableCatalogNames(ctx.sessionManager);\n\t\t\t\tconst result = await showChromeDevtoolsToolWorkflow(pi, ctx, generation, {\n\t\t\t\t\tsnapshot: current,\n\t\t\t\t\tinitialDraft: selectedTools,\n\t\t\t\t\tstartAtReview: true,\n\t\t\t\t});\n\t\t\t\tif (result?.applied && isCurrent()) updateSnapshotAfterApply(current, result.selectedTools);\n\t\t\t\treturn result?.closeParent ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\tsettings: async ({ state: current }) => {\n\t\t\t\tconst { showChromeDevtoolsBrowserSettings } = await import(\"./browser-settings-menu.js\");\n\t\t\t\tif (!isCurrent()) return { kind: \"stay\" };\n\t\t\t\tconst result = await showChromeDevtoolsBrowserSettings(pi, ctx, generation);\n\t\t\t\tif (!isCurrent()) return { kind: \"stay\" };\n\t\t\t\tconst refreshed = await loadChromeDevtoolsMenuSnapshot(pi, ctx);\n\t\t\t\tif (!isCurrent()) return { kind: \"stay\" };\n\t\t\t\tObject.assign(current, refreshed);\n\t\t\t\treturn result.closeParent ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t},\n\t});\n\tawait runMenu(ctx, menu, {\n\t\tgetState: () => snapshot,\n\t\tsignal: menuSignal,\n\t\tisCurrent,\n\t\tonError: (currentCtx, error) =>\n\t\t\tcurrentCtx.ui.notify(\n\t\t\t\tsanitizeChromeDevtoolsDisplay(`Chrome DevTools menu failed: ${formatError(error)}`),\n\t\t\t\t\"error\",\n\t\t\t),\n\t});\n}\n\nexport async function showChromeDevtoolsToolWorkflow(\n\tpi: ExtensionAPI,\n\tctx: CommandContext,\n\tgeneration: number,\n\toptions: {\n\t\tsnapshot?: MenuSnapshot;\n\t\tinitialDraft?: readonly ChromeDevToolsToolName[];\n\t\tstartAtReview?: boolean;\n\t} = {},\n): Promise<\n\t{ applied: boolean; closeParent: boolean; selectedTools: ChromeDevToolsToolName[] } | undefined\n> {\n\tconst snapshot = options.snapshot ?? (await loadSnapshotWithFeedback(pi, ctx, generation));\n\tif (!snapshot) return undefined;\n\tconst menuSignal = state.sessionController.signal;\n\tconst isCurrent = () => generation === state.sessionGeneration && !menuSignal.aborted;\n\tconst accepted = new Set(snapshot.activeTools);\n\tconst workflow: ToolWorkflowState = {\n\t\taccepted,\n\t\tdraft: new Set(options.initialDraft ?? snapshot.activeTools),\n\t\tmutationBlockedReason: snapshot.mutationBlockedReason,\n\t\tgeneration,\n\t\tapplied: false,\n\t};\n\tconst menu = defineMenu<ToolWorkflowState, ToolScreen, ToolAction>({\n\t\tstart: options.startAtReview ? \"review\" : \"tools\",\n\t\tscreens: {\n\t\t\ttools: ({ state: current }) => ({\n\t\t\t\tkind: \"multiSelect\",\n\t\t\t\ttitle: `Browser tools (${current.draft.size}/${availableCatalogNames(ctx.sessionManager).length})`,\n\t\t\t\tlines: toolDraftLines(current, ctx.sessionManager),\n\t\t\t\titems: availableCatalogNames(ctx.sessionManager).map((toolName) => ({\n\t\t\t\t\tid: toolName,\n\t\t\t\t\tlabel: TOOL_PRESENTATION[toolName].label,\n\t\t\t\t\tdescription: TOOL_PRESENTATION[toolName].description,\n\t\t\t\t\tsearchText: `${toolName} ${TOOL_PRESENTATION[toolName].description}`,\n\t\t\t\t\tselected: current.draft.has(toolName),\n\t\t\t\t\tdisabled: Boolean(current.mutationBlockedReason),\n\t\t\t\t\tdisabledReason: current.mutationBlockedReason,\n\t\t\t\t})),\n\t\t\t\taction: \"toggle\",\n\t\t\t\tactions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"select-all\",\n\t\t\t\t\t\tlabel: \"Select all\",\n\t\t\t\t\t\tdisabled: Boolean(current.mutationBlockedReason),\n\t\t\t\t\t\tdisabledReason: current.mutationBlockedReason,\n\t\t\t\t\t\taction: \"selectAll\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"select-none\",\n\t\t\t\t\t\tlabel: \"Select none\",\n\t\t\t\t\t\tdisabled: Boolean(current.mutationBlockedReason),\n\t\t\t\t\t\tdisabledReason: current.mutationBlockedReason,\n\t\t\t\t\t\taction: \"selectNone\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"review\",\n\t\t\t\t\t\tlabel: \"Review changes\u2026\",\n\t\t\t\t\t\tdisabled:\n\t\t\t\t\t\t\tBoolean(current.mutationBlockedReason) || setsEqual(current.accepted, current.draft),\n\t\t\t\t\t\tdisabledReason:\n\t\t\t\t\t\t\tcurrent.mutationBlockedReason ??\n\t\t\t\t\t\t\t(setsEqual(current.accepted, current.draft) ? \"No unapplied changes\" : undefined),\n\t\t\t\t\t\tto: \"review\",\n\t\t\t\t\t},\n\t\t\t\t\t{ id: \"cancel\", label: \"Cancel\", action: \"cancel\" },\n\t\t\t\t],\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t\treview: ({ state: current }) => ({\n\t\t\t\tkind: \"review\",\n\t\t\t\ttitle: \"Review tool changes\",\n\t\t\t\tlines: [\n\t\t\t\t\t`Currently available: ${current.accepted.size}/${availableCatalogNames(ctx.sessionManager).length}`,\n\t\t\t\t\t`Proposed availability: ${current.draft.size}/${availableCatalogNames(ctx.sessionManager).length}`,\n\t\t\t\t],\n\t\t\t\tcontent: buildToolReview(current, ctx.sessionManager),\n\t\t\t\tformat: { kind: \"text\" },\n\t\t\t\tviewportSize: \"adaptive\",\n\t\t\t\t...(current.mutationBlockedReason || setsEqual(current.accepted, current.draft)\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tconfirm: {\n\t\t\t\t\t\t\t\tid: \"apply\",\n\t\t\t\t\t\t\t\tlabel: \"Apply tool changes\",\n\t\t\t\t\t\t\t\taction: \"apply\" as const,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t},\n\t\tactions: {\n\t\t\ttoggle: ({ state: current, itemId, selected }) => {\n\t\t\t\tif (!isChromeDevtoolsToolName(itemId) || selected === undefined)\n\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\tif (selected) current.draft.add(itemId);\n\t\t\t\telse current.draft.delete(itemId);\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tselectAll: ({ state: current }) => {\n\t\t\t\tcurrent.draft = new Set(availableCatalogNames(ctx.sessionManager));\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tselectNone: ({ state: current }) => {\n\t\t\t\tcurrent.draft = new Set();\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\treview: () => ({ kind: \"to\", screen: \"review\" }),\n\t\t\tcancel: () => ({ kind: \"back\" }),\n\t\t\tapply: async ({ state: current, signal }) => {\n\t\t\t\tawait ctx.waitForIdle();\n\t\t\t\tif (signal.aborted || !isCurrent() || current.generation !== state.sessionGeneration) {\n\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t}\n\t\t\t\tconst selectedTools = orderedTools(current.draft);\n\t\t\t\tconst saveResult = await setSelectedChromeDevtoolsTools(\n\t\t\t\t\tpi,\n\t\t\t\t\tctx,\n\t\t\t\t\tselectedTools,\n\t\t\t\t\torderedTools(current.accepted),\n\t\t\t\t);\n\t\t\t\tif (!isCurrent()) return { kind: \"rejected\" };\n\t\t\t\tif (saveResult === \"active-tools-changed\") {\n\t\t\t\t\tcurrent.accepted = new Set(activeChromeTools(pi));\n\t\t\t\t}\n\t\t\t\tif (saveResult !== \"saved\") return { kind: \"rejected\" };\n\t\t\t\tcurrent.accepted = new Set(selectedTools);\n\t\t\t\tcurrent.draft = new Set(selectedTools);\n\t\t\t\tcurrent.applied = true;\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Saved: ${selectedTools.length} of ${availableCatalogNames(ctx.sessionManager).length} browser tools available.`,\n\t\t\t\t\t\"info\",\n\t\t\t\t);\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t},\n\t});\n\tconst result = await runMenu(ctx, menu, {\n\t\tgetState: () => workflow,\n\t\tsignal: menuSignal,\n\t\tisCurrent,\n\t\tonError: (currentCtx, error) =>\n\t\t\tcurrentCtx.ui.notify(\n\t\t\t\tsanitizeChromeDevtoolsDisplay(\n\t\t\t\t\t`Chrome DevTools tool selection failed: ${formatError(error)}`,\n\t\t\t\t),\n\t\t\t\t\"error\",\n\t\t\t),\n\t});\n\treturn {\n\t\tapplied: workflow.applied,\n\t\tcloseParent: !workflow.applied && result.kind === \"closed\" && result.reason === \"close\",\n\t\tselectedTools: orderedTools(workflow.accepted),\n\t};\n}\n\nasync function loadSnapshotWithFeedback(pi: ExtensionAPI, ctx: CommandContext, generation: number) {\n\tconst menuSignal = state.sessionController.signal;\n\tconst isCurrent = () => generation === state.sessionGeneration && !menuSignal.aborted;\n\tconst result = await runTask(ctx, {\n\t\tlabel: \"Loading Chrome DevTools settings\u2026\",\n\t\tsignal: menuSignal,\n\t\tisCurrent,\n\t\ttask: async ({ signal }) => {\n\t\t\tsignal.throwIfAborted();\n\t\t\tconst settings = await loadSettings();\n\t\t\tsignal.throwIfAborted();\n\t\t\treturn buildMenuSnapshot(pi, settings);\n\t\t},\n\t});\n\treturn result.kind === \"completed\" ? result.value : undefined;\n}\n\nexport async function loadChromeDevtoolsMenuSnapshot(\n\tpi: ExtensionAPI,\n\tctx: ExtensionCommandContext,\n) {\n\tconst settings = await loadSettings({\n\t\tcwd: ctx.cwd,\n\t\tprojectTrusted: ctx.isProjectTrusted(),\n\t});\n\treturn buildMenuSnapshot(pi, settings);\n}\n\nfunction buildMenuSnapshot(pi: ExtensionAPI, settings: SettingsLoadResult): MenuSnapshot {\n\tconst activeTools = activeChromeTools(pi);\n\tconst persistedTools =\n\t\tsettings.kind === \"loaded\" && settings.settings.tools\n\t\t\t? orderedTools(new Set(settings.settings.tools))\n\t\t\t: undefined;\n\tconst persistenceLabel =\n\t\tsettings.kind === \"invalid\"\n\t\t\t? \"settings need repair\"\n\t\t\t: persistedTools === undefined\n\t\t\t\t? \"not saved\"\n\t\t\t\t: arraysEqual(activeTools, persistedTools)\n\t\t\t\t\t? \"saved\"\n\t\t\t\t\t: \"runtime catalog differs from saved catalog\";\n\tconst settingsWarning = [\n\t\t...new Set([settings.notice, state.settingsNotice].filter(Boolean)),\n\t].join(\"\\n\");\n\treturn {\n\t\tactiveTools,\n\t\tpersistenceLabel,\n\t\t...(settings.kind === \"invalid\"\n\t\t\t? { mutationBlockedReason: `Repair ${settings.reason} before saving` }\n\t\t\t: {}),\n\t\t...(settingsWarning ? { settingsWarning } : {}),\n\t};\n}\n\nfunction mainStateLines(snapshot: MenuSnapshot, owner: object) {\n\tconst launchError = launchAttemptLines(owner).find((line) =>\n\t\tline.startsWith(\"Last launch error:\"),\n\t);\n\treturn sanitizeLines([\n\t\t`Tool catalog: ${snapshot.activeTools.length} of ${availableCatalogNames(owner).length} available \u00B7 ${snapshot.persistenceLabel}`,\n\t\t`WebMCP: ${webMcpEnabled(owner) ? \"enabled \u00B7 experimental \u00B7 confirmation required for every call\" : \"disabled \u00B7 experimental\"}`,\n\t\t`Browser: ${browserLifecycleSummary(owner)}`,\n\t\t`Endpoint: ${devToolsEndpoint(owner)}`,\n\t\t...(snapshot.settingsWarning ? [`Settings warning: ${snapshot.settingsWarning}`] : []),\n\t\t...(launchError ? [`Launch warning: ${launchError.slice(\"Last launch error: \".length)}`] : []),\n\t]);\n}\n\nfunction browserLifecycleSummary(owner: object) {\n\tconst lifecycle = browserLifecycleState(owner);\n\tif (lifecycle === \"starting\") return \"starting managed browser\";\n\tif (lifecycle === \"running\") return \"managed browser running\";\n\tif (lifecycle === \"exited\") return \"managed browser exited \u00B7 open Browser status to recover\";\n\tif (lifecycle === \"failed\") return \"last launch failed \u00B7 open Browser status to recover\";\n\tconst launchMode = launchModeLabel(owner);\n\treturn launchMode.startsWith(\"attach first\")\n\t\t? \"not started \u00B7 attaches or launches on first use\"\n\t\t: `not started \u00B7 ${launchMode}`;\n}\n\nfunction toolDraftLines(current: ToolWorkflowState, owner: object) {\n\tif (current.mutationBlockedReason)\n\t\treturn sanitizeLines([`Unavailable: ${current.mutationBlockedReason}`]);\n\tconst changes = symmetricDifferenceSize(current.accepted, current.draft);\n\treturn [\n\t\t`Currently available: ${current.accepted.size}/${availableCatalogNames(owner).length}`,\n\t\tchanges === 0\n\t\t\t? \"No unapplied changes \u00B7 Escape cancels\"\n\t\t\t: `${changes} unapplied ${changes === 1 ? \"change\" : \"changes\"} \u00B7 Escape cancels`,\n\t\t`WebMCP gateways: ${webMcpEnabled(owner) ? \"available for selection \u00B7 experimental\" : \"hidden while experimental WebMCP is disabled\"}`,\n\t\t\"Changes are not applied until Review changes and Apply tool changes.\",\n\t];\n}\n\nfunction buildToolReview(current: ToolWorkflowState, owner: object) {\n\tconst catalog = availableCatalogNames(owner);\n\tconst available = catalog.filter((name) => current.draft.has(name));\n\tconst unavailable = catalog.filter((name) => !current.draft.has(name));\n\treturn sanitizeChromeDevtoolsDisplay(\n\t\t[\n\t\t\t`Current available browser tools: ${current.accepted.size}/${catalog.length}`,\n\t\t\t`Proposed available browser tools: ${current.draft.size}/${catalog.length}`,\n\t\t\t\"\",\n\t\t\t\"Available after apply:\",\n\t\t\t...(available.length > 0\n\t\t\t\t? available.map((name) => ` - ${TOOL_PRESENTATION[name].label} (${name})`)\n\t\t\t\t: [\" - none\"]),\n\t\t\t\"\",\n\t\t\t\"Unavailable after apply:\",\n\t\t\t...(unavailable.length > 0\n\t\t\t\t? unavailable.map((name) => ` - ${TOOL_PRESENTATION[name].label} (${name})`)\n\t\t\t\t: [\" - none\"]),\n\t\t\t\"\",\n\t\t\t\"Other active Pi tools remain unchanged.\",\n\t\t\t\"Native-capable models defer these tools until chrome_devtools_load selects them.\",\n\t\t\t\"Other models expose available tools eagerly before the next model request.\",\n\t\t\t\"The accepted availability policy is saved for future sessions.\",\n\t\t].join(\"\\n\"),\n\t);\n}\n\nfunction updateSnapshotAfterApply(\n\tsnapshot: MenuSnapshot,\n\tselectedTools: readonly ChromeDevToolsToolName[],\n) {\n\tsnapshot.activeTools = [...selectedTools];\n\tsnapshot.persistenceLabel = \"saved\";\n}\n\nfunction activeChromeTools(pi: ExtensionAPI) {\n\treturn availableChromeDevtoolsTools(pi);\n}\n\nfunction orderedTools(tools: ReadonlySet<ChromeDevToolsToolName>) {\n\treturn CHROME_DEVTOOLS_TOOL_NAMES.filter((toolName) => tools.has(toolName));\n}\n\nfunction isChromeDevtoolsToolName(value: string): value is ChromeDevToolsToolName {\n\treturn CHROME_DEVTOOLS_TOOL_NAMES.includes(value as ChromeDevToolsToolName);\n}\n\nfunction setsEqual<T>(left: ReadonlySet<T>, right: ReadonlySet<T>) {\n\treturn left.size === right.size && [...left].every((value) => right.has(value));\n}\n\nfunction symmetricDifferenceSize<T>(left: ReadonlySet<T>, right: ReadonlySet<T>) {\n\tlet changes = 0;\n\tfor (const value of left) if (!right.has(value)) changes += 1;\n\tfor (const value of right) if (!left.has(value)) changes += 1;\n\treturn changes;\n}\n\nfunction arraysEqual<T>(left: readonly T[], right: readonly T[]) {\n\treturn left.length === right.length && left.every((value, index) => value === right[index]);\n}\n\nfunction sanitizeLines(lines: readonly string[]) {\n\treturn sanitizeChromeDevtoolsDisplay(lines.join(\"\\n\")).split(\"\\n\");\n}\n\nfunction availableCatalogNames(owner: object): ChromeDevToolsToolName[] {\n\treturn webMcpEnabled(owner)\n\t\t? [...CHROME_DEVTOOLS_TOOL_NAMES]\n\t\t: [...CORE_CHROME_DEVTOOLS_TOOL_NAMES];\n}\n\nfunction formatError(error: unknown) {\n\treturn error instanceof Error ? error.message : String(error);\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/webmcp/policy.ts", "../../src/webmcp/protocol.ts", "../../src/webmcp/discovery.ts", "../../src/webmcp/tools.ts"],
4
- "sourcesContent": ["import { createHash } from \"node:crypto\";\nimport { stripVTControlCharacters } from \"node:util\";\nimport {\n\tDEFAULT_MAX_BYTES,\n\tDEFAULT_MAX_LINES,\n\tformatSize,\n\ttruncateHead,\n} from \"@earendil-works/pi-coding-agent\";\nimport type { TSchema } from \"typebox\";\nimport { Check } from \"typebox/value\";\nimport type { WebMcpProtocolAnnotation, WebMcpProtocolTool } from \"./protocol.js\";\n\nexport const MAX_WEBMCP_TOOLS = 100;\nconst MAX_SCHEMA_BYTES = 64 * 1024;\nconst MAX_INPUT_BYTES = 64 * 1024;\nconst MAX_OUTPUT_BYTES = 1024 * 1024;\nconst MAX_JSON_DEPTH = 32;\nconst MAX_JSON_NODES = 10_000;\nconst MAX_OUTPUT_NODES = 100_000;\nconst MAX_SCHEMA_VALIDATION_BRANCHES = 128;\n\nexport interface WebMcpToolDescriptor {\n\tannotations: WebMcpProtocolAnnotation;\n\tdescription: string;\n\tdocumentId: string;\n\tframeId: string;\n\tframeOrigin: string;\n\tinputSchema: Record<string, unknown>;\n\tname: string;\n\tpageId: string;\n\tpageUrl: string;\n\tschemaDigest: string;\n\tsessionGeneration: string;\n\ttitle?: string;\n}\n\nexport interface WebMcpToolIdentity {\n\tdocumentId: string;\n\tframeId: string;\n\tframeOrigin: string;\n\tname: string;\n\tpageId: string;\n\tschemaDigest: string;\n\tsessionGeneration: string;\n}\n\nexport function normalizeWebMcpTool(\n\ttool: WebMcpProtocolTool,\n\tcontext: {\n\t\tdocumentId: string;\n\t\tframeOrigin: string;\n\t\tpageId: string;\n\t\tpageUrl: string;\n\t\tsessionGeneration: string;\n\t},\n): WebMcpToolDescriptor {\n\tconst name = boundedString(tool.name, \"tool name\", 512, { nonEmpty: true });\n\tconst description = boundedString(tool.description, \"tool description\", 16 * 1024);\n\tconst title =\n\t\ttool.title === undefined ? undefined : boundedString(tool.title, \"tool title\", 1_024);\n\tconst documentId = boundedString(context.documentId, \"document loader ID\", 512, {\n\t\tnonEmpty: true,\n\t});\n\tconst frameId = boundedString(tool.frameId, \"frame ID\", 512, { nonEmpty: true });\n\tconst frameOrigin = boundedString(context.frameOrigin, \"frame origin\", 2_048, {\n\t\tnonEmpty: true,\n\t});\n\tconst pageId = boundedString(context.pageId, \"page ID\", 512, { nonEmpty: true });\n\tconst pageUrl = boundedString(context.pageUrl, \"page URL\", 8_192);\n\tconst inputSchema = tool.inputSchema ?? { type: \"object\", additionalProperties: true };\n\trejectRegexBearingSchema(inputSchema);\n\tconst canonicalSchema = canonicalJsonObject(inputSchema, {\n\t\tlabel: \"WebMCP input schema\",\n\t\tmaxBytes: MAX_SCHEMA_BYTES,\n\t\tmaxDepth: MAX_JSON_DEPTH,\n\t\tmaxNodes: MAX_JSON_NODES,\n\t});\n\trejectExpensiveValidationSchema(canonicalSchema);\n\tconst annotations = canonicalAnnotations(tool.annotations);\n\tconst schemaDigest = createHash(\"sha256\")\n\t\t.update(canonicalStringify({ inputSchema: canonicalSchema, annotations }))\n\t\t.digest(\"hex\");\n\treturn {\n\t\tannotations,\n\t\tdescription,\n\t\tdocumentId,\n\t\tframeId,\n\t\tframeOrigin,\n\t\tinputSchema: canonicalSchema,\n\t\tname,\n\t\tpageId,\n\t\tpageUrl,\n\t\tschemaDigest,\n\t\tsessionGeneration: context.sessionGeneration,\n\t\t...(title === undefined ? {} : { title }),\n\t};\n}\n\nexport function webMcpIdentity(tool: WebMcpToolDescriptor): WebMcpToolIdentity {\n\treturn {\n\t\tsessionGeneration: tool.sessionGeneration,\n\t\tpageId: tool.pageId,\n\t\tdocumentId: tool.documentId,\n\t\tframeId: tool.frameId,\n\t\tframeOrigin: tool.frameOrigin,\n\t\tname: tool.name,\n\t\tschemaDigest: tool.schemaDigest,\n\t};\n}\n\nexport function requireMatchingWebMcpTool(\n\ttools: readonly WebMcpToolDescriptor[],\n\texpected: WebMcpToolIdentity,\n) {\n\tconst candidates = tools.filter(\n\t\t(tool) => tool.frameId === expected.frameId && tool.name === expected.name,\n\t);\n\tif (candidates.length === 0) throw new Error(\"The selected WebMCP tool is no longer available.\");\n\tif (candidates.length > 1) {\n\t\tthrow new Error(\"The selected WebMCP tool identity is ambiguous in its frame.\");\n\t}\n\tconst current = candidates[0];\n\tif (!current) throw new Error(\"The selected WebMCP tool is no longer available.\");\n\tconst mismatches = (\n\t\t[\n\t\t\t[\"session generation\", current.sessionGeneration, expected.sessionGeneration],\n\t\t\t[\"page\", current.pageId, expected.pageId],\n\t\t\t[\"document\", current.documentId, expected.documentId],\n\t\t\t[\"frame\", current.frameId, expected.frameId],\n\t\t\t[\"frame origin\", current.frameOrigin, expected.frameOrigin],\n\t\t\t[\"schema or annotations\", current.schemaDigest, expected.schemaDigest],\n\t\t] as const\n\t).flatMap(([label, actual, wanted]) => (actual === wanted ? [] : [label]));\n\tif (mismatches.length > 0) {\n\t\tthrow new Error(`The selected WebMCP tool became stale: ${mismatches.join(\", \")} changed.`);\n\t}\n\treturn current;\n}\n\nexport function normalizeWebMcpInput(input: Record<string, unknown>) {\n\treturn canonicalJsonObject(input, {\n\t\tlabel: \"WebMCP tool input\",\n\t\tmaxBytes: MAX_INPUT_BYTES,\n\t\tmaxDepth: MAX_JSON_DEPTH,\n\t\tmaxNodes: MAX_JSON_NODES,\n\t});\n}\n\nexport function validateWebMcpInput(\n\tschema: Record<string, unknown>,\n\tinput: Record<string, unknown>,\n) {\n\tconst normalized = normalizeWebMcpInput(input);\n\tlet valid: boolean;\n\ttry {\n\t\tvalid = Check(schema as TSchema, normalized);\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`The page provided a WebMCP input schema that cannot be validated: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t}\n\tif (!valid) throw new Error(\"WebMCP tool input does not match the current page-provided schema.\");\n\treturn normalized;\n}\n\nexport function normalizeWebMcpOutput(output: unknown) {\n\treturn canonicalJsonValue(output, {\n\t\tlabel: \"WebMCP tool output\",\n\t\tmaxBytes: MAX_OUTPUT_BYTES,\n\t\tmaxDepth: MAX_JSON_DEPTH * 2,\n\t\tmaxNodes: MAX_OUTPUT_NODES,\n\t});\n}\n\nexport function boundedWebMcpDiscovery(\n\tpage: { id: string; title: string; url: string },\n\ttools: readonly WebMcpToolDescriptor[],\n) {\n\tconst included: WebMcpToolDescriptor[] = [];\n\tfor (const tool of tools) {\n\t\tconst candidate = [...included, tool];\n\t\tconst publication = boundedWebMcpJson({\n\t\t\tpage,\n\t\t\ttools: candidate,\n\t\t\ttotalToolCount: tools.length,\n\t\t\ttruncated: candidate.length < tools.length,\n\t\t});\n\t\tif (publication.truncated) break;\n\t\tincluded.push(tool);\n\t}\n\tconst truncated = included.length < tools.length;\n\tconst publication = boundedWebMcpJson({\n\t\tpage,\n\t\ttools: included,\n\t\ttotalToolCount: tools.length,\n\t\ttruncated,\n\t});\n\tif (publication.truncated) {\n\t\tthrow new Error(\"WebMCP discovery metadata cannot fit within Pi's output limit.\");\n\t}\n\treturn { ...publication, included, truncated };\n}\n\nexport function boundedWebMcpJson(value: unknown) {\n\tconst serialized = sanitizeWebMcpDisplay(JSON.stringify(value, null, 2), Number.MAX_SAFE_INTEGER);\n\tconst result = truncateHead(serialized, {\n\t\tmaxBytes: Math.max(1, DEFAULT_MAX_BYTES - 256),\n\t\tmaxLines: Math.max(1, DEFAULT_MAX_LINES - 2),\n\t});\n\tif (!result.truncated) return { text: result.content, truncated: false };\n\tconst notice = `\\n[WebMCP output truncated: ${result.outputLines}/${result.totalLines} lines, ${formatSize(result.outputBytes)}/${formatSize(result.totalBytes)}.]`;\n\treturn { text: `${result.content}${notice}`, truncated: true };\n}\n\nexport function webMcpConfirmationMessage(\n\ttool: WebMcpToolDescriptor,\n\tinput: Record<string, unknown>,\n\tmanagedProfile: boolean,\n) {\n\tconst inputSummary = sanitizeWebMcpDisplay(JSON.stringify(input, null, 2), 2_000);\n\treturn [\n\t\tmanagedProfile\n\t\t\t? \"This call uses the isolated browser profile managed by Pi.\"\n\t\t\t: \"Warning: this call uses an attached browser profile that may contain everyday authenticated sessions and sensitive state.\",\n\t\t`Page: ${sanitizeWebMcpDisplay(tool.pageUrl, 4_096)}`,\n\t\t`Frame origin: ${sanitizeWebMcpDisplay(tool.frameOrigin, 2_048)}`,\n\t\t`Tool: ${sanitizeWebMcpDisplay(tool.name, 512)}`,\n\t\t\"Page annotations are untrusted and do not bypass this confirmation.\",\n\t\t\"Input:\",\n\t\tinputSummary,\n\t].join(\"\\n\");\n}\n\nexport function sanitizeWebMcpDisplay(value: string, maxCharacters = 50_000) {\n\tconst withoutBidi = stripVTControlCharacters(value).replace(\n\t\t/[\\u202a-\\u202e\\u2066-\\u2069]/gu,\n\t\t\"\uFFFD\",\n\t);\n\tconst sanitized = Array.from(withoutBidi, (character) => {\n\t\tconst codePoint = character.codePointAt(0) ?? 0;\n\t\tconst unsafeControl =\n\t\t\t(codePoint >= 0 && codePoint <= 8) ||\n\t\t\t(codePoint >= 11 && codePoint <= 31) ||\n\t\t\t(codePoint >= 127 && codePoint <= 159);\n\t\treturn unsafeControl ? \"\uFFFD\" : character;\n\t}).join(\"\");\n\tif (sanitized.length <= maxCharacters) return sanitized;\n\treturn `${sanitized.slice(0, Math.max(0, maxCharacters - 1))}\u2026`;\n}\n\nexport function webMcpErrorMessage(error: unknown) {\n\treturn sanitizeWebMcpDisplay(error instanceof Error ? error.message : String(error), 8_192);\n}\n\nfunction canonicalAnnotations(value: WebMcpProtocolAnnotation | undefined) {\n\tif (!value) return {};\n\treturn Object.fromEntries(\n\t\tObject.entries(value)\n\t\t\t.filter((entry): entry is [string, boolean] => typeof entry[1] === \"boolean\")\n\t\t\t.sort(([left], [right]) => left.localeCompare(right)),\n\t) as WebMcpProtocolAnnotation;\n}\n\nfunction rejectRegexBearingSchema(schema: unknown): void {\n\tif (Array.isArray(schema)) {\n\t\tfor (const child of schema) rejectRegexBearingSchema(child);\n\t\treturn;\n\t}\n\tif (!isRecord(schema)) return;\n\tif (schema.pattern !== undefined || schema.patternProperties !== undefined) {\n\t\tthrow new Error(\n\t\t\t\"WebMCP input schemas with pattern or patternProperties are unsupported because page-controlled regular expressions cannot be evaluated safely.\",\n\t\t);\n\t}\n\tfor (const keyword of [\n\t\t\"additionalItems\",\n\t\t\"additionalProperties\",\n\t\t\"contains\",\n\t\t\"else\",\n\t\t\"if\",\n\t\t\"items\",\n\t\t\"not\",\n\t\t\"propertyNames\",\n\t\t\"then\",\n\t\t\"unevaluatedItems\",\n\t\t\"unevaluatedProperties\",\n\t] as const) {\n\t\trejectRegexBearingSchema(schema[keyword]);\n\t}\n\tfor (const keyword of [\"allOf\", \"anyOf\", \"oneOf\", \"prefixItems\"] as const) {\n\t\tif (Array.isArray(schema[keyword])) {\n\t\t\tfor (const child of schema[keyword]) rejectRegexBearingSchema(child);\n\t\t}\n\t}\n\tfor (const keyword of [\n\t\t\"$defs\",\n\t\t\"definitions\",\n\t\t\"dependencies\",\n\t\t\"dependentSchemas\",\n\t\t\"properties\",\n\t] as const) {\n\t\tif (!isRecord(schema[keyword])) continue;\n\t\tfor (const child of Object.values(schema[keyword])) rejectRegexBearingSchema(child);\n\t}\n}\n\nfunction rejectExpensiveValidationSchema(schema: unknown) {\n\tlet branches = 0;\n\tconst countBranches = (count: number) => {\n\t\tbranches += count;\n\t\tif (branches > MAX_SCHEMA_VALIDATION_BRANCHES) {\n\t\t\tthrow new Error(\n\t\t\t\t`WebMCP input schema exceeds the validation branch limit of ${MAX_SCHEMA_VALIDATION_BRANCHES}.`,\n\t\t\t);\n\t\t}\n\t};\n\tconst visit = (candidate: unknown): void => {\n\t\tif (Array.isArray(candidate)) {\n\t\t\tfor (const child of candidate) visit(child);\n\t\t\treturn;\n\t\t}\n\t\tif (!isRecord(candidate)) return;\n\t\tfor (const keyword of [\"allOf\", \"anyOf\", \"oneOf\"] as const) {\n\t\t\tconst alternatives = candidate[keyword];\n\t\t\tif (Array.isArray(alternatives)) countBranches(alternatives.length);\n\t\t}\n\t\tfor (const keyword of [\"dependencies\", \"dependentSchemas\"] as const) {\n\t\t\tconst dependencies = candidate[keyword];\n\t\t\tif (!isRecord(dependencies)) continue;\n\t\t\tcountBranches(Object.values(dependencies).filter(isRecord).length);\n\t\t}\n\t\tfor (const child of Object.values(candidate)) visit(child);\n\t};\n\tvisit(schema);\n}\n\ninterface JsonLimits {\n\tlabel: string;\n\tmaxBytes: number;\n\tmaxDepth: number;\n\tmaxNodes: number;\n}\n\nfunction canonicalJsonObject(value: Record<string, unknown>, limits: JsonLimits) {\n\tconst canonical = canonicalJsonValue(value, limits);\n\tif (!isRecord(canonical)) throw new Error(`${limits.label} must be a JSON object.`);\n\treturn canonical;\n}\n\nfunction canonicalJsonValue(value: unknown, limits: JsonLimits) {\n\tlet nodes = 0;\n\tconst visit = (candidate: unknown, depth: number): unknown => {\n\t\tnodes += 1;\n\t\tif (nodes > limits.maxNodes) {\n\t\t\tthrow new Error(`${limits.label} exceeds the ${limits.maxNodes} value limit.`);\n\t\t}\n\t\tif (depth > limits.maxDepth) {\n\t\t\tthrow new Error(`${limits.label} exceeds the depth limit of ${limits.maxDepth}.`);\n\t\t}\n\t\tif (candidate === null || typeof candidate === \"string\" || typeof candidate === \"boolean\") {\n\t\t\treturn candidate;\n\t\t}\n\t\tif (typeof candidate === \"number\") {\n\t\t\tif (!Number.isFinite(candidate))\n\t\t\t\tthrow new Error(`${limits.label} contains a non-finite number.`);\n\t\t\treturn candidate;\n\t\t}\n\t\tif (Array.isArray(candidate)) return candidate.map((entry) => visit(entry, depth + 1));\n\t\tif (isRecord(candidate)) {\n\t\t\treturn Object.fromEntries(\n\t\t\t\tObject.keys(candidate)\n\t\t\t\t\t.sort()\n\t\t\t\t\t.map((key) => [key, visit(candidate[key], depth + 1)]),\n\t\t\t);\n\t\t}\n\t\tthrow new Error(`${limits.label} contains a value that is not JSON-compatible.`);\n\t};\n\tconst canonical = visit(value, 0);\n\tconst serialized = canonicalStringify(canonical);\n\tconst bytes = Buffer.byteLength(serialized, \"utf8\");\n\tif (bytes > limits.maxBytes) {\n\t\tthrow new Error(\n\t\t\t`${limits.label} exceeds ${formatSize(limits.maxBytes)} (${formatSize(bytes)}).`,\n\t\t);\n\t}\n\treturn canonical;\n}\n\nfunction canonicalStringify(value: unknown) {\n\tconst serialized = JSON.stringify(value);\n\tif (serialized === undefined) throw new Error(\"Value is not JSON-compatible.\");\n\treturn serialized;\n}\n\nfunction boundedString(\n\tvalue: string,\n\tlabel: string,\n\tmaxBytes: number,\n\toptions: { nonEmpty?: boolean } = {},\n) {\n\tif (options.nonEmpty && value.length === 0) throw new Error(`WebMCP ${label} must not be empty.`);\n\tconst bytes = Buffer.byteLength(value, \"utf8\");\n\tif (bytes > maxBytes) throw new Error(`WebMCP ${label} exceeds ${formatSize(maxBytes)}.`);\n\treturn value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n", "import { fetchDevToolsJson } from \"../browser-manager.js\";\nimport { CdpClient } from \"../cdp-client.js\";\nimport { DEFAULT_TIMEOUT_MS, type DevToolsPage } from \"../runtime.js\";\n\nexport interface WebMcpProtocolAnnotation {\n\tautosubmit?: boolean;\n\tconsequential?: boolean;\n\treadOnly?: boolean;\n\tuntrustedContent?: boolean;\n}\n\nexport interface WebMcpProtocolTool {\n\tannotations?: WebMcpProtocolAnnotation;\n\tbackendNodeId?: number;\n\tdescription: string;\n\tframeId: string;\n\tinputSchema?: Record<string, unknown>;\n\tname: string;\n\ttitle?: string;\n}\n\nexport interface WebMcpFrame {\n\tid: string;\n\tloaderId: string;\n\tsecurityOrigin?: string;\n\turl: string;\n}\n\nexport interface WebMcpInvocationResponse {\n\terrorText?: string;\n\texception?: unknown;\n\tinvocationId: string;\n\toutput?: unknown;\n\tstatus: \"Canceled\" | \"Completed\" | \"Error\";\n}\n\nexport interface WebMcpIdentityWatch {\n\tdispose(): Promise<void>;\n\tsignal: AbortSignal;\n}\n\ninterface ProtocolDescription {\n\tdomains?: unknown;\n}\n\nconst REQUIRED_COMMANDS = [\"enable\", \"disable\", \"invokeTool\", \"cancelInvocation\"];\nconst REQUIRED_EVENTS = [\"toolsAdded\", \"toolsRemoved\", \"toolInvoked\", \"toolResponded\"];\nconst IDENTITY_WATCH_TIMEOUT_MS = DEFAULT_TIMEOUT_MS * 4;\n\nexport async function requireWebMcpDomain(signal: AbortSignal, owner: object) {\n\tsignal.throwIfAborted();\n\tconst protocol = await fetchDevToolsJson<ProtocolDescription>(\n\t\t\"/json/protocol\",\n\t\t{ signal },\n\t\towner,\n\t);\n\tsignal.throwIfAborted();\n\tconst domain = findDomain(protocol.domains, \"WebMCP\");\n\tif (\n\t\t!domain ||\n\t\t!hasNamedEntries(domain.commands, REQUIRED_COMMANDS) ||\n\t\t!hasNamedEntries(domain.events, REQUIRED_EVENTS)\n\t) {\n\t\tthrow new Error(\n\t\t\t\"This browser does not expose the experimental Chrome DevTools WebMCP domain. Use a compatible Chrome build and enable the website's required Origin Trial or WebMCP testing feature.\",\n\t\t);\n\t}\n}\n\nexport async function connectWebMcpPage(page: DevToolsPage, signal: AbortSignal) {\n\tif (!page.webSocketDebuggerUrl) throw new Error(`Page has no webSocketDebuggerUrl: ${page.id}`);\n\treturn CdpClient.connect(page.webSocketDebuggerUrl, {\n\t\tsignal: withDeadline(signal),\n\t});\n}\n\nexport async function cancelWebMcpInvocation(page: DevToolsPage, invocationId: string) {\n\tconst cleanupSignal = AbortSignal.timeout(1_000);\n\tconst client = await connectWebMcpPage(page, cleanupSignal);\n\ttry {\n\t\tawait client.send(\"WebMCP.cancelInvocation\", { invocationId }, { signal: cleanupSignal });\n\t} finally {\n\t\tclient.close();\n\t}\n}\n\nexport async function enableWebMcpIdentityTracking(client: CdpClient, signal: AbortSignal) {\n\tawait client.send(\"Page.enable\", {}, { signal, timeoutMs: DEFAULT_TIMEOUT_MS });\n}\n\nexport async function enableWebMcp(client: CdpClient, signal: AbortSignal) {\n\tconst eventController = new AbortController();\n\tconst eventSignal = AbortSignal.any([signal, eventController.signal]);\n\tconst toolsAdded = client\n\t\t.waitForEvent(\n\t\t\t\"WebMCP.toolsAdded\",\n\t\t\t(value): value is { tools: WebMcpProtocolTool[] } => {\n\t\t\t\tconst parsed = parseToolsAdded(value);\n\t\t\t\tif (!parsed) throw new Error(\"Chrome sent a malformed WebMCP.toolsAdded event\");\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\t{ signal: eventSignal, timeoutMs: DEFAULT_TIMEOUT_MS },\n\t\t)\n\t\t.then(\n\t\t\t(value) => ({ ok: true as const, value }),\n\t\t\t(error: unknown) => ({ error, ok: false as const }),\n\t\t);\n\ttry {\n\t\tawait client.send(\"WebMCP.enable\", {}, { signal, timeoutMs: DEFAULT_TIMEOUT_MS });\n\t} catch (error) {\n\t\teventController.abort();\n\t\tawait toolsAdded;\n\t\tthrow error;\n\t}\n\ttry {\n\t\tconst result = await toolsAdded;\n\t\tif (!result.ok) throw result.error;\n\t\tconst parsed = parseToolsAdded(result.value);\n\t\tif (!parsed) throw new Error(\"Chrome sent a malformed WebMCP.toolsAdded event\");\n\t\treturn parsed.tools;\n\t} finally {\n\t\teventController.abort();\n\t}\n}\n\nexport async function disableWebMcp(client: CdpClient) {\n\ttry {\n\t\tawait client.send(\"WebMCP.disable\", {}, { timeoutMs: 1_000 });\n\t} catch {\n\t\t// Best-effort cleanup: the target may already be detached or the domain may be unavailable.\n\t}\n}\n\nexport async function readWebMcpFrames(client: CdpClient, signal: AbortSignal) {\n\tconst result = await client.send<unknown>(\n\t\t\"Page.getFrameTree\",\n\t\t{},\n\t\t{\n\t\t\tsignal,\n\t\t\ttimeoutMs: DEFAULT_TIMEOUT_MS,\n\t\t},\n\t);\n\tconst frames = parseFrameTree(result);\n\tif (!frames) throw new Error(\"Chrome sent a malformed Page.getFrameTree response\");\n\treturn frames;\n}\n\nexport function watchWebMcpIdentity(\n\tclient: CdpClient,\n\texpected: { documentId: string; frameId: string; toolName: string },\n\tsignal: AbortSignal,\n): WebMcpIdentityWatch {\n\tconst stopController = new AbortController();\n\tconst staleController = new AbortController();\n\tconst watchSignal = AbortSignal.any([signal, stopController.signal]);\n\tconst options = { signal: watchSignal, timeoutMs: IDENTITY_WATCH_TIMEOUT_MS };\n\tconst settleWatch = (create: () => Promise<unknown>) => {\n\t\tlet watch: Promise<unknown>;\n\t\ttry {\n\t\t\twatch = create();\n\t\t} catch (error) {\n\t\t\twatch = Promise.reject(error);\n\t\t}\n\t\treturn watch.then(\n\t\t\t() => {\n\t\t\t\tif (staleController.signal.aborted) return;\n\t\t\t\tstaleController.abort(\n\t\t\t\t\tnew DOMException(\n\t\t\t\t\t\t\"The selected WebMCP document or tool changed before Chrome completed the invocation boundary.\",\n\t\t\t\t\t\t\"AbortError\",\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\tif (stopController.signal.aborted || signal.aborted || staleController.signal.aborted) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tstaleController.abort(error);\n\t\t\t},\n\t\t);\n\t};\n\tconst settledWatches = [\n\t\tsettleWatch(() =>\n\t\t\tclient.waitForEvent(\n\t\t\t\t\"Page.frameNavigated\",\n\t\t\t\t(value): value is unknown =>\n\t\t\t\t\tframeNavigationChangesIdentity(value, expected.frameId, expected.documentId),\n\t\t\t\toptions,\n\t\t\t),\n\t\t),\n\t\tsettleWatch(() =>\n\t\t\tclient.waitForEvent(\n\t\t\t\t\"WebMCP.toolsAdded\",\n\t\t\t\t(value): value is unknown => toolChangeMatchesIdentity(value, expected),\n\t\t\t\toptions,\n\t\t\t),\n\t\t),\n\t\tsettleWatch(() =>\n\t\t\tclient.waitForEvent(\n\t\t\t\t\"WebMCP.toolsRemoved\",\n\t\t\t\t(value): value is unknown => toolChangeMatchesIdentity(value, expected),\n\t\t\t\toptions,\n\t\t\t),\n\t\t),\n\t];\n\treturn {\n\t\tsignal: AbortSignal.any([signal, staleController.signal]),\n\t\tasync dispose() {\n\t\t\tstopController.abort();\n\t\t\tawait Promise.allSettled(settledWatches);\n\t\t},\n\t};\n}\n\nexport async function invokeWebMcpTool(\n\tclient: CdpClient,\n\trequest: { frameId: string; input: Record<string, unknown>; toolName: string },\n\tsignal: AbortSignal,\n\tfallbackCancel?: (invocationId: string) => Promise<unknown>,\n): Promise<WebMcpInvocationResponse> {\n\tsignal.throwIfAborted();\n\tlet invocationId: string | undefined;\n\tlet cancellation: Promise<unknown> | undefined;\n\tconst cancel = () => {\n\t\tif (!invocationId || cancellation) return;\n\t\tconst invocationToCancel = invocationId;\n\t\tconst recoverCancellation = () =>\n\t\t\tfallbackCancel\n\t\t\t\t? fallbackCancel(invocationToCancel).catch(() => undefined)\n\t\t\t\t: Promise.resolve();\n\t\ttry {\n\t\t\tcancellation = client\n\t\t\t\t.send(\"WebMCP.cancelInvocation\", { invocationId }, { timeoutMs: 1_000 })\n\t\t\t\t.catch(recoverCancellation);\n\t\t} catch {\n\t\t\tcancellation = recoverCancellation();\n\t\t}\n\t};\n\tconst onAbort = () => cancel();\n\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\ttry {\n\t\tlet response: unknown;\n\t\ttry {\n\t\t\tresponse = await client.send<unknown>(\n\t\t\t\t\"WebMCP.invokeTool\",\n\t\t\t\t{ frameId: request.frameId, toolName: request.toolName, input: request.input },\n\t\t\t\t{ timeoutMs: DEFAULT_TIMEOUT_MS },\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (signal.aborted) throw signal.reason;\n\t\t\tthrow error;\n\t\t}\n\t\tinvocationId = parseInvocationId(response);\n\t\tif (!invocationId) throw new Error(\"Chrome sent a malformed WebMCP.invokeTool response\");\n\t\tif (signal.aborted) cancel();\n\t\tlet event: WebMcpInvocationResponse;\n\t\ttry {\n\t\t\tevent = await client.waitForEvent(\n\t\t\t\t\"WebMCP.toolResponded\",\n\t\t\t\t(value): value is WebMcpInvocationResponse => {\n\t\t\t\t\tconst parsed = parseToolResponded(value);\n\t\t\t\t\tif (!parsed) throw new Error(\"Chrome sent a malformed WebMCP.toolResponded event\");\n\t\t\t\t\treturn parsed.invocationId === invocationId;\n\t\t\t\t},\n\t\t\t\t{ timeoutMs: DEFAULT_TIMEOUT_MS },\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tcancel();\n\t\t\tawait cancellation;\n\t\t\tif (signal.aborted) throw signal.reason;\n\t\t\tthrow error;\n\t\t}\n\t\tif (signal.aborted) throw signal.reason;\n\t\treturn event;\n\t} finally {\n\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\tawait cancellation;\n\t}\n}\n\nfunction findDomain(value: unknown, name: string): Record<string, unknown> | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\treturn value.find(\n\t\t(candidate): candidate is Record<string, unknown> =>\n\t\t\tisRecord(candidate) && candidate.domain === name,\n\t);\n}\n\nfunction hasNamedEntries(value: unknown, required: readonly string[]) {\n\tif (!Array.isArray(value)) return false;\n\tconst names = new Set(\n\t\tvalue.flatMap((candidate) =>\n\t\t\tisRecord(candidate) && typeof candidate.name === \"string\" ? [candidate.name] : [],\n\t\t),\n\t);\n\treturn required.every((name) => names.has(name));\n}\n\nfunction parseToolsAdded(value: unknown): { tools: WebMcpProtocolTool[] } | undefined {\n\tif (!isRecord(value) || !Array.isArray(value.tools)) return undefined;\n\tconst tools: WebMcpProtocolTool[] = [];\n\tfor (const candidate of value.tools) {\n\t\tconst tool = parseTool(candidate);\n\t\tif (!tool) return undefined;\n\t\ttools.push(tool);\n\t}\n\treturn { tools };\n}\n\nfunction parseTool(value: unknown): WebMcpProtocolTool | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\ttypeof value.name !== \"string\" ||\n\t\ttypeof value.description !== \"string\" ||\n\t\ttypeof value.frameId !== \"string\" ||\n\t\t(value.inputSchema !== undefined && !isRecord(value.inputSchema)) ||\n\t\t(value.title !== undefined && typeof value.title !== \"string\") ||\n\t\t(value.backendNodeId !== undefined && typeof value.backendNodeId !== \"number\")\n\t) {\n\t\treturn undefined;\n\t}\n\tconst annotations = parseAnnotations(value.annotations);\n\tif (value.annotations !== undefined && !annotations) return undefined;\n\treturn {\n\t\tname: value.name,\n\t\tdescription: value.description,\n\t\tframeId: value.frameId,\n\t\t...(value.title === undefined ? {} : { title: value.title }),\n\t\t...(value.inputSchema === undefined ? {} : { inputSchema: value.inputSchema }),\n\t\t...(annotations ? { annotations } : {}),\n\t\t...(value.backendNodeId === undefined ? {} : { backendNodeId: value.backendNodeId }),\n\t};\n}\n\nfunction parseAnnotations(value: unknown): WebMcpProtocolAnnotation | undefined {\n\tif (value === undefined) return undefined;\n\tif (!isRecord(value)) return undefined;\n\tconst annotations: WebMcpProtocolAnnotation = {};\n\tfor (const key of [\"autosubmit\", \"consequential\", \"readOnly\", \"untrustedContent\"] as const) {\n\t\tif (value[key] === undefined) continue;\n\t\tif (typeof value[key] !== \"boolean\") return undefined;\n\t\tannotations[key] = value[key];\n\t}\n\treturn annotations;\n}\n\nfunction parseFrameTree(value: unknown): WebMcpFrame[] | undefined {\n\tif (!isRecord(value) || !isRecord(value.frameTree)) return undefined;\n\tconst frames: WebMcpFrame[] = [];\n\tconst visit = (tree: unknown): boolean => {\n\t\tif (!isRecord(tree) || !isRecord(tree.frame)) return false;\n\t\tconst frame = tree.frame;\n\t\tif (\n\t\t\ttypeof frame.id !== \"string\" ||\n\t\t\ttypeof frame.loaderId !== \"string\" ||\n\t\t\ttypeof frame.url !== \"string\" ||\n\t\t\t(frame.securityOrigin !== undefined && typeof frame.securityOrigin !== \"string\")\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\tframes.push({\n\t\t\tid: frame.id,\n\t\t\tloaderId: frame.loaderId,\n\t\t\turl: frame.url,\n\t\t\t...(frame.securityOrigin === undefined ? {} : { securityOrigin: frame.securityOrigin }),\n\t\t});\n\t\tif (tree.childFrames === undefined) return true;\n\t\treturn Array.isArray(tree.childFrames) && tree.childFrames.every(visit);\n\t};\n\treturn visit(value.frameTree) ? frames : undefined;\n}\n\nfunction frameNavigationChangesIdentity(value: unknown, frameId: string, documentId: string) {\n\tif (!isRecord(value) || !isRecord(value.frame)) {\n\t\tthrow new Error(\"Chrome sent a malformed Page.frameNavigated event\");\n\t}\n\tif (typeof value.frame.id !== \"string\" || typeof value.frame.loaderId !== \"string\") {\n\t\tthrow new Error(\"Chrome sent a malformed Page.frameNavigated event\");\n\t}\n\treturn value.frame.id === frameId && value.frame.loaderId !== documentId;\n}\n\nfunction toolChangeMatchesIdentity(\n\tvalue: unknown,\n\texpected: { frameId: string; toolName: string },\n) {\n\tif (!isRecord(value) || !Array.isArray(value.tools)) {\n\t\tthrow new Error(\"Chrome sent a malformed WebMCP tool-change event\");\n\t}\n\treturn value.tools.some((tool) => {\n\t\tif (!isRecord(tool) || typeof tool.frameId !== \"string\" || typeof tool.name !== \"string\") {\n\t\t\tthrow new Error(\"Chrome sent a malformed WebMCP tool-change event\");\n\t\t}\n\t\treturn tool.frameId === expected.frameId && tool.name === expected.toolName;\n\t});\n}\n\nfunction parseInvocationId(value: unknown) {\n\treturn isRecord(value) && typeof value.invocationId === \"string\" ? value.invocationId : undefined;\n}\n\nfunction parseToolResponded(value: unknown): WebMcpInvocationResponse | undefined {\n\tif (\n\t\t!isRecord(value) ||\n\t\ttypeof value.invocationId !== \"string\" ||\n\t\t!([\"Canceled\", \"Completed\", \"Error\"] as const).includes(value.status as never) ||\n\t\t(value.errorText !== undefined && typeof value.errorText !== \"string\")\n\t) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tinvocationId: value.invocationId,\n\t\tstatus: value.status as WebMcpInvocationResponse[\"status\"],\n\t\t...(value.output === undefined ? {} : { output: value.output }),\n\t\t...(value.errorText === undefined ? {} : { errorText: value.errorText }),\n\t\t...(value.exception === undefined ? {} : { exception: value.exception }),\n\t};\n}\n\nfunction withDeadline(signal: AbortSignal) {\n\treturn AbortSignal.any([signal, AbortSignal.timeout(DEFAULT_TIMEOUT_MS)]);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n", "import { getPage } from \"../cdp-client.js\";\nimport { type DevToolsPage, webMcpOperationIsCurrent } from \"../runtime.js\";\nimport {\n\tMAX_WEBMCP_TOOLS,\n\tnormalizeWebMcpOutput,\n\tnormalizeWebMcpTool,\n\trequireMatchingWebMcpTool,\n\ttype WebMcpToolDescriptor,\n\ttype WebMcpToolIdentity,\n\twebMcpErrorMessage,\n} from \"./policy.js\";\nimport {\n\tcancelWebMcpInvocation,\n\tconnectWebMcpPage,\n\tdisableWebMcp,\n\tenableWebMcp,\n\tenableWebMcpIdentityTracking,\n\tinvokeWebMcpTool,\n\treadWebMcpFrames,\n\trequireWebMcpDomain,\n\ttype WebMcpFrame,\n\ttype WebMcpProtocolTool,\n\twatchWebMcpIdentity,\n} from \"./protocol.js\";\n\nexport interface WebMcpOperationIdentity {\n\towner: object;\n\tsessionGeneration: number;\n\tsignal: AbortSignal;\n\twebMcpGeneration: number;\n}\n\nexport interface WebMcpInvocationResult {\n\tinvocationId: string;\n\toutput: unknown;\n\ttool: WebMcpToolDescriptor;\n}\n\nexport async function discoverWebMcpTools(page: DevToolsPage, operation: WebMcpOperationIdentity) {\n\tassertOperationCurrent(operation);\n\tawait requireWebMcpDomain(operation.signal, operation.owner);\n\tassertOperationCurrent(operation);\n\tconst client = await connectWebMcpPage(page, operation.signal);\n\ttry {\n\t\tconst tools = await readInventory(client, page, operation);\n\t\tawait requireStablePage(client, page, tools, operation);\n\t\treturn tools;\n\t} finally {\n\t\tawait disableWebMcp(client);\n\t\tclient.close();\n\t}\n}\n\nexport async function invokeDiscoveredWebMcpTool(\n\tpage: DevToolsPage,\n\texpected: WebMcpToolIdentity,\n\tinput: Record<string, unknown>,\n\toperation: WebMcpOperationIdentity,\n): Promise<WebMcpInvocationResult> {\n\tassertOperationCurrent(operation);\n\tawait requireWebMcpDomain(operation.signal, operation.owner);\n\tassertOperationCurrent(operation);\n\tconst client = await connectWebMcpPage(page, operation.signal);\n\ttry {\n\t\tawait enableWebMcpIdentityTracking(client, operation.signal);\n\t\tassertOperationCurrent(operation);\n\t\tconst tools = await readInventory(client, page, operation);\n\t\tconst tool = requireMatchingWebMcpTool(tools, expected);\n\t\tconst identityWatch = watchWebMcpIdentity(\n\t\t\tclient,\n\t\t\t{ documentId: tool.documentId, frameId: tool.frameId, toolName: tool.name },\n\t\t\toperation.signal,\n\t\t);\n\t\tconst guardedOperation = { ...operation, signal: identityWatch.signal };\n\t\ttry {\n\t\t\tawait requireStablePage(client, page, [tool], guardedOperation);\n\t\t\tassertOperationCurrent(guardedOperation);\n\t\t\tconst response = await invokeWebMcpTool(\n\t\t\t\tclient,\n\t\t\t\t{ frameId: tool.frameId, toolName: tool.name, input },\n\t\t\t\tguardedOperation.signal,\n\t\t\t\t(invocationId) => cancelWebMcpInvocation(page, invocationId),\n\t\t\t);\n\t\t\tassertOperationCurrent(guardedOperation);\n\t\t\tif (response.status === \"Canceled\") {\n\t\t\t\tthrow new DOMException(\"Chrome canceled the WebMCP tool invocation.\", \"AbortError\");\n\t\t\t}\n\t\t\tif (response.status === \"Error\") {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`WebMCP tool failed: ${webMcpErrorMessage(response.errorText ?? remoteExceptionText(response.exception))}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tinvocationId: response.invocationId,\n\t\t\t\toutput: normalizeWebMcpOutput(response.output ?? null),\n\t\t\t\ttool,\n\t\t\t};\n\t\t} finally {\n\t\t\tawait identityWatch.dispose();\n\t\t}\n\t} finally {\n\t\tawait disableWebMcp(client);\n\t\tclient.close();\n\t}\n}\n\nasync function readInventory(\n\tclient: Awaited<ReturnType<typeof connectWebMcpPage>>,\n\tpage: DevToolsPage,\n\toperation: WebMcpOperationIdentity,\n) {\n\tconst framesBefore = await readWebMcpFrames(client, operation.signal);\n\tassertOperationCurrent(operation);\n\tconst protocolTools = await enableWebMcp(client, operation.signal);\n\tassertOperationCurrent(operation);\n\tif (protocolTools.length > MAX_WEBMCP_TOOLS) {\n\t\tthrow new Error(`WebMCP page exposes more than ${MAX_WEBMCP_TOOLS} tools.`);\n\t}\n\tconst framesAfter = await readWebMcpFrames(client, operation.signal);\n\tassertOperationCurrent(operation);\n\trequireStableInventoryDocuments(protocolTools, framesBefore, framesAfter);\n\treturn normalizeInventory(protocolTools, framesAfter, page, operation);\n}\n\nfunction requireStableInventoryDocuments(\n\ttools: readonly WebMcpProtocolTool[],\n\tbefore: readonly WebMcpFrame[],\n\tafter: readonly WebMcpFrame[],\n) {\n\tconst beforeLoaders = new Map(before.map((frame) => [frame.id, frame.loaderId]));\n\tconst afterLoaders = new Map(after.map((frame) => [frame.id, frame.loaderId]));\n\tfor (const frameId of new Set(tools.map((tool) => tool.frameId))) {\n\t\tconst beforeLoader = beforeLoaders.get(frameId);\n\t\tconst afterLoader = afterLoaders.get(frameId);\n\t\tif (!beforeLoader || !afterLoader || beforeLoader !== afterLoader) {\n\t\t\tthrow new Error(\n\t\t\t\t\"A WebMCP frame document changed while Chrome was publishing its tool inventory.\",\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction normalizeInventory(\n\tprotocolTools: readonly WebMcpProtocolTool[],\n\tframes: readonly WebMcpFrame[],\n\tpage: DevToolsPage,\n\toperation: WebMcpOperationIdentity,\n) {\n\tconst frameDocuments = new Map(\n\t\tframes.map((frame) => [frame.id, { documentId: frame.loaderId, origin: frameOrigin(frame) }]),\n\t);\n\tconst tools = protocolTools.map((tool) => {\n\t\tconst frame = frameDocuments.get(tool.frameId);\n\t\tif (!frame) {\n\t\t\tthrow new Error(`WebMCP tool ${webMcpErrorMessage(tool.name)} belongs to an unknown frame.`);\n\t\t}\n\t\treturn normalizeWebMcpTool(tool, {\n\t\t\tdocumentId: frame.documentId,\n\t\t\tframeOrigin: frame.origin,\n\t\t\tpageId: page.id,\n\t\t\tpageUrl: page.url,\n\t\t\tsessionGeneration: generationToken(operation),\n\t\t});\n\t});\n\tconst identities = new Set<string>();\n\tfor (const tool of tools) {\n\t\tconst key = `${tool.frameId}\\u0000${tool.name}`;\n\t\tif (identities.has(key)) {\n\t\t\tthrow new Error(\n\t\t\t\t`WebMCP tool identity is duplicated: ${webMcpErrorMessage(tool.name)} in frame ${webMcpErrorMessage(tool.frameId)}.`,\n\t\t\t);\n\t\t}\n\t\tidentities.add(key);\n\t}\n\treturn tools;\n}\n\nasync function requireStablePage(\n\tclient: Awaited<ReturnType<typeof connectWebMcpPage>>,\n\tpage: DevToolsPage,\n\ttools: readonly WebMcpToolDescriptor[],\n\toperation: WebMcpOperationIdentity,\n) {\n\tconst current = await getPage(page.id, {\n\t\tsessionOwner: operation.owner,\n\t\tsignal: operation.signal,\n\t});\n\tassertOperationCurrent(operation);\n\tif (\n\t\tcurrent.url !== page.url ||\n\t\tcurrent.webSocketDebuggerUrl !== page.webSocketDebuggerUrl ||\n\t\tcurrent.type !== page.type\n\t) {\n\t\tthrow new Error(\"The Chrome page navigated or was replaced during the WebMCP operation.\");\n\t}\n\tconst finalFrames = await readWebMcpFrames(client, operation.signal);\n\tassertOperationCurrent(operation);\n\tconst finalDocuments = new Map(finalFrames.map((frame) => [frame.id, frame.loaderId]));\n\tfor (const tool of tools) {\n\t\tif (finalDocuments.get(tool.frameId) !== tool.documentId) {\n\t\t\tthrow new Error(\"A WebMCP frame document changed during the final page identity check.\");\n\t\t}\n\t}\n}\n\nfunction assertOperationCurrent(operation: WebMcpOperationIdentity) {\n\toperation.signal.throwIfAborted();\n\tif (!webMcpOperationIsCurrent(operation)) {\n\t\tthrow new DOMException(\"The WebMCP operation became stale.\", \"AbortError\");\n\t}\n}\n\nfunction generationToken(operation: WebMcpOperationIdentity) {\n\treturn `${operation.sessionGeneration}:${operation.webMcpGeneration}`;\n}\n\nfunction frameOrigin(frame: WebMcpFrame) {\n\tif (frame.securityOrigin && frame.securityOrigin !== \"://\") return frame.securityOrigin;\n\ttry {\n\t\treturn new URL(frame.url).origin;\n\t} catch {\n\t\tthrow new Error(\n\t\t\t`Chrome returned an invalid WebMCP frame URL: ${webMcpErrorMessage(frame.url)}`,\n\t\t);\n\t}\n}\n\nfunction remoteExceptionText(value: unknown) {\n\tif (typeof value === \"object\" && value !== null) {\n\t\tconst exception = value as { description?: unknown; value?: unknown };\n\t\tif (typeof exception.description === \"string\") return exception.description;\n\t\tif (typeof exception.value === \"string\") return exception.value;\n\t}\n\treturn \"The page reported an unknown tool error.\";\n}\n", "import type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { managedBrowserForOwner } from \"../browser-manager.js\";\nimport { getPage, resolvePage, textResult } from \"../cdp-client.js\";\nimport {\n\tbeginWebMcpOperation,\n\tcurrentWebMcpGeneration,\n\twebMcpEnabled,\n\twebMcpOperationIsCurrent,\n\twebMcpSessionSignal,\n} from \"../runtime.js\";\nimport { discoverWebMcpTools, invokeDiscoveredWebMcpTool } from \"./discovery.js\";\nimport {\n\tboundedWebMcpDiscovery,\n\tboundedWebMcpJson,\n\tnormalizeWebMcpInput,\n\trequireMatchingWebMcpTool,\n\tsanitizeWebMcpDisplay,\n\tvalidateWebMcpInput,\n\ttype WebMcpToolIdentity,\n\twebMcpConfirmationMessage,\n\twebMcpErrorMessage,\n\twebMcpIdentity,\n} from \"./policy.js\";\n\ninterface ListInput {\n\tpageId?: string;\n}\n\ninterface CallInput extends Omit<WebMcpToolIdentity, \"name\"> {\n\tinput: Record<string, unknown>;\n\ttoolName: string;\n}\n\nexport async function executeWebMcpListTool(\n\tparams: ListInput,\n\ttoolSignal: AbortSignal | undefined,\n\tctx: ExtensionContext,\n) {\n\ttry {\n\t\trequireWebMcpEnabled(ctx.sessionManager);\n\t\tconst preflightGeneration = currentWebMcpGeneration(ctx.sessionManager);\n\t\tconst preflightSignal = combinedSignal(ctx.sessionManager, toolSignal);\n\t\tpreflightSignal.throwIfAborted();\n\t\tconst page = await resolvePage(params.pageId, {\n\t\t\tsessionOwner: ctx.sessionManager,\n\t\t\tsignal: preflightSignal,\n\t\t});\n\t\tpreflightSignal.throwIfAborted();\n\t\trequireCurrentPreflight(ctx.sessionManager, preflightGeneration);\n\t\tconst operation = beginWebMcpOperation(ctx.sessionManager, toolSignal);\n\t\ttry {\n\t\t\tconst tools = await discoverWebMcpTools(page, operation);\n\t\t\tassertCurrent(operation);\n\t\t\tconst published = boundedWebMcpDiscovery(\n\t\t\t\t{ id: page.id, title: page.title, url: page.url },\n\t\t\t\ttools,\n\t\t\t);\n\t\t\treturn textResult(published.text, {\n\t\t\t\tpage: { id: page.id, url: page.url },\n\t\t\t\ttoolCount: tools.length,\n\t\t\t\tpublishedToolCount: published.included.length,\n\t\t\t\ttruncated: published.truncated,\n\t\t\t\tidentities: published.included.map(webMcpIdentity),\n\t\t\t});\n\t\t} finally {\n\t\t\toperation.dispose();\n\t\t}\n\t} catch (error) {\n\t\tthrow safeToolError(error);\n\t}\n}\n\nexport async function executeWebMcpCallTool(\n\tparams: CallInput,\n\ttoolSignal: AbortSignal | undefined,\n\tctx: ExtensionContext,\n) {\n\ttry {\n\t\trequireWebMcpEnabled(ctx.sessionManager);\n\t\tif (!ctx.hasUI || (ctx.mode !== \"tui\" && ctx.mode !== \"rpc\")) {\n\t\t\tthrow new Error(\n\t\t\t\t\"chrome_devtools_webmcp_call_tool requires observable confirmation in TUI or RPC mode and is unavailable in print or JSON mode.\",\n\t\t\t);\n\t\t}\n\t\tconst input = normalizeWebMcpInput(params.input);\n\t\tconst expected = expectedIdentity(params);\n\t\tconst preflightGeneration = currentWebMcpGeneration(ctx.sessionManager);\n\t\tconst preflightSignal = combinedSignal(ctx.sessionManager, toolSignal);\n\t\tpreflightSignal.throwIfAborted();\n\t\tconst page = await getPage(params.pageId, {\n\t\t\tsessionOwner: ctx.sessionManager,\n\t\t\tsignal: preflightSignal,\n\t\t});\n\t\tpreflightSignal.throwIfAborted();\n\t\trequireCurrentPreflight(ctx.sessionManager, preflightGeneration);\n\t\tconst operation = beginWebMcpOperation(ctx.sessionManager, toolSignal);\n\t\ttry {\n\t\t\tconst discovered = await discoverWebMcpTools(page, operation);\n\t\t\tconst current = requireMatchingWebMcpTool(discovered, expected);\n\t\t\tconst validatedInput = validateWebMcpInput(current.inputSchema, input);\n\t\t\tassertCurrent(operation);\n\t\t\tconst confirmed = await ctx.ui.confirm(\n\t\t\t\t`Allow WebMCP tool: ${sanitizeWebMcpDisplay(current.name, 256)}`,\n\t\t\t\twebMcpConfirmationMessage(current, validatedInput, usesManagedProfile(ctx.sessionManager)),\n\t\t\t\t{ signal: operation.signal },\n\t\t\t);\n\t\t\tassertCurrent(operation);\n\t\t\tif (!confirmed) {\n\t\t\t\tthrow new DOMException(\"WebMCP tool call cancelled by the user.\", \"AbortError\");\n\t\t\t}\n\t\t\tconst invocation = await invokeDiscoveredWebMcpTool(\n\t\t\t\tpage,\n\t\t\t\texpected,\n\t\t\t\tvalidatedInput,\n\t\t\t\toperation,\n\t\t\t);\n\t\t\tassertCurrent(operation);\n\t\t\tconst published = boundedWebMcpJson({\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttool: webMcpIdentity(invocation.tool),\n\t\t\t\toutput: invocation.output,\n\t\t\t});\n\t\t\treturn textResult(published.text, {\n\t\t\t\tinvocationId: invocation.invocationId,\n\t\t\t\ttool: webMcpIdentity(invocation.tool),\n\t\t\t\ttruncated: published.truncated,\n\t\t\t\toutput: published.text,\n\t\t\t});\n\t\t} finally {\n\t\t\toperation.dispose();\n\t\t}\n\t} catch (error) {\n\t\tthrow safeToolError(error);\n\t}\n}\n\nfunction requireWebMcpEnabled(owner: object) {\n\tif (!webMcpEnabled(owner)) {\n\t\tthrow new Error(\n\t\t\t\"WebMCP is disabled. Enable the experimental user setting in /chrome-devtools settings, then make the WebMCP gateway tools available.\",\n\t\t);\n\t}\n}\n\nfunction combinedSignal(owner: object, toolSignal: AbortSignal | undefined) {\n\tconst sessionSignal = webMcpSessionSignal(owner);\n\treturn toolSignal ? AbortSignal.any([toolSignal, sessionSignal]) : sessionSignal;\n}\n\nfunction requireCurrentPreflight(owner: object, generation: number) {\n\trequireWebMcpEnabled(owner);\n\tif (generation !== currentWebMcpGeneration(owner)) {\n\t\tthrow new DOMException(\n\t\t\t\"The WebMCP operation became stale during page resolution.\",\n\t\t\t\"AbortError\",\n\t\t);\n\t}\n}\n\nfunction expectedIdentity(params: CallInput): WebMcpToolIdentity {\n\treturn {\n\t\tsessionGeneration: params.sessionGeneration,\n\t\tpageId: params.pageId,\n\t\tdocumentId: params.documentId,\n\t\tframeId: params.frameId,\n\t\tframeOrigin: params.frameOrigin,\n\t\tname: params.toolName,\n\t\tschemaDigest: params.schemaDigest,\n\t};\n}\n\nfunction assertCurrent(operation: ReturnType<typeof beginWebMcpOperation>) {\n\toperation.signal.throwIfAborted();\n\tif (!webMcpOperationIsCurrent(operation)) {\n\t\tthrow new DOMException(\"The WebMCP operation became stale.\", \"AbortError\");\n\t}\n}\n\nfunction usesManagedProfile(owner: object) {\n\tconst managedBrowser = managedBrowserForOwner(owner);\n\treturn Boolean(managedBrowser?.ready && !managedBrowser.exited);\n}\n\nfunction safeToolError(error: unknown) {\n\tconst message = webMcpErrorMessage(error);\n\tif (error instanceof DOMException && error.name === \"AbortError\") {\n\t\treturn new DOMException(message, \"AbortError\");\n\t}\n\treturn new Error(message);\n}\n"],
5
- "mappings": "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",
6
- "names": ["frameOrigin", "publication", "isRecord"]
7
- }