cdp-mcp 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +28 -303
  2. package/bin.js +23 -0
  3. package/contract.d.ts +1 -0
  4. package/contract.js +2 -0
  5. package/index.d.ts +1 -0
  6. package/index.js +2 -0
  7. package/package.json +31 -73
  8. package/dist/contract.d.ts +0 -11
  9. package/dist/contract.js +0 -11
  10. package/dist/contract.js.map +0 -1
  11. package/dist/index.d.ts +0 -18
  12. package/dist/index.js +0 -402
  13. package/dist/index.js.map +0 -1
  14. package/dist/locator.d.ts +0 -108
  15. package/dist/locator.js +0 -176
  16. package/dist/locator.js.map +0 -1
  17. package/dist/server.d.ts +0 -2
  18. package/dist/server.js +0 -41
  19. package/dist/server.js.map +0 -1
  20. package/dist/session/browser.d.ts +0 -29
  21. package/dist/session/browser.js +0 -409
  22. package/dist/session/browser.js.map +0 -1
  23. package/dist/session/buffers.d.ts +0 -48
  24. package/dist/session/buffers.js +0 -43
  25. package/dist/session/buffers.js.map +0 -1
  26. package/dist/session/pause.d.ts +0 -21
  27. package/dist/session/pause.js +0 -99
  28. package/dist/session/pause.js.map +0 -1
  29. package/dist/session/state.d.ts +0 -53
  30. package/dist/session/state.js +0 -93
  31. package/dist/session/state.js.map +0 -1
  32. package/dist/sourcemap/loader.d.ts +0 -4
  33. package/dist/sourcemap/loader.js +0 -138
  34. package/dist/sourcemap/loader.js.map +0 -1
  35. package/dist/sourcemap/normalize.d.ts +0 -2
  36. package/dist/sourcemap/normalize.js +0 -59
  37. package/dist/sourcemap/normalize.js.map +0 -1
  38. package/dist/sourcemap/store.d.ts +0 -57
  39. package/dist/sourcemap/store.js +0 -185
  40. package/dist/sourcemap/store.js.map +0 -1
  41. package/dist/tools/_locator_runtime.d.ts +0 -31
  42. package/dist/tools/_locator_runtime.js +0 -243
  43. package/dist/tools/_locator_runtime.js.map +0 -1
  44. package/dist/tools/_register.d.ts +0 -2
  45. package/dist/tools/_register.js +0 -30
  46. package/dist/tools/_register.js.map +0 -1
  47. package/dist/tools/breakpoints.d.ts +0 -4
  48. package/dist/tools/breakpoints.js +0 -164
  49. package/dist/tools/breakpoints.js.map +0 -1
  50. package/dist/tools/console.d.ts +0 -2
  51. package/dist/tools/console.js +0 -48
  52. package/dist/tools/console.js.map +0 -1
  53. package/dist/tools/dom.d.ts +0 -2
  54. package/dist/tools/dom.js +0 -309
  55. package/dist/tools/dom.js.map +0 -1
  56. package/dist/tools/execution.d.ts +0 -29
  57. package/dist/tools/execution.js +0 -89
  58. package/dist/tools/execution.js.map +0 -1
  59. package/dist/tools/forms.d.ts +0 -8
  60. package/dist/tools/forms.js +0 -256
  61. package/dist/tools/forms.js.map +0 -1
  62. package/dist/tools/inspect.d.ts +0 -2
  63. package/dist/tools/inspect.js +0 -178
  64. package/dist/tools/inspect.js.map +0 -1
  65. package/dist/tools/nav.d.ts +0 -2
  66. package/dist/tools/nav.js +0 -136
  67. package/dist/tools/nav.js.map +0 -1
  68. package/dist/tools/network.d.ts +0 -2
  69. package/dist/tools/network.js +0 -137
  70. package/dist/tools/network.js.map +0 -1
  71. package/dist/tools/session.d.ts +0 -2
  72. package/dist/tools/session.js +0 -76
  73. package/dist/tools/session.js.map +0 -1
  74. package/dist/tools/source.d.ts +0 -2
  75. package/dist/tools/source.js +0 -63
  76. package/dist/tools/source.js.map +0 -1
  77. package/dist/tools/storage.d.ts +0 -2
  78. package/dist/tools/storage.js +0 -296
  79. package/dist/tools/storage.js.map +0 -1
  80. package/dist/util/browser-resolve.d.ts +0 -19
  81. package/dist/util/browser-resolve.js +0 -263
  82. package/dist/util/browser-resolve.js.map +0 -1
  83. package/dist/util/errors.d.ts +0 -7
  84. package/dist/util/errors.js +0 -12
  85. package/dist/util/errors.js.map +0 -1
  86. package/dist/util/format.d.ts +0 -20
  87. package/dist/util/format.js +0 -65
  88. package/dist/util/format.js.map +0 -1
  89. package/dist/util/log.d.ts +0 -6
  90. package/dist/util/log.js +0 -34
  91. package/dist/util/log.js.map +0 -1
  92. package/docs/chromium-sandboxing.md +0 -197
  93. package/docs/known-chromium-gaps.md +0 -138
  94. package/docs/launchd-service.md +0 -217
  95. package/docs/local-l3-e2e-setup.md +0 -199
  96. package/docs/systemd-service.md +0 -233
