@narumitw/pi-chrome-devtools 0.53.0 → 0.53.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.
- package/README.md +88 -230
- package/dist/chunks/{browser-settings-menu-N5O65I7S.js → browser-settings-menu-IMB6HXSU.js} +5 -3
- package/dist/chunks/browser-settings-menu-IMB6HXSU.js.map +7 -0
- package/dist/chunks/{chunk-RTECHAEZ.js → chunk-GTTYS5GT.js} +20 -9
- package/dist/chunks/chunk-GTTYS5GT.js.map +7 -0
- package/dist/chunks/{chunk-B7B63PWB.js → chunk-LLXOCRNF.js} +50 -30
- package/dist/chunks/chunk-LLXOCRNF.js.map +7 -0
- package/dist/chunks/{chunk-GVBXT3FB.js → chunk-SRT3UUIP.js} +117 -73
- package/dist/chunks/chunk-SRT3UUIP.js.map +7 -0
- package/dist/chunks/{menu-UBHW6UP2.js → menu-UJETYMSB.js} +4 -4
- package/dist/chunks/{tools-V7OR5KJ3.js → tools-6P7EUX37.js} +49 -30
- package/dist/chunks/tools-6P7EUX37.js.map +7 -0
- package/dist/index.ts +21 -18
- package/dist/index.ts.map +2 -2
- package/docs/browser-setup.md +147 -0
- package/package.json +7 -7
- package/src/browser-manager.ts +138 -72
- package/src/browser-settings-menu.ts +2 -1
- package/src/cdp-client.ts +18 -7
- package/src/chrome-devtools.ts +8 -1
- package/src/display.ts +38 -0
- package/src/render.ts +6 -7
- package/src/tool-selector.ts +21 -32
- package/src/tools.ts +5 -5
- package/src/webmcp/policy.ts +14 -7
- package/src/webmcp/protocol.ts +33 -21
- package/dist/chunks/browser-settings-menu-N5O65I7S.js.map +0 -7
- package/dist/chunks/chunk-B7B63PWB.js.map +0 -7
- package/dist/chunks/chunk-GVBXT3FB.js.map +0 -7
- package/dist/chunks/chunk-RTECHAEZ.js.map +0 -7
- package/dist/chunks/tools-V7OR5KJ3.js.map +0 -7
- /package/dist/chunks/{menu-UBHW6UP2.js.map → menu-UJETYMSB.js.map} +0 -0
package/src/tool-selector.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { stripVTControlCharacters } from "node:util";
|
|
2
1
|
import type { ExtensionAPI, ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
|
|
3
2
|
import {
|
|
4
3
|
browserCandidateHint,
|
|
5
4
|
browserLifecycleState,
|
|
5
|
+
browserSettingsForOwner,
|
|
6
6
|
devToolsEndpoint,
|
|
7
7
|
endpointConfigHint,
|
|
8
8
|
endpointSourceLabel,
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
launchModeLabel,
|
|
12
12
|
managedBrowserForOwner,
|
|
13
13
|
} from "./browser-manager.js";
|
|
14
|
+
import { sanitizeChromeDevtoolsDisplay } from "./display.js";
|
|
14
15
|
import {
|
|
15
16
|
applyAvailableChromeDevtoolsTools,
|
|
16
17
|
availableChromeDevtoolsTools,
|
|
@@ -26,6 +27,8 @@ import {
|
|
|
26
27
|
isWebMcpToolName,
|
|
27
28
|
} from "./tool-names.js";
|
|
28
29
|
|
|
30
|
+
export { sanitizeChromeDevtoolsDisplay };
|
|
31
|
+
|
|
29
32
|
type CommandContext = ExtensionCommandContext;
|
|
30
33
|
|
|
31
34
|
function unique<T>(values: T[]) {
|
|
@@ -211,7 +214,7 @@ export async function buildToolStatusMessage(pi: ExtensionAPI, owner: object) {
|
|
|
211
214
|
...(state.settingsNotice ? [`Settings note: ${state.settingsNotice}`] : []),
|
|
212
215
|
`Other active tools preserved: ${summary.activeNonChromeToolCount}`,
|
|
213
216
|
`Endpoint: ${devToolsEndpoint(owner)}`,
|
|
214
|
-
`Endpoint source: ${endpointSourceLabel()}`,
|
|
217
|
+
`Endpoint source: ${endpointSourceLabel(owner)}`,
|
|
215
218
|
`Launch mode: ${launchModeLabel(owner)}`,
|
|
216
219
|
...launchAttemptLines(owner),
|
|
217
220
|
].join("\n"),
|
|
@@ -223,6 +226,7 @@ export function buildQuickstartMessage(owner: object) {
|
|
|
223
226
|
}
|
|
224
227
|
|
|
225
228
|
export function buildBrowserStatusMessage(owner?: object) {
|
|
229
|
+
const browser = browserSettingsForOwner(owner);
|
|
226
230
|
const lifecycle = browserLifecycleState(owner);
|
|
227
231
|
const webMcpIsEnabled = owner ? webMcpEnabled(owner) : false;
|
|
228
232
|
const browserState =
|
|
@@ -241,20 +245,20 @@ export function buildBrowserStatusMessage(owner?: object) {
|
|
|
241
245
|
`Browser: ${browserState}`,
|
|
242
246
|
"Viewing this status does not probe the endpoint or launch Chrome.",
|
|
243
247
|
`Endpoint: ${devToolsEndpoint(owner)}`,
|
|
244
|
-
`Endpoint source: ${endpointSourceLabel()}`,
|
|
248
|
+
`Endpoint source: ${endpointSourceLabel(owner)}`,
|
|
245
249
|
`Launch mode: ${launchModeLabel(owner)}`,
|
|
246
|
-
`Unpacked extensions: ${
|
|
250
|
+
`Unpacked extensions: ${browser.extensionPaths.length} (${browser.extensionPathsSource})`,
|
|
247
251
|
`WebMCP: ${webMcpIsEnabled ? "enabled · experimental" : "disabled · experimental"}`,
|
|
248
252
|
...(webMcpIsEnabled && !managedBrowserForOwner(owner)?.ready
|
|
249
253
|
? [
|
|
250
254
|
"WebMCP warning: attached browser profiles may contain everyday authenticated sessions and sensitive state.",
|
|
251
255
|
]
|
|
252
256
|
: []),
|
|
253
|
-
...(
|
|
257
|
+
...(browser.extensionPaths.length > 0
|
|
254
258
|
? ["Unpacked extensions execute trusted browser code in an isolated managed browser."]
|
|
255
259
|
: []),
|
|
256
260
|
...launchAttemptLines(owner),
|
|
257
|
-
...(needsRecovery ? [launchHint(), endpointConfigHint()] : []),
|
|
261
|
+
...(needsRecovery ? [launchHint(owner), endpointConfigHint()] : []),
|
|
258
262
|
].join("\n"),
|
|
259
263
|
);
|
|
260
264
|
}
|
|
@@ -263,38 +267,23 @@ export function buildSettingsSetupMessage(owner: object) {
|
|
|
263
267
|
return sanitizeChromeDevtoolsDisplay(
|
|
264
268
|
[
|
|
265
269
|
`Chrome DevTools endpoint: ${devToolsEndpoint(owner)}`,
|
|
266
|
-
`Endpoint source: ${endpointSourceLabel()}`,
|
|
270
|
+
`Endpoint source: ${endpointSourceLabel(owner)}`,
|
|
267
271
|
`Launch mode: ${launchModeLabel(owner)}`,
|
|
268
272
|
...browserSettingsStatusLines(owner),
|
|
269
|
-
launchHint(),
|
|
270
|
-
browserCandidateHint(),
|
|
273
|
+
launchHint(owner),
|
|
274
|
+
browserCandidateHint(owner),
|
|
271
275
|
...launchAttemptLines(owner),
|
|
272
276
|
endpointConfigHint(),
|
|
273
277
|
].join("\n"),
|
|
274
278
|
);
|
|
275
279
|
}
|
|
276
280
|
|
|
277
|
-
export function sanitizeChromeDevtoolsDisplay(value: string, maxCharacters = 50_000) {
|
|
278
|
-
const withoutBidi = stripVTControlCharacters(value).replace(
|
|
279
|
-
/[\u202a-\u202e\u2066-\u2069]/gu,
|
|
280
|
-
"�",
|
|
281
|
-
);
|
|
282
|
-
const sanitized = Array.from(withoutBidi, (character) => {
|
|
283
|
-
const codePoint = character.codePointAt(0) ?? 0;
|
|
284
|
-
const unsafeControl =
|
|
285
|
-
(codePoint >= 0 && codePoint <= 8) ||
|
|
286
|
-
(codePoint >= 11 && codePoint <= 31) ||
|
|
287
|
-
(codePoint >= 127 && codePoint <= 159);
|
|
288
|
-
return unsafeControl ? "�" : character;
|
|
289
|
-
}).join("");
|
|
290
|
-
if (sanitized.length <= maxCharacters) return sanitized;
|
|
291
|
-
return `${sanitized.slice(0, Math.max(0, maxCharacters - 1))}…`;
|
|
292
|
-
}
|
|
293
|
-
|
|
294
281
|
function browserSettingsStatusLines(owner: object) {
|
|
282
|
+
const browser = browserSettingsForOwner(owner);
|
|
283
|
+
const extensionPaths = browser.extensionPaths;
|
|
295
284
|
const extensionLines =
|
|
296
|
-
|
|
297
|
-
?
|
|
285
|
+
extensionPaths.length > 0
|
|
286
|
+
? extensionPaths.map((extensionPath) => ` - ${extensionPath}`)
|
|
298
287
|
: [" - none"];
|
|
299
288
|
return [
|
|
300
289
|
`Settings file: ${state.settingsFilePath ?? settingsFilePath()} (user)`,
|
|
@@ -303,13 +292,13 @@ function browserSettingsStatusLines(owner: object) {
|
|
|
303
292
|
`Project settings: ${state.projectSettingsFilePath} (${state.projectSettingsTrusted ? "trusted" : "untrusted; ignored"})`,
|
|
304
293
|
]
|
|
305
294
|
: []),
|
|
306
|
-
`Auto-launch: ${
|
|
307
|
-
`Browser executable: ${
|
|
308
|
-
`Unpacked extensions (${
|
|
295
|
+
`Auto-launch: ${browser.autoLaunchEnabled ? "on" : "off"} (${browser.autoLaunchSource})`,
|
|
296
|
+
`Browser executable: ${browser.executablePath ?? "automatic discovery"} (${browser.executablePathSource})`,
|
|
297
|
+
`Unpacked extensions (${browser.extensionPathsSource}):`,
|
|
309
298
|
...extensionLines,
|
|
310
299
|
`WebMCP: ${webMcpEnabled(owner) ? "enabled · experimental · every call requires confirmation" : "disabled · experimental"}`,
|
|
311
300
|
"Confirmed menu settings apply before the next browser connection; manual JSON edits require /reload or session replacement.",
|
|
312
|
-
...(
|
|
301
|
+
...(extensionPaths.length > 0
|
|
313
302
|
? [
|
|
314
303
|
"Unpacked extensions require Chrome for Testing or Chromium and execute trusted browser code.",
|
|
315
304
|
]
|
package/src/tools.ts
CHANGED
|
@@ -6,11 +6,11 @@ import {
|
|
|
6
6
|
listPages,
|
|
7
7
|
resolvePage,
|
|
8
8
|
resolvePageForNavigation,
|
|
9
|
+
setActivePageId,
|
|
9
10
|
textResult,
|
|
10
11
|
withCdp,
|
|
11
12
|
} from "./cdp-client.js";
|
|
12
13
|
import { renderScreenshotResult, renderTextResult, renderToolCall, withStatus } from "./render.js";
|
|
13
|
-
import { state } from "./runtime.js";
|
|
14
14
|
import { formatScreenshotText, saveScreenshot, throwIfAborted } from "./screenshot.js";
|
|
15
15
|
import { CHROME_DEVTOOLS_TOOL_NAMES, WEBMCP_TOOL_NAMES } from "./tool-names.js";
|
|
16
16
|
|
|
@@ -41,7 +41,7 @@ export const selectPageTool = defineTool({
|
|
|
41
41
|
async execute(_toolCallId, params, signal, _onUpdate, ctx) {
|
|
42
42
|
return withStatus(ctx, "select page", async () => {
|
|
43
43
|
const page = await getPage(params.pageId, { sessionOwner: ctx.sessionManager, signal });
|
|
44
|
-
|
|
44
|
+
setActivePageId(ctx.sessionManager, page.id);
|
|
45
45
|
return textResult(`Selected page ${page.id}: ${page.title}\n${page.url}`, {
|
|
46
46
|
page: formatPage(page),
|
|
47
47
|
});
|
|
@@ -73,7 +73,7 @@ export const navigateTool = defineTool({
|
|
|
73
73
|
return client.send("Page.navigate", { url: params.url });
|
|
74
74
|
});
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
setActivePageId(ctx.sessionManager, page.id);
|
|
77
77
|
const action = created ? "Created page and navigated" : "Navigated";
|
|
78
78
|
return textResult(`${action} ${page.id} to ${params.url}`, {
|
|
79
79
|
created,
|
|
@@ -113,7 +113,7 @@ export const evaluateTool = defineTool({
|
|
|
113
113
|
}),
|
|
114
114
|
);
|
|
115
115
|
|
|
116
|
-
|
|
116
|
+
setActivePageId(ctx.sessionManager, page.id);
|
|
117
117
|
return textResult(JSON.stringify(result, null, 2), { page: formatPage(page), result });
|
|
118
118
|
});
|
|
119
119
|
},
|
|
@@ -238,7 +238,7 @@ export const screenshotTool = defineTool({
|
|
|
238
238
|
});
|
|
239
239
|
});
|
|
240
240
|
|
|
241
|
-
|
|
241
|
+
setActivePageId(ctx.sessionManager, page.id);
|
|
242
242
|
const savedScreenshot = await saveScreenshot(result.data, params.savePath, ctx.cwd, signal);
|
|
243
243
|
return {
|
|
244
244
|
content: [
|
package/src/webmcp/policy.ts
CHANGED
|
@@ -306,6 +306,14 @@ function rejectRegexBearingSchema(schema: unknown): void {
|
|
|
306
306
|
|
|
307
307
|
function rejectExpensiveValidationSchema(schema: unknown) {
|
|
308
308
|
let branches = 0;
|
|
309
|
+
const countBranches = (count: number) => {
|
|
310
|
+
branches += count;
|
|
311
|
+
if (branches > MAX_SCHEMA_VALIDATION_BRANCHES) {
|
|
312
|
+
throw new Error(
|
|
313
|
+
`WebMCP input schema exceeds the validation branch limit of ${MAX_SCHEMA_VALIDATION_BRANCHES}.`,
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
};
|
|
309
317
|
const visit = (candidate: unknown): void => {
|
|
310
318
|
if (Array.isArray(candidate)) {
|
|
311
319
|
for (const child of candidate) visit(child);
|
|
@@ -314,13 +322,12 @@ function rejectExpensiveValidationSchema(schema: unknown) {
|
|
|
314
322
|
if (!isRecord(candidate)) return;
|
|
315
323
|
for (const keyword of ["allOf", "anyOf", "oneOf"] as const) {
|
|
316
324
|
const alternatives = candidate[keyword];
|
|
317
|
-
if (
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
}
|
|
325
|
+
if (Array.isArray(alternatives)) countBranches(alternatives.length);
|
|
326
|
+
}
|
|
327
|
+
for (const keyword of ["dependencies", "dependentSchemas"] as const) {
|
|
328
|
+
const dependencies = candidate[keyword];
|
|
329
|
+
if (!isRecord(dependencies)) continue;
|
|
330
|
+
countBranches(Object.values(dependencies).filter(isRecord).length);
|
|
324
331
|
}
|
|
325
332
|
for (const child of Object.values(candidate)) visit(child);
|
|
326
333
|
};
|
package/src/webmcp/protocol.ts
CHANGED
|
@@ -154,26 +154,14 @@ export function watchWebMcpIdentity(
|
|
|
154
154
|
const staleController = new AbortController();
|
|
155
155
|
const watchSignal = AbortSignal.any([signal, stopController.signal]);
|
|
156
156
|
const options = { signal: watchSignal, timeoutMs: IDENTITY_WATCH_TIMEOUT_MS };
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
(
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
"WebMCP.toolsAdded",
|
|
166
|
-
(value): value is unknown => toolChangeMatchesIdentity(value, expected),
|
|
167
|
-
options,
|
|
168
|
-
),
|
|
169
|
-
client.waitForEvent(
|
|
170
|
-
"WebMCP.toolsRemoved",
|
|
171
|
-
(value): value is unknown => toolChangeMatchesIdentity(value, expected),
|
|
172
|
-
options,
|
|
173
|
-
),
|
|
174
|
-
];
|
|
175
|
-
const settledWatches = watches.map((watch) =>
|
|
176
|
-
watch.then(
|
|
157
|
+
const settleWatch = (create: () => Promise<unknown>) => {
|
|
158
|
+
let watch: Promise<unknown>;
|
|
159
|
+
try {
|
|
160
|
+
watch = create();
|
|
161
|
+
} catch (error) {
|
|
162
|
+
watch = Promise.reject(error);
|
|
163
|
+
}
|
|
164
|
+
return watch.then(
|
|
177
165
|
() => {
|
|
178
166
|
if (staleController.signal.aborted) return;
|
|
179
167
|
staleController.abort(
|
|
@@ -189,8 +177,32 @@ export function watchWebMcpIdentity(
|
|
|
189
177
|
}
|
|
190
178
|
staleController.abort(error);
|
|
191
179
|
},
|
|
180
|
+
);
|
|
181
|
+
};
|
|
182
|
+
const settledWatches = [
|
|
183
|
+
settleWatch(() =>
|
|
184
|
+
client.waitForEvent(
|
|
185
|
+
"Page.frameNavigated",
|
|
186
|
+
(value): value is unknown =>
|
|
187
|
+
frameNavigationChangesIdentity(value, expected.frameId, expected.documentId),
|
|
188
|
+
options,
|
|
189
|
+
),
|
|
192
190
|
),
|
|
193
|
-
|
|
191
|
+
settleWatch(() =>
|
|
192
|
+
client.waitForEvent(
|
|
193
|
+
"WebMCP.toolsAdded",
|
|
194
|
+
(value): value is unknown => toolChangeMatchesIdentity(value, expected),
|
|
195
|
+
options,
|
|
196
|
+
),
|
|
197
|
+
),
|
|
198
|
+
settleWatch(() =>
|
|
199
|
+
client.waitForEvent(
|
|
200
|
+
"WebMCP.toolsRemoved",
|
|
201
|
+
(value): value is unknown => toolChangeMatchesIdentity(value, expected),
|
|
202
|
+
options,
|
|
203
|
+
),
|
|
204
|
+
),
|
|
205
|
+
];
|
|
194
206
|
return {
|
|
195
207
|
signal: AbortSignal.any([signal, staleController.signal]),
|
|
196
208
|
async dispose() {
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/browser-settings-menu.ts"],
|
|
4
|
-
"sourcesContent": ["import { isAbsolute } from \"node:path\";\nimport type { ExtensionAPI, ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu } from \"@narumitw/pi-tui-kit\";\nimport { shutdownManagedBrowser } from \"./browser-manager.js\";\nimport {\n\tapplyAvailableChromeDevtoolsTools,\n\tconfiguredChromeDevtoolsTools,\n\tsetChromeDevtoolsSessionOwner,\n} from \"./lazy-tools.js\";\nimport {\n\tapplyRuntimeBrowserSettings,\n\tapplyRuntimeWebMcpSetting,\n\tinvalidateWebMcpOperations,\n\tstate,\n\twebMcpEnabled,\n} from \"./runtime.js\";\nimport {\n\ttype BrowserSettingsPatch,\n\ttype BrowserSettingsSource,\n\tloadSettings,\n\tparseBrowserEndpoint,\n\ttype SettingsLoadResult,\n\tsaveBrowserSettings,\n\tsaveWebMcpSettings,\n} from \"./settings.js\";\nimport { sanitizeChromeDevtoolsDisplay } from \"./tool-selector.js\";\n\ntype BrowserSettingsScreen = \"settings\" | \"endpoint\" | \"executable\" | \"extensions\";\ntype BrowserSettingsAction =\n\t| \"open-endpoint\"\n\t| \"save-endpoint\"\n\t| \"set-auto-launch\"\n\t| \"set-webmcp\"\n\t| \"open-executable\"\n\t| \"save-executable\"\n\t| \"show-extensions\";\n\ninterface BrowserSettingsMenuState {\n\tload: SettingsLoadResult;\n}\n\ntype CommandContext = ExtensionCommandContext;\n\nexport async function showChromeDevtoolsBrowserSettings(\n\tpi: ExtensionAPI,\n\tctx: CommandContext,\n\tgeneration: number,\n): Promise<{ closeParent: boolean }> {\n\tsetChromeDevtoolsSessionOwner(pi, ctx.sessionManager);\n\tconst ownerSignal = state.sessionController.signal;\n\tconst isCurrent = () => generation === state.sessionGeneration && !ownerSignal.aborted;\n\tconst projectTrusted = ctx.isProjectTrusted();\n\tconst menu = defineMenu<BrowserSettingsMenuState, BrowserSettingsScreen, BrowserSettingsAction>({\n\t\tstart: \"settings\",\n\t\tscreens: {\n\t\t\tsettings: ({ state: current }) => {\n\t\t\t\tif (current.load.userFile.kind === \"invalid\") return invalidSettingsScreen(current.load);\n\t\t\t\tconst browser = current.load.effectiveBrowser;\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"settings\",\n\t\t\t\t\ttitle: \"Chrome DevTools Browser settings\",\n\t\t\t\t\tlines: settingsContextLines(current.load),\n\t\t\t\t\titems: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"endpoint\",\n\t\t\t\t\t\t\tlabel: \"DevTools endpoint\",\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t'HTTP origin with an explicit port; enter \"default\" to restore 127.0.0.1:9222.',\n\t\t\t\t\t\t\tcurrentValue: sanitizeChromeDevtoolsDisplay(browser.endpoint),\n\t\t\t\t\t\t\taction: \"open-endpoint\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"auto-launch\",\n\t\t\t\t\t\t\tlabel: \"Auto-launch\",\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\"Launch an isolated managed browser when a local endpoint is unavailable.\",\n\t\t\t\t\t\t\tcurrentValue: browser.autoLaunchEnabled ? \"On\" : \"Off\",\n\t\t\t\t\t\t\tvalues: [\"On\", \"Off\"],\n\t\t\t\t\t\t\taction: \"set-auto-launch\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"executable\",\n\t\t\t\t\t\t\tlabel: \"Browser executable\",\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t'Absolute executable path; enter \"automatic\" to restore browser discovery.',\n\t\t\t\t\t\t\tcurrentValue: sanitizeChromeDevtoolsDisplay(browser.executablePath ?? \"Automatic\"),\n\t\t\t\t\t\t\taction: \"open-executable\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"webmcp\",\n\t\t\t\t\t\t\tlabel: \"WebMCP \u00B7 Experimental\",\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\"Allow user-confirmed calls to page-provided WebMCP tools in this browser session.\",\n\t\t\t\t\t\t\tcurrentValue: current.load.effectiveWebMcpEnabled ? \"On\" : \"Off\",\n\t\t\t\t\t\t\tvalues: [\"On\", \"Off\"],\n\t\t\t\t\t\t\taction: \"set-webmcp\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"extensions\",\n\t\t\t\t\t\t\tlabel: \"Unpacked extensions\",\n\t\t\t\t\t\t\tdescription: \"Inspect trusted extension paths configured in user or project JSON.\",\n\t\t\t\t\t\t\tcurrentValue: `${browser.extensionPaths.length} configured`,\n\t\t\t\t\t\t\taction: \"show-extensions\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t},\n\t\t\tendpoint: ({ state: current }) => ({\n\t\t\t\tkind: \"input\",\n\t\t\t\ttitle: \"DevTools endpoint\",\n\t\t\t\tlines: [\n\t\t\t\t\tsanitizeChromeDevtoolsDisplay(\n\t\t\t\t\t\t`Current effective endpoint: ${current.load.effectiveBrowser.endpoint}`,\n\t\t\t\t\t),\n\t\t\t\t\t'Enter an HTTP origin with an explicit port, or \"default\".',\n\t\t\t\t],\n\t\t\t\tplaceholder: \"http://127.0.0.1:9222\",\n\t\t\t\taction: \"save-endpoint\",\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t\texecutable: ({ state: current }) => ({\n\t\t\t\tkind: \"input\",\n\t\t\t\ttitle: \"Browser executable\",\n\t\t\t\tlines: [\n\t\t\t\t\tsanitizeChromeDevtoolsDisplay(\n\t\t\t\t\t\t`Current effective executable: ${current.load.effectiveBrowser.executablePath ?? \"automatic discovery\"}`,\n\t\t\t\t\t),\n\t\t\t\t\t'Enter an absolute path, or \"automatic\".',\n\t\t\t\t],\n\t\t\t\tplaceholder: \"absolute browser executable path\",\n\t\t\t\taction: \"save-executable\",\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t\textensions: ({ state: current }) => ({\n\t\t\t\tkind: \"detail\",\n\t\t\t\ttitle: \"Unpacked extensions\",\n\t\t\t\tlines: extensionDetailLines(current.load),\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t},\n\t\tactions: {\n\t\t\t\"open-endpoint\": () => ({ kind: \"to\", screen: \"endpoint\" }),\n\t\t\t\"save-endpoint\": async ({ value, signal }) => {\n\t\t\t\tif (value === undefined) return { kind: \"rejected\" };\n\t\t\t\tlet endpoint: string | null;\n\t\t\t\ttry {\n\t\t\t\t\tconst trimmed = value.trim();\n\t\t\t\t\tendpoint =\n\t\t\t\t\t\ttrimmed.toLowerCase() === \"default\" ? null : parseBrowserEndpoint(trimmed).endpoint;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tnotifySaveFailure(ctx, error);\n\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t}\n\t\t\t\tconst saved = await saveAndApplyBrowserPatch(\n\t\t\t\t\tctx,\n\t\t\t\t\tgeneration,\n\t\t\t\t\townerSignal,\n\t\t\t\t\tsignal,\n\t\t\t\t\tprojectTrusted,\n\t\t\t\t\t{ endpoint },\n\t\t\t\t);\n\t\t\t\tif (!saved) return { kind: \"rejected\" };\n\t\t\t\tnotifyEffectiveSave(\n\t\t\t\t\tctx,\n\t\t\t\t\t\"endpoint\",\n\t\t\t\t\tsaved.effectiveBrowser.endpoint,\n\t\t\t\t\tsaved.effectiveBrowser.endpointSource,\n\t\t\t\t);\n\t\t\t\treturn { kind: \"back\" };\n\t\t\t},\n\t\t\t\"set-auto-launch\": async ({ value, signal }) => {\n\t\t\t\tif (value !== \"On\" && value !== \"Off\") return { kind: \"rejected\" };\n\t\t\t\tconst saved = await saveAndApplyBrowserPatch(\n\t\t\t\t\tctx,\n\t\t\t\t\tgeneration,\n\t\t\t\t\townerSignal,\n\t\t\t\t\tsignal,\n\t\t\t\t\tprojectTrusted,\n\t\t\t\t\t{ autoLaunch: value === \"On\" },\n\t\t\t\t);\n\t\t\t\tif (!saved) return { kind: \"rejected\" };\n\t\t\t\tnotifyEffectiveSave(\n\t\t\t\t\tctx,\n\t\t\t\t\t\"auto-launch\",\n\t\t\t\t\tsaved.effectiveBrowser.autoLaunchEnabled ? \"On\" : \"Off\",\n\t\t\t\t\tsaved.effectiveBrowser.autoLaunchSource,\n\t\t\t\t);\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\t\"set-webmcp\": async ({ value, signal }) => {\n\t\t\t\tif (value !== \"On\" && value !== \"Off\") return { kind: \"rejected\" };\n\t\t\t\tconst saved = await saveAndApplyWebMcpSetting(\n\t\t\t\t\tpi,\n\t\t\t\t\tctx,\n\t\t\t\t\tgeneration,\n\t\t\t\t\townerSignal,\n\t\t\t\t\tsignal,\n\t\t\t\t\tprojectTrusted,\n\t\t\t\t\tvalue === \"On\",\n\t\t\t\t);\n\t\t\t\tif (!saved) return { kind: \"rejected\" };\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\tsaved.effectiveWebMcpEnabled\n\t\t\t\t\t\t? \"Experimental WebMCP enabled. Every page-provided tool call requires confirmation. Choose gateway availability under Browser tools.\"\n\t\t\t\t\t\t: \"Experimental WebMCP disabled. Active WebMCP work was aborted and both gateway tools are unavailable.\",\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\t\"open-executable\": () => ({ kind: \"to\", screen: \"executable\" }),\n\t\t\t\"save-executable\": async ({ value, signal }) => {\n\t\t\t\tif (value === undefined) return { kind: \"rejected\" };\n\t\t\t\tconst trimmed = value.trim();\n\t\t\t\tconst reset = [\"automatic\", \"default\", \"none\"].includes(trimmed.toLowerCase());\n\t\t\t\tif (!reset && (!trimmed || !isAbsolute(trimmed))) {\n\t\t\t\t\tnotifySaveFailure(ctx, new Error('Enter an absolute path or \"automatic\".'));\n\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t}\n\t\t\t\tconst executablePath = reset ? null : trimmed;\n\t\t\t\tconst saved = await saveAndApplyBrowserPatch(\n\t\t\t\t\tctx,\n\t\t\t\t\tgeneration,\n\t\t\t\t\townerSignal,\n\t\t\t\t\tsignal,\n\t\t\t\t\tprojectTrusted,\n\t\t\t\t\t{ executablePath },\n\t\t\t\t);\n\t\t\t\tif (!saved) return { kind: \"rejected\" };\n\t\t\t\tnotifyEffectiveSave(\n\t\t\t\t\tctx,\n\t\t\t\t\t\"browser executable\",\n\t\t\t\t\tsaved.effectiveBrowser.executablePath ?? \"automatic discovery\",\n\t\t\t\t\tsaved.effectiveBrowser.executablePathSource,\n\t\t\t\t);\n\t\t\t\treturn { kind: \"back\" };\n\t\t\t},\n\t\t\t\"show-extensions\": () => ({ kind: \"to\", screen: \"extensions\" }),\n\t\t},\n\t});\n\tconst result = await runMenu(ctx, menu, {\n\t\tgetState: async ({ signal }) => {\n\t\t\tsignal.throwIfAborted();\n\t\t\tconst load = await loadSettings({ cwd: ctx.cwd, projectTrusted });\n\t\t\tsignal.throwIfAborted();\n\t\t\treturn { load };\n\t\t},\n\t\tsignal: ownerSignal,\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 browser settings failed: ${formatError(error)}`,\n\t\t\t\t),\n\t\t\t\t\"error\",\n\t\t\t),\n\t});\n\treturn { closeParent: result.kind === \"closed\" && result.reason === \"close\" };\n}\n\nasync function saveAndApplyBrowserPatch(\n\tctx: CommandContext,\n\tgeneration: number,\n\townerSignal: AbortSignal,\n\tactionSignal: AbortSignal,\n\tprojectTrusted: boolean,\n\tpatch: BrowserSettingsPatch,\n) {\n\ttry {\n\t\tawait ctx.waitForIdle();\n\t\tif (!isCurrent(generation, ownerSignal, actionSignal)) return false;\n\t\tawait saveBrowserSettings(patch);\n\t\tif (!isCurrent(generation, ownerSignal, actionSignal)) return false;\n\t\tinvalidateWebMcpOperations(ctx.sessionManager, \"Chrome DevTools browser configuration changed\");\n\t\tawait shutdownManagedBrowser(undefined, { owner: ctx.sessionManager });\n\t\tif (!isCurrent(generation, ownerSignal, actionSignal)) return false;\n\t\tconst loaded = await loadSettings({ cwd: ctx.cwd, projectTrusted });\n\t\tif (!isCurrent(generation, ownerSignal, actionSignal)) return false;\n\t\tapplyRuntimeBrowserSettings(loaded.effectiveBrowser, loaded.paths, projectTrusted);\n\t\tstate.settingsNotice = loaded.notice;\n\t\treturn loaded;\n\t} catch (error) {\n\t\tif (isCurrent(generation, ownerSignal, actionSignal)) notifySaveFailure(ctx, error);\n\t\treturn false;\n\t}\n}\n\nasync function saveAndApplyWebMcpSetting(\n\tpi: ExtensionAPI,\n\tctx: CommandContext,\n\tgeneration: number,\n\townerSignal: AbortSignal,\n\tactionSignal: AbortSignal,\n\tprojectTrusted: boolean,\n\tenabled: boolean,\n) {\n\tconst previousEnabled = webMcpEnabled(ctx.sessionManager);\n\tconst previousTools = configuredChromeDevtoolsTools(pi);\n\ttry {\n\t\tawait ctx.waitForIdle();\n\t\tif (!isCurrent(generation, ownerSignal, actionSignal)) return false;\n\t\tapplyRuntimeWebMcpSetting(enabled, ctx.sessionManager);\n\t\tapplyAvailableChromeDevtoolsTools(pi, previousTools);\n\t\tawait saveWebMcpSettings(enabled);\n\t\tif (!isOwnerCurrent(generation, ownerSignal)) return false;\n\t\tconst loaded = await loadSettings({ cwd: ctx.cwd, projectTrusted });\n\t\tif (!isOwnerCurrent(generation, ownerSignal)) return false;\n\t\tstate.settingsNotice = loaded.notice;\n\t\treturn loaded;\n\t} catch (error) {\n\t\tif (!isOwnerCurrent(generation, ownerSignal)) return false;\n\t\tlet rollbackError: unknown;\n\t\ttry {\n\t\t\tapplyRuntimeWebMcpSetting(previousEnabled, ctx.sessionManager);\n\t\t\tapplyAvailableChromeDevtoolsTools(pi, previousTools);\n\t\t} catch (caught) {\n\t\t\trollbackError = caught;\n\t\t}\n\t\tif (isCurrent(generation, ownerSignal, actionSignal)) {\n\t\t\tnotifySaveFailure(\n\t\t\t\tctx,\n\t\t\t\trollbackError\n\t\t\t\t\t? new Error(\n\t\t\t\t\t\t\t`${formatError(error)}; WebMCP rollback failed: ${formatError(rollbackError)}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t: error,\n\t\t\t);\n\t\t}\n\t\treturn false;\n\t}\n}\n\nfunction isOwnerCurrent(generation: number, ownerSignal: AbortSignal) {\n\treturn generation === state.sessionGeneration && !ownerSignal.aborted;\n}\n\nfunction isCurrent(generation: number, ownerSignal: AbortSignal, actionSignal: AbortSignal) {\n\treturn isOwnerCurrent(generation, ownerSignal) && !actionSignal.aborted;\n}\n\nfunction invalidSettingsScreen(load: SettingsLoadResult) {\n\tconst reason =\n\t\tload.userFile.kind === \"invalid\"\n\t\t\t? load.userFile.reason\n\t\t\t: \"The user settings file is unavailable.\";\n\treturn {\n\t\tkind: \"detail\" as const,\n\t\ttitle: \"Chrome DevTools Browser settings \u00B7 Read only\",\n\t\tlines: [\n\t\t\tsanitizeChromeDevtoolsDisplay(\n\t\t\t\t`Fix the active user settings before saving; the file will not be overwritten. ${reason}`,\n\t\t\t),\n\t\t],\n\t\thint: \"back\" as const,\n\t};\n}\n\nfunction settingsContextLines(load: SettingsLoadResult) {\n\tconst browser = load.effectiveBrowser;\n\treturn [\n\t\t`User settings \u00B7 ${load.paths.user}`,\n\t\t`Effective sources: endpoint ${browser.endpointSource} \u00B7 auto-launch ${browser.autoLaunchSource} \u00B7 executable ${browser.executablePathSource}`,\n\t\t...(load.notice ? [`Warning: ${load.notice}`] : []),\n\t].map((line) => sanitizeChromeDevtoolsDisplay(line));\n}\n\nfunction extensionDetailLines(load: SettingsLoadResult) {\n\tconst browser = load.effectiveBrowser;\n\treturn [\n\t\t`Effective source: ${browser.extensionPathsSource}`,\n\t\t...(browser.extensionPaths.length > 0\n\t\t\t? browser.extensionPaths.map((extensionPath) => `- ${extensionPath}`)\n\t\t\t: [\"No unpacked extensions are configured.\"]),\n\t\t\"Edit browser.extensionPaths in the user JSON or a trusted project JSON, then run /reload.\",\n\t\t\"Unpacked extensions execute privileged browser code; load only paths you trust.\",\n\t].map((line) => sanitizeChromeDevtoolsDisplay(line));\n}\n\nfunction notifyEffectiveSave(\n\tctx: CommandContext,\n\tsetting: string,\n\teffectiveValue: string,\n\tsource: BrowserSettingsSource,\n) {\n\tconst overrideNotice =\n\t\tsource === \"environment\" ? \" The deprecated environment override remains effective.\" : \"\";\n\tctx.ui.notify(\n\t\tsanitizeChromeDevtoolsDisplay(\n\t\t\t`Chrome DevTools ${setting} saved. Effective ${setting}: ${effectiveValue} (${source}).${overrideNotice}`,\n\t\t),\n\t\t\"info\",\n\t);\n}\n\nfunction notifySaveFailure(ctx: CommandContext, error: unknown) {\n\tctx.ui.notify(\n\t\tsanitizeChromeDevtoolsDisplay(\n\t\t\t`Chrome DevTools browser settings save failed; previous settings remain active: ${formatError(error)}`,\n\t\t),\n\t\t\"warning\",\n\t);\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": ["isCurrent"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/lazy-tools.ts", "../../src/tool-selector.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n\tdefineTool,\n\ttype ExtensionAPI,\n\ttype ExtensionContext,\n} from \"@earendil-works/pi-coding-agent\";\nimport { Type } from \"typebox\";\nimport { webMcpEnabled } from \"./runtime.js\";\nimport {\n\tCHROME_DEVTOOLS_TOOL_NAMES,\n\ttype ChromeDevToolsToolName,\n\tisWebMcpToolName,\n} 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;\nconst lazyExposureByApi = new WeakMap<ExtensionAPI, boolean>();\nconst sessionOwnerByApi = new WeakMap<ExtensionAPI, object>();\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\tchrome_devtools_webmcp_list_tools:\n\t\t\"list discover page provided website webmcp tools capabilities experimental\",\n\tchrome_devtools_webmcp_call_tool:\n\t\t\"call invoke page provided website webmcp tool confirmation experimental\",\n};\n\nexport function setChromeDevtoolsSessionOwner(pi: ExtensionAPI, owner: object) {\n\tsessionOwnerByApi.set(pi, owner);\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 configureChromeDevtoolsToolExposure(\n\tpi: ExtensionAPI,\n\tavailableTools: readonly ChromeDevToolsToolName[],\n\tmodel?: ExtensionContext[\"model\"],\n) {\n\tsetAvailableTools(pi, availableTools);\n\tconst available = effectiveAvailableTools(pi);\n\tconst lazyExposure = supportsNativeDeferredToolLoading(model);\n\tlazyExposureByApi.set(pi, lazyExposure);\n\tconst exposedTools = lazyExposure\n\t\t? []\n\t\t: CHROME_DEVTOOLS_TOOL_NAMES.filter((name) => available.has(name));\n\tconst nonCapabilityTools = pi\n\t\t.getActiveTools()\n\t\t.filter((name) => !CHROME_DEVTOOLS_TOOL_NAMES.includes(name as ChromeDevToolsToolName));\n\tpi.setActiveTools(\n\t\tunique([...nonCapabilityTools, CHROME_DEVTOOLS_LOAD_TOOL_NAME, ...exposedTools]),\n\t);\n}\n\nexport function requireEagerChromeDevtoolsToolExposure(pi: ExtensionAPI) {\n\tlazyExposureByApi.set(pi, false);\n\tconst active = pi.getActiveTools();\n\tconst available = availableChromeDevtoolsTools(pi);\n\tpi.setActiveTools(unique([...active, CHROME_DEVTOOLS_LOAD_TOOL_NAME, ...available]));\n}\n\nexport function applyAvailableChromeDevtoolsTools(\n\tpi: ExtensionAPI,\n\tavailableTools: readonly ChromeDevToolsToolName[],\n) {\n\tsetAvailableTools(pi, availableTools);\n\tconst available = effectiveAvailableTools(pi);\n\tconst lazyExposure = lazyExposureByApi.get(pi) === true;\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\t(lazyExposure && available.has(name as ChromeDevToolsToolName)),\n\t\t);\n\tconst eagerTools = lazyExposure\n\t\t? []\n\t\t: CHROME_DEVTOOLS_TOOL_NAMES.filter((name) => available.has(name));\n\tpi.setActiveTools(unique([...active, CHROME_DEVTOOLS_LOAD_TOOL_NAME, ...eagerTools]));\n}\n\nexport function chromeDevtoolsToolExposureMode(pi: ExtensionAPI) {\n\treturn lazyExposureByApi.get(pi) === true ? \"native deferred\" : \"eager\";\n}\n\nexport function supportsNativeDeferredToolLoading(model: ExtensionContext[\"model\"]): boolean {\n\tif (!model) return false;\n\tif (model.api === \"anthropic-messages\") {\n\t\tconst configured = compatBoolean(model.compat, \"supportsToolReferences\");\n\t\tif (configured !== undefined) return configured;\n\t\tif (model.provider !== \"anthropic\" || model.id.includes(\"haiku\")) return false;\n\t\tconst version = model.id.match(/^claude-(?:opus|sonnet|fable)-(\\d+)(?:-(\\d+))?(?:-|$)/);\n\t\tif (!version) return false;\n\t\tconst major = Number(version[1]);\n\t\tconst minor = version[2] && version[2].length < 8 ? Number(version[2]) : 0;\n\t\treturn major > 4 || (major === 4 && minor >= 5);\n\t}\n\tif (model.api === \"openai-completions\") {\n\t\treturn compatString(model.compat, \"deferredToolsMode\") === \"kimi\";\n\t}\n\tif (model.api === \"openai-responses\" || model.api === \"openai-codex-responses\") {\n\t\treturn (\n\t\t\tcompatBoolean(model.compat, \"supportsAdditionalTools\") === true ||\n\t\t\tcompatBoolean(model.compat, \"supportsToolSearch\") === true\n\t\t);\n\t}\n\treturn false;\n}\n\nexport function availableChromeDevtoolsTools(pi: ExtensionAPI) {\n\tconst available = effectiveAvailableTools(pi);\n\treturn CHROME_DEVTOOLS_TOOL_NAMES.filter((name) => available.has(name));\n}\n\nexport function configuredChromeDevtoolsTools(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, _onUpdate, ctx) {\n\t\t\tsignal?.throwIfAborted();\n\t\t\tsetChromeDevtoolsSessionOwner(pi, ctx.sessionManager);\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 effectiveAvailableTools(pi: ExtensionAPI) {\n\tconst configured = availableToolsByApi.get(pi) ?? new Set();\n\tconst owner = sessionOwnerByApi.get(pi);\n\tconst enabled = owner !== undefined && webMcpEnabled(owner);\n\treturn new Set(\n\t\tCHROME_DEVTOOLS_TOOL_NAMES.filter(\n\t\t\t(name) => configured.has(name) && (enabled || !isWebMcpToolName(name)),\n\t\t),\n\t);\n}\n\nfunction compatBoolean(value: unknown, key: string) {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n\tconst record = value as Record<string, unknown>;\n\treturn typeof record[key] === \"boolean\" ? record[key] : undefined;\n}\n\nfunction compatString(value: unknown, key: string) {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n\tconst record = value as Record<string, unknown>;\n\treturn typeof record[key] === \"string\" ? record[key] : undefined;\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\tmanagedBrowserForOwner,\n} from \"./browser-manager.js\";\nimport {\n\tapplyAvailableChromeDevtoolsTools,\n\tavailableChromeDevtoolsTools,\n\tCHROME_DEVTOOLS_LOAD_TOOL_NAME,\n\tchromeDevtoolsToolExposureMode,\n} from \"./lazy-tools.js\";\nimport { invalidateWebMcpOperations, state, webMcpEnabled } from \"./runtime.js\";\nimport { loadSettings, saveSettings, settingsFilePath } from \"./settings.js\";\nimport {\n\tCHROME_DEVTOOLS_TOOL_NAMES,\n\ttype ChromeDevToolsToolName,\n\tCORE_CHROME_DEVTOOLS_TOOL_NAMES,\n\tisWebMcpToolName,\n} 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\tcapabilityCount: 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, ctx.sessionManager);\n\tif (generation !== state.sessionGeneration) return;\n\tctx.ui.notify(`Chrome DevTools tool 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\tconst previousWebMcpTools = previousAvailableTools.filter(isWebMcpToolName);\n\t\tconst selectedWebMcpTools = selectedTools.filter(isWebMcpToolName);\n\t\tif (!arraysEqual(previousWebMcpTools, selectedWebMcpTools)) {\n\t\t\tinvalidateWebMcpOperations(\n\t\t\t\tctx.sessionManager,\n\t\t\t\t\"Chrome DevTools WebMCP gateway availability changed\",\n\t\t\t);\n\t\t}\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\tconst restoredChromeTools =\n\t\t\t\tchromeDevtoolsToolExposureMode(pi) === \"eager\"\n\t\t\t\t\t? previousAvailableTools\n\t\t\t\t\t: previousLoadedChromeTools;\n\t\t\tpi.setActiveTools(unique([...currentNonChromeTools, ...restoredChromeTools]));\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, owner: object): 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 capabilityCount = effectiveCatalog(owner).length;\n\tconst availabilityStatus =\n\t\tavailableChromeToolCount === capabilityCount\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\tcapabilityCount,\n\t};\n}\n\nexport async function buildToolStatusMessage(pi: ExtensionAPI, owner: object) {\n\tconst summary = getToolStatusSummary(pi, owner);\n\tconst persistedSetting = await persistedSettingLabel();\n\treturn sanitizeChromeDevtoolsDisplay(\n\t\t[\n\t\t\t`Chrome DevTools tools available: ${formatRuntimeStatus(summary)}`,\n\t\t\t`Tool exposure: ${chromeDevtoolsToolExposureMode(pi)}`,\n\t\t\t`Loaded capability tools this session: ${summary.loadedChromeToolCount}/${summary.capabilityCount}`,\n\t\t\t`WebMCP: ${webMcpEnabled(owner) ? \"enabled \u00B7 experimental \u00B7 confirmation required for every call\" : \"disabled \u00B7 experimental\"}`,\n\t\t\t`Loader: ${pi.getActiveTools().includes(CHROME_DEVTOOLS_LOAD_TOOL_NAME) ? \"active\" : \"inactive\"}`,\n\t\t\t`Persisted tool catalog: ${persistedSetting}`,\n\t\t\t...browserSettingsStatusLines(owner),\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(owner)}`,\n\t\t\t`Endpoint source: ${endpointSourceLabel()}`,\n\t\t\t`Launch mode: ${launchModeLabel(owner)}`,\n\t\t\t...launchAttemptLines(owner),\n\t\t].join(\"\\n\"),\n\t);\n}\n\nexport function buildQuickstartMessage(owner: object) {\n\treturn buildSettingsSetupMessage(owner);\n}\n\nexport function buildBrowserStatusMessage(owner?: object) {\n\tconst lifecycle = browserLifecycleState(owner);\n\tconst webMcpIsEnabled = owner ? webMcpEnabled(owner) : false;\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(owner)}`,\n\t\t\t`Endpoint source: ${endpointSourceLabel()}`,\n\t\t\t`Launch mode: ${launchModeLabel(owner)}`,\n\t\t\t`Unpacked extensions: ${state.extensionPaths.length} (${state.extensionPathsSource})`,\n\t\t\t`WebMCP: ${webMcpIsEnabled ? \"enabled \u00B7 experimental\" : \"disabled \u00B7 experimental\"}`,\n\t\t\t...(webMcpIsEnabled && !managedBrowserForOwner(owner)?.ready\n\t\t\t\t? [\n\t\t\t\t\t\t\"WebMCP warning: attached browser profiles may contain everyday authenticated sessions and sensitive state.\",\n\t\t\t\t\t]\n\t\t\t\t: []),\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(owner),\n\t\t\t...(needsRecovery ? [launchHint(), endpointConfigHint()] : []),\n\t\t].join(\"\\n\"),\n\t);\n}\n\nexport function buildSettingsSetupMessage(owner: object) {\n\treturn sanitizeChromeDevtoolsDisplay(\n\t\t[\n\t\t\t`Chrome DevTools endpoint: ${devToolsEndpoint(owner)}`,\n\t\t\t`Endpoint source: ${endpointSourceLabel()}`,\n\t\t\t`Launch mode: ${launchModeLabel(owner)}`,\n\t\t\t...browserSettingsStatusLines(owner),\n\t\t\tlaunchHint(),\n\t\t\tbrowserCandidateHint(),\n\t\t\t...launchAttemptLines(owner),\n\t\t\tendpointConfigHint(),\n\t\t].join(\"\\n\"),\n\t);\n}\n\nexport function sanitizeChromeDevtoolsDisplay(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\nfunction browserSettingsStatusLines(owner: object) {\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`WebMCP: ${webMcpEnabled(owner) ? \"enabled \u00B7 experimental \u00B7 every call requires confirmation\" : \"disabled \u00B7 experimental\"}`,\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(owner: object) {\n\treturn [\n\t\t\"Chrome DevTools commands:\",\n\t\t`WebMCP: ${webMcpEnabled(owner) ? \"enabled\" : \"disabled\"} \u00B7 experimental \u00B7 every page-provided call requires confirmation`,\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 available Chrome DevTools tools\",\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\",\n\t\t\"/chrome-devtools disable|off \u2014 make all Chrome DevTools capability tools unavailable\",\n\t].join(\"\\n\");\n}\n\nexport function allChromeDevtoolsTools(owner: object) {\n\treturn effectiveCatalog(owner);\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}/${summary.capabilityCount} 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\nfunction effectiveCatalog(owner: object): ChromeDevToolsToolName[] {\n\treturn webMcpEnabled(owner)\n\t\t? [...CHROME_DEVTOOLS_TOOL_NAMES]\n\t\t: [...CORE_CHROME_DEVTOOLS_TOOL_NAMES];\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": ["unique"]
|
|
7
|
-
}
|