cdp-mcp 0.2.2 → 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.
- package/README.md +28 -303
- package/bin.js +23 -0
- package/contract.d.ts +1 -0
- package/contract.js +2 -0
- package/index.d.ts +1 -0
- package/index.js +2 -0
- package/package.json +31 -73
- package/dist/contract.d.ts +0 -11
- package/dist/contract.js +0 -11
- package/dist/contract.js.map +0 -1
- package/dist/index.d.ts +0 -18
- package/dist/index.js +0 -402
- package/dist/index.js.map +0 -1
- package/dist/locator.d.ts +0 -108
- package/dist/locator.js +0 -176
- package/dist/locator.js.map +0 -1
- package/dist/server.d.ts +0 -2
- package/dist/server.js +0 -41
- package/dist/server.js.map +0 -1
- package/dist/session/browser.d.ts +0 -29
- package/dist/session/browser.js +0 -409
- package/dist/session/browser.js.map +0 -1
- package/dist/session/buffers.d.ts +0 -48
- package/dist/session/buffers.js +0 -43
- package/dist/session/buffers.js.map +0 -1
- package/dist/session/pause.d.ts +0 -21
- package/dist/session/pause.js +0 -99
- package/dist/session/pause.js.map +0 -1
- package/dist/session/state.d.ts +0 -54
- package/dist/session/state.js +0 -93
- package/dist/session/state.js.map +0 -1
- package/dist/sourcemap/loader.d.ts +0 -4
- package/dist/sourcemap/loader.js +0 -138
- package/dist/sourcemap/loader.js.map +0 -1
- package/dist/sourcemap/normalize.d.ts +0 -2
- package/dist/sourcemap/normalize.js +0 -59
- package/dist/sourcemap/normalize.js.map +0 -1
- package/dist/sourcemap/store.d.ts +0 -57
- package/dist/sourcemap/store.js +0 -196
- package/dist/sourcemap/store.js.map +0 -1
- package/dist/tools/_locator_runtime.d.ts +0 -31
- package/dist/tools/_locator_runtime.js +0 -243
- package/dist/tools/_locator_runtime.js.map +0 -1
- package/dist/tools/_register.d.ts +0 -2
- package/dist/tools/_register.js +0 -30
- package/dist/tools/_register.js.map +0 -1
- package/dist/tools/breakpoints.d.ts +0 -4
- package/dist/tools/breakpoints.js +0 -200
- package/dist/tools/breakpoints.js.map +0 -1
- package/dist/tools/console.d.ts +0 -2
- package/dist/tools/console.js +0 -48
- package/dist/tools/console.js.map +0 -1
- package/dist/tools/dom.d.ts +0 -2
- package/dist/tools/dom.js +0 -309
- package/dist/tools/dom.js.map +0 -1
- package/dist/tools/execution.d.ts +0 -29
- package/dist/tools/execution.js +0 -89
- package/dist/tools/execution.js.map +0 -1
- package/dist/tools/forms.d.ts +0 -8
- package/dist/tools/forms.js +0 -256
- package/dist/tools/forms.js.map +0 -1
- package/dist/tools/inspect.d.ts +0 -2
- package/dist/tools/inspect.js +0 -178
- package/dist/tools/inspect.js.map +0 -1
- package/dist/tools/nav.d.ts +0 -2
- package/dist/tools/nav.js +0 -136
- package/dist/tools/nav.js.map +0 -1
- package/dist/tools/network.d.ts +0 -2
- package/dist/tools/network.js +0 -137
- package/dist/tools/network.js.map +0 -1
- package/dist/tools/session.d.ts +0 -2
- package/dist/tools/session.js +0 -76
- package/dist/tools/session.js.map +0 -1
- package/dist/tools/source.d.ts +0 -2
- package/dist/tools/source.js +0 -63
- package/dist/tools/source.js.map +0 -1
- package/dist/tools/storage.d.ts +0 -2
- package/dist/tools/storage.js +0 -296
- package/dist/tools/storage.js.map +0 -1
- package/dist/util/browser-resolve.d.ts +0 -19
- package/dist/util/browser-resolve.js +0 -263
- package/dist/util/browser-resolve.js.map +0 -1
- package/dist/util/errors.d.ts +0 -7
- package/dist/util/errors.js +0 -12
- package/dist/util/errors.js.map +0 -1
- package/dist/util/format.d.ts +0 -20
- package/dist/util/format.js +0 -65
- package/dist/util/format.js.map +0 -1
- package/dist/util/log.d.ts +0 -6
- package/dist/util/log.js +0 -34
- package/dist/util/log.js.map +0 -1
- package/docs/chromium-sandboxing.md +0 -197
- package/docs/known-chromium-gaps.md +0 -138
- package/docs/launchd-service.md +0 -217
- package/docs/local-l3-e2e-setup.md +0 -199
- package/docs/systemd-service.md +0 -233
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { requireSession, ROOT_SESSION_KEY } from "../session/state.js";
|
|
3
|
-
import { mapOriginalToGenerated, mapCdpToOriginal } from "../sourcemap/store.js";
|
|
4
|
-
import { ToolError } from "../util/errors.js";
|
|
5
|
-
import { registerJsonTool } from "./_register.js";
|
|
6
|
-
// Look up an existing breakpoint by normalized (file, line, column). Column
|
|
7
|
-
// is always a number here — the caller is responsible for collapsing an
|
|
8
|
-
// omitted or undefined `input.column` to 0 before calling, matching the
|
|
9
|
-
// `input.column ?? 0` shape that mapOriginalToGenerated and list_breakpoints
|
|
10
|
-
// already use. If the three normalizations ever diverge, set_breakpoint's
|
|
11
|
-
// idempotent path silently breaks (see PR #20 review).
|
|
12
|
-
function findBreakpointAt(breakpoints, file, line, column) {
|
|
13
|
-
for (const r of breakpoints.values()) {
|
|
14
|
-
if (r.file === file && r.line === line && (r.column ?? 0) === column)
|
|
15
|
-
return r;
|
|
16
|
-
}
|
|
17
|
-
return undefined;
|
|
18
|
-
}
|
|
19
|
-
// Physical CDP breakpoint identity for a generated location. A breakpoint is
|
|
20
|
-
// bound by (sessionId, url, line, col), so two candidates with the same key are
|
|
21
|
-
// the same CDP breakpoint. Mirrors the dedup key in mapOriginalToGenerated.
|
|
22
|
-
function genKey(g) {
|
|
23
|
-
return `${g.sessionId ?? ""}|${g.scriptUrl}|${g.lineNumber}:${g.columnNumber}`;
|
|
24
|
-
}
|
|
25
|
-
function breakpointEnvelope(r, status) {
|
|
26
|
-
return {
|
|
27
|
-
id: r.id,
|
|
28
|
-
resolved_locations: r.resolvedLocations,
|
|
29
|
-
binding_count: r.bindings.length,
|
|
30
|
-
sessions_bound: Array.from(new Set(r.bindings.map((b) => b.sessionId ?? ROOT_SESSION_KEY))),
|
|
31
|
-
status,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
export function registerBreakpointTools(server) {
|
|
35
|
-
registerJsonTool(server, "set_breakpoint", 'Set a breakpoint in TypeScript source. Resolves matching scripts via source maps (including in workers and iframes) and binds in each one\'s session. Returns the resolved JS->TS locations. Idempotent at the compiled-location level: re-calling at the same source location — or a different source line the source map collapses onto the same compiled JS position — returns the existing breakpoint id with status: "already-set" (when condition/log_message match). A compiled location already bound with a different condition/log_message, or only partially overlapping an existing breakpoint, returns error: "breakpoint_conflict" — remove the existing breakpoint first.', {
|
|
36
|
-
file: z.string().describe("TS file path or fragment (e.g. src/foo.ts)"),
|
|
37
|
-
line: z.number().int().positive().describe("1-based"),
|
|
38
|
-
column: z.number().int().nonnegative().optional(),
|
|
39
|
-
condition: z.string().optional().describe("Expression — pause only when truthy"),
|
|
40
|
-
log_message: z.string().optional().describe("Logpoint: log instead of pausing"),
|
|
41
|
-
}, async (input) => {
|
|
42
|
-
const s = requireSession();
|
|
43
|
-
// Normalize once at the top so lookup, mapping, and storage cannot
|
|
44
|
-
// drift. column collapses `undefined` and omitted to 0 — matching what
|
|
45
|
-
// mapOriginalToGenerated and list_breakpoints already do. condition /
|
|
46
|
-
// logMessage truthy-normalize so the empty string and undefined match.
|
|
47
|
-
const file = input.file;
|
|
48
|
-
const line = input.line;
|
|
49
|
-
const column = input.column ?? 0;
|
|
50
|
-
const condition = input.condition || undefined;
|
|
51
|
-
const logMessage = input.log_message || undefined;
|
|
52
|
-
const existing = findBreakpointAt(s.breakpoints, file, line, column);
|
|
53
|
-
if (existing) {
|
|
54
|
-
if (existing.condition === condition && existing.logMessage === logMessage) {
|
|
55
|
-
return breakpointEnvelope(existing, "already-set");
|
|
56
|
-
}
|
|
57
|
-
const locStr = `${file}:${line}:${column}`;
|
|
58
|
-
throw new ToolError("breakpoint_conflict", `Breakpoint already exists at ${locStr} (id ${existing.id}) with a different condition or log_message. Remove it first (remove_breakpoint) before setting a new one.`);
|
|
59
|
-
}
|
|
60
|
-
const candidates = mapOriginalToGenerated(s.scripts, file, line, column);
|
|
61
|
-
if (candidates.length === 0) {
|
|
62
|
-
throw new ToolError("no_mapping", `No source-mapped script matches '${file}:${line}'. Try list_scripts to confirm what's loaded.`);
|
|
63
|
-
}
|
|
64
|
-
// Generated-layer idempotency. findBreakpointAt() above matches on the
|
|
65
|
-
// *TS* coordinate, but two different TS lines can minify to the SAME
|
|
66
|
-
// compiled position — and since we bind by `url`, CDP would reject the
|
|
67
|
-
// second with "Breakpoint at specified location already exists" (a
|
|
68
|
-
// non-recoverable internal_error, issue #24). We detect that against what
|
|
69
|
-
// is PHYSICALLY bound — each binding's recorded genKey — not a re-mapping
|
|
70
|
-
// of the live ScriptStore: a script that loads after a record was set
|
|
71
|
-
// (dynamic import / code-split) must not make us claim coverage that was
|
|
72
|
-
// never bound (PR #25 review, finding 1).
|
|
73
|
-
const candKeys = candidates.map(genKey);
|
|
74
|
-
for (const r of s.breakpoints.values()) {
|
|
75
|
-
const boundKeys = new Set(r.bindings.map((b) => b.genKey).filter((k) => k !== undefined));
|
|
76
|
-
if (!candKeys.some((k) => boundKeys.has(k)))
|
|
77
|
-
continue;
|
|
78
|
-
// Full coverage + same condition/log_message → genuinely the same
|
|
79
|
-
// breakpoint. Anything else is recoverable conflict, never a silent
|
|
80
|
-
// partial bind (finding 2): partial overlap means some candidates would
|
|
81
|
-
// still collide in CDP, and a differing condition can't reuse r.
|
|
82
|
-
const fullyCovered = candKeys.every((k) => boundKeys.has(k));
|
|
83
|
-
if (fullyCovered && r.condition === condition && r.logMessage === logMessage) {
|
|
84
|
-
return breakpointEnvelope(r, "already-set");
|
|
85
|
-
}
|
|
86
|
-
const locStr = `${file}:${line}:${column}`;
|
|
87
|
-
const why = fullyCovered
|
|
88
|
-
? "the same compiled location with a different condition or log_message"
|
|
89
|
-
: "an overlapping compiled location";
|
|
90
|
-
throw new ToolError("breakpoint_conflict", `Breakpoint ${r.id} (${r.file}:${r.line}) already binds ${why} as ${locStr}. Remove it first (remove_breakpoint) before setting a new one.`);
|
|
91
|
-
}
|
|
92
|
-
const id = s.nextBpId();
|
|
93
|
-
const bindings = [];
|
|
94
|
-
const resolved = [];
|
|
95
|
-
const conditionExpr = buildConditionExpression(condition, logMessage);
|
|
96
|
-
for (const c of candidates) {
|
|
97
|
-
// Use the exact `url` field rather than `urlRegex`. CDP's regex is
|
|
98
|
-
// unanchored — `http://localhost/main.js` as a urlRegex also matches
|
|
99
|
-
// `http://localhost/main.js?v=2`, `…?vue&type=template`, etc.
|
|
100
|
-
const params = {
|
|
101
|
-
url: c.scriptUrl,
|
|
102
|
-
lineNumber: c.lineNumber,
|
|
103
|
-
columnNumber: c.columnNumber,
|
|
104
|
-
...(conditionExpr ? { condition: conditionExpr } : {}),
|
|
105
|
-
};
|
|
106
|
-
const res = await s.client.send("Debugger.setBreakpointByUrl", params, c.sessionId);
|
|
107
|
-
// Record the requested spec (genKey) so a later set_breakpoint can tell
|
|
108
|
-
// a real CDP collision from a stale ScriptStore recompute (PR #25 review).
|
|
109
|
-
bindings.push({ cdpId: res.breakpointId, genKey: genKey(c), ...(c.sessionId ? { sessionId: c.sessionId } : {}) });
|
|
110
|
-
for (const loc of res.locations) {
|
|
111
|
-
const orig = mapCdpToOriginal(s.scripts, loc, c.sessionId);
|
|
112
|
-
if (orig)
|
|
113
|
-
resolved.push(orig);
|
|
114
|
-
else
|
|
115
|
-
resolved.push({ file: c.scriptUrl, line: loc.lineNumber + 1, column: loc.columnNumber ?? 0 });
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
const record = {
|
|
119
|
-
id,
|
|
120
|
-
file,
|
|
121
|
-
line,
|
|
122
|
-
column,
|
|
123
|
-
...(condition ? { condition } : {}),
|
|
124
|
-
...(logMessage ? { logMessage } : {}),
|
|
125
|
-
resolvedLocations: resolved,
|
|
126
|
-
bindings,
|
|
127
|
-
};
|
|
128
|
-
s.breakpoints.set(id, record);
|
|
129
|
-
return breakpointEnvelope(record, "set");
|
|
130
|
-
});
|
|
131
|
-
registerJsonTool(server, "remove_breakpoint", "Remove a breakpoint by ID (returned from set_breakpoint).", { id: z.string() }, async (input) => {
|
|
132
|
-
const s = requireSession();
|
|
133
|
-
const rec = s.breakpoints.get(input.id);
|
|
134
|
-
if (!rec)
|
|
135
|
-
throw new ToolError("not_found", `No breakpoint with id ${input.id}`);
|
|
136
|
-
for (const b of rec.bindings) {
|
|
137
|
-
try {
|
|
138
|
-
await s.client.send("Debugger.removeBreakpoint", { breakpointId: b.cdpId }, b.sessionId);
|
|
139
|
-
}
|
|
140
|
-
catch {
|
|
141
|
-
/* ignore — session may already be gone */
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
s.breakpoints.delete(input.id);
|
|
145
|
-
return "removed";
|
|
146
|
-
});
|
|
147
|
-
registerJsonTool(server, "list_breakpoints", "List all currently active breakpoints.", undefined, async () => {
|
|
148
|
-
const s = requireSession();
|
|
149
|
-
return Array.from(s.breakpoints.values()).map((bp) => ({
|
|
150
|
-
id: bp.id,
|
|
151
|
-
file: bp.file,
|
|
152
|
-
line: bp.line,
|
|
153
|
-
column: bp.column ?? 0,
|
|
154
|
-
condition: bp.condition,
|
|
155
|
-
log_message: bp.logMessage,
|
|
156
|
-
resolved_locations: bp.resolvedLocations,
|
|
157
|
-
binding_count: bp.bindings.length,
|
|
158
|
-
}));
|
|
159
|
-
});
|
|
160
|
-
registerJsonTool(server, "set_pause_on_exceptions", "Configure whether the debugger pauses on exceptions. Applies to the root AND all currently-attached child sessions (workers/iframes/service workers), and is remembered so newly-attached children inherit the setting.", {
|
|
161
|
-
state: z.enum(["none", "uncaught", "all"]),
|
|
162
|
-
}, async (input) => {
|
|
163
|
-
const s = requireSession();
|
|
164
|
-
// Persist so onChildAttached can replay to future attachments.
|
|
165
|
-
s.pauseOnExceptions = input.state;
|
|
166
|
-
// Apply to every currently-attached session. ROOT_SESSION_KEY → undefined
|
|
167
|
-
// for the CDP call; child keys are the literal sessionId.
|
|
168
|
-
const targetSessions = [];
|
|
169
|
-
for (const key of s.sessionHandlers.keys()) {
|
|
170
|
-
targetSessions.push(key === ROOT_SESSION_KEY ? undefined : key);
|
|
171
|
-
}
|
|
172
|
-
if (targetSessions.length === 0)
|
|
173
|
-
targetSessions.push(undefined); // safety net
|
|
174
|
-
const results = await Promise.allSettled(targetSessions.map((sid) => s.client.send("Debugger.setPauseOnExceptions", { state: input.state }, sid)));
|
|
175
|
-
const failures = results
|
|
176
|
-
.map((r, i) => (r.status === "rejected" ? { sid: targetSessions[i] ?? "__root__", error: String(r.reason) } : null))
|
|
177
|
-
.filter((x) => x !== null);
|
|
178
|
-
return {
|
|
179
|
-
state: input.state,
|
|
180
|
-
sessions_applied: targetSessions.length - failures.length,
|
|
181
|
-
failures,
|
|
182
|
-
};
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
// Combine an optional `condition` predicate with an optional `logMessage`.
|
|
186
|
-
// Logpoint: emit a console.log and never pause (`false` short-circuits).
|
|
187
|
-
/** @internal exported for unit tests; not part of the MCP tool surface. */
|
|
188
|
-
export function buildConditionExpression(condition, logMessage) {
|
|
189
|
-
if (!condition && !logMessage)
|
|
190
|
-
return undefined;
|
|
191
|
-
if (logMessage) {
|
|
192
|
-
const tmpl = JSON.stringify(logMessage);
|
|
193
|
-
const log = `console.log(${tmpl}.replace(/\\{([^}]+)\\}/g, (m, expr) => { try { return String(eval(expr)); } catch (e) { return "{" + expr + "=?}"; } }))`;
|
|
194
|
-
if (condition)
|
|
195
|
-
return `(${condition}) && (${log}, false)`;
|
|
196
|
-
return `(${log}, false)`;
|
|
197
|
-
}
|
|
198
|
-
return condition;
|
|
199
|
-
}
|
|
200
|
-
//# sourceMappingURL=breakpoints.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"breakpoints.js","sourceRoot":"","sources":["../../src/tools/breakpoints.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/console.d.ts
DELETED
package/dist/tools/console.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { requireSession } from "../session/state.js";
|
|
3
|
-
import { truncate } from "../util/format.js";
|
|
4
|
-
import { registerJsonTool } from "./_register.js";
|
|
5
|
-
const LEVELS = ["log", "info", "warn", "error", "debug", "trace", "verbose"];
|
|
6
|
-
export function registerConsoleTools(server) {
|
|
7
|
-
registerJsonTool(server, "get_console_logs", "Query the buffered console + uncaught-exception stream. Paginate with `since` (the seq from the last call).", {
|
|
8
|
-
since: z.number().int().nonnegative().optional(),
|
|
9
|
-
level: z.enum(LEVELS).optional(),
|
|
10
|
-
search: z.string().optional().describe("Substring filter on message text"),
|
|
11
|
-
limit: z.number().int().positive().optional(),
|
|
12
|
-
}, async (input) => {
|
|
13
|
-
const s = requireSession();
|
|
14
|
-
const search = input.search?.toLowerCase();
|
|
15
|
-
const items = s.console.query({
|
|
16
|
-
since: input.since ?? 0,
|
|
17
|
-
limit: input.limit ?? 100,
|
|
18
|
-
filter: (e) => {
|
|
19
|
-
if (input.level && e.level !== input.level)
|
|
20
|
-
return false;
|
|
21
|
-
if (search && !e.text.toLowerCase().includes(search))
|
|
22
|
-
return false;
|
|
23
|
-
return true;
|
|
24
|
-
},
|
|
25
|
-
});
|
|
26
|
-
return {
|
|
27
|
-
cursor: items.length ? items[items.length - 1].seq : input.since ?? 0,
|
|
28
|
-
items: items.map((e) => ({
|
|
29
|
-
seq: e.seq,
|
|
30
|
-
ts: e.ts,
|
|
31
|
-
level: e.level,
|
|
32
|
-
source: e.source,
|
|
33
|
-
text: truncate(e.text, 1000),
|
|
34
|
-
file: e.mappedFile,
|
|
35
|
-
line: e.mappedLine,
|
|
36
|
-
column: e.mappedColumn,
|
|
37
|
-
js_url: e.url,
|
|
38
|
-
js_line: e.lineNumber != null ? e.lineNumber + 1 : undefined,
|
|
39
|
-
})),
|
|
40
|
-
};
|
|
41
|
-
});
|
|
42
|
-
registerJsonTool(server, "clear_console", "Clear the buffered console stream (does not clear the browser's own console).", undefined, async () => {
|
|
43
|
-
const s = requireSession();
|
|
44
|
-
s.console.clear();
|
|
45
|
-
return "cleared";
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
//# sourceMappingURL=console.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/tools/console.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/dom.d.ts
DELETED
package/dist/tools/dom.js
DELETED
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { writeFile } from "node:fs/promises";
|
|
3
|
-
import { requireSession } from "../session/state.js";
|
|
4
|
-
import { ToolError } from "../util/errors.js";
|
|
5
|
-
import { registerJsonTool } from "./_register.js";
|
|
6
|
-
import { locatorShape } from "../locator.js";
|
|
7
|
-
import { normalizeLocator, locatorHelpersScript, locatorReadScript } from "./_locator_runtime.js";
|
|
8
|
-
const waitStateSchema = z.enum(["visible", "hidden", "attached", "detached"]);
|
|
9
|
-
export function registerDomTools(server) {
|
|
10
|
-
registerJsonTool(server, "query_selector", "Find an element by CSS selector. Returns nodeId + a short preview.", { selector: z.string() }, async (input) => {
|
|
11
|
-
const s = requireSession();
|
|
12
|
-
const doc = await s.client.send("DOM.getDocument", { depth: 1 });
|
|
13
|
-
const found = await s.client.send("DOM.querySelector", {
|
|
14
|
-
nodeId: doc.root.nodeId,
|
|
15
|
-
selector: input.selector,
|
|
16
|
-
});
|
|
17
|
-
if (!found.nodeId)
|
|
18
|
-
return { found: false };
|
|
19
|
-
const desc = await s.client.send("DOM.describeNode", { nodeId: found.nodeId, depth: 0 });
|
|
20
|
-
return {
|
|
21
|
-
found: true,
|
|
22
|
-
node_id: found.nodeId,
|
|
23
|
-
tag: desc.node.nodeName?.toLowerCase(),
|
|
24
|
-
attrs: pairsToObj(desc.node.attributes ?? []),
|
|
25
|
-
text_preview: (desc.node.nodeValue ?? "").slice(0, 200),
|
|
26
|
-
backend_node_id: desc.node.backendNodeId,
|
|
27
|
-
};
|
|
28
|
-
});
|
|
29
|
-
registerJsonTool(server, "get_element_html", "Get the outer (or inner) HTML for an element.", {
|
|
30
|
-
selector: z.string().optional(),
|
|
31
|
-
node_id: z.number().int().positive().optional(),
|
|
32
|
-
outer: z.boolean().optional().describe("Default true"),
|
|
33
|
-
}, async (input) => {
|
|
34
|
-
const s = requireSession();
|
|
35
|
-
let nodeId = input.node_id;
|
|
36
|
-
if (!nodeId) {
|
|
37
|
-
if (!input.selector)
|
|
38
|
-
throw new ToolError("missing_arg", "selector or node_id required");
|
|
39
|
-
const doc = await s.client.send("DOM.getDocument", { depth: 1 });
|
|
40
|
-
const found = await s.client.send("DOM.querySelector", {
|
|
41
|
-
nodeId: doc.root.nodeId,
|
|
42
|
-
selector: input.selector,
|
|
43
|
-
});
|
|
44
|
-
if (!found.nodeId)
|
|
45
|
-
throw new ToolError("not_found", `No element matches ${input.selector}`);
|
|
46
|
-
nodeId = found.nodeId;
|
|
47
|
-
}
|
|
48
|
-
const outer = input.outer ?? true;
|
|
49
|
-
const html = await s.client.send("DOM.getOuterHTML", { nodeId });
|
|
50
|
-
if (outer)
|
|
51
|
-
return { node_id: nodeId, html: html.outerHTML };
|
|
52
|
-
// CDP has no direct innerHTML — derive it.
|
|
53
|
-
const wrapper = html.outerHTML.replace(/^<[^>]+>/, "").replace(/<\/[^>]+>$/, "");
|
|
54
|
-
return { node_id: nodeId, html: wrapper };
|
|
55
|
-
});
|
|
56
|
-
registerJsonTool(server, "locate", "Find elements with a structured LocatorSpec, e.g. { by: 'role', role: 'button', name: 'Submit' }.", {
|
|
57
|
-
...locatorShape,
|
|
58
|
-
include_hidden: z.boolean().optional().describe("Default false: only return visible matches."),
|
|
59
|
-
limit: z.number().int().positive().max(100).optional().describe("Default 20."),
|
|
60
|
-
}, async (input) => {
|
|
61
|
-
const locator = normalizeLocator(input);
|
|
62
|
-
const result = await evaluateLocator(locator, {
|
|
63
|
-
includeHidden: input.include_hidden ?? false,
|
|
64
|
-
limit: input.limit ?? 20,
|
|
65
|
-
});
|
|
66
|
-
if (!result.ok)
|
|
67
|
-
throw new ToolError("invalid_locator", result.error ?? "Invalid locator");
|
|
68
|
-
return result;
|
|
69
|
-
});
|
|
70
|
-
registerJsonTool(server, "wait_for", "Poll until a structured LocatorSpec reaches the requested DOM state.", {
|
|
71
|
-
...locatorShape,
|
|
72
|
-
state: waitStateSchema.optional().describe("Default visible."),
|
|
73
|
-
timeout_ms: z.number().int().positive().optional().describe("Default 5000."),
|
|
74
|
-
interval_ms: z.number().int().positive().optional().describe("Default 100."),
|
|
75
|
-
}, async (input) => {
|
|
76
|
-
const locator = normalizeLocator(input);
|
|
77
|
-
const state = input.state ?? "visible";
|
|
78
|
-
const timeoutMs = input.timeout_ms ?? 5000;
|
|
79
|
-
const intervalMs = input.interval_ms ?? 100;
|
|
80
|
-
const started = Date.now();
|
|
81
|
-
let lastResult = null;
|
|
82
|
-
while (Date.now() - started <= timeoutMs) {
|
|
83
|
-
lastResult = await evaluateLocator(locator, { includeHidden: true, limit: 20 });
|
|
84
|
-
if (!lastResult.ok)
|
|
85
|
-
throw new ToolError("invalid_locator", lastResult.error ?? "Invalid locator");
|
|
86
|
-
if (matchesWaitState(lastResult, state)) {
|
|
87
|
-
return {
|
|
88
|
-
state,
|
|
89
|
-
elapsed_ms: Date.now() - started,
|
|
90
|
-
locator,
|
|
91
|
-
result: lastResult,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
await delay(Math.min(intervalMs, Math.max(1, timeoutMs - (Date.now() - started))));
|
|
95
|
-
}
|
|
96
|
-
throw new ToolError("timeout", `Timed out after ${timeoutMs}ms waiting for ${describeLocator(locator)} to be ${state}; last count=${lastResult?.count ?? 0}, visible=${lastResult?.visible_count ?? 0}`);
|
|
97
|
-
});
|
|
98
|
-
registerJsonTool(server, "get_form_state", "Read named form fields using [name=\"...\"] selectors. Omit names to read every named control in the form/page.", {
|
|
99
|
-
names: z.array(z.string()).optional(),
|
|
100
|
-
form_selector: z.string().optional().describe("Optional CSS selector for the form or container to inspect."),
|
|
101
|
-
}, async (input) => {
|
|
102
|
-
const s = requireSession();
|
|
103
|
-
const res = await s.client.send("Runtime.evaluate", {
|
|
104
|
-
expression: buildFormStateExpression(input),
|
|
105
|
-
returnByValue: true,
|
|
106
|
-
});
|
|
107
|
-
const value = res.result.value;
|
|
108
|
-
if (!value.ok)
|
|
109
|
-
throw new ToolError("invalid_selector", value.error ?? "Unable to read form state");
|
|
110
|
-
return value;
|
|
111
|
-
});
|
|
112
|
-
registerJsonTool(server, "click", "Click an element matched by CSS selector. Uses synthetic input events.", { selector: z.string() }, async (input) => {
|
|
113
|
-
const s = requireSession();
|
|
114
|
-
const expr = `(() => {
|
|
115
|
-
const el = document.querySelector(${JSON.stringify(input.selector)});
|
|
116
|
-
if (!el) return { ok: false, error: "no match" };
|
|
117
|
-
el.scrollIntoView({ block: "center", inline: "center" });
|
|
118
|
-
const r = el.getBoundingClientRect();
|
|
119
|
-
return { ok: true, x: r.left + r.width / 2, y: r.top + r.height / 2 };
|
|
120
|
-
})()`;
|
|
121
|
-
const res = await s.client.send("Runtime.evaluate", {
|
|
122
|
-
expression: expr,
|
|
123
|
-
returnByValue: true,
|
|
124
|
-
});
|
|
125
|
-
const v = res.result.value;
|
|
126
|
-
if (!v.ok)
|
|
127
|
-
throw new ToolError("not_found", `click: ${v.error ?? "unknown"}`);
|
|
128
|
-
const x = v.x;
|
|
129
|
-
const y = v.y;
|
|
130
|
-
await s.client.send("Input.dispatchMouseEvent", { type: "mouseMoved", x, y });
|
|
131
|
-
await s.client.send("Input.dispatchMouseEvent", { type: "mousePressed", x, y, button: "left", clickCount: 1 });
|
|
132
|
-
await s.client.send("Input.dispatchMouseEvent", { type: "mouseReleased", x, y, button: "left", clickCount: 1 });
|
|
133
|
-
return { clicked: input.selector, x, y };
|
|
134
|
-
});
|
|
135
|
-
registerJsonTool(server, "type_text", "Focus a CSS-selected element and type text into it.", { selector: z.string(), text: z.string(), clear_first: z.boolean().optional() }, async (input) => {
|
|
136
|
-
const s = requireSession();
|
|
137
|
-
const focus = await s.client.send("Runtime.evaluate", {
|
|
138
|
-
expression: `(() => {
|
|
139
|
-
const el = document.querySelector(${JSON.stringify(input.selector)});
|
|
140
|
-
if (!el) return false;
|
|
141
|
-
el.focus();
|
|
142
|
-
${input.clear_first ? "if ('value' in el) el.value = '';" : ""}
|
|
143
|
-
return true;
|
|
144
|
-
})()`,
|
|
145
|
-
returnByValue: true,
|
|
146
|
-
});
|
|
147
|
-
if (focus.result.value !== true)
|
|
148
|
-
throw new ToolError("not_found", `type_text: ${input.selector}`);
|
|
149
|
-
await s.client.send("Input.insertText", { text: input.text });
|
|
150
|
-
return { typed: input.text.length, into: input.selector };
|
|
151
|
-
});
|
|
152
|
-
registerJsonTool(server, "press_key", "Send a key press to the focused element (e.g. Enter, Tab, Escape).", { key: z.string() }, async (input) => {
|
|
153
|
-
const s = requireSession();
|
|
154
|
-
await s.client.send("Input.dispatchKeyEvent", { type: "keyDown", key: input.key });
|
|
155
|
-
await s.client.send("Input.dispatchKeyEvent", { type: "keyUp", key: input.key });
|
|
156
|
-
return { pressed: input.key };
|
|
157
|
-
});
|
|
158
|
-
registerJsonTool(server, "screenshot", "Take a screenshot of the current page. Returns base64 PNG by default, or saves to a file.", {
|
|
159
|
-
full_page: z.boolean().optional(),
|
|
160
|
-
path: z.string().optional().describe("If set, save to this absolute path and return path instead of base64"),
|
|
161
|
-
format: z.enum(["png", "jpeg"]).optional(),
|
|
162
|
-
quality: z.number().int().min(1).max(100).optional(),
|
|
163
|
-
}, async (input) => {
|
|
164
|
-
const s = requireSession();
|
|
165
|
-
const r = await s.client.send("Page.captureScreenshot", {
|
|
166
|
-
format: input.format ?? "png",
|
|
167
|
-
...(input.quality && input.format === "jpeg" ? { quality: input.quality } : {}),
|
|
168
|
-
captureBeyondViewport: !!input.full_page,
|
|
169
|
-
});
|
|
170
|
-
if (input.path) {
|
|
171
|
-
await writeFile(input.path, Buffer.from(r.data, "base64"));
|
|
172
|
-
return { saved: input.path, bytes: r.data.length };
|
|
173
|
-
}
|
|
174
|
-
return { format: input.format ?? "png", base64: r.data };
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
function pairsToObj(pairs) {
|
|
178
|
-
const out = {};
|
|
179
|
-
for (let i = 0; i < pairs.length; i += 2) {
|
|
180
|
-
out[pairs[i] ?? ""] = pairs[i + 1] ?? "";
|
|
181
|
-
}
|
|
182
|
-
return out;
|
|
183
|
-
}
|
|
184
|
-
async function evaluateLocator(locator, options) {
|
|
185
|
-
const s = requireSession();
|
|
186
|
-
const res = await s.client.send("Runtime.evaluate", {
|
|
187
|
-
expression: buildLocateExpression(locator, options),
|
|
188
|
-
returnByValue: true,
|
|
189
|
-
});
|
|
190
|
-
return res.result.value;
|
|
191
|
-
}
|
|
192
|
-
function matchesWaitState(result, state) {
|
|
193
|
-
switch (state) {
|
|
194
|
-
case "visible":
|
|
195
|
-
return result.visible_count > 0;
|
|
196
|
-
case "attached":
|
|
197
|
-
return result.count > 0;
|
|
198
|
-
case "hidden":
|
|
199
|
-
return result.count === 0 || result.visible_count === 0;
|
|
200
|
-
case "detached":
|
|
201
|
-
return result.count === 0;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
function delay(ms) {
|
|
205
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
206
|
-
}
|
|
207
|
-
function describeLocator(locator) {
|
|
208
|
-
return JSON.stringify(locator);
|
|
209
|
-
}
|
|
210
|
-
function buildLocateExpression(locator, options) {
|
|
211
|
-
return `(() => {
|
|
212
|
-
const spec = ${JSON.stringify(locator)};
|
|
213
|
-
const options = ${JSON.stringify(options)};
|
|
214
|
-
${locatorHelpersScript()}${locatorReadScript()}
|
|
215
|
-
return locate(spec, options);
|
|
216
|
-
})()`;
|
|
217
|
-
}
|
|
218
|
-
function buildFormStateExpression(input) {
|
|
219
|
-
return `(() => {
|
|
220
|
-
const input = ${JSON.stringify(input)};
|
|
221
|
-
${formStateRuntimeScript()}
|
|
222
|
-
return readFormState(input);
|
|
223
|
-
})()`;
|
|
224
|
-
}
|
|
225
|
-
function formStateRuntimeScript() {
|
|
226
|
-
return String.raw `
|
|
227
|
-
const compact = (value) => (value || "").replace(/\s+/g, " ").trim();
|
|
228
|
-
const isVisible = (el) => {
|
|
229
|
-
if (!el.isConnected) return false;
|
|
230
|
-
const style = getComputedStyle(el);
|
|
231
|
-
if (style.visibility === "hidden" || style.display === "none" || Number(style.opacity) === 0) return false;
|
|
232
|
-
const rect = el.getBoundingClientRect();
|
|
233
|
-
return rect.width > 0 && rect.height > 0;
|
|
234
|
-
};
|
|
235
|
-
const controlValue = (el) => {
|
|
236
|
-
if (el instanceof HTMLSelectElement) {
|
|
237
|
-
if (el.multiple) return Array.from(el.selectedOptions).map((option) => option.value);
|
|
238
|
-
return el.value;
|
|
239
|
-
}
|
|
240
|
-
if (el instanceof HTMLInputElement && el.type === "checkbox") return el.checked;
|
|
241
|
-
if (el instanceof HTMLInputElement && el.type === "radio") return el.checked ? el.value : null;
|
|
242
|
-
return "value" in el ? el.value : null;
|
|
243
|
-
};
|
|
244
|
-
const describeControl = (el) => ({
|
|
245
|
-
tag: el.tagName.toLowerCase(),
|
|
246
|
-
type: el.getAttribute("type") || undefined,
|
|
247
|
-
value: controlValue(el),
|
|
248
|
-
raw_value: "value" in el ? el.value : undefined,
|
|
249
|
-
checked: "checked" in el ? !!el.checked : undefined,
|
|
250
|
-
disabled: "disabled" in el ? !!el.disabled : undefined,
|
|
251
|
-
visible: isVisible(el),
|
|
252
|
-
text: compact(el.innerText || el.textContent || "").slice(0, 200) || undefined,
|
|
253
|
-
});
|
|
254
|
-
const summarizeGroup = (controls) => {
|
|
255
|
-
const radioControls = controls.filter((el) => el instanceof HTMLInputElement && el.type === "radio");
|
|
256
|
-
if (radioControls.length > 0) {
|
|
257
|
-
const checked = radioControls.find((el) => el.checked);
|
|
258
|
-
return {
|
|
259
|
-
kind: "radio_group",
|
|
260
|
-
value: checked ? checked.value : null,
|
|
261
|
-
controls: radioControls.map(describeControl),
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
|
-
const checkboxControls = controls.filter((el) => el instanceof HTMLInputElement && el.type === "checkbox");
|
|
265
|
-
if (checkboxControls.length > 1) {
|
|
266
|
-
return {
|
|
267
|
-
kind: "checkbox_group",
|
|
268
|
-
value: checkboxControls.filter((el) => el.checked).map((el) => el.value),
|
|
269
|
-
controls: checkboxControls.map(describeControl),
|
|
270
|
-
};
|
|
271
|
-
}
|
|
272
|
-
return {
|
|
273
|
-
kind: controls.length === 1 ? "field" : "field_group",
|
|
274
|
-
value: controls.length === 1 ? controlValue(controls[0]) : controls.map(controlValue),
|
|
275
|
-
controls: controls.map(describeControl),
|
|
276
|
-
};
|
|
277
|
-
};
|
|
278
|
-
const readFormState = (input) => {
|
|
279
|
-
let root = document;
|
|
280
|
-
if (input.form_selector) {
|
|
281
|
-
try {
|
|
282
|
-
root = document.querySelector(input.form_selector);
|
|
283
|
-
} catch (error) {
|
|
284
|
-
return { ok: false, error: "Invalid form_selector " + input.form_selector + ": " + error.message };
|
|
285
|
-
}
|
|
286
|
-
if (!root) return { ok: false, error: "No element matches form_selector " + input.form_selector };
|
|
287
|
-
}
|
|
288
|
-
const controls = Array.from(root.querySelectorAll("input[name], textarea[name], select[name], button[name]"));
|
|
289
|
-
const wantedNames = input.names || Array.from(new Set(controls.map((el) => el.getAttribute("name")).filter(Boolean)));
|
|
290
|
-
const fields = {};
|
|
291
|
-
const missing = [];
|
|
292
|
-
for (const name of wantedNames) {
|
|
293
|
-
const matches = controls.filter((el) => el.getAttribute("name") === name);
|
|
294
|
-
if (matches.length === 0) {
|
|
295
|
-
missing.push(name);
|
|
296
|
-
continue;
|
|
297
|
-
}
|
|
298
|
-
fields[name] = summarizeGroup(matches);
|
|
299
|
-
}
|
|
300
|
-
return {
|
|
301
|
-
ok: true,
|
|
302
|
-
form_selector: input.form_selector || null,
|
|
303
|
-
fields,
|
|
304
|
-
missing,
|
|
305
|
-
};
|
|
306
|
-
};
|
|
307
|
-
`;
|
|
308
|
-
}
|
|
309
|
-
//# sourceMappingURL=dom.js.map
|
package/dist/tools/dom.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/tools/dom.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
-
import type { Protocol } from "devtools-protocol";
|
|
3
|
-
import { requireSession } from "../session/state.js";
|
|
4
|
-
export declare function registerExecutionTools(server: McpServer): void;
|
|
5
|
-
export declare function summarizePause(s: ReturnType<typeof requireSession>, reason: Protocol.Debugger.PausedEvent["reason"], hitBreakpoints: string[] | undefined, data: object | undefined, callFrames: Protocol.Debugger.CallFrame[], sessionId: string | undefined): {
|
|
6
|
-
reason: "ambiguous" | "assert" | "CSPViolation" | "debugCommand" | "DOM" | "EventListener" | "exception" | "instrumentation" | "OOM" | "other" | "promiseRejection" | "XHR" | "step";
|
|
7
|
-
hit_breakpoint_ids: string[];
|
|
8
|
-
session_id: string | null;
|
|
9
|
-
data: object | null;
|
|
10
|
-
call_stack: {
|
|
11
|
-
index: number;
|
|
12
|
-
frame_id: string;
|
|
13
|
-
session_id: string | null;
|
|
14
|
-
function_name: string;
|
|
15
|
-
file: string;
|
|
16
|
-
line: number;
|
|
17
|
-
column: number;
|
|
18
|
-
js_url: string | undefined;
|
|
19
|
-
js_line: number;
|
|
20
|
-
js_column: number;
|
|
21
|
-
scope_types: ("catch" | "global" | "local" | "with" | "closure" | "block" | "script" | "eval" | "module" | "wasm-expression-stack")[];
|
|
22
|
-
this: {
|
|
23
|
-
type: "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function" | "map" | "error" | "array" | "null" | "node" | "regexp" | "date" | "set" | "weakmap" | "weakset" | "iterator" | "generator" | "proxy" | "promise" | "typedarray" | "arraybuffer" | "dataview" | "webassemblymemory" | "wasmvalue" | "trustedtype";
|
|
24
|
-
preview: string;
|
|
25
|
-
} | null;
|
|
26
|
-
}[];
|
|
27
|
-
};
|
|
28
|
-
/** @internal exported for unit tests; not part of the MCP tool surface. */
|
|
29
|
-
export declare function matchUserBreakpoints(s: ReturnType<typeof requireSession>, hit: string[], pauseSessionId: string | undefined): string[];
|