@@ -1,89 +0,0 @@
1
- import { z } from "zod";
2
- import { requireSession, requirePaused } from "../session/state.js";
3
- import { mapCdpToOriginal } from "../sourcemap/store.js";
4
- import { registerJsonTool } from "./_register.js";
5
- export function registerExecutionTools(server) {
6
- registerJsonTool(server, "resume", "Resume execution. Dispatched to the session that paused (root, worker, OOPIF, …).", undefined, async () => {
7
- const s = requirePaused();
8
- const sid = s.pause.current().sessionId;
9
- await s.client.send("Debugger.resume", undefined, sid);
10
- return "resumed";
11
- });
12
- registerJsonTool(server, "step_over", "Step over the current line. Awaits the next pause (or returns null if execution continues).", { timeout_ms: z.number().int().positive().optional() }, async (input) => stepThen((s, sid) => s.client.send("Debugger.stepOver", undefined, sid), input.timeout_ms));
13
- registerJsonTool(server, "step_into", "Step into the next function call.", { timeout_ms: z.number().int().positive().optional() }, async (input) => stepThen((s, sid) => s.client.send("Debugger.stepInto", undefined, sid), input.timeout_ms));
14
- registerJsonTool(server, "step_out", "Step out of the current function.", { timeout_ms: z.number().int().positive().optional() }, async (input) => stepThen((s, sid) => s.client.send("Debugger.stepOut", undefined, sid), input.timeout_ms));
15
- registerJsonTool(server, "pause", "Pause execution manually at the next statement. By default targets the root page; pass `session_id` (from list_targets or a script's session_id) to pause a specific worker/iframe/service-worker.", {
16
- session_id: z.string().nullable().optional().describe("null or omitted = root."),
17
- }, async (input) => {
18
- const s = requireSession();
19
- const sid = input.session_id ?? undefined;
20
- await s.client.send("Debugger.pause", undefined, sid);
21
- return { paused_session: sid ?? null };
22
- });
23
- registerJsonTool(server, "wait_for_pause", "Block until the debugger pauses (or times out). Returns the pause reason and a TS-mapped call stack.", { timeout_ms: z.number().int().positive().optional().describe("Default 30000") }, async (input) => {
24
- const s = requireSession();
25
- const state = await s.pause.waitForPause(input.timeout_ms ?? 30000);
26
- return summarizePause(s, state.reason, state.hitBreakpoints, state.data, state.callFrames, state.sessionId);
27
- });
28
- }
29
- async function stepThen(send, timeoutMs) {
30
- const s = requirePaused();
31
- // Capture the paused session BEFORE marking resumed — pauseState is cleared
32
- // by onResumed and we still need the sessionId to route the step command.
33
- const sid = s.pause.current().sessionId;
34
- s.pause.onResumed();
35
- await send(s, sid);
36
- const next = await s.pause.waitForPauseOrResume(timeoutMs ?? 30000);
37
- if (!next)
38
- return { paused: false, message: "execution did not pause within timeout" };
39
- return {
40
- paused: true,
41
- ...summarizePause(s, next.reason, next.hitBreakpoints, next.data, next.callFrames, next.sessionId),
42
- };
43
- }
44
- export function summarizePause(s, reason, hitBreakpoints, data, callFrames, sessionId) {
45
- const userBreakpointIds = matchUserBreakpoints(s, hitBreakpoints ?? [], sessionId);
46
- return {
47
- reason,
48
- hit_breakpoint_ids: userBreakpointIds,
49
- session_id: sessionId ?? null,
50
- data: data ?? null,
51
- call_stack: callFrames.map((cf, i) => formatFrameForPause(s, cf, i, sessionId)),
52
- };
53
- }
54
- function formatFrameForPause(s, cf, index, sessionId) {
55
- const mapped = mapCdpToOriginal(s.scripts, cf.location, sessionId);
56
- const script = s.scripts.get(cf.location.scriptId, sessionId);
57
- return {
58
- index,
59
- frame_id: cf.callFrameId,
60
- session_id: sessionId ?? null,
61
- function_name: cf.functionName || "(anonymous)",
62
- file: mapped?.file ?? script?.url ?? cf.url ?? "<unknown>",
63
- line: mapped?.line ?? cf.location.lineNumber + 1,
64
- column: mapped?.column ?? cf.location.columnNumber ?? 0,
65
- js_url: script?.url,
66
- js_line: cf.location.lineNumber + 1,
67
- js_column: cf.location.columnNumber ?? 0,
68
- scope_types: cf.scopeChain.map((sc) => sc.type),
69
- this: cf.this ? { type: cf.this.subtype ?? cf.this.type, preview: cf.this.description ?? "" } : null,
70
- };
71
- }
72
- /** @internal exported for unit tests; not part of the MCP tool surface. */
73
- export function matchUserBreakpoints(s, hit, pauseSessionId) {
74
- if (!hit.length)
75
- return [];
76
- const out = [];
77
- for (const rec of s.breakpoints.values()) {
78
- // Require BOTH cdpId AND sessionId match. setBreakpointByUrl derives
79
- // the breakpoint ID from URL/line/column, so two sessions binding the
80
- // same script can mint colliding cdpIds. Without the sessionId guard,
81
- // a pause in one session would falsely be reported as a hit for
82
- // another session's binding. undefined === undefined for root.
83
- if (rec.bindings.some((b) => hit.includes(b.cdpId) && b.sessionId === pauseSessionId)) {
84
- out.push(rec.id);
85
- }
86
- }
87
- return out;
88
- }
89
- //# sourceMappingURL=execution.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/tools/execution.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- /**
3
- * Form-driving tools (issue #12 items 1, 2, 3, 6). Each LocatorSpec-driven tool
4
- * resolves its target through the shared in-page locator runtime (the same
5
- * `findElements`/visibility semantics as `locate`), mutates it, and dispatches
6
- * `input`/`change` so app frameworks observe the change.
7
- */
8
- export declare function registerFormTools(server: McpServer): void;
@@ -1,256 +0,0 @@
1
- import { z } from "zod";
2
- import { requireSession } from "../session/state.js";
3
- import { ToolError } from "../util/errors.js";
4
- import { registerJsonTool } from "./_register.js";
5
- import { locatorShape } from "../locator.js";
6
- import { normalizeLocator, locatorHelpersScript, mutationHelpersScript, } from "./_locator_runtime.js";
7
- /**
8
- * Form-driving tools (issue #12 items 1, 2, 3, 6). Each LocatorSpec-driven tool
9
- * resolves its target through the shared in-page locator runtime (the same
10
- * `findElements`/visibility semantics as `locate`), mutates it, and dispatches
11
- * `input`/`change` so app frameworks observe the change.
12
- */
13
- export function registerFormTools(server) {
14
- registerJsonTool(server, "select_option", "Set the value of a native <select> located by LocatorSpec. Match options by option_value, option_label, and/or option_index (named distinctly from the locator's own fields). Dispatches input + change. For <select multiple>, pass multiple:true to select every match. Returns status:\"selected\" with the resolved option(s).", {
15
- ...locatorShape,
16
- option_value: z
17
- .union([z.string(), z.array(z.string())])
18
- .optional()
19
- .describe("Option value attribute(s) to select."),
20
- option_label: z
21
- .union([z.string(), z.array(z.string())])
22
- .optional()
23
- .describe("Visible option label/text to select."),
24
- option_index: z
25
- .union([z.number().int().nonnegative(), z.array(z.number().int().nonnegative())])
26
- .optional()
27
- .describe("Zero-based option index(es) to select."),
28
- multiple: z.boolean().optional().describe("Select every match in a <select multiple> (default false: first match only)."),
29
- session_id: z.string().optional().describe("Target a worker/iframe session; omit for the root page."),
30
- }, async (input) => {
31
- const values = toArray(input.option_value);
32
- const labels = toArray(input.option_label);
33
- const indexes = toArray(input.option_index);
34
- if (values.length === 0 && labels.length === 0 && indexes.length === 0) {
35
- throw new ToolError("missing_arg", "select_option requires one of option_value, option_label, or option_index");
36
- }
37
- const locator = normalizeLocator(input);
38
- const body = String.raw `
39
- if (!(el instanceof HTMLSelectElement)) return { ok: false, error: "element is not a <select>", code: "wrong_element" };
40
- const wantValues = ${JSON.stringify(values)};
41
- const wantLabels = ${JSON.stringify(labels)};
42
- const wantIndexes = ${JSON.stringify(indexes)};
43
- const allowMultiple = ${JSON.stringify(!!input.multiple)} && el.multiple;
44
- const optionLabel = (opt) => (opt.label || opt.textContent || "").trim();
45
- const isMatch = (opt, i) => wantValues.includes(opt.value) || wantLabels.includes(optionLabel(opt)) || wantIndexes.includes(i);
46
- const options = Array.from(el.options);
47
- const selected = [];
48
- if (allowMultiple) {
49
- // Decide matches before mutating: a zero-match select_option must
50
- // leave the existing selection untouched (and fall through to the
51
- // not_found return below) rather than deselect every option and
52
- // report an error without firing events. On a real match the
53
- // non-matches are cleared, giving multi-select replace semantics.
54
- const matched = options.map((opt, i) => isMatch(opt, i));
55
- if (matched.some(Boolean)) {
56
- options.forEach((opt, i) => {
57
- opt.selected = matched[i];
58
- if (matched[i]) selected.push({ value: opt.value, label: optionLabel(opt), index: i });
59
- });
60
- }
61
- } else {
62
- for (let i = 0; i < options.length; i++) {
63
- if (isMatch(options[i], i)) {
64
- el.value = options[i].value;
65
- selected.push({ value: options[i].value, label: optionLabel(options[i]), index: i });
66
- break;
67
- }
68
- }
69
- }
70
- if (selected.length === 0) return { ok: false, error: "no <option> matched the requested value/label/index", code: "not_found" };
71
- fireEvents(el, ["input", "change"]);
72
- return { ok: true, selected, multiple: el.multiple, count };
73
- `;
74
- const v = await runMutation(locator, body, input.session_id);
75
- if (!v.ok)
76
- throw new ToolError(v.code ?? "not_found", v.error ?? "select_option failed");
77
- return { status: "selected", selected: v.selected, multiple: v.multiple, count: v.count };
78
- });
79
- registerToggle(server, "check");
80
- registerToggle(server, "uncheck");
81
- registerJsonTool(server, "fill", "Set an input, textarea, or contenteditable element (located by LocatorSpec) to exactly the given value, replacing any existing contents. Dispatches input + change. Use this (not type_text) when you need the field to end up equal to a specific value.", {
82
- ...locatorShape,
83
- value: z.string().describe("The exact value the field should contain afterwards (replaces existing contents)."),
84
- session_id: z.string().optional().describe("Target a worker/iframe session; omit for the root page."),
85
- }, async (input) => {
86
- const locator = normalizeLocator(input);
87
- const body = String.raw `
88
- // fill writes free text, so restrict to text-like controls. Many other
89
- // elements expose a "value" property whose meaning is not "the text the
90
- // user sees" — <select> (the selected option), checkbox/radio (the
91
- // submitted value, not the checked state), and button/submit/reset/file/
92
- // image/range/color inputs — so editing them via fill would be surprising.
93
- // Those get a structured wrong_element; use select_option / check / uncheck.
94
- const NON_TEXT_INPUT_TYPES = ["button", "submit", "reset", "checkbox", "radio", "file", "image", "range", "color"];
95
- const isTextInput = el instanceof HTMLInputElement && !NON_TEXT_INPUT_TYPES.includes((el.getAttribute("type") || "text").toLowerCase());
96
- const fillable = el.isContentEditable || el instanceof HTMLTextAreaElement || isTextInput;
97
- if (!fillable) {
98
- const tag = el.tagName.toLowerCase();
99
- const detail = el instanceof HTMLInputElement ? "<input type=" + (el.getAttribute("type") || "text") + ">" : "<" + tag + ">";
100
- return { ok: false, error: "element is not fillable — fill targets a text <input>, <textarea>, or contenteditable, got " + detail, code: "wrong_element" };
101
- }
102
- const value = ${JSON.stringify(input.value)};
103
- el.focus();
104
- if (!("value" in el) && el.isContentEditable) { el.textContent = value; }
105
- else { el.value = value; }
106
- fireEvents(el, ["input", "change"]);
107
- return { ok: true, tag: el.tagName.toLowerCase(), count };
108
- `;
109
- const v = await runMutation(locator, body, input.session_id);
110
- if (!v.ok)
111
- throw new ToolError(v.code ?? "not_found", v.error ?? "fill failed");
112
- return { status: "filled", value_length: input.value.length, tag: v.tag, count: v.count };
113
- });
114
- registerJsonTool(server, "suggest_locator", "Given a starting element (by node_id or CSS selector), return ranked LocatorSpec candidates (role+name → text → test-id → label → placeholder → name → CSS fallback), each annotated with how many elements it currently matches (1 = unambiguous) and whether it resolves back to the target. Useful for validating/normalising a locator before driving with it.", {
115
- node_id: z.number().int().positive().optional().describe("DOM nodeId from query_selector/locate."),
116
- selector: z.string().optional().describe("CSS selector for the starting element (alternative to node_id)."),
117
- session_id: z.string().optional().describe("Target a worker/iframe session; omit for the root page."),
118
- }, async (input) => {
119
- const s = requireSession();
120
- if (input.node_id === undefined && !input.selector) {
121
- throw new ToolError("missing_arg", "node_id or selector required");
122
- }
123
- let value;
124
- if (input.selector && input.node_id === undefined) {
125
- const expression = `(() => {
126
- ${locatorHelpersScript()}${suggestDefScript()}
127
- let el;
128
- try {
129
- el = document.querySelector(${JSON.stringify(input.selector)});
130
- } catch (e) {
131
- return { ok: false, error: "Invalid CSS selector " + ${JSON.stringify(input.selector)} + ": " + e.message, code: "invalid_selector" };
132
- }
133
- if (!el) return { ok: false, error: "no element matches selector", code: "not_found" };
134
- return suggest(el);
135
- })()`;
136
- const res = await s.client.send("Runtime.evaluate", { expression, returnByValue: true }, input.session_id);
137
- value = res.result.value;
138
- }
139
- else {
140
- const resolved = await s.client.send("DOM.resolveNode", { nodeId: input.node_id }, input.session_id);
141
- const objectId = resolved.object?.objectId;
142
- if (!objectId)
143
- throw new ToolError("not_found", `could not resolve node ${input.node_id}`);
144
- const functionDeclaration = `function() {
145
- ${locatorHelpersScript()}${suggestDefScript()}
146
- return suggest(this);
147
- }`;
148
- const res = await s.client.send("Runtime.callFunctionOn", { objectId, functionDeclaration, returnByValue: true }, input.session_id);
149
- value = res.result.value;
150
- }
151
- if (!value || !value.ok)
152
- throw new ToolError(value?.code ?? "not_found", value?.error ?? "suggest_locator failed");
153
- return { candidates: value.candidates, recommended: value.recommended };
154
- });
155
- }
156
- function toArray(x) {
157
- if (x === undefined)
158
- return [];
159
- return Array.isArray(x) ? x : [x];
160
- }
161
- /**
162
- * Resolve `locator` to a single element in the page and run `body` against it.
163
- * `body` is JS that runs with `el` (the resolved element), `count` (total
164
- * matches), and `fireEvents(el, types)` in scope, and must `return` a
165
- * `{ ok, ... }` object (with an optional `code` on failure).
166
- */
167
- async function runMutation(locator, body, sessionId) {
168
- const s = requireSession();
169
- const expression = `(() => {
170
- const spec = ${JSON.stringify(locator)};
171
- ${locatorHelpersScript()}${mutationHelpersScript()}
172
- const resolved = resolveOne(spec);
173
- if (!resolved.ok) return { ok: false, error: resolved.error, code: resolved.code ?? "not_found" };
174
- const el = resolved.el;
175
- const count = resolved.count;
176
- ${body}
177
- })()`;
178
- const res = await s.client.send("Runtime.evaluate", { expression, returnByValue: true }, sessionId);
179
- return res.result.value;
180
- }
181
- function registerToggle(server, name) {
182
- const wantChecked = name === "check";
183
- const description = name === "check"
184
- ? "Ensure a checkbox or radio (located by LocatorSpec) is checked. Idempotent: returns status:\"already-checked\" with no events if it already is, else sets it and dispatches input + change."
185
- : "Ensure a checkbox or radio (located by LocatorSpec) is unchecked. Idempotent: returns status:\"already-unchecked\" with no events if it already is, else clears it and dispatches input + change.";
186
- registerJsonTool(server, name, description, { ...locatorShape, session_id: z.string().optional().describe("Target a worker/iframe session; omit for the root page.") }, async (input) => {
187
- const locator = normalizeLocator(input);
188
- const body = String.raw `
189
- if (!(el instanceof HTMLInputElement) || (el.type !== "checkbox" && el.type !== "radio"))
190
- return { ok: false, error: "element is not a checkbox or radio", code: "wrong_element" };
191
- if (el.checked === ${JSON.stringify(wantChecked)}) return { ok: true, changed: false, checked: el.checked, count };
192
- el.checked = ${JSON.stringify(wantChecked)};
193
- fireEvents(el, ["input", "change"]);
194
- return { ok: true, changed: true, checked: el.checked, count };
195
- `;
196
- const v = await runMutation(locator, body, input.session_id);
197
- if (!v.ok)
198
- throw new ToolError(v.code ?? "not_found", v.error ?? `${name} failed`);
199
- const status = wantChecked
200
- ? v.changed
201
- ? "checked"
202
- : "already-checked"
203
- : v.changed
204
- ? "unchecked"
205
- : "already-unchecked";
206
- return { status, checked: v.checked, count: v.count };
207
- });
208
- }
209
- /**
210
- * In-page `suggest(el)` definition. Compose after `locatorHelpersScript()` (it
211
- * relies on `implicitRole`/`accessibleName`/`labelText`/`textOf`/`cssPath`/
212
- * `findElements`). Builds ranked candidates and re-runs `findElements` per
213
- * candidate so the reported match counts are exactly what `locate` would produce.
214
- */
215
- function suggestDefScript() {
216
- return String.raw `
217
- const suggest = (el) => {
218
- const role = implicitRole(el);
219
- const name = accessibleName(el);
220
- const text = textOf(el);
221
- const testId = el.getAttribute("data-testid") || el.getAttribute("data-test-id") || el.getAttribute("data-test");
222
- const label = labelText(el);
223
- const placeholder = el.getAttribute("placeholder");
224
- const nameAttr = el.getAttribute("name");
225
- const cands = [];
226
- if (role && name) cands.push({ by: "role", role, name });
227
- if (text && text.length <= 80) cands.push({ by: "text", text });
228
- if (testId) cands.push({ by: "test_id", test_id: testId });
229
- if (label) cands.push({ by: "label", label });
230
- if (placeholder) cands.push({ by: "placeholder", placeholder });
231
- if (nameAttr) cands.push({ by: "name", name: nameAttr });
232
- cands.push({ by: "css", css: cssPath(el) });
233
- // findElements role/text both scan "body *"; cache it once since we call per candidate.
234
- const bodyEls = Array.from(document.querySelectorAll("body *"));
235
- const resolveMatches = (locator) => {
236
- if (locator.by === "text") return bodyEls.filter((e) => leafTextMatches(e, locator.text || locator.name, !!locator.exact));
237
- if (locator.by === "role") return bodyEls.filter((e) => implicitRole(e) === lower(locator.role) && matchesText(accessibleName(e), locator.name, !!locator.exact));
238
- const found = findElements(locator);
239
- return found.ok ? found.elements : [];
240
- };
241
- const annotated = cands.map((locator) => {
242
- const els = resolveMatches(locator);
243
- return {
244
- locator,
245
- match_count: els.length,
246
- unambiguous: els.length === 1,
247
- resolves_to_target: els.indexOf(el) !== -1,
248
- };
249
- });
250
- let recommended = annotated.findIndex((c) => c.unambiguous && c.resolves_to_target);
251
- if (recommended < 0) recommended = annotated.findIndex((c) => c.resolves_to_target);
252
- return { ok: true, candidates: annotated, recommended: recommended < 0 ? null : recommended };
253
- };
254
- `;
255
- }
256
- //# sourceMappingURL=forms.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/tools/forms.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerInspectTools(server: McpServer): void;
@@ -1,178 +0,0 @@
1
- import { z } from "zod";
2
- import { requireSession, requirePaused } from "../session/state.js";
3
- import { mapCdpToOriginal } from "../sourcemap/store.js";
4
- import { describeRemote, previewRemoteObject } from "../util/format.js";
5
- import { ToolError } from "../util/errors.js";
6
- import { registerJsonTool } from "./_register.js";
7
- // session_id provenance: objectIds, callFrameIds, and scriptIds returned by
8
- // CDP are scoped per-session (per-target). The inspect tools attach
9
- // `session_id` to every returned remote-object so the agent can pass it back
10
- // to get_object_properties and route to the correct Runtime agent.
11
- export function registerInspectTools(server) {
12
- registerJsonTool(server, "get_call_stack", "Get the current call stack with TS-mapped frames. Only valid while paused. Each frame includes the session_id its Runtime/Debugger agent belongs to — pass it through to evaluate/get_object_properties for the right routing.", undefined, async () => {
13
- const s = requirePaused();
14
- const state = s.pause.current();
15
- const sid = state.sessionId;
16
- return state.callFrames.map((cf, i) => {
17
- const mapped = mapCdpToOriginal(s.scripts, cf.location, sid);
18
- const script = s.scripts.get(cf.location.scriptId, sid);
19
- return {
20
- index: i,
21
- frame_id: cf.callFrameId,
22
- session_id: sid ?? null,
23
- function_name: cf.functionName || "(anonymous)",
24
- file: mapped?.file ?? script?.url ?? cf.url ?? "<unknown>",
25
- line: mapped?.line ?? cf.location.lineNumber + 1,
26
- column: mapped?.column ?? cf.location.columnNumber ?? 0,
27
- js_url: script?.url,
28
- js_line: cf.location.lineNumber + 1,
29
- scope_types: cf.scopeChain.map((sc) => sc.type),
30
- };
31
- });
32
- });
33
- registerJsonTool(server, "get_scope", "Return variables visible at a paused frame. Valid only while paused. Each item includes the session_id of the originating Runtime agent — required for follow-on get_object_properties calls when paused in a worker/iframe.", {
34
- frame_index: z.number().int().nonnegative().optional().describe("Default 0 (topmost frame)"),
35
- scope_type: z
36
- .enum(["local", "closure", "global", "block", "catch", "with", "script", "eval", "module"])
37
- .optional()
38
- .describe("Default: local"),
39
- max_props: z.number().int().positive().optional(),
40
- }, async (input) => {
41
- const s = requirePaused();
42
- const state = s.pause.current();
43
- const sid = state.sessionId;
44
- const idx = input.frame_index ?? 0;
45
- const frame = state.callFrames[idx];
46
- if (!frame)
47
- throw new ToolError("bad_frame", `Frame ${idx} out of range (${state.callFrames.length} frames)`);
48
- const targetType = input.scope_type ?? "local";
49
- const scope = frame.scopeChain.find((sc) => sc.type === targetType);
50
- if (!scope?.object?.objectId) {
51
- throw new ToolError("no_scope", `Frame ${idx} has no '${targetType}' scope. Available: ${frame.scopeChain.map((sc) => sc.type).join(", ")}`);
52
- }
53
- const max = input.max_props ?? 50;
54
- const result = await s.client.send("Runtime.getProperties", {
55
- objectId: scope.object.objectId,
56
- ownProperties: false,
57
- accessorPropertiesOnly: false,
58
- generatePreview: true,
59
- }, sid);
60
- const items = (result.result ?? [])
61
- .filter((p) => !p.symbol)
62
- .slice(0, max)
63
- .map((p) => ({
64
- name: p.name,
65
- ...(p.value ? describeRemote(p.value) : { type: "missing", preview: "(no value)" }),
66
- session_id: sid ?? null,
67
- writable: p.writable,
68
- enumerable: p.enumerable,
69
- }));
70
- return {
71
- frame_index: idx,
72
- scope_type: targetType,
73
- session_id: sid ?? null,
74
- items,
75
- truncated: (result.result?.length ?? 0) > max,
76
- };
77
- });
78
- registerJsonTool(server, "evaluate", "Evaluate a JS expression. When the debugger is paused, the expression runs in the paused frame's context via Debugger.evaluateOnCallFrame (top frame by default; override with frame_index). When not paused, runs in the page's Runtime context via Runtime.evaluate. frame_index given while not paused is a not_paused error. Note: while paused the event loop is frozen, so async expressions return the unresolved Promise object rather than awaiting it.", {
79
- expression: z.string(),
80
- frame_index: z.number().int().nonnegative().optional(),
81
- return_by_value: z.boolean().optional(),
82
- timeout_ms: z.number().int().positive().optional(),
83
- }, async (input) => {
84
- const s = requireSession();
85
- const paused = s.pause.isPaused();
86
- if (input.frame_index !== undefined && !paused) {
87
- throw new ToolError("not_paused", "frame_index requires paused state");
88
- }
89
- if (paused) {
90
- const state = s.pause.current();
91
- const sid = state.sessionId;
92
- const idx = input.frame_index ?? 0;
93
- const frame = state.callFrames[idx];
94
- if (!frame)
95
- throw new ToolError("bad_frame", `Frame ${idx} out of range (${state.callFrames.length} frames)`);
96
- const res = await s.client.send("Debugger.evaluateOnCallFrame", {
97
- callFrameId: frame.callFrameId,
98
- expression: input.expression,
99
- returnByValue: !!input.return_by_value,
100
- generatePreview: true,
101
- throwOnSideEffect: false,
102
- ...(input.timeout_ms ? { timeout: input.timeout_ms } : {}),
103
- }, sid);
104
- return formatEvalResult(res.result, res.exceptionDetails, sid);
105
- }
106
- const res = await s.client.send("Runtime.evaluate", {
107
- expression: input.expression,
108
- returnByValue: !!input.return_by_value,
109
- generatePreview: true,
110
- awaitPromise: true,
111
- ...(input.timeout_ms ? { timeout: input.timeout_ms } : {}),
112
- });
113
- return formatEvalResult(res.result, res.exceptionDetails, undefined);
114
- });
115
- registerJsonTool(server, "get_object_properties", "Inspect a RemoteObject by ID (from get_scope, evaluate, or a callstack frame). Pass `session_id` from the source response so the call routes to the right Runtime agent — null or omitted means root.", {
116
- object_id: z.string(),
117
- session_id: z.string().nullable().optional().describe("From get_scope/evaluate/get_call_stack response. null or omitted = root."),
118
- own_only: z.boolean().optional().describe("Default true"),
119
- max_props: z.number().int().positive().optional(),
120
- }, async (input) => {
121
- const s = requireSession();
122
- // Strict provenance: omitted session_id means root. The previous
123
- // "fall back to the paused session" behavior misrouted any
124
- // root-minted objectId once a child session was paused — a root
125
- // `evaluate` response carries no session_id (JSON drops undefined),
126
- // so an agent could not pass it back, and the fallback then
127
- // dispatched against the wrong target.
128
- // null is the explicit "root" sentinel agents round-trip from responses;
129
- // CDP wants undefined for root.
130
- const sid = input.session_id ?? undefined;
131
- const max = input.max_props ?? 50;
132
- const ownProperties = input.own_only ?? true;
133
- const result = await s.client.send("Runtime.getProperties", {
134
- objectId: input.object_id,
135
- ownProperties,
136
- accessorPropertiesOnly: false,
137
- generatePreview: true,
138
- }, sid);
139
- return {
140
- session_id: sid ?? null,
141
- items: (result.result ?? [])
142
- .filter((p) => !p.symbol)
143
- .slice(0, max)
144
- .map((p) => ({
145
- name: p.name,
146
- ...(p.value ? describeRemote(p.value) : { type: "missing", preview: "(no value)" }),
147
- session_id: sid ?? null,
148
- writable: p.writable,
149
- enumerable: p.enumerable,
150
- })),
151
- truncated: (result.result?.length ?? 0) > max,
152
- };
153
- });
154
- }
155
- function formatEvalResult(result, exceptionDetails, sessionId) {
156
- // Emit session_id as `null` for root (not undefined) so it survives JSON
157
- // serialization. Agents need a value to round-trip into
158
- // get_object_properties — otherwise a root-evaluate response with no
159
- // session_id field has nothing for the agent to pass back, and any
160
- // omit-then-default fallback misroutes when a child session is paused.
161
- const sid = sessionId ?? null;
162
- if (exceptionDetails) {
163
- return {
164
- error: true,
165
- message: exceptionDetails.exception?.description ?? exceptionDetails.text,
166
- ...(exceptionDetails.exception?.objectId ? { object_id: exceptionDetails.exception.objectId } : {}),
167
- session_id: sid,
168
- };
169
- }
170
- return {
171
- type: result.subtype ?? result.type,
172
- preview: previewRemoteObject(result),
173
- value: "value" in result ? result.value : undefined,
174
- ...(result.objectId ? { object_id: result.objectId } : {}),
175
- session_id: sid,
176
- };
177
- }
178
- //# sourceMappingURL=inspect.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/tools/inspect.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerNavTools(server: McpServer): void;