@narumitw/pi-chrome-devtools 0.52.0 → 0.52.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 +10 -1
- package/dist/chunks/browser-settings-menu-L4CZINWO.ts +266 -0
- package/dist/chunks/browser-settings-menu-L4CZINWO.ts.map +7 -0
- package/dist/chunks/chunk-RM7OGXVL.ts +1607 -0
- package/dist/chunks/chunk-RM7OGXVL.ts.map +7 -0
- package/dist/chunks/menu-U4AIAN7V.ts +397 -0
- package/dist/chunks/menu-U4AIAN7V.ts.map +7 -0
- package/dist/index.ts +762 -0
- package/dist/index.ts.map +7 -0
- package/package.json +11 -7
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
// @generated by scripts/build-runtime.mjs; do not edit.
|
|
2
|
+
// @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
|
|
3
|
+
import {
|
|
4
|
+
CHROME_DEVTOOLS_TOOL_NAMES,
|
|
5
|
+
availableChromeDevtoolsTools,
|
|
6
|
+
browserLifecycleState,
|
|
7
|
+
buildBrowserStatusMessage,
|
|
8
|
+
buildCommandGuide,
|
|
9
|
+
devToolsEndpoint,
|
|
10
|
+
launchModeLabel,
|
|
11
|
+
loadSettings,
|
|
12
|
+
sanitizeChromeDevtoolsDisplay,
|
|
13
|
+
setSelectedChromeDevtoolsTools,
|
|
14
|
+
state
|
|
15
|
+
} from "./chunk-RM7OGXVL.js";
|
|
16
|
+
|
|
17
|
+
// src/menu.ts
|
|
18
|
+
import { defineMenu, runMenu, runTask } from "@narumitw/pi-tui-kit";
|
|
19
|
+
var TOOL_PRESENTATION = {
|
|
20
|
+
chrome_devtools_list_pages: {
|
|
21
|
+
label: "List open pages",
|
|
22
|
+
description: "List inspectable Chrome tabs and pages (chrome_devtools_list_pages)."
|
|
23
|
+
},
|
|
24
|
+
chrome_devtools_select_page: {
|
|
25
|
+
label: "Select the active page",
|
|
26
|
+
description: "Choose the page later browser actions use (chrome_devtools_select_page)."
|
|
27
|
+
},
|
|
28
|
+
chrome_devtools_navigate: {
|
|
29
|
+
label: "Navigate a page",
|
|
30
|
+
description: "Open a URL, creating a page when needed (chrome_devtools_navigate)."
|
|
31
|
+
},
|
|
32
|
+
chrome_devtools_evaluate: {
|
|
33
|
+
label: "Run JavaScript",
|
|
34
|
+
description: "Evaluate JavaScript in the selected page (chrome_devtools_evaluate)."
|
|
35
|
+
},
|
|
36
|
+
chrome_devtools_screenshot: {
|
|
37
|
+
label: "Capture a screenshot",
|
|
38
|
+
description: "Save a PNG of the selected page (chrome_devtools_screenshot)."
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
async function showChromeDevtoolsMenu(pi, ctx, generation) {
|
|
42
|
+
const snapshot = await loadSnapshotWithFeedback(pi, ctx, generation);
|
|
43
|
+
if (!snapshot) return;
|
|
44
|
+
const menuSignal = state.sessionController.signal;
|
|
45
|
+
const isCurrent = () => generation === state.sessionGeneration && !menuSignal.aborted;
|
|
46
|
+
const menu = defineMenu({
|
|
47
|
+
start: "main",
|
|
48
|
+
screens: {
|
|
49
|
+
main: ({ state: current }) => ({
|
|
50
|
+
kind: "actions",
|
|
51
|
+
title: "Chrome DevTools",
|
|
52
|
+
lines: mainStateLines(current),
|
|
53
|
+
items: [
|
|
54
|
+
{
|
|
55
|
+
id: "tools",
|
|
56
|
+
label: "Choose available browser tools\u2026",
|
|
57
|
+
description: "Choose which capabilities the loader may expose.",
|
|
58
|
+
disabled: Boolean(current.mutationBlockedReason),
|
|
59
|
+
disabledReason: current.mutationBlockedReason,
|
|
60
|
+
action: "tools"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: "bulk",
|
|
64
|
+
label: current.activeTools.length === CHROME_DEVTOOLS_TOOL_NAMES.length ? "Make all browser tools unavailable\u2026" : "Make all browser tools available\u2026",
|
|
65
|
+
description: current.activeTools.length === CHROME_DEVTOOLS_TOOL_NAMES.length ? "Preview 0 of 5; other active tools stay enabled." : "Preview 5 of 5; other active tools stay enabled.",
|
|
66
|
+
disabled: Boolean(current.mutationBlockedReason),
|
|
67
|
+
disabledReason: current.mutationBlockedReason,
|
|
68
|
+
action: "bulk"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: "browser-status",
|
|
72
|
+
label: "Browser status",
|
|
73
|
+
description: "Runtime, endpoint, and last launch attempt.",
|
|
74
|
+
to: "browserStatus"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: "settings",
|
|
78
|
+
label: "Browser settings",
|
|
79
|
+
description: "Edit endpoint, auto-launch, and browser executable settings.",
|
|
80
|
+
action: "settings"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: "help",
|
|
84
|
+
label: "Help",
|
|
85
|
+
description: "Commands and usage.",
|
|
86
|
+
to: "help"
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
hint: "close"
|
|
90
|
+
}),
|
|
91
|
+
browserStatus: () => ({
|
|
92
|
+
kind: "review",
|
|
93
|
+
title: "Browser status",
|
|
94
|
+
content: buildBrowserStatusMessage(),
|
|
95
|
+
format: { kind: "text" },
|
|
96
|
+
viewportSize: "adaptive",
|
|
97
|
+
hint: "back"
|
|
98
|
+
}),
|
|
99
|
+
help: () => ({
|
|
100
|
+
kind: "review",
|
|
101
|
+
title: "Chrome DevTools help",
|
|
102
|
+
content: buildCommandGuide(),
|
|
103
|
+
format: { kind: "text" },
|
|
104
|
+
viewportSize: "adaptive",
|
|
105
|
+
hint: "back"
|
|
106
|
+
})
|
|
107
|
+
},
|
|
108
|
+
actions: {
|
|
109
|
+
tools: async ({ state: current }) => {
|
|
110
|
+
const result = await showChromeDevtoolsToolWorkflow(pi, ctx, generation, {
|
|
111
|
+
snapshot: current
|
|
112
|
+
});
|
|
113
|
+
if (result?.applied && isCurrent()) updateSnapshotAfterApply(current, result.selectedTools);
|
|
114
|
+
return result?.closeParent ? { kind: "close" } : { kind: "stay" };
|
|
115
|
+
},
|
|
116
|
+
bulk: async ({ state: current }) => {
|
|
117
|
+
const selectedTools = current.activeTools.length === CHROME_DEVTOOLS_TOOL_NAMES.length ? [] : [...CHROME_DEVTOOLS_TOOL_NAMES];
|
|
118
|
+
const result = await showChromeDevtoolsToolWorkflow(pi, ctx, generation, {
|
|
119
|
+
snapshot: current,
|
|
120
|
+
initialDraft: selectedTools,
|
|
121
|
+
startAtReview: true
|
|
122
|
+
});
|
|
123
|
+
if (result?.applied && isCurrent()) updateSnapshotAfterApply(current, result.selectedTools);
|
|
124
|
+
return result?.closeParent ? { kind: "close" } : { kind: "stay" };
|
|
125
|
+
},
|
|
126
|
+
settings: async () => {
|
|
127
|
+
const { showChromeDevtoolsBrowserSettings } = await import("./browser-settings-menu-L4CZINWO.js");
|
|
128
|
+
if (!isCurrent()) return { kind: "stay" };
|
|
129
|
+
const result = await showChromeDevtoolsBrowserSettings(ctx, generation);
|
|
130
|
+
if (!isCurrent()) return { kind: "stay" };
|
|
131
|
+
return result.closeParent ? { kind: "close" } : { kind: "stay" };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
await runMenu(ctx, menu, {
|
|
136
|
+
getState: () => snapshot,
|
|
137
|
+
signal: menuSignal,
|
|
138
|
+
isCurrent,
|
|
139
|
+
onError: (currentCtx, error) => currentCtx.ui.notify(
|
|
140
|
+
sanitizeChromeDevtoolsDisplay(`Chrome DevTools menu failed: ${formatError(error)}`),
|
|
141
|
+
"error"
|
|
142
|
+
)
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
async function showChromeDevtoolsToolWorkflow(pi, ctx, generation, options = {}) {
|
|
146
|
+
const snapshot = options.snapshot ?? await loadSnapshotWithFeedback(pi, ctx, generation);
|
|
147
|
+
if (!snapshot) return void 0;
|
|
148
|
+
const menuSignal = state.sessionController.signal;
|
|
149
|
+
const isCurrent = () => generation === state.sessionGeneration && !menuSignal.aborted;
|
|
150
|
+
const accepted = new Set(snapshot.activeTools);
|
|
151
|
+
const workflow = {
|
|
152
|
+
accepted,
|
|
153
|
+
draft: new Set(options.initialDraft ?? snapshot.activeTools),
|
|
154
|
+
mutationBlockedReason: snapshot.mutationBlockedReason,
|
|
155
|
+
generation,
|
|
156
|
+
applied: false
|
|
157
|
+
};
|
|
158
|
+
const menu = defineMenu({
|
|
159
|
+
start: options.startAtReview ? "review" : "tools",
|
|
160
|
+
screens: {
|
|
161
|
+
tools: ({ state: current }) => ({
|
|
162
|
+
kind: "multiSelect",
|
|
163
|
+
title: `Browser tools (${current.draft.size}/${CHROME_DEVTOOLS_TOOL_NAMES.length})`,
|
|
164
|
+
lines: toolDraftLines(current),
|
|
165
|
+
items: CHROME_DEVTOOLS_TOOL_NAMES.map((toolName) => ({
|
|
166
|
+
id: toolName,
|
|
167
|
+
label: TOOL_PRESENTATION[toolName].label,
|
|
168
|
+
description: TOOL_PRESENTATION[toolName].description,
|
|
169
|
+
searchText: `${toolName} ${TOOL_PRESENTATION[toolName].description}`,
|
|
170
|
+
selected: current.draft.has(toolName),
|
|
171
|
+
disabled: Boolean(current.mutationBlockedReason),
|
|
172
|
+
disabledReason: current.mutationBlockedReason
|
|
173
|
+
})),
|
|
174
|
+
action: "toggle",
|
|
175
|
+
actions: [
|
|
176
|
+
{
|
|
177
|
+
id: "select-all",
|
|
178
|
+
label: "Select all",
|
|
179
|
+
disabled: Boolean(current.mutationBlockedReason),
|
|
180
|
+
disabledReason: current.mutationBlockedReason,
|
|
181
|
+
action: "selectAll"
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
id: "select-none",
|
|
185
|
+
label: "Select none",
|
|
186
|
+
disabled: Boolean(current.mutationBlockedReason),
|
|
187
|
+
disabledReason: current.mutationBlockedReason,
|
|
188
|
+
action: "selectNone"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
id: "review",
|
|
192
|
+
label: "Review changes\u2026",
|
|
193
|
+
disabled: Boolean(current.mutationBlockedReason) || setsEqual(current.accepted, current.draft),
|
|
194
|
+
disabledReason: current.mutationBlockedReason ?? (setsEqual(current.accepted, current.draft) ? "No unapplied changes" : void 0),
|
|
195
|
+
to: "review"
|
|
196
|
+
},
|
|
197
|
+
{ id: "cancel", label: "Cancel", action: "cancel" }
|
|
198
|
+
],
|
|
199
|
+
hint: "back"
|
|
200
|
+
}),
|
|
201
|
+
review: ({ state: current }) => ({
|
|
202
|
+
kind: "review",
|
|
203
|
+
title: "Review tool changes",
|
|
204
|
+
lines: [
|
|
205
|
+
`Currently available: ${current.accepted.size}/${CHROME_DEVTOOLS_TOOL_NAMES.length}`,
|
|
206
|
+
`Proposed availability: ${current.draft.size}/${CHROME_DEVTOOLS_TOOL_NAMES.length}`
|
|
207
|
+
],
|
|
208
|
+
content: buildToolReview(current),
|
|
209
|
+
format: { kind: "text" },
|
|
210
|
+
viewportSize: "adaptive",
|
|
211
|
+
...current.mutationBlockedReason || setsEqual(current.accepted, current.draft) ? {} : {
|
|
212
|
+
confirm: {
|
|
213
|
+
id: "apply",
|
|
214
|
+
label: "Apply tool changes",
|
|
215
|
+
action: "apply"
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
hint: "back"
|
|
219
|
+
})
|
|
220
|
+
},
|
|
221
|
+
actions: {
|
|
222
|
+
toggle: ({ state: current, itemId, selected }) => {
|
|
223
|
+
if (!isChromeDevtoolsToolName(itemId) || selected === void 0)
|
|
224
|
+
return { kind: "rejected" };
|
|
225
|
+
if (selected) current.draft.add(itemId);
|
|
226
|
+
else current.draft.delete(itemId);
|
|
227
|
+
return { kind: "stay" };
|
|
228
|
+
},
|
|
229
|
+
selectAll: ({ state: current }) => {
|
|
230
|
+
current.draft = new Set(CHROME_DEVTOOLS_TOOL_NAMES);
|
|
231
|
+
return { kind: "stay" };
|
|
232
|
+
},
|
|
233
|
+
selectNone: ({ state: current }) => {
|
|
234
|
+
current.draft = /* @__PURE__ */ new Set();
|
|
235
|
+
return { kind: "stay" };
|
|
236
|
+
},
|
|
237
|
+
review: () => ({ kind: "to", screen: "review" }),
|
|
238
|
+
cancel: () => ({ kind: "back" }),
|
|
239
|
+
apply: async ({ state: current, signal }) => {
|
|
240
|
+
await ctx.waitForIdle();
|
|
241
|
+
if (signal.aborted || !isCurrent() || current.generation !== state.sessionGeneration) {
|
|
242
|
+
return { kind: "rejected" };
|
|
243
|
+
}
|
|
244
|
+
const selectedTools = orderedTools(current.draft);
|
|
245
|
+
const saveResult = await setSelectedChromeDevtoolsTools(
|
|
246
|
+
pi,
|
|
247
|
+
ctx,
|
|
248
|
+
selectedTools,
|
|
249
|
+
orderedTools(current.accepted)
|
|
250
|
+
);
|
|
251
|
+
if (!isCurrent()) return { kind: "rejected" };
|
|
252
|
+
if (saveResult === "active-tools-changed") {
|
|
253
|
+
current.accepted = new Set(activeChromeTools(pi));
|
|
254
|
+
}
|
|
255
|
+
if (saveResult !== "saved") return { kind: "rejected" };
|
|
256
|
+
current.accepted = new Set(selectedTools);
|
|
257
|
+
current.draft = new Set(selectedTools);
|
|
258
|
+
current.applied = true;
|
|
259
|
+
ctx.ui.notify(
|
|
260
|
+
`Saved: ${selectedTools.length} of ${CHROME_DEVTOOLS_TOOL_NAMES.length} browser tools available to lazy-load.`,
|
|
261
|
+
"info"
|
|
262
|
+
);
|
|
263
|
+
return { kind: "close" };
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
const result = await runMenu(ctx, menu, {
|
|
268
|
+
getState: () => workflow,
|
|
269
|
+
signal: menuSignal,
|
|
270
|
+
isCurrent,
|
|
271
|
+
onError: (currentCtx, error) => currentCtx.ui.notify(
|
|
272
|
+
sanitizeChromeDevtoolsDisplay(
|
|
273
|
+
`Chrome DevTools tool selection failed: ${formatError(error)}`
|
|
274
|
+
),
|
|
275
|
+
"error"
|
|
276
|
+
)
|
|
277
|
+
});
|
|
278
|
+
return {
|
|
279
|
+
applied: workflow.applied,
|
|
280
|
+
closeParent: !workflow.applied && result.kind === "closed" && result.reason === "close",
|
|
281
|
+
selectedTools: orderedTools(workflow.accepted)
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
async function loadSnapshotWithFeedback(pi, ctx, generation) {
|
|
285
|
+
const menuSignal = state.sessionController.signal;
|
|
286
|
+
const isCurrent = () => generation === state.sessionGeneration && !menuSignal.aborted;
|
|
287
|
+
const result = await runTask(ctx, {
|
|
288
|
+
label: "Loading Chrome DevTools settings\u2026",
|
|
289
|
+
signal: menuSignal,
|
|
290
|
+
isCurrent,
|
|
291
|
+
task: async ({ signal }) => {
|
|
292
|
+
signal.throwIfAborted();
|
|
293
|
+
const settings = await loadSettings();
|
|
294
|
+
signal.throwIfAborted();
|
|
295
|
+
return buildMenuSnapshot(pi, settings);
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
return result.kind === "completed" ? result.value : void 0;
|
|
299
|
+
}
|
|
300
|
+
function buildMenuSnapshot(pi, settings) {
|
|
301
|
+
const activeTools = activeChromeTools(pi);
|
|
302
|
+
const persistedTools = settings.kind === "loaded" && settings.settings.tools ? orderedTools(new Set(settings.settings.tools)) : void 0;
|
|
303
|
+
const persistenceLabel = settings.kind === "invalid" ? "settings need repair" : persistedTools === void 0 ? "not saved" : arraysEqual(activeTools, persistedTools) ? "saved" : "runtime catalog differs from saved catalog";
|
|
304
|
+
const settingsWarning = [
|
|
305
|
+
...new Set([settings.notice, state.settingsNotice].filter(Boolean))
|
|
306
|
+
].join("\n");
|
|
307
|
+
return {
|
|
308
|
+
activeTools,
|
|
309
|
+
persistenceLabel,
|
|
310
|
+
...settings.kind === "invalid" ? { mutationBlockedReason: `Repair ${settings.reason} before saving` } : {},
|
|
311
|
+
...settingsWarning ? { settingsWarning } : {}
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
function mainStateLines(snapshot) {
|
|
315
|
+
return sanitizeLines([
|
|
316
|
+
`Lazy catalog: ${snapshot.activeTools.length} of ${CHROME_DEVTOOLS_TOOL_NAMES.length} available \xB7 ${snapshot.persistenceLabel}`,
|
|
317
|
+
`Browser: ${browserLifecycleSummary()}`,
|
|
318
|
+
`Endpoint: ${devToolsEndpoint()}`,
|
|
319
|
+
...snapshot.settingsWarning ? [`Settings warning: ${snapshot.settingsWarning}`] : [],
|
|
320
|
+
...state.lastLaunchAttempt?.lastError ? [`Launch warning: ${state.lastLaunchAttempt.lastError}`] : []
|
|
321
|
+
]);
|
|
322
|
+
}
|
|
323
|
+
function browserLifecycleSummary() {
|
|
324
|
+
const lifecycle = browserLifecycleState();
|
|
325
|
+
if (lifecycle === "starting") return "starting managed browser";
|
|
326
|
+
if (lifecycle === "running") return "managed browser running";
|
|
327
|
+
if (lifecycle === "exited") return "managed browser exited \xB7 open Browser status to recover";
|
|
328
|
+
if (lifecycle === "failed") return "last launch failed \xB7 open Browser status to recover";
|
|
329
|
+
const launchMode = launchModeLabel();
|
|
330
|
+
return launchMode.startsWith("attach first") ? "not started \xB7 attaches or launches on first use" : `not started \xB7 ${launchMode}`;
|
|
331
|
+
}
|
|
332
|
+
function toolDraftLines(current) {
|
|
333
|
+
if (current.mutationBlockedReason)
|
|
334
|
+
return sanitizeLines([`Unavailable: ${current.mutationBlockedReason}`]);
|
|
335
|
+
const changes = symmetricDifferenceSize(current.accepted, current.draft);
|
|
336
|
+
return [
|
|
337
|
+
`Currently available: ${current.accepted.size}/${CHROME_DEVTOOLS_TOOL_NAMES.length}`,
|
|
338
|
+
changes === 0 ? "No unapplied changes \xB7 Escape cancels" : `${changes} unapplied ${changes === 1 ? "change" : "changes"} \xB7 Escape cancels`,
|
|
339
|
+
"Changes are not applied until Review changes and Apply tool changes."
|
|
340
|
+
];
|
|
341
|
+
}
|
|
342
|
+
function buildToolReview(current) {
|
|
343
|
+
const available = CHROME_DEVTOOLS_TOOL_NAMES.filter((name) => current.draft.has(name));
|
|
344
|
+
const unavailable = CHROME_DEVTOOLS_TOOL_NAMES.filter((name) => !current.draft.has(name));
|
|
345
|
+
return sanitizeChromeDevtoolsDisplay(
|
|
346
|
+
[
|
|
347
|
+
`Current available browser tools: ${current.accepted.size}/${CHROME_DEVTOOLS_TOOL_NAMES.length}`,
|
|
348
|
+
`Proposed available browser tools: ${current.draft.size}/${CHROME_DEVTOOLS_TOOL_NAMES.length}`,
|
|
349
|
+
"",
|
|
350
|
+
"Available to lazy-load after apply:",
|
|
351
|
+
...available.length > 0 ? available.map((name) => ` - ${TOOL_PRESENTATION[name].label} (${name})`) : [" - none"],
|
|
352
|
+
"",
|
|
353
|
+
"Unavailable after apply:",
|
|
354
|
+
...unavailable.length > 0 ? unavailable.map((name) => ` - ${TOOL_PRESENTATION[name].label} (${name})`) : [" - none"],
|
|
355
|
+
"",
|
|
356
|
+
"Other active Pi tools remain unchanged.",
|
|
357
|
+
"Newly available tools remain deferred until chrome_devtools_load selects them.",
|
|
358
|
+
"The accepted availability policy is saved for future sessions."
|
|
359
|
+
].join("\n")
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
function updateSnapshotAfterApply(snapshot, selectedTools) {
|
|
363
|
+
snapshot.activeTools = [...selectedTools];
|
|
364
|
+
snapshot.persistenceLabel = "saved";
|
|
365
|
+
}
|
|
366
|
+
function activeChromeTools(pi) {
|
|
367
|
+
return availableChromeDevtoolsTools(pi);
|
|
368
|
+
}
|
|
369
|
+
function orderedTools(tools) {
|
|
370
|
+
return CHROME_DEVTOOLS_TOOL_NAMES.filter((toolName) => tools.has(toolName));
|
|
371
|
+
}
|
|
372
|
+
function isChromeDevtoolsToolName(value) {
|
|
373
|
+
return CHROME_DEVTOOLS_TOOL_NAMES.includes(value);
|
|
374
|
+
}
|
|
375
|
+
function setsEqual(left, right) {
|
|
376
|
+
return left.size === right.size && [...left].every((value) => right.has(value));
|
|
377
|
+
}
|
|
378
|
+
function symmetricDifferenceSize(left, right) {
|
|
379
|
+
let changes = 0;
|
|
380
|
+
for (const value of left) if (!right.has(value)) changes += 1;
|
|
381
|
+
for (const value of right) if (!left.has(value)) changes += 1;
|
|
382
|
+
return changes;
|
|
383
|
+
}
|
|
384
|
+
function arraysEqual(left, right) {
|
|
385
|
+
return left.length === right.length && left.every((value, index) => value === right[index]);
|
|
386
|
+
}
|
|
387
|
+
function sanitizeLines(lines) {
|
|
388
|
+
return sanitizeChromeDevtoolsDisplay(lines.join("\n")).split("\n");
|
|
389
|
+
}
|
|
390
|
+
function formatError(error) {
|
|
391
|
+
return error instanceof Error ? error.message : String(error);
|
|
392
|
+
}
|
|
393
|
+
export {
|
|
394
|
+
showChromeDevtoolsMenu,
|
|
395
|
+
showChromeDevtoolsToolWorkflow
|
|
396
|
+
};
|
|
397
|
+
//# sourceMappingURL=menu-U4AIAN7V.ts.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 { browserLifecycleState, devToolsEndpoint, launchModeLabel } from \"./browser-manager.js\";\nimport { availableChromeDevtoolsTools } from \"./lazy-tools.js\";\nimport { state } from \"./runtime.js\";\nimport { loadSettings, type SettingsLoadResult } from \"./settings.js\";\nimport { CHROME_DEVTOOLS_TOOL_NAMES, type ChromeDevToolsToolName } 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};\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),\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 === CHROME_DEVTOOLS_TOOL_NAMES.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 === CHROME_DEVTOOLS_TOOL_NAMES.length\n\t\t\t\t\t\t\t\t? \"Preview 0 of 5; other active tools stay enabled.\"\n\t\t\t\t\t\t\t\t: \"Preview 5 of 5; 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(),\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(),\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 === CHROME_DEVTOOLS_TOOL_NAMES.length\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: [...CHROME_DEVTOOLS_TOOL_NAMES];\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 () => {\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(ctx, generation);\n\t\t\t\tif (!isCurrent()) return { kind: \"stay\" };\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}/${CHROME_DEVTOOLS_TOOL_NAMES.length})`,\n\t\t\t\tlines: toolDraftLines(current),\n\t\t\t\titems: CHROME_DEVTOOLS_TOOL_NAMES.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}/${CHROME_DEVTOOLS_TOOL_NAMES.length}`,\n\t\t\t\t\t`Proposed availability: ${current.draft.size}/${CHROME_DEVTOOLS_TOOL_NAMES.length}`,\n\t\t\t\t],\n\t\t\t\tcontent: buildToolReview(current),\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(CHROME_DEVTOOLS_TOOL_NAMES);\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 ${CHROME_DEVTOOLS_TOOL_NAMES.length} browser tools available to lazy-load.`,\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\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) {\n\treturn sanitizeLines([\n\t\t`Lazy catalog: ${snapshot.activeTools.length} of ${CHROME_DEVTOOLS_TOOL_NAMES.length} available \u00B7 ${snapshot.persistenceLabel}`,\n\t\t`Browser: ${browserLifecycleSummary()}`,\n\t\t`Endpoint: ${devToolsEndpoint()}`,\n\t\t...(snapshot.settingsWarning ? [`Settings warning: ${snapshot.settingsWarning}`] : []),\n\t\t...(state.lastLaunchAttempt?.lastError\n\t\t\t? [`Launch warning: ${state.lastLaunchAttempt.lastError}`]\n\t\t\t: []),\n\t]);\n}\n\nfunction browserLifecycleSummary() {\n\tconst lifecycle = browserLifecycleState();\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();\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) {\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}/${CHROME_DEVTOOLS_TOOL_NAMES.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\"Changes are not applied until Review changes and Apply tool changes.\",\n\t];\n}\n\nfunction buildToolReview(current: ToolWorkflowState) {\n\tconst available = CHROME_DEVTOOLS_TOOL_NAMES.filter((name) => current.draft.has(name));\n\tconst unavailable = CHROME_DEVTOOLS_TOOL_NAMES.filter((name) => !current.draft.has(name));\n\treturn sanitizeChromeDevtoolsDisplay(\n\t\t[\n\t\t\t`Current available browser tools: ${current.accepted.size}/${CHROME_DEVTOOLS_TOOL_NAMES.length}`,\n\t\t\t`Proposed available browser tools: ${current.draft.size}/${CHROME_DEVTOOLS_TOOL_NAMES.length}`,\n\t\t\t\"\",\n\t\t\t\"Available to lazy-load 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\"Newly available tools remain deferred until chrome_devtools_load selects them.\",\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 formatError(error: unknown) {\n\treturn error instanceof Error ? error.message : String(error);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|