chrome-devtools-axi 0.1.4 → 0.1.6
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 +1 -0
- package/dist/bin/chrome-devtools-axi-bridge.d.ts +2 -0
- package/dist/bin/chrome-devtools-axi-bridge.js +7 -0
- package/dist/bin/chrome-devtools-axi-bridge.js.map +1 -0
- package/dist/src/bridge.d.ts +31 -1
- package/dist/src/bridge.js +144 -64
- package/dist/src/bridge.js.map +1 -1
- package/dist/src/cli.d.ts +1 -1
- package/dist/src/cli.js +161 -70
- package/dist/src/cli.js.map +1 -1
- package/dist/src/client.d.ts +6 -5
- package/dist/src/client.js +18 -11
- package/dist/src/client.js.map +1 -1
- package/dist/src/hooks.js +11 -4
- package/dist/src/hooks.js.map +1 -1
- package/dist/src/run.d.ts +35 -0
- package/dist/src/run.js +226 -0
- package/dist/src/run.js.map +1 -0
- package/package.json +1 -1
package/dist/src/client.js
CHANGED
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { spawn } from "node:child_process";
|
|
5
5
|
import { readFileSync, existsSync } from "node:fs";
|
|
6
|
-
import { join
|
|
6
|
+
import { join } from "node:path";
|
|
7
7
|
import { homedir } from "node:os";
|
|
8
8
|
import { request } from "node:http";
|
|
9
|
+
import { resolveBridgeScript } from "./bridge.js";
|
|
9
10
|
const STATE_DIR = join(homedir(), ".chrome-devtools-axi");
|
|
10
11
|
const PID_FILE = join(STATE_DIR, "bridge.pid");
|
|
11
12
|
const DEFAULT_PORT = 9224;
|
|
@@ -112,9 +113,15 @@ export async function ensureBridge() {
|
|
|
112
113
|
if (await checkBridgeHealth(pidInfo.port)) {
|
|
113
114
|
return pidInfo.port;
|
|
114
115
|
}
|
|
116
|
+
try {
|
|
117
|
+
process.kill(pidInfo.pid, "SIGTERM");
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Best effort — if shutdown fails, the startup poll below will time out.
|
|
121
|
+
}
|
|
115
122
|
}
|
|
116
123
|
// Start a new bridge
|
|
117
|
-
const bridgeScript =
|
|
124
|
+
const bridgeScript = resolveBridgeScript(import.meta.dirname);
|
|
118
125
|
// Try .ts first (dev mode), fall back to .js (built)
|
|
119
126
|
const script = existsSync(bridgeScript.replace(/\.js$/, ".ts"))
|
|
120
127
|
? bridgeScript.replace(/\.js$/, ".ts")
|
|
@@ -151,10 +158,10 @@ export async function callTool(name, args = {}) {
|
|
|
151
158
|
}
|
|
152
159
|
catch (err) {
|
|
153
160
|
const message = err instanceof Error ? err.message : String(err);
|
|
154
|
-
throw
|
|
161
|
+
throw mapErrorMessage(message);
|
|
155
162
|
}
|
|
156
163
|
}
|
|
157
|
-
function
|
|
164
|
+
export function mapErrorMessage(message) {
|
|
158
165
|
if (message.includes("ECONNREFUSED") || message.includes("ECONNRESET")) {
|
|
159
166
|
return new CdpError("Bridge is not running", "BRIDGE_NOT_READY", [
|
|
160
167
|
"Run `chrome-devtools-axi open <url>` — the bridge starts automatically",
|
|
@@ -186,13 +193,10 @@ function mapError(message) {
|
|
|
186
193
|
return new CdpError(message, "UNKNOWN");
|
|
187
194
|
}
|
|
188
195
|
/**
|
|
189
|
-
*
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* Get session status without starting the bridge.
|
|
193
|
-
* Returns null if bridge is not running.
|
|
196
|
+
* Get the current page snapshot without starting the bridge.
|
|
197
|
+
* Returns null if the bridge is not running or healthy.
|
|
194
198
|
*/
|
|
195
|
-
export async function
|
|
199
|
+
export async function getSessionSnapshotIfRunning() {
|
|
196
200
|
const pidInfo = readPidFile();
|
|
197
201
|
if (!pidInfo || !isProcessAlive(pidInfo.pid)) {
|
|
198
202
|
return null;
|
|
@@ -211,7 +215,10 @@ export async function getSessionStatus() {
|
|
|
211
215
|
return null;
|
|
212
216
|
}
|
|
213
217
|
}
|
|
214
|
-
|
|
218
|
+
/**
|
|
219
|
+
* Stop the bridge process.
|
|
220
|
+
*/
|
|
221
|
+
export function stopBridge() {
|
|
215
222
|
const pidInfo = readPidFile();
|
|
216
223
|
if (!pidInfo) {
|
|
217
224
|
return false;
|
package/dist/src/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/src/hooks.js
CHANGED
|
@@ -77,8 +77,8 @@ export function computeCodexConfigUpdate(content) {
|
|
|
77
77
|
const line = updated[i];
|
|
78
78
|
const section = line.match(/^\s*(\[{1,2})([^\]]+)(\]{1,2})\s*(?:#.*)?$/);
|
|
79
79
|
if (section) {
|
|
80
|
-
const isTableHeader = (section[1] === "[" && section[3] === "]")
|
|
81
|
-
|
|
80
|
+
const isTableHeader = (section[1] === "[" && section[3] === "]") ||
|
|
81
|
+
(section[1] === "[[" && section[3] === "]]");
|
|
82
82
|
if (!isTableHeader) {
|
|
83
83
|
continue;
|
|
84
84
|
}
|
|
@@ -113,7 +113,10 @@ export function computeCodexConfigUpdate(content) {
|
|
|
113
113
|
: normalized.endsWith(newline)
|
|
114
114
|
? newline
|
|
115
115
|
: `${newline}${newline}`;
|
|
116
|
-
return [
|
|
116
|
+
return [
|
|
117
|
+
`${normalized}${separator}[features]${newline}codex_hooks = true${newline}`,
|
|
118
|
+
true,
|
|
119
|
+
];
|
|
117
120
|
}
|
|
118
121
|
/**
|
|
119
122
|
* Idempotently install session hooks into all supported agents.
|
|
@@ -122,11 +125,15 @@ export function computeCodexConfigUpdate(content) {
|
|
|
122
125
|
export function installHooks() {
|
|
123
126
|
try {
|
|
124
127
|
const execPath = resolve(process.argv[1]);
|
|
128
|
+
if (!execPath.includes("chrome-devtools-axi"))
|
|
129
|
+
return;
|
|
125
130
|
for (const target of getHookTargets()) {
|
|
126
131
|
try {
|
|
127
132
|
mkdirSync(dirname(target.path), { recursive: true });
|
|
128
133
|
if (target.path.endsWith(".toml")) {
|
|
129
|
-
const content = existsSync(target.path)
|
|
134
|
+
const content = existsSync(target.path)
|
|
135
|
+
? readFileSync(target.path, "utf-8")
|
|
136
|
+
: "";
|
|
130
137
|
const [updated, changed] = computeCodexConfigUpdate(content);
|
|
131
138
|
if (changed) {
|
|
132
139
|
writeFileSync(target.path, updated);
|
package/dist/src/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script runner for `chrome-devtools-axi run`.
|
|
3
|
+
*
|
|
4
|
+
* Reads a script from stdin, provides a minimal `page` global, and executes it.
|
|
5
|
+
* Only the script's own console.log output is visible to the caller.
|
|
6
|
+
*/
|
|
7
|
+
type CallTool = (name: string, args?: Record<string, unknown>) => Promise<string>;
|
|
8
|
+
/** Extract the actual JS value from MCP evaluate_script response wrapper. */
|
|
9
|
+
export declare function parseEvalOutput(output: string): unknown;
|
|
10
|
+
/** Returns true when the string looks like a @uid ref (e.g. "@12", "26_181"). */
|
|
11
|
+
export declare function isUidRef(s: string): boolean;
|
|
12
|
+
export interface OpenResult {
|
|
13
|
+
url: string;
|
|
14
|
+
status: number | null;
|
|
15
|
+
}
|
|
16
|
+
export interface PageHelper {
|
|
17
|
+
open(url: string): Promise<OpenResult>;
|
|
18
|
+
eval(jsOrFn: string | ((...args: unknown[]) => unknown)): Promise<unknown>;
|
|
19
|
+
wait(ms: number): Promise<void>;
|
|
20
|
+
wait(selector: string, timeout?: number): Promise<void>;
|
|
21
|
+
snapshot(): Promise<string>;
|
|
22
|
+
click(refOrSelector: string): Promise<void>;
|
|
23
|
+
fill(refOrSelector: string, text: string): Promise<void>;
|
|
24
|
+
type(text: string): Promise<void>;
|
|
25
|
+
press(key: string): Promise<void>;
|
|
26
|
+
back(): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
export declare function createPageHelper(callTool: CallTool): PageHelper;
|
|
29
|
+
export interface RunResult {
|
|
30
|
+
stdout: string;
|
|
31
|
+
}
|
|
32
|
+
/** Read all of stdin into a string. */
|
|
33
|
+
export declare function readStdin(): Promise<string>;
|
|
34
|
+
export declare function runScript(content: string, callTool: CallTool): Promise<RunResult>;
|
|
35
|
+
export {};
|
package/dist/src/run.js
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script runner for `chrome-devtools-axi run`.
|
|
3
|
+
*
|
|
4
|
+
* Reads a script from stdin, provides a minimal `page` global, and executes it.
|
|
5
|
+
* Only the script's own console.log output is visible to the caller.
|
|
6
|
+
*/
|
|
7
|
+
import { mkdtempSync, writeFileSync, unlinkSync, rmdirSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { tmpdir } from "node:os";
|
|
10
|
+
import { CdpError } from "./client.js";
|
|
11
|
+
// --- Value parsing ---
|
|
12
|
+
/** Extract the actual JS value from MCP evaluate_script response wrapper. */
|
|
13
|
+
export function parseEvalOutput(output) {
|
|
14
|
+
const jsonBlock = output.match(/```json\n([\s\S]*?)\n```/);
|
|
15
|
+
if (jsonBlock) {
|
|
16
|
+
try {
|
|
17
|
+
return JSON.parse(jsonBlock[1].trim());
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return jsonBlock[1].trim();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const preamble = "Script ran on page and returned:";
|
|
24
|
+
if (output.includes(preamble)) {
|
|
25
|
+
const raw = output.slice(output.indexOf(preamble) + preamble.length).trim();
|
|
26
|
+
try {
|
|
27
|
+
return JSON.parse(raw);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return raw;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return output.trim();
|
|
34
|
+
}
|
|
35
|
+
/** Strip MCP preamble/headers from snapshot text, returning just the accessibility tree. */
|
|
36
|
+
function stripSnapshotHeader(text) {
|
|
37
|
+
const lines = text.split("\n");
|
|
38
|
+
const treeStart = lines.findIndex((l) => /\bRootWebArea\b|\buid=/.test(l));
|
|
39
|
+
if (treeStart > 0)
|
|
40
|
+
return lines.slice(treeStart).join("\n");
|
|
41
|
+
return text.replace(/^[\s\S]*?##\s+Latest page snapshot\s*\n/, "");
|
|
42
|
+
}
|
|
43
|
+
/** Strip leading @ from uid ref string. */
|
|
44
|
+
function parseUid(ref) {
|
|
45
|
+
return ref.startsWith("@") ? ref.slice(1) : ref;
|
|
46
|
+
}
|
|
47
|
+
/** Check if an open error is recoverable by falling back to new_page. */
|
|
48
|
+
function isRecoverableOpenError(error) {
|
|
49
|
+
if (!(error instanceof CdpError))
|
|
50
|
+
return false;
|
|
51
|
+
if (error.code !== "BROWSER_ERROR")
|
|
52
|
+
return false;
|
|
53
|
+
return /not connected|session (?:closed|not found)|no page/i.test(error.message);
|
|
54
|
+
}
|
|
55
|
+
// --- Selector detection ---
|
|
56
|
+
const UID_RE = /^@?\d[\d_]*$/;
|
|
57
|
+
/** Returns true when the string looks like a @uid ref (e.g. "@12", "26_181"). */
|
|
58
|
+
export function isUidRef(s) {
|
|
59
|
+
return UID_RE.test(s);
|
|
60
|
+
}
|
|
61
|
+
const DEFAULT_WAIT_TIMEOUT = 30_000;
|
|
62
|
+
export function createPageHelper(callTool) {
|
|
63
|
+
/** Run JS in the page and return the parsed value. */
|
|
64
|
+
async function evalJs(code) {
|
|
65
|
+
const output = await callTool("evaluate_script", { function: code });
|
|
66
|
+
return parseEvalOutput(output);
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
async open(url) {
|
|
70
|
+
if (!url) {
|
|
71
|
+
throw new CdpError("Missing URL", "VALIDATION_ERROR", [
|
|
72
|
+
'Start with `await page.open("https://example.com")`',
|
|
73
|
+
]);
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
await callTool("navigate_page", { type: "url", url });
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (!isRecoverableOpenError(error))
|
|
80
|
+
throw error;
|
|
81
|
+
await callTool("new_page", { url });
|
|
82
|
+
}
|
|
83
|
+
const info = await evalJs(`() => ({ url: location.href, status: performance.getEntriesByType('navigation').pop()?.responseStatus ?? null })`);
|
|
84
|
+
const result = info;
|
|
85
|
+
return {
|
|
86
|
+
url: String(result?.url ?? url),
|
|
87
|
+
status: typeof result?.status === "number" ? result.status : null,
|
|
88
|
+
};
|
|
89
|
+
},
|
|
90
|
+
async eval(jsOrFn) {
|
|
91
|
+
const fn = typeof jsOrFn === "function"
|
|
92
|
+
? String(jsOrFn)
|
|
93
|
+
: `() => (${jsOrFn.trim()})`;
|
|
94
|
+
return evalJs(fn);
|
|
95
|
+
},
|
|
96
|
+
async wait(msOrSelector, timeout) {
|
|
97
|
+
if (typeof msOrSelector === "number") {
|
|
98
|
+
await callTool("evaluate_script", {
|
|
99
|
+
function: `new Promise(r => setTimeout(r, ${msOrSelector}))`,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const ms = timeout ?? DEFAULT_WAIT_TIMEOUT;
|
|
104
|
+
const sel = JSON.stringify(msOrSelector);
|
|
105
|
+
await callTool("evaluate_script", {
|
|
106
|
+
function: `new Promise((resolve, reject) => {
|
|
107
|
+
const sel = ${sel};
|
|
108
|
+
if (document.querySelector(sel)) { resolve(); return; }
|
|
109
|
+
const observer = new MutationObserver(() => {
|
|
110
|
+
if (document.querySelector(sel)) {
|
|
111
|
+
observer.disconnect();
|
|
112
|
+
clearTimeout(timer);
|
|
113
|
+
resolve();
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
const timer = setTimeout(() => {
|
|
117
|
+
observer.disconnect();
|
|
118
|
+
reject(new Error('Timeout waiting for: ' + sel));
|
|
119
|
+
}, ${ms});
|
|
120
|
+
observer.observe(document.body, { childList: true, subtree: true, attributes: true });
|
|
121
|
+
})`,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
async snapshot() {
|
|
126
|
+
const result = await callTool("take_snapshot");
|
|
127
|
+
return stripSnapshotHeader(result);
|
|
128
|
+
},
|
|
129
|
+
async click(refOrSelector) {
|
|
130
|
+
if (isUidRef(refOrSelector)) {
|
|
131
|
+
await callTool("click", { uid: parseUid(refOrSelector) });
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
const sel = JSON.stringify(refOrSelector);
|
|
135
|
+
await callTool("evaluate_script", {
|
|
136
|
+
function: `(() => {
|
|
137
|
+
const el = document.querySelector(${sel});
|
|
138
|
+
if (!el) throw new Error('Element not found: ' + ${sel});
|
|
139
|
+
el.scrollIntoView({ block: 'center' });
|
|
140
|
+
el.click();
|
|
141
|
+
})()`,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
async fill(refOrSelector, text) {
|
|
146
|
+
if (isUidRef(refOrSelector)) {
|
|
147
|
+
await callTool("fill", { uid: parseUid(refOrSelector), value: text });
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
const sel = JSON.stringify(refOrSelector);
|
|
151
|
+
const val = JSON.stringify(text);
|
|
152
|
+
await callTool("evaluate_script", {
|
|
153
|
+
function: `(() => {
|
|
154
|
+
const el = document.querySelector(${sel});
|
|
155
|
+
if (!el) throw new Error('Element not found: ' + ${sel});
|
|
156
|
+
el.focus();
|
|
157
|
+
el.value = ${val};
|
|
158
|
+
el.dispatchEvent(new Event('input', { bubbles: true }));
|
|
159
|
+
el.dispatchEvent(new Event('change', { bubbles: true }));
|
|
160
|
+
})()`,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
async type(text) {
|
|
165
|
+
await callTool("type_text", { text });
|
|
166
|
+
},
|
|
167
|
+
async press(key) {
|
|
168
|
+
await callTool("press_key", { key });
|
|
169
|
+
},
|
|
170
|
+
async back() {
|
|
171
|
+
await callTool("navigate_page", { type: "back" });
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/** Read all of stdin into a string. */
|
|
176
|
+
export async function readStdin() {
|
|
177
|
+
const chunks = [];
|
|
178
|
+
for await (const chunk of process.stdin) {
|
|
179
|
+
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
|
|
180
|
+
}
|
|
181
|
+
return Buffer.concat(chunks).toString("utf-8");
|
|
182
|
+
}
|
|
183
|
+
export async function runScript(content, callTool) {
|
|
184
|
+
const page = createPageHelper(callTool);
|
|
185
|
+
// Write to a temp .mjs so dynamic import supports top-level await
|
|
186
|
+
const tmpDir = mkdtempSync(join(tmpdir(), "cda-run-"));
|
|
187
|
+
const tmpFile = join(tmpDir, "script.mjs");
|
|
188
|
+
writeFileSync(tmpFile, content, "utf-8");
|
|
189
|
+
// Capture console.log output from the script
|
|
190
|
+
const lines = [];
|
|
191
|
+
const origLog = console.log;
|
|
192
|
+
const captureLog = (...args) => {
|
|
193
|
+
lines.push(args.map(String).join(" "));
|
|
194
|
+
};
|
|
195
|
+
// Inject page global and capture console
|
|
196
|
+
const prevPage = globalThis.page;
|
|
197
|
+
globalThis.page = page;
|
|
198
|
+
console.log = captureLog;
|
|
199
|
+
try {
|
|
200
|
+
const mod = await import(tmpFile);
|
|
201
|
+
// Support optional default export function
|
|
202
|
+
if (typeof mod.default === "function") {
|
|
203
|
+
await mod.default();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
console.log = origLog;
|
|
208
|
+
if (prevPage === undefined) {
|
|
209
|
+
delete globalThis.page;
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
globalThis.page = prevPage;
|
|
213
|
+
}
|
|
214
|
+
// Clean up temp file
|
|
215
|
+
try {
|
|
216
|
+
unlinkSync(tmpFile);
|
|
217
|
+
rmdirSync(tmpDir);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
/* best effort */
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const stdout = lines.length > 0 ? lines.join("\n") + "\n" : "";
|
|
224
|
+
return { stdout };
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/run.ts"],"names":[],"mappings":"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"}
|