@narumitw/pi-chrome-devtools 0.52.3 → 0.53.1
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 +62 -9
- package/dist/chunks/{browser-settings-menu-VWCNG4HB.js → browser-settings-menu-REIU7C3Q.js} +83 -7
- package/dist/chunks/browser-settings-menu-REIU7C3Q.js.map +7 -0
- package/dist/chunks/chunk-GTTYS5GT.js +384 -0
- package/dist/chunks/chunk-GTTYS5GT.js.map +7 -0
- package/dist/chunks/{chunk-RH6KESL3.js → chunk-SRT3UUIP.js} +473 -574
- package/dist/chunks/chunk-SRT3UUIP.js.map +7 -0
- package/dist/chunks/chunk-YJVYJ2L2.js +469 -0
- package/dist/chunks/chunk-YJVYJ2L2.js.map +7 -0
- package/dist/chunks/{menu-PLD3S3EO.js → menu-H5HMVGHI.js} +72 -39
- package/dist/chunks/menu-H5HMVGHI.js.map +7 -0
- package/dist/chunks/tools-6P7EUX37.js +964 -0
- package/dist/chunks/tools-6P7EUX37.js.map +7 -0
- package/dist/index.ts +166 -199
- package/dist/index.ts.map +4 -4
- package/package.json +4 -3
- package/src/browser-manager.ts +408 -169
- package/src/browser-settings-menu.ts +100 -5
- package/src/cdp-client.ts +347 -90
- package/src/chrome-devtools.ts +58 -11
- package/src/lazy-tools.ts +37 -4
- package/src/menu.ts +80 -39
- package/src/render.ts +12 -1
- package/src/runtime.ts +92 -0
- package/src/settings.ts +47 -10
- package/src/tool-names.ts +16 -1
- package/src/tool-selector.ts +85 -44
- package/src/tools.ts +91 -15
- package/src/webmcp/discovery.ts +235 -0
- package/src/webmcp/policy.ts +409 -0
- package/src/webmcp/protocol.ts +426 -0
- package/src/webmcp/tools.ts +190 -0
- package/dist/chunks/browser-settings-menu-VWCNG4HB.js.map +0 -7
- package/dist/chunks/chunk-RH6KESL3.js.map +0 -7
- package/dist/chunks/menu-PLD3S3EO.js.map +0 -7
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
// @generated by scripts/build-runtime.mjs; do not edit.
|
|
2
2
|
// @ts-nocheck -- the generated entry uses a .ts extension for Pi's Jiti loader.
|
|
3
3
|
import {
|
|
4
|
-
CHROME_DEVTOOLS_TOOL_NAMES,
|
|
5
4
|
availableChromeDevtoolsTools,
|
|
6
|
-
browserLifecycleState,
|
|
7
5
|
buildBrowserStatusMessage,
|
|
8
6
|
buildCommandGuide,
|
|
7
|
+
sanitizeChromeDevtoolsDisplay,
|
|
8
|
+
setSelectedChromeDevtoolsTools
|
|
9
|
+
} from "./chunk-YJVYJ2L2.js";
|
|
10
|
+
import {
|
|
11
|
+
CHROME_DEVTOOLS_TOOL_NAMES,
|
|
12
|
+
CORE_CHROME_DEVTOOLS_TOOL_NAMES,
|
|
13
|
+
browserLifecycleState,
|
|
9
14
|
devToolsEndpoint,
|
|
15
|
+
launchAttemptLines,
|
|
10
16
|
launchModeLabel,
|
|
11
17
|
loadSettings,
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
} from "./chunk-RH6KESL3.js";
|
|
18
|
+
state,
|
|
19
|
+
webMcpEnabled
|
|
20
|
+
} from "./chunk-SRT3UUIP.js";
|
|
16
21
|
|
|
17
22
|
// src/menu.ts
|
|
18
23
|
import { defineMenu, runMenu, runTask } from "@narumitw/pi-tui-kit";
|
|
@@ -36,6 +41,14 @@ var TOOL_PRESENTATION = {
|
|
|
36
41
|
chrome_devtools_screenshot: {
|
|
37
42
|
label: "Capture a screenshot",
|
|
38
43
|
description: "Save a PNG of the selected page (chrome_devtools_screenshot)."
|
|
44
|
+
},
|
|
45
|
+
chrome_devtools_webmcp_list_tools: {
|
|
46
|
+
label: "List page WebMCP tools \xB7 Experimental",
|
|
47
|
+
description: "Discover page-provided WebMCP capabilities (chrome_devtools_webmcp_list_tools)."
|
|
48
|
+
},
|
|
49
|
+
chrome_devtools_webmcp_call_tool: {
|
|
50
|
+
label: "Call a page WebMCP tool \xB7 Experimental",
|
|
51
|
+
description: "Invoke a listed page tool after confirmation (chrome_devtools_webmcp_call_tool)."
|
|
39
52
|
}
|
|
40
53
|
};
|
|
41
54
|
async function showChromeDevtoolsMenu(pi, ctx, generation) {
|
|
@@ -49,7 +62,7 @@ async function showChromeDevtoolsMenu(pi, ctx, generation) {
|
|
|
49
62
|
main: ({ state: current }) => ({
|
|
50
63
|
kind: "actions",
|
|
51
64
|
title: "Chrome DevTools",
|
|
52
|
-
lines: mainStateLines(current),
|
|
65
|
+
lines: mainStateLines(current, ctx.sessionManager),
|
|
53
66
|
items: [
|
|
54
67
|
{
|
|
55
68
|
id: "tools",
|
|
@@ -61,8 +74,8 @@ async function showChromeDevtoolsMenu(pi, ctx, generation) {
|
|
|
61
74
|
},
|
|
62
75
|
{
|
|
63
76
|
id: "bulk",
|
|
64
|
-
label: current.activeTools.length ===
|
|
65
|
-
description: current.activeTools.length ===
|
|
77
|
+
label: current.activeTools.length === availableCatalogNames(ctx.sessionManager).length ? "Make all browser tools unavailable\u2026" : "Make all browser tools available\u2026",
|
|
78
|
+
description: current.activeTools.length === availableCatalogNames(ctx.sessionManager).length ? `Preview 0 of ${availableCatalogNames(ctx.sessionManager).length}; other active tools stay enabled.` : `Preview ${availableCatalogNames(ctx.sessionManager).length} of ${availableCatalogNames(ctx.sessionManager).length}; other active tools stay enabled.`,
|
|
66
79
|
disabled: Boolean(current.mutationBlockedReason),
|
|
67
80
|
disabledReason: current.mutationBlockedReason,
|
|
68
81
|
action: "bulk"
|
|
@@ -91,7 +104,7 @@ async function showChromeDevtoolsMenu(pi, ctx, generation) {
|
|
|
91
104
|
browserStatus: () => ({
|
|
92
105
|
kind: "review",
|
|
93
106
|
title: "Browser status",
|
|
94
|
-
content: buildBrowserStatusMessage(),
|
|
107
|
+
content: buildBrowserStatusMessage(ctx.sessionManager),
|
|
95
108
|
format: { kind: "text" },
|
|
96
109
|
viewportSize: "adaptive",
|
|
97
110
|
hint: "back"
|
|
@@ -99,7 +112,7 @@ async function showChromeDevtoolsMenu(pi, ctx, generation) {
|
|
|
99
112
|
help: () => ({
|
|
100
113
|
kind: "review",
|
|
101
114
|
title: "Chrome DevTools help",
|
|
102
|
-
content: buildCommandGuide(),
|
|
115
|
+
content: buildCommandGuide(ctx.sessionManager),
|
|
103
116
|
format: { kind: "text" },
|
|
104
117
|
viewportSize: "adaptive",
|
|
105
118
|
hint: "back"
|
|
@@ -114,7 +127,7 @@ async function showChromeDevtoolsMenu(pi, ctx, generation) {
|
|
|
114
127
|
return result?.closeParent ? { kind: "close" } : { kind: "stay" };
|
|
115
128
|
},
|
|
116
129
|
bulk: async ({ state: current }) => {
|
|
117
|
-
const selectedTools = current.activeTools.length ===
|
|
130
|
+
const selectedTools = current.activeTools.length === availableCatalogNames(ctx.sessionManager).length ? [] : availableCatalogNames(ctx.sessionManager);
|
|
118
131
|
const result = await showChromeDevtoolsToolWorkflow(pi, ctx, generation, {
|
|
119
132
|
snapshot: current,
|
|
120
133
|
initialDraft: selectedTools,
|
|
@@ -123,11 +136,14 @@ async function showChromeDevtoolsMenu(pi, ctx, generation) {
|
|
|
123
136
|
if (result?.applied && isCurrent()) updateSnapshotAfterApply(current, result.selectedTools);
|
|
124
137
|
return result?.closeParent ? { kind: "close" } : { kind: "stay" };
|
|
125
138
|
},
|
|
126
|
-
settings: async () => {
|
|
127
|
-
const { showChromeDevtoolsBrowserSettings } = await import("./browser-settings-menu-
|
|
139
|
+
settings: async ({ state: current }) => {
|
|
140
|
+
const { showChromeDevtoolsBrowserSettings } = await import("./browser-settings-menu-REIU7C3Q.js");
|
|
128
141
|
if (!isCurrent()) return { kind: "stay" };
|
|
129
|
-
const result = await showChromeDevtoolsBrowserSettings(ctx, generation);
|
|
142
|
+
const result = await showChromeDevtoolsBrowserSettings(pi, ctx, generation);
|
|
130
143
|
if (!isCurrent()) return { kind: "stay" };
|
|
144
|
+
const refreshed = await loadChromeDevtoolsMenuSnapshot(pi, ctx);
|
|
145
|
+
if (!isCurrent()) return { kind: "stay" };
|
|
146
|
+
Object.assign(current, refreshed);
|
|
131
147
|
return result.closeParent ? { kind: "close" } : { kind: "stay" };
|
|
132
148
|
}
|
|
133
149
|
}
|
|
@@ -160,9 +176,9 @@ async function showChromeDevtoolsToolWorkflow(pi, ctx, generation, options = {})
|
|
|
160
176
|
screens: {
|
|
161
177
|
tools: ({ state: current }) => ({
|
|
162
178
|
kind: "multiSelect",
|
|
163
|
-
title: `Browser tools (${current.draft.size}/${
|
|
164
|
-
lines: toolDraftLines(current),
|
|
165
|
-
items:
|
|
179
|
+
title: `Browser tools (${current.draft.size}/${availableCatalogNames(ctx.sessionManager).length})`,
|
|
180
|
+
lines: toolDraftLines(current, ctx.sessionManager),
|
|
181
|
+
items: availableCatalogNames(ctx.sessionManager).map((toolName) => ({
|
|
166
182
|
id: toolName,
|
|
167
183
|
label: TOOL_PRESENTATION[toolName].label,
|
|
168
184
|
description: TOOL_PRESENTATION[toolName].description,
|
|
@@ -202,10 +218,10 @@ async function showChromeDevtoolsToolWorkflow(pi, ctx, generation, options = {})
|
|
|
202
218
|
kind: "review",
|
|
203
219
|
title: "Review tool changes",
|
|
204
220
|
lines: [
|
|
205
|
-
`Currently available: ${current.accepted.size}/${
|
|
206
|
-
`Proposed availability: ${current.draft.size}/${
|
|
221
|
+
`Currently available: ${current.accepted.size}/${availableCatalogNames(ctx.sessionManager).length}`,
|
|
222
|
+
`Proposed availability: ${current.draft.size}/${availableCatalogNames(ctx.sessionManager).length}`
|
|
207
223
|
],
|
|
208
|
-
content: buildToolReview(current),
|
|
224
|
+
content: buildToolReview(current, ctx.sessionManager),
|
|
209
225
|
format: { kind: "text" },
|
|
210
226
|
viewportSize: "adaptive",
|
|
211
227
|
...current.mutationBlockedReason || setsEqual(current.accepted, current.draft) ? {} : {
|
|
@@ -227,7 +243,7 @@ async function showChromeDevtoolsToolWorkflow(pi, ctx, generation, options = {})
|
|
|
227
243
|
return { kind: "stay" };
|
|
228
244
|
},
|
|
229
245
|
selectAll: ({ state: current }) => {
|
|
230
|
-
current.draft = new Set(
|
|
246
|
+
current.draft = new Set(availableCatalogNames(ctx.sessionManager));
|
|
231
247
|
return { kind: "stay" };
|
|
232
248
|
},
|
|
233
249
|
selectNone: ({ state: current }) => {
|
|
@@ -257,7 +273,7 @@ async function showChromeDevtoolsToolWorkflow(pi, ctx, generation, options = {})
|
|
|
257
273
|
current.draft = new Set(selectedTools);
|
|
258
274
|
current.applied = true;
|
|
259
275
|
ctx.ui.notify(
|
|
260
|
-
`Saved: ${selectedTools.length} of ${
|
|
276
|
+
`Saved: ${selectedTools.length} of ${availableCatalogNames(ctx.sessionManager).length} browser tools available.`,
|
|
261
277
|
"info"
|
|
262
278
|
);
|
|
263
279
|
return { kind: "close" };
|
|
@@ -297,6 +313,13 @@ async function loadSnapshotWithFeedback(pi, ctx, generation) {
|
|
|
297
313
|
});
|
|
298
314
|
return result.kind === "completed" ? result.value : void 0;
|
|
299
315
|
}
|
|
316
|
+
async function loadChromeDevtoolsMenuSnapshot(pi, ctx) {
|
|
317
|
+
const settings = await loadSettings({
|
|
318
|
+
cwd: ctx.cwd,
|
|
319
|
+
projectTrusted: ctx.isProjectTrusted()
|
|
320
|
+
});
|
|
321
|
+
return buildMenuSnapshot(pi, settings);
|
|
322
|
+
}
|
|
300
323
|
function buildMenuSnapshot(pi, settings) {
|
|
301
324
|
const activeTools = activeChromeTools(pi);
|
|
302
325
|
const persistedTools = settings.kind === "loaded" && settings.settings.tools ? orderedTools(new Set(settings.settings.tools)) : void 0;
|
|
@@ -311,41 +334,47 @@ function buildMenuSnapshot(pi, settings) {
|
|
|
311
334
|
...settingsWarning ? { settingsWarning } : {}
|
|
312
335
|
};
|
|
313
336
|
}
|
|
314
|
-
function mainStateLines(snapshot) {
|
|
337
|
+
function mainStateLines(snapshot, owner) {
|
|
338
|
+
const launchError = launchAttemptLines(owner).find(
|
|
339
|
+
(line) => line.startsWith("Last launch error:")
|
|
340
|
+
);
|
|
315
341
|
return sanitizeLines([
|
|
316
|
-
`Tool catalog: ${snapshot.activeTools.length} of ${
|
|
317
|
-
`
|
|
318
|
-
`
|
|
342
|
+
`Tool catalog: ${snapshot.activeTools.length} of ${availableCatalogNames(owner).length} available \xB7 ${snapshot.persistenceLabel}`,
|
|
343
|
+
`WebMCP: ${webMcpEnabled(owner) ? "enabled \xB7 experimental \xB7 confirmation required for every call" : "disabled \xB7 experimental"}`,
|
|
344
|
+
`Browser: ${browserLifecycleSummary(owner)}`,
|
|
345
|
+
`Endpoint: ${devToolsEndpoint(owner)}`,
|
|
319
346
|
...snapshot.settingsWarning ? [`Settings warning: ${snapshot.settingsWarning}`] : [],
|
|
320
|
-
...
|
|
347
|
+
...launchError ? [`Launch warning: ${launchError.slice("Last launch error: ".length)}`] : []
|
|
321
348
|
]);
|
|
322
349
|
}
|
|
323
|
-
function browserLifecycleSummary() {
|
|
324
|
-
const lifecycle = browserLifecycleState();
|
|
350
|
+
function browserLifecycleSummary(owner) {
|
|
351
|
+
const lifecycle = browserLifecycleState(owner);
|
|
325
352
|
if (lifecycle === "starting") return "starting managed browser";
|
|
326
353
|
if (lifecycle === "running") return "managed browser running";
|
|
327
354
|
if (lifecycle === "exited") return "managed browser exited \xB7 open Browser status to recover";
|
|
328
355
|
if (lifecycle === "failed") return "last launch failed \xB7 open Browser status to recover";
|
|
329
|
-
const launchMode = launchModeLabel();
|
|
356
|
+
const launchMode = launchModeLabel(owner);
|
|
330
357
|
return launchMode.startsWith("attach first") ? "not started \xB7 attaches or launches on first use" : `not started \xB7 ${launchMode}`;
|
|
331
358
|
}
|
|
332
|
-
function toolDraftLines(current) {
|
|
359
|
+
function toolDraftLines(current, owner) {
|
|
333
360
|
if (current.mutationBlockedReason)
|
|
334
361
|
return sanitizeLines([`Unavailable: ${current.mutationBlockedReason}`]);
|
|
335
362
|
const changes = symmetricDifferenceSize(current.accepted, current.draft);
|
|
336
363
|
return [
|
|
337
|
-
`Currently available: ${current.accepted.size}/${
|
|
364
|
+
`Currently available: ${current.accepted.size}/${availableCatalogNames(owner).length}`,
|
|
338
365
|
changes === 0 ? "No unapplied changes \xB7 Escape cancels" : `${changes} unapplied ${changes === 1 ? "change" : "changes"} \xB7 Escape cancels`,
|
|
366
|
+
`WebMCP gateways: ${webMcpEnabled(owner) ? "available for selection \xB7 experimental" : "hidden while experimental WebMCP is disabled"}`,
|
|
339
367
|
"Changes are not applied until Review changes and Apply tool changes."
|
|
340
368
|
];
|
|
341
369
|
}
|
|
342
|
-
function buildToolReview(current) {
|
|
343
|
-
const
|
|
344
|
-
const
|
|
370
|
+
function buildToolReview(current, owner) {
|
|
371
|
+
const catalog = availableCatalogNames(owner);
|
|
372
|
+
const available = catalog.filter((name) => current.draft.has(name));
|
|
373
|
+
const unavailable = catalog.filter((name) => !current.draft.has(name));
|
|
345
374
|
return sanitizeChromeDevtoolsDisplay(
|
|
346
375
|
[
|
|
347
|
-
`Current available browser tools: ${current.accepted.size}/${
|
|
348
|
-
`Proposed available browser tools: ${current.draft.size}/${
|
|
376
|
+
`Current available browser tools: ${current.accepted.size}/${catalog.length}`,
|
|
377
|
+
`Proposed available browser tools: ${current.draft.size}/${catalog.length}`,
|
|
349
378
|
"",
|
|
350
379
|
"Available after apply:",
|
|
351
380
|
...available.length > 0 ? available.map((name) => ` - ${TOOL_PRESENTATION[name].label} (${name})`) : [" - none"],
|
|
@@ -388,11 +417,15 @@ function arraysEqual(left, right) {
|
|
|
388
417
|
function sanitizeLines(lines) {
|
|
389
418
|
return sanitizeChromeDevtoolsDisplay(lines.join("\n")).split("\n");
|
|
390
419
|
}
|
|
420
|
+
function availableCatalogNames(owner) {
|
|
421
|
+
return webMcpEnabled(owner) ? [...CHROME_DEVTOOLS_TOOL_NAMES] : [...CORE_CHROME_DEVTOOLS_TOOL_NAMES];
|
|
422
|
+
}
|
|
391
423
|
function formatError(error) {
|
|
392
424
|
return error instanceof Error ? error.message : String(error);
|
|
393
425
|
}
|
|
394
426
|
export {
|
|
427
|
+
loadChromeDevtoolsMenuSnapshot,
|
|
395
428
|
showChromeDevtoolsMenu,
|
|
396
429
|
showChromeDevtoolsToolWorkflow
|
|
397
430
|
};
|
|
398
|
-
//# sourceMappingURL=menu-
|
|
431
|
+
//# sourceMappingURL=menu-H5HMVGHI.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/menu.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ExtensionAPI, ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { defineMenu, runMenu, runTask } from \"@narumitw/pi-tui-kit\";\nimport {\n\tbrowserLifecycleState,\n\tdevToolsEndpoint,\n\tlaunchAttemptLines,\n\tlaunchModeLabel,\n} from \"./browser-manager.js\";\nimport { availableChromeDevtoolsTools } from \"./lazy-tools.js\";\nimport { state, webMcpEnabled } from \"./runtime.js\";\nimport { loadSettings, type SettingsLoadResult } from \"./settings.js\";\nimport {\n\tCHROME_DEVTOOLS_TOOL_NAMES,\n\ttype ChromeDevToolsToolName,\n\tCORE_CHROME_DEVTOOLS_TOOL_NAMES,\n} from \"./tool-names.js\";\nimport {\n\tbuildBrowserStatusMessage,\n\tbuildCommandGuide,\n\tsanitizeChromeDevtoolsDisplay,\n\tsetSelectedChromeDevtoolsTools,\n} from \"./tool-selector.js\";\n\ntype CommandContext = ExtensionCommandContext;\ntype MainScreen = \"main\" | \"browserStatus\" | \"help\";\ntype MainAction = \"tools\" | \"bulk\" | \"settings\";\ntype ToolScreen = \"tools\" | \"review\";\ntype ToolAction = \"toggle\" | \"selectAll\" | \"selectNone\" | \"review\" | \"apply\" | \"cancel\";\n\ninterface MenuSnapshot {\n\tactiveTools: ChromeDevToolsToolName[];\n\tpersistenceLabel: string;\n\tmutationBlockedReason?: string;\n\tsettingsWarning?: string;\n}\n\ninterface ToolWorkflowState {\n\taccepted: Set<ChromeDevToolsToolName>;\n\tdraft: Set<ChromeDevToolsToolName>;\n\tmutationBlockedReason?: string;\n\tgeneration: number;\n\tapplied: boolean;\n}\n\nconst TOOL_PRESENTATION: Record<ChromeDevToolsToolName, { label: string; description: string }> = {\n\tchrome_devtools_list_pages: {\n\t\tlabel: \"List open pages\",\n\t\tdescription: \"List inspectable Chrome tabs and pages (chrome_devtools_list_pages).\",\n\t},\n\tchrome_devtools_select_page: {\n\t\tlabel: \"Select the active page\",\n\t\tdescription: \"Choose the page later browser actions use (chrome_devtools_select_page).\",\n\t},\n\tchrome_devtools_navigate: {\n\t\tlabel: \"Navigate a page\",\n\t\tdescription: \"Open a URL, creating a page when needed (chrome_devtools_navigate).\",\n\t},\n\tchrome_devtools_evaluate: {\n\t\tlabel: \"Run JavaScript\",\n\t\tdescription: \"Evaluate JavaScript in the selected page (chrome_devtools_evaluate).\",\n\t},\n\tchrome_devtools_screenshot: {\n\t\tlabel: \"Capture a screenshot\",\n\t\tdescription: \"Save a PNG of the selected page (chrome_devtools_screenshot).\",\n\t},\n\tchrome_devtools_webmcp_list_tools: {\n\t\tlabel: \"List page WebMCP tools \u00B7 Experimental\",\n\t\tdescription: \"Discover page-provided WebMCP capabilities (chrome_devtools_webmcp_list_tools).\",\n\t},\n\tchrome_devtools_webmcp_call_tool: {\n\t\tlabel: \"Call a page WebMCP tool \u00B7 Experimental\",\n\t\tdescription: \"Invoke a listed page tool after confirmation (chrome_devtools_webmcp_call_tool).\",\n\t},\n};\n\nexport async function showChromeDevtoolsMenu(\n\tpi: ExtensionAPI,\n\tctx: CommandContext,\n\tgeneration: number,\n) {\n\tconst snapshot = await loadSnapshotWithFeedback(pi, ctx, generation);\n\tif (!snapshot) return;\n\tconst menuSignal = state.sessionController.signal;\n\tconst isCurrent = () => generation === state.sessionGeneration && !menuSignal.aborted;\n\tconst menu = defineMenu<MenuSnapshot, MainScreen, MainAction>({\n\t\tstart: \"main\",\n\t\tscreens: {\n\t\t\tmain: ({ state: current }) => ({\n\t\t\t\tkind: \"actions\",\n\t\t\t\ttitle: \"Chrome DevTools\",\n\t\t\t\tlines: mainStateLines(current, ctx.sessionManager),\n\t\t\t\titems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"tools\",\n\t\t\t\t\t\tlabel: \"Choose available browser tools\u2026\",\n\t\t\t\t\t\tdescription: \"Choose which capabilities the loader may expose.\",\n\t\t\t\t\t\tdisabled: Boolean(current.mutationBlockedReason),\n\t\t\t\t\t\tdisabledReason: current.mutationBlockedReason,\n\t\t\t\t\t\taction: \"tools\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"bulk\",\n\t\t\t\t\t\tlabel:\n\t\t\t\t\t\t\tcurrent.activeTools.length === availableCatalogNames(ctx.sessionManager).length\n\t\t\t\t\t\t\t\t? \"Make all browser tools unavailable\u2026\"\n\t\t\t\t\t\t\t\t: \"Make all browser tools available\u2026\",\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\tcurrent.activeTools.length === availableCatalogNames(ctx.sessionManager).length\n\t\t\t\t\t\t\t\t? `Preview 0 of ${availableCatalogNames(ctx.sessionManager).length}; other active tools stay enabled.`\n\t\t\t\t\t\t\t\t: `Preview ${availableCatalogNames(ctx.sessionManager).length} of ${availableCatalogNames(ctx.sessionManager).length}; other active tools stay enabled.`,\n\t\t\t\t\t\tdisabled: Boolean(current.mutationBlockedReason),\n\t\t\t\t\t\tdisabledReason: current.mutationBlockedReason,\n\t\t\t\t\t\taction: \"bulk\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"browser-status\",\n\t\t\t\t\t\tlabel: \"Browser status\",\n\t\t\t\t\t\tdescription: \"Runtime, endpoint, and last launch attempt.\",\n\t\t\t\t\t\tto: \"browserStatus\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"settings\",\n\t\t\t\t\t\tlabel: \"Browser settings\",\n\t\t\t\t\t\tdescription: \"Edit endpoint, auto-launch, and browser executable settings.\",\n\t\t\t\t\t\taction: \"settings\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"help\",\n\t\t\t\t\t\tlabel: \"Help\",\n\t\t\t\t\t\tdescription: \"Commands and usage.\",\n\t\t\t\t\t\tto: \"help\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\thint: \"close\",\n\t\t\t}),\n\t\t\tbrowserStatus: () => ({\n\t\t\t\tkind: \"review\",\n\t\t\t\ttitle: \"Browser status\",\n\t\t\t\tcontent: buildBrowserStatusMessage(ctx.sessionManager),\n\t\t\t\tformat: { kind: \"text\" },\n\t\t\t\tviewportSize: \"adaptive\",\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t\thelp: () => ({\n\t\t\t\tkind: \"review\",\n\t\t\t\ttitle: \"Chrome DevTools help\",\n\t\t\t\tcontent: buildCommandGuide(ctx.sessionManager),\n\t\t\t\tformat: { kind: \"text\" },\n\t\t\t\tviewportSize: \"adaptive\",\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t},\n\t\tactions: {\n\t\t\ttools: async ({ state: current }) => {\n\t\t\t\tconst result = await showChromeDevtoolsToolWorkflow(pi, ctx, generation, {\n\t\t\t\t\tsnapshot: current,\n\t\t\t\t});\n\t\t\t\tif (result?.applied && isCurrent()) updateSnapshotAfterApply(current, result.selectedTools);\n\t\t\t\treturn result?.closeParent ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\tbulk: async ({ state: current }) => {\n\t\t\t\tconst selectedTools =\n\t\t\t\t\tcurrent.activeTools.length === availableCatalogNames(ctx.sessionManager).length\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: availableCatalogNames(ctx.sessionManager);\n\t\t\t\tconst result = await showChromeDevtoolsToolWorkflow(pi, ctx, generation, {\n\t\t\t\t\tsnapshot: current,\n\t\t\t\t\tinitialDraft: selectedTools,\n\t\t\t\t\tstartAtReview: true,\n\t\t\t\t});\n\t\t\t\tif (result?.applied && isCurrent()) updateSnapshotAfterApply(current, result.selectedTools);\n\t\t\t\treturn result?.closeParent ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t\tsettings: async ({ state: current }) => {\n\t\t\t\tconst { showChromeDevtoolsBrowserSettings } = await import(\"./browser-settings-menu.js\");\n\t\t\t\tif (!isCurrent()) return { kind: \"stay\" };\n\t\t\t\tconst result = await showChromeDevtoolsBrowserSettings(pi, ctx, generation);\n\t\t\t\tif (!isCurrent()) return { kind: \"stay\" };\n\t\t\t\tconst refreshed = await loadChromeDevtoolsMenuSnapshot(pi, ctx);\n\t\t\t\tif (!isCurrent()) return { kind: \"stay\" };\n\t\t\t\tObject.assign(current, refreshed);\n\t\t\t\treturn result.closeParent ? { kind: \"close\" } : { kind: \"stay\" };\n\t\t\t},\n\t\t},\n\t});\n\tawait runMenu(ctx, menu, {\n\t\tgetState: () => snapshot,\n\t\tsignal: menuSignal,\n\t\tisCurrent,\n\t\tonError: (currentCtx, error) =>\n\t\t\tcurrentCtx.ui.notify(\n\t\t\t\tsanitizeChromeDevtoolsDisplay(`Chrome DevTools menu failed: ${formatError(error)}`),\n\t\t\t\t\"error\",\n\t\t\t),\n\t});\n}\n\nexport async function showChromeDevtoolsToolWorkflow(\n\tpi: ExtensionAPI,\n\tctx: CommandContext,\n\tgeneration: number,\n\toptions: {\n\t\tsnapshot?: MenuSnapshot;\n\t\tinitialDraft?: readonly ChromeDevToolsToolName[];\n\t\tstartAtReview?: boolean;\n\t} = {},\n): Promise<\n\t{ applied: boolean; closeParent: boolean; selectedTools: ChromeDevToolsToolName[] } | undefined\n> {\n\tconst snapshot = options.snapshot ?? (await loadSnapshotWithFeedback(pi, ctx, generation));\n\tif (!snapshot) return undefined;\n\tconst menuSignal = state.sessionController.signal;\n\tconst isCurrent = () => generation === state.sessionGeneration && !menuSignal.aborted;\n\tconst accepted = new Set(snapshot.activeTools);\n\tconst workflow: ToolWorkflowState = {\n\t\taccepted,\n\t\tdraft: new Set(options.initialDraft ?? snapshot.activeTools),\n\t\tmutationBlockedReason: snapshot.mutationBlockedReason,\n\t\tgeneration,\n\t\tapplied: false,\n\t};\n\tconst menu = defineMenu<ToolWorkflowState, ToolScreen, ToolAction>({\n\t\tstart: options.startAtReview ? \"review\" : \"tools\",\n\t\tscreens: {\n\t\t\ttools: ({ state: current }) => ({\n\t\t\t\tkind: \"multiSelect\",\n\t\t\t\ttitle: `Browser tools (${current.draft.size}/${availableCatalogNames(ctx.sessionManager).length})`,\n\t\t\t\tlines: toolDraftLines(current, ctx.sessionManager),\n\t\t\t\titems: availableCatalogNames(ctx.sessionManager).map((toolName) => ({\n\t\t\t\t\tid: toolName,\n\t\t\t\t\tlabel: TOOL_PRESENTATION[toolName].label,\n\t\t\t\t\tdescription: TOOL_PRESENTATION[toolName].description,\n\t\t\t\t\tsearchText: `${toolName} ${TOOL_PRESENTATION[toolName].description}`,\n\t\t\t\t\tselected: current.draft.has(toolName),\n\t\t\t\t\tdisabled: Boolean(current.mutationBlockedReason),\n\t\t\t\t\tdisabledReason: current.mutationBlockedReason,\n\t\t\t\t})),\n\t\t\t\taction: \"toggle\",\n\t\t\t\tactions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"select-all\",\n\t\t\t\t\t\tlabel: \"Select all\",\n\t\t\t\t\t\tdisabled: Boolean(current.mutationBlockedReason),\n\t\t\t\t\t\tdisabledReason: current.mutationBlockedReason,\n\t\t\t\t\t\taction: \"selectAll\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"select-none\",\n\t\t\t\t\t\tlabel: \"Select none\",\n\t\t\t\t\t\tdisabled: Boolean(current.mutationBlockedReason),\n\t\t\t\t\t\tdisabledReason: current.mutationBlockedReason,\n\t\t\t\t\t\taction: \"selectNone\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"review\",\n\t\t\t\t\t\tlabel: \"Review changes\u2026\",\n\t\t\t\t\t\tdisabled:\n\t\t\t\t\t\t\tBoolean(current.mutationBlockedReason) || setsEqual(current.accepted, current.draft),\n\t\t\t\t\t\tdisabledReason:\n\t\t\t\t\t\t\tcurrent.mutationBlockedReason ??\n\t\t\t\t\t\t\t(setsEqual(current.accepted, current.draft) ? \"No unapplied changes\" : undefined),\n\t\t\t\t\t\tto: \"review\",\n\t\t\t\t\t},\n\t\t\t\t\t{ id: \"cancel\", label: \"Cancel\", action: \"cancel\" },\n\t\t\t\t],\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t\treview: ({ state: current }) => ({\n\t\t\t\tkind: \"review\",\n\t\t\t\ttitle: \"Review tool changes\",\n\t\t\t\tlines: [\n\t\t\t\t\t`Currently available: ${current.accepted.size}/${availableCatalogNames(ctx.sessionManager).length}`,\n\t\t\t\t\t`Proposed availability: ${current.draft.size}/${availableCatalogNames(ctx.sessionManager).length}`,\n\t\t\t\t],\n\t\t\t\tcontent: buildToolReview(current, ctx.sessionManager),\n\t\t\t\tformat: { kind: \"text\" },\n\t\t\t\tviewportSize: \"adaptive\",\n\t\t\t\t...(current.mutationBlockedReason || setsEqual(current.accepted, current.draft)\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tconfirm: {\n\t\t\t\t\t\t\t\tid: \"apply\",\n\t\t\t\t\t\t\t\tlabel: \"Apply tool changes\",\n\t\t\t\t\t\t\t\taction: \"apply\" as const,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\thint: \"back\",\n\t\t\t}),\n\t\t},\n\t\tactions: {\n\t\t\ttoggle: ({ state: current, itemId, selected }) => {\n\t\t\t\tif (!isChromeDevtoolsToolName(itemId) || selected === undefined)\n\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\tif (selected) current.draft.add(itemId);\n\t\t\t\telse current.draft.delete(itemId);\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tselectAll: ({ state: current }) => {\n\t\t\t\tcurrent.draft = new Set(availableCatalogNames(ctx.sessionManager));\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\tselectNone: ({ state: current }) => {\n\t\t\t\tcurrent.draft = new Set();\n\t\t\t\treturn { kind: \"stay\" };\n\t\t\t},\n\t\t\treview: () => ({ kind: \"to\", screen: \"review\" }),\n\t\t\tcancel: () => ({ kind: \"back\" }),\n\t\t\tapply: async ({ state: current, signal }) => {\n\t\t\t\tawait ctx.waitForIdle();\n\t\t\t\tif (signal.aborted || !isCurrent() || current.generation !== state.sessionGeneration) {\n\t\t\t\t\treturn { kind: \"rejected\" };\n\t\t\t\t}\n\t\t\t\tconst selectedTools = orderedTools(current.draft);\n\t\t\t\tconst saveResult = await setSelectedChromeDevtoolsTools(\n\t\t\t\t\tpi,\n\t\t\t\t\tctx,\n\t\t\t\t\tselectedTools,\n\t\t\t\t\torderedTools(current.accepted),\n\t\t\t\t);\n\t\t\t\tif (!isCurrent()) return { kind: \"rejected\" };\n\t\t\t\tif (saveResult === \"active-tools-changed\") {\n\t\t\t\t\tcurrent.accepted = new Set(activeChromeTools(pi));\n\t\t\t\t}\n\t\t\t\tif (saveResult !== \"saved\") return { kind: \"rejected\" };\n\t\t\t\tcurrent.accepted = new Set(selectedTools);\n\t\t\t\tcurrent.draft = new Set(selectedTools);\n\t\t\t\tcurrent.applied = true;\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Saved: ${selectedTools.length} of ${availableCatalogNames(ctx.sessionManager).length} browser tools available.`,\n\t\t\t\t\t\"info\",\n\t\t\t\t);\n\t\t\t\treturn { kind: \"close\" };\n\t\t\t},\n\t\t},\n\t});\n\tconst result = await runMenu(ctx, menu, {\n\t\tgetState: () => workflow,\n\t\tsignal: menuSignal,\n\t\tisCurrent,\n\t\tonError: (currentCtx, error) =>\n\t\t\tcurrentCtx.ui.notify(\n\t\t\t\tsanitizeChromeDevtoolsDisplay(\n\t\t\t\t\t`Chrome DevTools tool selection failed: ${formatError(error)}`,\n\t\t\t\t),\n\t\t\t\t\"error\",\n\t\t\t),\n\t});\n\treturn {\n\t\tapplied: workflow.applied,\n\t\tcloseParent: !workflow.applied && result.kind === \"closed\" && result.reason === \"close\",\n\t\tselectedTools: orderedTools(workflow.accepted),\n\t};\n}\n\nasync function loadSnapshotWithFeedback(pi: ExtensionAPI, ctx: CommandContext, generation: number) {\n\tconst menuSignal = state.sessionController.signal;\n\tconst isCurrent = () => generation === state.sessionGeneration && !menuSignal.aborted;\n\tconst result = await runTask(ctx, {\n\t\tlabel: \"Loading Chrome DevTools settings\u2026\",\n\t\tsignal: menuSignal,\n\t\tisCurrent,\n\t\ttask: async ({ signal }) => {\n\t\t\tsignal.throwIfAborted();\n\t\t\tconst settings = await loadSettings();\n\t\t\tsignal.throwIfAborted();\n\t\t\treturn buildMenuSnapshot(pi, settings);\n\t\t},\n\t});\n\treturn result.kind === \"completed\" ? result.value : undefined;\n}\n\nexport async function loadChromeDevtoolsMenuSnapshot(\n\tpi: ExtensionAPI,\n\tctx: ExtensionCommandContext,\n) {\n\tconst settings = await loadSettings({\n\t\tcwd: ctx.cwd,\n\t\tprojectTrusted: ctx.isProjectTrusted(),\n\t});\n\treturn buildMenuSnapshot(pi, settings);\n}\n\nfunction buildMenuSnapshot(pi: ExtensionAPI, settings: SettingsLoadResult): MenuSnapshot {\n\tconst activeTools = activeChromeTools(pi);\n\tconst persistedTools =\n\t\tsettings.kind === \"loaded\" && settings.settings.tools\n\t\t\t? orderedTools(new Set(settings.settings.tools))\n\t\t\t: undefined;\n\tconst persistenceLabel =\n\t\tsettings.kind === \"invalid\"\n\t\t\t? \"settings need repair\"\n\t\t\t: persistedTools === undefined\n\t\t\t\t? \"not saved\"\n\t\t\t\t: arraysEqual(activeTools, persistedTools)\n\t\t\t\t\t? \"saved\"\n\t\t\t\t\t: \"runtime catalog differs from saved catalog\";\n\tconst settingsWarning = [\n\t\t...new Set([settings.notice, state.settingsNotice].filter(Boolean)),\n\t].join(\"\\n\");\n\treturn {\n\t\tactiveTools,\n\t\tpersistenceLabel,\n\t\t...(settings.kind === \"invalid\"\n\t\t\t? { mutationBlockedReason: `Repair ${settings.reason} before saving` }\n\t\t\t: {}),\n\t\t...(settingsWarning ? { settingsWarning } : {}),\n\t};\n}\n\nfunction mainStateLines(snapshot: MenuSnapshot, owner: object) {\n\tconst launchError = launchAttemptLines(owner).find((line) =>\n\t\tline.startsWith(\"Last launch error:\"),\n\t);\n\treturn sanitizeLines([\n\t\t`Tool catalog: ${snapshot.activeTools.length} of ${availableCatalogNames(owner).length} available \u00B7 ${snapshot.persistenceLabel}`,\n\t\t`WebMCP: ${webMcpEnabled(owner) ? \"enabled \u00B7 experimental \u00B7 confirmation required for every call\" : \"disabled \u00B7 experimental\"}`,\n\t\t`Browser: ${browserLifecycleSummary(owner)}`,\n\t\t`Endpoint: ${devToolsEndpoint(owner)}`,\n\t\t...(snapshot.settingsWarning ? [`Settings warning: ${snapshot.settingsWarning}`] : []),\n\t\t...(launchError ? [`Launch warning: ${launchError.slice(\"Last launch error: \".length)}`] : []),\n\t]);\n}\n\nfunction browserLifecycleSummary(owner: object) {\n\tconst lifecycle = browserLifecycleState(owner);\n\tif (lifecycle === \"starting\") return \"starting managed browser\";\n\tif (lifecycle === \"running\") return \"managed browser running\";\n\tif (lifecycle === \"exited\") return \"managed browser exited \u00B7 open Browser status to recover\";\n\tif (lifecycle === \"failed\") return \"last launch failed \u00B7 open Browser status to recover\";\n\tconst launchMode = launchModeLabel(owner);\n\treturn launchMode.startsWith(\"attach first\")\n\t\t? \"not started \u00B7 attaches or launches on first use\"\n\t\t: `not started \u00B7 ${launchMode}`;\n}\n\nfunction toolDraftLines(current: ToolWorkflowState, owner: object) {\n\tif (current.mutationBlockedReason)\n\t\treturn sanitizeLines([`Unavailable: ${current.mutationBlockedReason}`]);\n\tconst changes = symmetricDifferenceSize(current.accepted, current.draft);\n\treturn [\n\t\t`Currently available: ${current.accepted.size}/${availableCatalogNames(owner).length}`,\n\t\tchanges === 0\n\t\t\t? \"No unapplied changes \u00B7 Escape cancels\"\n\t\t\t: `${changes} unapplied ${changes === 1 ? \"change\" : \"changes\"} \u00B7 Escape cancels`,\n\t\t`WebMCP gateways: ${webMcpEnabled(owner) ? \"available for selection \u00B7 experimental\" : \"hidden while experimental WebMCP is disabled\"}`,\n\t\t\"Changes are not applied until Review changes and Apply tool changes.\",\n\t];\n}\n\nfunction buildToolReview(current: ToolWorkflowState, owner: object) {\n\tconst catalog = availableCatalogNames(owner);\n\tconst available = catalog.filter((name) => current.draft.has(name));\n\tconst unavailable = catalog.filter((name) => !current.draft.has(name));\n\treturn sanitizeChromeDevtoolsDisplay(\n\t\t[\n\t\t\t`Current available browser tools: ${current.accepted.size}/${catalog.length}`,\n\t\t\t`Proposed available browser tools: ${current.draft.size}/${catalog.length}`,\n\t\t\t\"\",\n\t\t\t\"Available after apply:\",\n\t\t\t...(available.length > 0\n\t\t\t\t? available.map((name) => ` - ${TOOL_PRESENTATION[name].label} (${name})`)\n\t\t\t\t: [\" - none\"]),\n\t\t\t\"\",\n\t\t\t\"Unavailable after apply:\",\n\t\t\t...(unavailable.length > 0\n\t\t\t\t? unavailable.map((name) => ` - ${TOOL_PRESENTATION[name].label} (${name})`)\n\t\t\t\t: [\" - none\"]),\n\t\t\t\"\",\n\t\t\t\"Other active Pi tools remain unchanged.\",\n\t\t\t\"Native-capable models defer these tools until chrome_devtools_load selects them.\",\n\t\t\t\"Other models expose available tools eagerly before the next model request.\",\n\t\t\t\"The accepted availability policy is saved for future sessions.\",\n\t\t].join(\"\\n\"),\n\t);\n}\n\nfunction updateSnapshotAfterApply(\n\tsnapshot: MenuSnapshot,\n\tselectedTools: readonly ChromeDevToolsToolName[],\n) {\n\tsnapshot.activeTools = [...selectedTools];\n\tsnapshot.persistenceLabel = \"saved\";\n}\n\nfunction activeChromeTools(pi: ExtensionAPI) {\n\treturn availableChromeDevtoolsTools(pi);\n}\n\nfunction orderedTools(tools: ReadonlySet<ChromeDevToolsToolName>) {\n\treturn CHROME_DEVTOOLS_TOOL_NAMES.filter((toolName) => tools.has(toolName));\n}\n\nfunction isChromeDevtoolsToolName(value: string): value is ChromeDevToolsToolName {\n\treturn CHROME_DEVTOOLS_TOOL_NAMES.includes(value as ChromeDevToolsToolName);\n}\n\nfunction setsEqual<T>(left: ReadonlySet<T>, right: ReadonlySet<T>) {\n\treturn left.size === right.size && [...left].every((value) => right.has(value));\n}\n\nfunction symmetricDifferenceSize<T>(left: ReadonlySet<T>, right: ReadonlySet<T>) {\n\tlet changes = 0;\n\tfor (const value of left) if (!right.has(value)) changes += 1;\n\tfor (const value of right) if (!left.has(value)) changes += 1;\n\treturn changes;\n}\n\nfunction arraysEqual<T>(left: readonly T[], right: readonly T[]) {\n\treturn left.length === right.length && left.every((value, index) => value === right[index]);\n}\n\nfunction sanitizeLines(lines: readonly string[]) {\n\treturn sanitizeChromeDevtoolsDisplay(lines.join(\"\\n\")).split(\"\\n\");\n}\n\nfunction availableCatalogNames(owner: object): ChromeDevToolsToolName[] {\n\treturn webMcpEnabled(owner)\n\t\t? [...CHROME_DEVTOOLS_TOOL_NAMES]\n\t\t: [...CORE_CHROME_DEVTOOLS_TOOL_NAMES];\n}\n\nfunction formatError(error: unknown) {\n\treturn error instanceof Error ? error.message : String(error);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|