@narumitw/pi-chrome-devtools 0.52.0 → 0.52.2

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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/tool-names.ts", "../../src/settings.ts", "../../src/runtime.ts", "../../src/browser-manager.ts", "../../src/lazy-tools.ts", "../../src/tool-selector.ts"],
4
+ "sourcesContent": ["export const 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 type ChromeDevToolsToolName = (typeof CHROME_DEVTOOLS_TOOL_NAMES)[number];\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}\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\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}\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\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\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};\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 = projectMachineSettingsWarnings(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 projectMachineSettingsWarnings(\n\tdocument: Record<string, unknown>,\n\tscope: \"project\" | \"user\",\n\tfilePath: string,\n) {\n\tif (scope !== \"project\" || !isRecord(document.browser)) return [];\n\tconst browser = document.browser;\n\treturn [\"endpoint\", \"autoLaunch\", \"executablePath\"]\n\t\t.filter((field) => browser[field] !== undefined)\n\t\t.map(\n\t\t\t(field) =>\n\t\t\t\t`Chrome DevTools project browser.${field} ignored in ${filePath}; configure this machine-owned setting in ${settingsFilePath()}.`,\n\t\t);\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\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 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\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\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\tDEFAULT_ENDPOINT_RETRY_MS,\n\tDEFAULT_ENDPOINT_WAIT_MS,\n\tDEFAULT_HTTP_TIMEOUT_MS,\n\tDEVTOOLS_ACTIVE_PORT_FILE,\n\ttype DevToolsPage,\n\tMANAGED_BROWSER_PROFILE_PREFIX,\n\ttype ManagedBrowser,\n\tstate,\n} from \"./runtime.js\";\n\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\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(waitMs = DEFAULT_ENDPOINT_WAIT_MS) {\n\tif (extensionsConfigured()) {\n\t\tvalidateExtensionLaunchMode();\n\t\tawait ensureManagedBrowserLaunched(waitMs);\n\t\treturn;\n\t}\n\tif (canAutoLaunchBrowser()) {\n\t\ttry {\n\t\t\tawait withEndpointRetry(() => fetchDevToolsJson<unknown>(\"/json/version\"), waitMs);\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tif (shouldAutoLaunchAfterEndpointError(error)) {\n\t\t\t\tawait ensureManagedBrowserLaunched(waitMs);\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\");\n\t} catch (error) {\n\t\tif (isRetryableEndpointError(error)) return;\n\t\tthrow error;\n\t}\n}\n\nfunction validateExtensionLaunchMode() {\n\tif (!isLocalDevToolsHost(state.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 (!state.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 (!state.browserExecutable) {\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(waitMs: number) {\n\tif (state.launchPromise) return state.launchPromise;\n\tif (state.managedBrowser && !state.managedBrowser.exited && state.managedBrowser.ready) return;\n\tconst generation = state.sessionGeneration;\n\tconst signal = state.sessionController.signal;\n\tthrowIfBrowserLaunchCancelled(generation, signal);\n\n\tconst launchPromise = prepareManagedBrowserLaunch(waitMs, generation, signal);\n\tconst wrappedPromise = launchPromise.finally(() => {\n\t\tif (state.launchPromise === wrappedPromise) state.launchPromise = undefined;\n\t});\n\tstate.launchPromise = wrappedPromise;\n\treturn wrappedPromise;\n}\n\nasync function prepareManagedBrowserLaunch(\n\twaitMs: number,\n\tgeneration: number,\n\tsignal: AbortSignal,\n) {\n\tif (state.managedBrowser) {\n\t\tawait shutdownManagedBrowser(state.managedBrowser, { awaitLaunch: false });\n\t\tthrowIfBrowserLaunchCancelled(generation, signal);\n\t}\n\tif (state.portConfigured) {\n\t\tconst available = await browserManagerOperations.isPortAvailable(state.host, state.port);\n\t\tthrowIfBrowserLaunchCancelled(generation, signal);\n\t\tif (!available) {\n\t\t\tthrow new DevToolsEndpointError(\n\t\t\t\t`Cannot launch the extension-owned browser because explicit port ${state.port} 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);\n}\n\nasync function launchManagedBrowser(waitMs: number, generation: number, signal: AbortSignal) {\n\tthrowIfBrowserLaunchCancelled(generation, signal);\n\tconst candidateDefinitions = browserCandidateDefinitions();\n\tconst candidates = await resolveBrowserCandidates(candidateDefinitions, generation, signal);\n\tthrowIfBrowserLaunchCancelled(generation, signal);\n\tstate.lastLaunchAttempt = {\n\t\tcandidateLabels: candidateDefinitions.map(formatBrowserCandidateDefinition),\n\t\tmode: state.portConfigured ? \"explicit-port\" : \"dynamic-port\",\n\t};\n\n\tif (candidates.length === 0) {\n\t\tthrow new DevToolsEndpointError(noBrowserCandidateMessage(candidateDefinitions));\n\t}\n\n\tlet lastError: unknown;\n\tfor (const candidate of candidates) {\n\t\tthrowIfBrowserLaunchCancelled(generation, signal);\n\t\ttry {\n\t\t\tif (extensionsConfigured())\n\t\t\t\tawait requireSupportedExtensionBrowser(candidate, generation, signal);\n\t\t\tawait launchBrowserCandidate(candidate, waitMs, generation, signal);\n\t\t\tthrowIfBrowserLaunchCancelled(generation, signal);\n\t\t\tstate.lastLaunchAttempt = {\n\t\t\t\t...state.lastLaunchAttempt,\n\t\t\t\tselectedCandidate: formatBrowserCandidate(candidate),\n\t\t\t\tuserDataDir: state.managedBrowser?.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);\n\t\t\t} catch (cancellation) {\n\t\t\t\tstate.lastLaunchAttempt = {\n\t\t\t\t\t...state.lastLaunchAttempt,\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\tstate.lastLaunchAttempt = {\n\t\t\t\t...state.lastLaunchAttempt,\n\t\t\t\tlastError: formatError(error),\n\t\t\t};\n\t\t}\n\t}\n\n\tif (lastError instanceof DevToolsEndpointError && extensionsConfigured()) 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(),\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) {\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);\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);\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) {\n\tthrowIfBrowserLaunchCancelled(generation, signal);\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);\n\t\tconst portArgument = state.portConfigured ? String(state.port) : \"0\";\n\t\tconst args = buildManagedBrowserLaunchArguments(\n\t\t\tuserDataDir,\n\t\t\tportArgument,\n\t\t\tstate.extensionPaths,\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};\n\t\tmanagedBrowser = launchedBrowser;\n\t\tstate.managedBrowser = launchedBrowser;\n\n\t\tchild.once(\"exit\", () => {\n\t\t\tlaunchedBrowser.exited = true;\n\t\t\tlaunchedBrowser.ready = false;\n\t\t\tif (!state.portConfigured && launchedBrowser.port === state.port) {\n\t\t\t\tstate.port = state.configuredPort;\n\t\t\t}\n\t\t});\n\n\t\tawait waitForBrowserSpawn(child);\n\t\tthrowIfBrowserLaunchCancelled(generation, signal);\n\t\tif (state.portConfigured) {\n\t\t\tlaunchedBrowser.port = state.port;\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);\n\t\t\tthrowIfBrowserLaunchCancelled(generation, signal);\n\t\t\tstate.port = launchedBrowser.port;\n\t\t}\n\t\tawait waitForDevToolsEndpoint(waitMs, launchedBrowser, generation, signal);\n\t\tthrowIfBrowserLaunchCancelled(generation, signal);\n\t\tlaunchedBrowser.ready = true;\n\t} catch (error) {\n\t\tif (managedBrowser) await shutdownManagedBrowser(managedBrowser, { awaitLaunch: false });\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) {\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);\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(),\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) {\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 });\n\t\t\tthrowIfBrowserLaunchCancelled(generation, signal);\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);\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()}.`,\n\t\t\t\t\tlaunchHint(),\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) {\n\tif (!state.shuttingDown && generation === state.sessionGeneration && !signal.aborted) {\n\t\treturn;\n\t}\n\tthrow new DevToolsEndpointError(\n\t\tgeneration === state.sessionGeneration\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 = state.managedBrowser,\n\toptions: { awaitLaunch?: boolean; cancelLaunch?: boolean } = {},\n) {\n\tif (options.cancelLaunch) state.shuttingDown = true;\n\tif (options.awaitLaunch !== false) {\n\t\tawait state.launchPromise?.catch(() => undefined);\n\t\tmanagedBrowser = managedBrowser ?? state.managedBrowser;\n\t}\n\tif (!managedBrowser) return;\n\tif (managedBrowser.cleanupPromise) return managedBrowser.cleanupPromise;\n\n\tconst cleanup = cleanupManagedBrowser(managedBrowser);\n\tmanagedBrowser.cleanupPromise = cleanup;\n\treturn cleanup;\n}\n\nasync function cleanupManagedBrowser(managedBrowser: ManagedBrowser) {\n\tif (state.managedBrowser === managedBrowser) state.managedBrowser = undefined;\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 (!state.portConfigured && managedBrowser.port === state.port) {\n\t\tstate.port = state.configuredPort;\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) {\n\tconst url = `${devToolsEndpoint()}${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), {\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>(operation: () => Promise<T>, waitMs: number) {\n\tconst deadline = Date.now() + waitMs;\n\twhile (true) {\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(Math.min(DEFAULT_ENDPOINT_RETRY_MS, remainingMs));\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) {\n\tif (!canAutoLaunchBrowser()) 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 !state.portConfigured && error instanceof DevToolsEndpointError;\n}\n\nfunction canAutoLaunchBrowser() {\n\treturn state.autoLaunchEnabled && isLocalDevToolsHost(state.host);\n}\n\nfunction extensionsConfigured() {\n\treturn state.extensionPaths.length > 0;\n}\n\nfunction endpointConnectionErrorMessage(error: unknown) {\n\tconst reason = isTimeoutError(error) ? \"request timed out\" : \"connection failed\";\n\treturn [\n\t\t`Cannot connect to Chrome DevTools endpoint at ${devToolsEndpoint()} (${reason}).`,\n\t\tlaunchHint(),\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() {\n\treturn `http://${formatHostForUrl(state.host)}:${state.port}`;\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() {\n\treturn state.endpointSource;\n}\n\nexport type BrowserLifecycleState = \"starting\" | \"running\" | \"exited\" | \"failed\" | \"unobserved\";\n\nexport function browserLifecycleState(): BrowserLifecycleState {\n\tif (state.launchPromise) return \"starting\";\n\tif (state.managedBrowser?.exited) return \"exited\";\n\tif (state.managedBrowser?.ready) return \"running\";\n\tif (state.lastLaunchAttempt?.lastError) return \"failed\";\n\treturn \"unobserved\";\n}\n\nexport function launchModeLabel() {\n\tif (extensionsConfigured()) {\n\t\tif (!isLocalDevToolsHost(state.host)) return \"invalid; extensions require a local endpoint\";\n\t\tif (!state.autoLaunchEnabled) return \"invalid; extensions require auto-launch\";\n\t\tif (state.managedBrowser && !state.managedBrowser.exited) {\n\t\t\treturn state.portConfigured\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 state.portConfigured\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(state.host)) return \"manual remote endpoint\";\n\tif (!state.autoLaunchEnabled) return \"manual; auto-launch disabled\";\n\tif (state.managedBrowser && !state.managedBrowser.exited) {\n\t\treturn state.portConfigured\n\t\t\t? \"auto-launched on explicit port\"\n\t\t\t: \"auto-launched on dynamic port\";\n\t}\n\treturn state.portConfigured\n\t\t? \"attach first; auto-launch explicit port\"\n\t\t: \"attach first; auto-launch dynamic port\";\n}\n\nexport function launchAttemptLines() {\n\tif (!state.lastLaunchAttempt) return [];\n\n\tconst lines = [`Last launch attempt: ${state.lastLaunchAttempt.mode}`];\n\tif (state.lastLaunchAttempt.selectedCandidate) {\n\t\tlines.push(`Launched browser: ${state.lastLaunchAttempt.selectedCandidate}`);\n\t} else {\n\t\tlines.push(`Tried browser candidates: ${state.lastLaunchAttempt.candidateLabels.join(\", \")}`);\n\t}\n\tif (state.lastLaunchAttempt.userDataDir) {\n\t\tlines.push(`Managed browser profile: ${state.lastLaunchAttempt.userDataDir}`);\n\t}\n\tif (state.lastLaunchAttempt.lastError) {\n\t\tlines.push(`Last launch error: ${state.lastLaunchAttempt.lastError}`);\n\t}\n\treturn lines;\n}\n\nexport function launchHint() {\n\tif (extensionsConfigured()) {\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(state.host)) {\n\t\treturn `Remote/non-local endpoints are not auto-launched. Start a browser with CDP enabled at ${devToolsEndpoint()}.`;\n\t}\n\tif (!state.autoLaunchEnabled) {\n\t\treturn `Auto-launch is disabled. Start a browser manually: ${chromeLaunchCommand()}`;\n\t}\n\tconst managedMode = state.portConfigured ? `port ${state.port}` : \"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()}`;\n}\n\nexport function browserCandidateHint() {\n\tif (extensionsConfigured()) {\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()\n\t\t.map((candidate) => candidate.label)\n\t\t.join(\", \")}`;\n}\n\nexport function chromeLaunchCommand() {\n\tconst executable = state.browserExecutable ?? defaultManualBrowserExecutable();\n\tconst dataDir =\n\t\tprocess.platform === \"win32\" ? \"%TEMP%\\\\pi-chrome-devtools\" : \"/tmp/pi-chrome-devtools\";\n\treturn `${quoteCommandPart(executable)} --remote-debugging-port=${state.port} --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(): BrowserCandidateDefinition[] {\n\tconst explicitCandidate = explicitBrowserCandidateDefinition();\n\tif (explicitCandidate.length > 0) return explicitCandidate;\n\n\treturn uniqueBrowserCandidates(platformBrowserCandidateDefinitions());\n}\n\nfunction explicitBrowserCandidateDefinition(): BrowserCandidateDefinition[] {\n\tif (!state.browserExecutable) return [];\n\treturn [\n\t\t{\n\t\t\tlabel:\n\t\t\t\tstate.browserExecutableSource === \"environment\"\n\t\t\t\t\t? \"PI_CHROME_DEVTOOLS_BROWSER\"\n\t\t\t\t\t: \"browser.executablePath\",\n\t\t\texecutable: state.browserExecutable,\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) {\n\tconst candidates: BrowserCandidate[] = [];\n\tfor (const definition of definitions) {\n\t\tconst resolvedExecutable = await resolveBrowserExecutable(definition.executable);\n\t\tthrowIfBrowserLaunchCancelled(generation, signal);\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(candidateDefinitions: BrowserCandidateDefinition[]) {\n\tif (extensionsConfigured()) {\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", "import { defineTool, type ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { Type } from \"typebox\";\nimport { CHROME_DEVTOOLS_TOOL_NAMES, type ChromeDevToolsToolName } from \"./tool-names.js\";\n\nexport const CHROME_DEVTOOLS_LOAD_TOOL_NAME = \"chrome_devtools_load\";\n\nconst AVAILABLE_TOOLS_STORE = Symbol.for(\"@narumitw/pi-chrome-devtools.available-tools-store\");\ntype ChromeDevtoolsGlobal = typeof globalThis & {\n\t[AVAILABLE_TOOLS_STORE]?: WeakMap<ExtensionAPI, Set<ChromeDevToolsToolName>>;\n};\nconst sharedGlobal = globalThis as ChromeDevtoolsGlobal;\nconst existingAvailableToolsStore = sharedGlobal[AVAILABLE_TOOLS_STORE];\nconst availableToolsByApi =\n\texistingAvailableToolsStore ?? new WeakMap<ExtensionAPI, Set<ChromeDevToolsToolName>>();\nif (!existingAvailableToolsStore) sharedGlobal[AVAILABLE_TOOLS_STORE] = availableToolsByApi;\n\nconst SEARCH_TEXT: Record<ChromeDevToolsToolName, string> = {\n\tchrome_devtools_list_pages: \"list open inspectable chrome browser pages tabs targets\",\n\tchrome_devtools_select_page: \"select choose active chrome browser page tab target\",\n\tchrome_devtools_navigate: \"navigate open create chrome browser page url website\",\n\tchrome_devtools_evaluate: \"evaluate run javascript expression dom inspect chrome browser page\",\n\tchrome_devtools_screenshot: \"capture screenshot png image visual chrome browser page\",\n};\n\nexport function initializeAvailableChromeDevtoolsTools(pi: ExtensionAPI) {\n\tif (availableToolsByApi.has(pi)) return;\n\tconst activeTools = new Set(pi.getActiveTools());\n\tsetAvailableTools(\n\t\tpi,\n\t\tCHROME_DEVTOOLS_TOOL_NAMES.filter((name) => activeTools.has(name)),\n\t);\n}\n\nexport function configureLazyChromeDevtoolsTools(\n\tpi: ExtensionAPI,\n\tavailableTools: readonly ChromeDevToolsToolName[],\n) {\n\tsetAvailableTools(pi, availableTools);\n\tconst nonCapabilityTools = pi\n\t\t.getActiveTools()\n\t\t.filter((name) => !CHROME_DEVTOOLS_TOOL_NAMES.includes(name as ChromeDevToolsToolName));\n\tpi.setActiveTools(unique([...nonCapabilityTools, CHROME_DEVTOOLS_LOAD_TOOL_NAME]));\n}\n\nexport function applyAvailableChromeDevtoolsTools(\n\tpi: ExtensionAPI,\n\tavailableTools: readonly ChromeDevToolsToolName[],\n) {\n\tconst available = setAvailableTools(pi, availableTools);\n\tconst active = pi\n\t\t.getActiveTools()\n\t\t.filter(\n\t\t\t(name) =>\n\t\t\t\t!CHROME_DEVTOOLS_TOOL_NAMES.includes(name as ChromeDevToolsToolName) ||\n\t\t\t\tavailable.has(name as ChromeDevToolsToolName),\n\t\t);\n\tpi.setActiveTools(unique([...active, CHROME_DEVTOOLS_LOAD_TOOL_NAME]));\n}\n\nexport function availableChromeDevtoolsTools(pi: ExtensionAPI) {\n\tconst available = availableToolsByApi.get(pi) ?? new Set();\n\treturn CHROME_DEVTOOLS_TOOL_NAMES.filter((name) => available.has(name));\n}\n\nexport function createChromeDevtoolsLoadTool(pi: ExtensionAPI) {\n\treturn defineTool({\n\t\tname: CHROME_DEVTOOLS_LOAD_TOOL_NAME,\n\t\tlabel: \"Chrome DevTools: Load Tools\",\n\t\tdescription:\n\t\t\t\"Find and enable Chrome DevTools browser tools relevant to a task. Loaded tools remain available for the session.\",\n\t\tpromptSnippet: \"Load Chrome DevTools browser capabilities on demand\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use chrome_devtools_load when a task requires inspecting or controlling a Chrome browser and the needed chrome_devtools_* capability is not active.\",\n\t\t],\n\t\tparameters: Type.Object({\n\t\t\tquery: Type.String({\n\t\t\t\tdescription: \"Browser capability or task to find tools for.\",\n\t\t\t\tmaxLength: 500,\n\t\t\t}),\n\t\t\tlimit: Type.Optional(\n\t\t\t\tType.Integer({\n\t\t\t\t\tdescription: \"Maximum tools to load. Defaults to 3.\",\n\t\t\t\t\tminimum: 1,\n\t\t\t\t\tmaximum: 5,\n\t\t\t\t}),\n\t\t\t),\n\t\t}),\n\t\tasync execute(_toolCallId, params, signal) {\n\t\t\tsignal?.throwIfAborted();\n\t\t\tconst available = new Set(availableChromeDevtoolsTools(pi));\n\t\t\tconst matches = matchChromeDevtoolsTools(params.query, params.limit ?? 3, available);\n\t\t\tconst active = pi.getActiveTools();\n\t\t\tconst activeSet = new Set(active);\n\t\t\tconst added = matches.filter((name) => !activeSet.has(name));\n\t\t\tif (added.length > 0) {\n\t\t\t\tpi.setActiveTools(unique([...active, ...added]));\n\t\t\t}\n\n\t\t\tconst text =\n\t\t\t\tmatches.length === 0\n\t\t\t\t\t? \"No available Chrome DevTools tools matched the query.\"\n\t\t\t\t\t: added.length > 0\n\t\t\t\t\t\t? `Loaded Chrome DevTools tools: ${added.join(\", \")}`\n\t\t\t\t\t\t: `Matching Chrome DevTools tools are already loaded: ${matches.join(\", \")}`;\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\" as const, text }],\n\t\t\t\tdetails: { matches, added },\n\t\t\t};\n\t\t},\n\t});\n}\n\nfunction matchChromeDevtoolsTools(\n\tquery: string,\n\tlimit: number,\n\tavailable: ReadonlySet<ChromeDevToolsToolName>,\n) {\n\tconst terms = query\n\t\t.toLowerCase()\n\t\t.split(/[^a-z0-9]+/)\n\t\t.filter((term) => term.length >= 2);\n\tif (terms.length === 0) return [];\n\treturn CHROME_DEVTOOLS_TOOL_NAMES.filter((name) => available.has(name))\n\t\t.map((name, index) => ({\n\t\t\tname,\n\t\t\tindex,\n\t\t\tscore: terms.reduce((score, term) => score + (SEARCH_TEXT[name].includes(term) ? 1 : 0), 0),\n\t\t}))\n\t\t.filter((match) => match.score > 0)\n\t\t.sort((left, right) => right.score - left.score || left.index - right.index)\n\t\t.slice(0, limit)\n\t\t.map((match) => match.name);\n}\n\nfunction setAvailableTools(pi: ExtensionAPI, availableTools: readonly ChromeDevToolsToolName[]) {\n\tconst available = new Set(availableTools);\n\tavailableToolsByApi.set(pi, available);\n\treturn available;\n}\n\nfunction unique(values: readonly string[]) {\n\treturn [...new Set(values)];\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport type { ExtensionAPI, ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport {\n\tbrowserCandidateHint,\n\tbrowserLifecycleState,\n\tdevToolsEndpoint,\n\tendpointConfigHint,\n\tendpointSourceLabel,\n\tlaunchAttemptLines,\n\tlaunchHint,\n\tlaunchModeLabel,\n} from \"./browser-manager.js\";\nimport {\n\tapplyAvailableChromeDevtoolsTools,\n\tavailableChromeDevtoolsTools,\n\tCHROME_DEVTOOLS_LOAD_TOOL_NAME,\n} from \"./lazy-tools.js\";\nimport { state } from \"./runtime.js\";\nimport { loadSettings, saveSettings, settingsFilePath } from \"./settings.js\";\nimport { CHROME_DEVTOOLS_TOOL_NAMES, type ChromeDevToolsToolName } from \"./tool-names.js\";\n\ntype CommandContext = ExtensionCommandContext;\n\nfunction unique<T>(values: T[]) {\n\treturn Array.from(new Set(values));\n}\n\nfunction formatError(error: unknown) {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\ninterface ToolStatusSummary {\n\tavailabilityStatus: \"enabled\" | \"disabled\" | \"partial\";\n\tavailableChromeToolCount: number;\n\tloadedChromeToolCount: number;\n\tactiveNonChromeToolCount: number;\n}\n\ntype ToolSelectionSaveResult = \"saved\" | \"active-tools-changed\" | \"failed\";\n\nexport async function updateChromeDevtoolsTools(\n\tpi: ExtensionAPI,\n\tctx: CommandContext,\n\tselectedTools: readonly ChromeDevToolsToolName[],\n\taction: string,\n) {\n\tconst generation = state.sessionGeneration;\n\tconst result = await transactSelectedTools(pi, ctx, selectedTools, generation);\n\tif (result !== \"saved\" || generation !== state.sessionGeneration) return;\n\tconst status = await buildToolStatusMessage(pi);\n\tif (generation !== state.sessionGeneration) return;\n\tctx.ui.notify(`Chrome DevTools lazy catalog ${action}.\\n\\n${status}`, \"info\");\n}\n\nexport async function setSelectedChromeDevtoolsTools(\n\tpi: ExtensionAPI,\n\tctx: CommandContext,\n\tselectedTools: readonly ChromeDevToolsToolName[],\n\texpectedActiveTools: readonly ChromeDevToolsToolName[],\n): Promise<ToolSelectionSaveResult> {\n\treturn transactSelectedTools(\n\t\tpi,\n\t\tctx,\n\t\tselectedTools,\n\t\tstate.sessionGeneration,\n\t\texpectedActiveTools,\n\t);\n}\n\nlet toolTransactionQueue = Promise.resolve();\n\nexport async function waitForChromeDevtoolsSettings(): Promise<void> {\n\tawait toolTransactionQueue;\n}\n\nfunction transactSelectedTools(\n\tpi: ExtensionAPI,\n\tctx: CommandContext,\n\tselectedTools: readonly ChromeDevToolsToolName[],\n\texpectedGeneration: number,\n\texpectedActiveTools?: readonly ChromeDevToolsToolName[],\n): Promise<ToolSelectionSaveResult> {\n\tconst operation = toolTransactionQueue.then(() =>\n\t\ttransactSelectedToolsNow(pi, ctx, selectedTools, expectedGeneration, expectedActiveTools),\n\t);\n\ttoolTransactionQueue = operation.then(\n\t\t() => undefined,\n\t\t() => undefined,\n\t);\n\treturn operation;\n}\n\nasync function transactSelectedToolsNow(\n\tpi: ExtensionAPI,\n\tctx: CommandContext,\n\tselectedTools: readonly ChromeDevToolsToolName[],\n\texpectedGeneration: number,\n\texpectedActiveTools?: readonly ChromeDevToolsToolName[],\n): Promise<ToolSelectionSaveResult> {\n\tif (expectedGeneration !== state.sessionGeneration) return \"failed\";\n\tif (expectedActiveTools && !arraysEqual(availableChromeDevtoolsTools(pi), expectedActiveTools)) {\n\t\tctx.ui.notify(\n\t\t\t\"Browser tool selection changed while review was open. Review the current state, then apply again.\",\n\t\t\t\"warning\",\n\t\t);\n\t\treturn \"active-tools-changed\";\n\t}\n\tconst previousActiveTools = pi.getActiveTools();\n\tconst previousAvailableTools = availableChromeDevtoolsTools(pi);\n\ttry {\n\t\tapplyChromeDevtoolsTools(pi, selectedTools);\n\t\tawait persistSettings(selectedTools);\n\t\treturn expectedGeneration === state.sessionGeneration ? \"saved\" : \"failed\";\n\t} catch (error) {\n\t\tlet rollbackError: unknown;\n\t\ttry {\n\t\t\tapplyAvailableChromeDevtoolsTools(pi, previousAvailableTools);\n\t\t\tconst currentNonChromeTools = pi\n\t\t\t\t.getActiveTools()\n\t\t\t\t.filter((name) => !CHROME_DEVTOOLS_TOOL_NAMES.includes(name as ChromeDevToolsToolName));\n\t\t\tconst previousLoadedChromeTools = previousActiveTools.filter((name) =>\n\t\t\t\tCHROME_DEVTOOLS_TOOL_NAMES.includes(name as ChromeDevToolsToolName),\n\t\t\t);\n\t\t\tpi.setActiveTools(unique([...currentNonChromeTools, ...previousLoadedChromeTools]));\n\t\t} catch (caught) {\n\t\t\trollbackError = caught;\n\t\t}\n\t\tif (expectedGeneration !== state.sessionGeneration) return \"failed\";\n\t\tctx.ui.notify(\n\t\t\tsanitizeChromeDevtoolsDisplay(\n\t\t\t\trollbackError\n\t\t\t\t\t? `Chrome DevTools settings save failed: ${formatError(error)}; active-tool rollback failed: ${formatError(rollbackError)}`\n\t\t\t\t\t: `Chrome DevTools settings save failed; active tools restored: ${formatError(error)}`,\n\t\t\t),\n\t\t\t\"warning\",\n\t\t);\n\t\treturn \"failed\";\n\t}\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\nexport function applyChromeDevtoolsTools(\n\tpi: ExtensionAPI,\n\tselectedTools: readonly ChromeDevToolsToolName[],\n) {\n\tapplyAvailableChromeDevtoolsTools(pi, selectedTools);\n}\n\nfunction getToolStatusSummary(pi: ExtensionAPI): ToolStatusSummary {\n\tconst chromeToolNames = new Set<string>(CHROME_DEVTOOLS_TOOL_NAMES);\n\tconst activeToolNames = new Set(pi.getActiveTools());\n\tconst loadedChromeToolCount = CHROME_DEVTOOLS_TOOL_NAMES.filter((name) =>\n\t\tactiveToolNames.has(name),\n\t).length;\n\tconst availableChromeToolCount = availableChromeDevtoolsTools(pi).length;\n\tconst activeNonChromeToolCount = Array.from(activeToolNames).filter(\n\t\t(name) => !chromeToolNames.has(name) && name !== CHROME_DEVTOOLS_LOAD_TOOL_NAME,\n\t).length;\n\tconst availabilityStatus =\n\t\tavailableChromeToolCount === CHROME_DEVTOOLS_TOOL_NAMES.length\n\t\t\t? \"enabled\"\n\t\t\t: availableChromeToolCount === 0\n\t\t\t\t? \"disabled\"\n\t\t\t\t: \"partial\";\n\n\treturn {\n\t\tavailabilityStatus,\n\t\tavailableChromeToolCount,\n\t\tloadedChromeToolCount,\n\t\tactiveNonChromeToolCount,\n\t};\n}\n\nexport async function buildToolStatusMessage(pi: ExtensionAPI) {\n\tconst summary = getToolStatusSummary(pi);\n\tconst persistedSetting = await persistedSettingLabel();\n\treturn sanitizeChromeDevtoolsDisplay(\n\t\t[\n\t\t\t`Chrome DevTools tools available to lazy-load: ${formatRuntimeStatus(summary)}`,\n\t\t\t`Loaded capability tools this session: ${summary.loadedChromeToolCount}/${CHROME_DEVTOOLS_TOOL_NAMES.length}`,\n\t\t\t`Loader: ${pi.getActiveTools().includes(CHROME_DEVTOOLS_LOAD_TOOL_NAME) ? \"active\" : \"inactive\"}`,\n\t\t\t`Persisted lazy catalog: ${persistedSetting}`,\n\t\t\t...browserSettingsStatusLines(),\n\t\t\t...(state.settingsNotice ? [`Settings note: ${state.settingsNotice}`] : []),\n\t\t\t`Other active tools preserved: ${summary.activeNonChromeToolCount}`,\n\t\t\t`Endpoint: ${devToolsEndpoint()}`,\n\t\t\t`Endpoint source: ${endpointSourceLabel()}`,\n\t\t\t`Launch mode: ${launchModeLabel()}`,\n\t\t\t...launchAttemptLines(),\n\t\t].join(\"\\n\"),\n\t);\n}\n\nexport function buildQuickstartMessage() {\n\treturn buildSettingsSetupMessage();\n}\n\nexport function buildBrowserStatusMessage() {\n\tconst lifecycle = browserLifecycleState();\n\tconst browserState =\n\t\tlifecycle === \"starting\"\n\t\t\t? \"starting managed browser\"\n\t\t\t: lifecycle === \"running\"\n\t\t\t\t? \"managed browser running\"\n\t\t\t\t: lifecycle === \"exited\"\n\t\t\t\t\t? \"managed browser exited\"\n\t\t\t\t\t: lifecycle === \"failed\"\n\t\t\t\t\t\t? \"last launch failed\"\n\t\t\t\t\t\t: \"not started; connection has not been checked\";\n\tconst needsRecovery = lifecycle === \"exited\" || lifecycle === \"failed\";\n\treturn sanitizeChromeDevtoolsDisplay(\n\t\t[\n\t\t\t`Browser: ${browserState}`,\n\t\t\t\"Viewing this status does not probe the endpoint or launch Chrome.\",\n\t\t\t`Endpoint: ${devToolsEndpoint()}`,\n\t\t\t`Endpoint source: ${endpointSourceLabel()}`,\n\t\t\t`Launch mode: ${launchModeLabel()}`,\n\t\t\t`Unpacked extensions: ${state.extensionPaths.length} (${state.extensionPathsSource})`,\n\t\t\t...(state.extensionPaths.length > 0\n\t\t\t\t? [\"Unpacked extensions execute trusted browser code in an isolated managed browser.\"]\n\t\t\t\t: []),\n\t\t\t...launchAttemptLines(),\n\t\t\t...(needsRecovery ? [launchHint(), endpointConfigHint()] : []),\n\t\t].join(\"\\n\"),\n\t);\n}\n\nexport function buildSettingsSetupMessage() {\n\treturn sanitizeChromeDevtoolsDisplay(\n\t\t[\n\t\t\t`Chrome DevTools endpoint: ${devToolsEndpoint()}`,\n\t\t\t`Endpoint source: ${endpointSourceLabel()}`,\n\t\t\t`Launch mode: ${launchModeLabel()}`,\n\t\t\t...browserSettingsStatusLines(),\n\t\t\tlaunchHint(),\n\t\t\tbrowserCandidateHint(),\n\t\t\t...launchAttemptLines(),\n\t\t\tendpointConfigHint(),\n\t\t].join(\"\\n\"),\n\t);\n}\n\nexport function sanitizeChromeDevtoolsDisplay(value: string, maxCharacters = 50_000) {\n\tconst sanitized = Array.from(stripVTControlCharacters(value), (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\nfunction browserSettingsStatusLines() {\n\tconst extensionLines =\n\t\tstate.extensionPaths.length > 0\n\t\t\t? state.extensionPaths.map((extensionPath) => ` - ${extensionPath}`)\n\t\t\t: [\" - none\"];\n\treturn [\n\t\t`Settings file: ${state.settingsFilePath ?? settingsFilePath()} (user)`,\n\t\t...(state.projectSettingsFilePath\n\t\t\t? [\n\t\t\t\t\t`Project settings: ${state.projectSettingsFilePath} (${state.projectSettingsTrusted ? \"trusted\" : \"untrusted; ignored\"})`,\n\t\t\t\t]\n\t\t\t: []),\n\t\t`Auto-launch: ${state.autoLaunchEnabled ? \"on\" : \"off\"} (${state.autoLaunchSource})`,\n\t\t`Browser executable: ${state.browserExecutable ?? \"automatic discovery\"} (${state.browserExecutableSource})`,\n\t\t`Unpacked extensions (${state.extensionPathsSource}):`,\n\t\t...extensionLines,\n\t\t\"Confirmed menu settings apply before the next browser connection; manual JSON edits require /reload or session replacement.\",\n\t\t...(state.extensionPaths.length > 0\n\t\t\t? [\n\t\t\t\t\t\"Unpacked extensions require Chrome for Testing or Chromium and execute trusted browser code.\",\n\t\t\t\t]\n\t\t\t: []),\n\t];\n}\n\nexport function buildCommandGuide() {\n\treturn [\n\t\t\"Chrome DevTools commands:\",\n\t\t\"/chrome-devtools \u2014 open this menu\",\n\t\t\"/chrome-devtools help \u2014 show command usage\",\n\t\t\"/chrome-devtools quickstart \u2014 show endpoint and launch help\",\n\t\t\"/chrome-devtools status \u2014 show tool and settings status\",\n\t\t\"/chrome-devtools settings \u2014 edit browser connection settings\",\n\t\t\"/chrome-devtools tools \u2014 choose tools available to lazy-load\",\n\t\t\"/chrome-devtools toggle|select \u2014 compatibility aliases for tools\",\n\t\t\"/chrome-devtools enable|on \u2014 make all Chrome DevTools tools available to lazy-load\",\n\t\t\"/chrome-devtools disable|off \u2014 make all Chrome DevTools capability tools unavailable\",\n\t].join(\"\\n\");\n}\n\nexport function allChromeDevtoolsTools() {\n\treturn [...CHROME_DEVTOOLS_TOOL_NAMES];\n}\n\nexport function orderedChromeDevtoolsTools(selectedTools: ReadonlySet<ChromeDevToolsToolName>) {\n\treturn CHROME_DEVTOOLS_TOOL_NAMES.filter((toolName) => selectedTools.has(toolName));\n}\n\nfunction formatRuntimeStatus(summary: ToolStatusSummary) {\n\treturn `${summary.availabilityStatus} (${summary.availableChromeToolCount}/${CHROME_DEVTOOLS_TOOL_NAMES.length} available)`;\n}\n\nasync function persistedSettingLabel() {\n\tconst settings = await loadSettings();\n\tif (settings.kind === \"loaded\" && settings.settings.tools) {\n\t\treturn formatPersistedSelection(settings.settings.tools);\n\t}\n\tif (settings.kind === \"invalid\") {\n\t\treturn `none; current active-tool policy preserved (invalid settings ignored: ${settings.reason})`;\n\t}\n\treturn \"none; current active-tool policy preserved\";\n}\n\nfunction formatPersistedSelection(tools: readonly ChromeDevToolsToolName[]) {\n\tif (tools.length === CHROME_DEVTOOLS_TOOL_NAMES.length) {\n\t\treturn `all available (${tools.length}/${CHROME_DEVTOOLS_TOOL_NAMES.length} selected)`;\n\t}\n\tif (tools.length === 0)\n\t\treturn `all unavailable (0/${CHROME_DEVTOOLS_TOOL_NAMES.length} selected)`;\n\treturn `${tools.length}/${CHROME_DEVTOOLS_TOOL_NAMES.length} selected: ${tools.join(\", \")}`;\n}\n\nasync function persistSettings(selectedTools: readonly ChromeDevToolsToolName[]) {\n\tawait saveSettings({ tools: [...selectedTools], updatedAt: Date.now() });\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["constants", "access", "readFile", "rm", "isAbsolute", "join", "resolve", "access", "readFile", "rm", "formatError", "isNodeError", "join", "resolve", "isAbsolute", "constants", "unique", "formatError"]
7
+ }