@page-scanner/cli 0.2.1 → 0.2.2
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 -1
- package/dist/bin.js +1 -1
- package/dist/cli/format.d.ts +1 -1
- package/dist/daemon/client.d.ts +32 -2
- package/dist/daemon/client.d.ts.map +1 -1
- package/dist/daemon/client.js +63 -8
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/rpc-server.js +2 -2
- package/dist/daemon/run.d.ts +6 -0
- package/dist/daemon/run.d.ts.map +1 -1
- package/dist/daemon/run.js +12 -6
- package/dist/daemon/run.js.map +1 -1
- package/dist/daemon/self.d.ts +20 -0
- package/dist/daemon/self.d.ts.map +1 -1
- package/dist/daemon/self.js +22 -0
- package/dist/daemon/self.js.map +1 -1
- package/dist/daemon/state.js +1 -1
- package/dist/daemon/state.js.map +1 -1
- package/dist/diff/image.js +1 -1
- package/dist/diff/image.js.map +1 -1
- package/dist/diff/png.d.ts +1 -1
- package/dist/diff/png.d.ts.map +1 -1
- package/dist/diff/png.js +4 -4
- package/dist/diff/png.js.map +1 -1
- package/dist/diff/text.js +4 -4
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/output.d.ts +24 -0
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +45 -2
- package/dist/output.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -272,6 +272,6 @@ the only one that pulls the WebSocket server in.
|
|
|
272
272
|
240,000, and a scan from here follows it.
|
|
273
273
|
- One pairing per machine, shared by every browser profile that connects to it.
|
|
274
274
|
|
|
275
|
-
##
|
|
275
|
+
## License
|
|
276
276
|
|
|
277
277
|
Apache-2.0. See [LICENSE](LICENSE).
|
package/dist/bin.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* The `page-scanner` command. Argument parsing, dispatch, exit code.
|
|
4
4
|
*
|
|
5
|
-
* Everything else lives behind `runCommand`, so the same
|
|
5
|
+
* Everything else lives behind `runCommand`, so the same behavior is
|
|
6
6
|
* reachable from `import { scan } from '@page-scanner/cli'` without a process.
|
|
7
7
|
*/
|
|
8
8
|
import { parseArgs } from './cli/args.js';
|
package/dist/cli/format.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Turning results into the text a person reads.
|
|
3
3
|
*
|
|
4
4
|
* Every function here is pure: data in, a string out, no writing and no
|
|
5
|
-
*
|
|
5
|
+
* color. A command can then be tested on what it computed rather than on what
|
|
6
6
|
* it printed, and the `--json` path skips this file entirely.
|
|
7
7
|
*
|
|
8
8
|
* The house style for the tables is "plain enough to pipe". No box drawing, no
|
package/dist/daemon/client.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { PageScannerError } from '../errors.js';
|
|
2
|
+
import { type SelfCommand } from './self.js';
|
|
1
3
|
import { type DaemonState } from './state.js';
|
|
2
4
|
/** How long to wait for a freshly spawned daemon to publish its state and answer. */
|
|
3
5
|
export declare const DAEMON_START_TIMEOUT_MS = 5000;
|
|
@@ -5,16 +7,44 @@ export interface DaemonClient {
|
|
|
5
7
|
state: DaemonState;
|
|
6
8
|
call<T>(method: string, params?: Record<string, unknown>, timeoutMs?: number): Promise<T>;
|
|
7
9
|
}
|
|
10
|
+
/** What a start hands back so the wait can stop early. */
|
|
11
|
+
export interface StartedDaemon {
|
|
12
|
+
/** Set once the start has visibly failed; until then the wait goes on. */
|
|
13
|
+
failure(): PageScannerError | undefined;
|
|
14
|
+
}
|
|
8
15
|
export interface ConnectOptions {
|
|
9
16
|
/**
|
|
10
17
|
* Starts the daemon. Injectable so a test can assert the spawn decision
|
|
11
|
-
* without putting a process on the machine.
|
|
18
|
+
* without putting a process on the machine. A rejection is the answer, and
|
|
19
|
+
* a returned `failure()` ends the wait as soon as it says something.
|
|
12
20
|
*/
|
|
13
|
-
startDaemon?: () => void
|
|
21
|
+
startDaemon?: () => void | StartedDaemon | Promise<void | StartedDaemon>;
|
|
14
22
|
startTimeoutMs?: number;
|
|
15
23
|
/** Injectable so a test does not wait in real time. */
|
|
16
24
|
sleep?: (ms: number) => Promise<void>;
|
|
17
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Spawns this same program as `serve --daemon`, detached, and lets go of it.
|
|
28
|
+
*
|
|
29
|
+
* A child that cannot start, or exits with a failure before the daemon is up,
|
|
30
|
+
* says so through `failure()`, so the wait ends on the real reason instead of
|
|
31
|
+
* timing out on a process that is already gone. An exit with 0 is not one: it
|
|
32
|
+
* is a daemon that found another already registered, which the wait picks up.
|
|
33
|
+
* @param self what to run, injectable so a test can spawn something that fails.
|
|
34
|
+
*/
|
|
35
|
+
export declare function spawnDaemon(self?: SelfCommand): StartedDaemon;
|
|
36
|
+
/**
|
|
37
|
+
* Runs the daemon inside this process, for a host that refuses to spawn it
|
|
38
|
+
* (`canSpawnSelf()` says which). Resolves once it is listening, and rejects
|
|
39
|
+
* with the daemon's own error when it cannot start, such as NOT_PAIRED or
|
|
40
|
+
* PORT_IN_USE, which a spawned daemon could only leave in its log.
|
|
41
|
+
*
|
|
42
|
+
* It lives as long as this process does, stops on the idle timer and on a
|
|
43
|
+
* `shutdown` call like any other, and the next call starts it again. It leaves
|
|
44
|
+
* SIGINT and SIGTERM to the host, and writes to the same log a spawned daemon
|
|
45
|
+
* does, never to stdout, which is the MCP server's.
|
|
46
|
+
*/
|
|
47
|
+
export declare function startDaemonInProcess(): Promise<void>;
|
|
18
48
|
/**
|
|
19
49
|
* Returns a client for a running daemon, starting one if necessary.
|
|
20
50
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,gBAAgB,EAAsC,MAAM,cAAc,CAAC;AAEpF,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAEpB,qFAAqF;AACrF,eAAO,MAAM,uBAAuB,OAAQ,CAAC;AAU7C,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC3F;AAED,0DAA0D;AAC1D,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,OAAO,IAAI,gBAAgB,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,IAAI,GAAG,aAAa,GAAG,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC,CAAC;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAsED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,GAAE,WAA2B,GAAG,aAAa,CAoC5E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiB1D;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAuCvF;AAED,wEAAwE;AACxE,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAkBnD"}
|
package/dist/daemon/client.js
CHANGED
|
@@ -8,14 +8,20 @@
|
|
|
8
8
|
* wakes a service worker that has just been retired.
|
|
9
9
|
*/
|
|
10
10
|
import { spawn } from 'node:child_process';
|
|
11
|
-
import { openSync } from 'node:fs';
|
|
11
|
+
import { appendFileSync, openSync } from 'node:fs';
|
|
12
12
|
import { PageScannerError, toPageScannerError } from '../errors.js';
|
|
13
13
|
import { CLI_VERSION } from '../version.js';
|
|
14
|
-
import { selfCommand } from './self.js';
|
|
14
|
+
import { canSpawnSelf, selfCommand } from './self.js';
|
|
15
15
|
import { clearDaemonState, daemonLogPath, processAlive, readDaemonState, } from './state.js';
|
|
16
16
|
/** How long to wait for a freshly spawned daemon to publish its state and answer. */
|
|
17
17
|
export const DAEMON_START_TIMEOUT_MS = 5_000;
|
|
18
18
|
const POLL_INTERVAL_MS = 100;
|
|
19
|
+
/**
|
|
20
|
+
* The daemon in the foreground, spelled like `PAIR_COMMAND` so it runs for
|
|
21
|
+
* someone who has only the MCP server: `page-scanner serve` is "command not
|
|
22
|
+
* found" there, and an agent relays the hint to its user word for word.
|
|
23
|
+
*/
|
|
24
|
+
const SERVE_COMMAND = 'npx @page-scanner/cli serve';
|
|
19
25
|
const realSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
20
26
|
function clientFor(state) {
|
|
21
27
|
return {
|
|
@@ -58,9 +64,17 @@ async function healthy(state) {
|
|
|
58
64
|
return null;
|
|
59
65
|
}
|
|
60
66
|
}
|
|
61
|
-
/**
|
|
62
|
-
|
|
63
|
-
|
|
67
|
+
/**
|
|
68
|
+
* Spawns this same program as `serve --daemon`, detached, and lets go of it.
|
|
69
|
+
*
|
|
70
|
+
* A child that cannot start, or exits with a failure before the daemon is up,
|
|
71
|
+
* says so through `failure()`, so the wait ends on the real reason instead of
|
|
72
|
+
* timing out on a process that is already gone. An exit with 0 is not one: it
|
|
73
|
+
* is a daemon that found another already registered, which the wait picks up.
|
|
74
|
+
* @param self what to run, injectable so a test can spawn something that fails.
|
|
75
|
+
*/
|
|
76
|
+
export function spawnDaemon(self = selfCommand()) {
|
|
77
|
+
const { command, args } = self;
|
|
64
78
|
let log;
|
|
65
79
|
try {
|
|
66
80
|
log = openSync(daemonLogPath(), 'a');
|
|
@@ -68,12 +82,50 @@ function spawnDaemon() {
|
|
|
68
82
|
catch (error) {
|
|
69
83
|
throw new PageScannerError('DAEMON_FAILED', `Could not open the daemon log at ${daemonLogPath()}: ${error instanceof Error ? error.message : String(error)}`);
|
|
70
84
|
}
|
|
85
|
+
let failure;
|
|
71
86
|
const child = spawn(command, [...args, 'serve', '--daemon'], {
|
|
72
87
|
detached: true,
|
|
73
88
|
stdio: ['ignore', log, log],
|
|
74
89
|
windowsHide: true,
|
|
75
90
|
});
|
|
91
|
+
child.once('error', (error) => {
|
|
92
|
+
failure = new PageScannerError('DAEMON_FAILED', `Could not start the daemon (${command}): ${error.message}`, `Start it yourself with \`${SERVE_COMMAND}\` in another terminal.`);
|
|
93
|
+
});
|
|
94
|
+
child.once('exit', (code, signal) => {
|
|
95
|
+
if (code === 0)
|
|
96
|
+
return;
|
|
97
|
+
failure ??= new PageScannerError('DAEMON_FAILED', `The daemon exited before it was ready (${signal ?? `exit code ${code}`}).`, `Its output is in ${daemonLogPath()}.`);
|
|
98
|
+
});
|
|
76
99
|
child.unref();
|
|
100
|
+
return { failure: () => failure };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Runs the daemon inside this process, for a host that refuses to spawn it
|
|
104
|
+
* (`canSpawnSelf()` says which). Resolves once it is listening, and rejects
|
|
105
|
+
* with the daemon's own error when it cannot start, such as NOT_PAIRED or
|
|
106
|
+
* PORT_IN_USE, which a spawned daemon could only leave in its log.
|
|
107
|
+
*
|
|
108
|
+
* It lives as long as this process does, stops on the idle timer and on a
|
|
109
|
+
* `shutdown` call like any other, and the next call starts it again. It leaves
|
|
110
|
+
* SIGINT and SIGTERM to the host, and writes to the same log a spawned daemon
|
|
111
|
+
* does, never to stdout, which is the MCP server's.
|
|
112
|
+
*/
|
|
113
|
+
export async function startDaemonInProcess() {
|
|
114
|
+
const { runDaemon } = await import('./run.js');
|
|
115
|
+
const log = (message) => {
|
|
116
|
+
try {
|
|
117
|
+
appendFileSync(daemonLogPath(), `${message}\n`);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// A log that cannot be written is not a reason to refuse a scan.
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
await new Promise((resolve, reject) => {
|
|
124
|
+
runDaemon({ log, handleSignals: false, onListening: () => resolve() }).then(
|
|
125
|
+
// Returning without listening means another daemon is registered; the
|
|
126
|
+
// wait that follows finds it.
|
|
127
|
+
() => resolve(), reject);
|
|
128
|
+
});
|
|
77
129
|
}
|
|
78
130
|
/**
|
|
79
131
|
* Returns a client for a running daemon, starting one if necessary.
|
|
@@ -84,7 +136,7 @@ function spawnDaemon() {
|
|
|
84
136
|
*/
|
|
85
137
|
export async function connectDaemon(options = {}) {
|
|
86
138
|
const sleep = options.sleep ?? realSleep;
|
|
87
|
-
const start = options.startDaemon ?? spawnDaemon;
|
|
139
|
+
const start = options.startDaemon ?? (canSpawnSelf() ? () => spawnDaemon() : startDaemonInProcess);
|
|
88
140
|
const deadlineMs = options.startTimeoutMs ?? DAEMON_START_TIMEOUT_MS;
|
|
89
141
|
const existing = readDaemonState();
|
|
90
142
|
if (existing) {
|
|
@@ -103,9 +155,12 @@ export async function connectDaemon(options = {}) {
|
|
|
103
155
|
}
|
|
104
156
|
clearDaemonState();
|
|
105
157
|
}
|
|
106
|
-
start();
|
|
158
|
+
const started = await start();
|
|
107
159
|
for (let waited = 0; waited < deadlineMs; waited += POLL_INTERVAL_MS) {
|
|
108
160
|
await sleep(POLL_INTERVAL_MS);
|
|
161
|
+
const failure = started?.failure();
|
|
162
|
+
if (failure)
|
|
163
|
+
throw failure;
|
|
109
164
|
const state = readDaemonState();
|
|
110
165
|
if (!state)
|
|
111
166
|
continue;
|
|
@@ -113,7 +168,7 @@ export async function connectDaemon(options = {}) {
|
|
|
113
168
|
if (health)
|
|
114
169
|
return clientFor(state);
|
|
115
170
|
}
|
|
116
|
-
throw new PageScannerError('DAEMON_FAILED', `The daemon did not come up within ${Math.round(deadlineMs / 1000)}s.`, `Run \`
|
|
171
|
+
throw new PageScannerError('DAEMON_FAILED', `The daemon did not come up within ${Math.round(deadlineMs / 1000)}s.`, `Run \`${SERVE_COMMAND}\` in another terminal to see why, or read ${daemonLogPath()}.`);
|
|
117
172
|
}
|
|
118
173
|
/** Returns true when a daemon was running and has been told to stop. */
|
|
119
174
|
export async function stopDaemon() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -220,14 +220,14 @@ export function startRpcServer(options) {
|
|
|
220
220
|
});
|
|
221
221
|
}
|
|
222
222
|
async function handle(request, response, options, server) {
|
|
223
|
-
const
|
|
223
|
+
const unauthorized = {
|
|
224
224
|
ok: false,
|
|
225
225
|
error: { code: 'BAD_REQUEST', message: 'Unauthorized.' },
|
|
226
226
|
};
|
|
227
227
|
const header = request.headers.authorization ?? '';
|
|
228
228
|
const presented = header.startsWith('Bearer ') ? header.slice('Bearer '.length) : '';
|
|
229
229
|
if (!tokensMatch(presented, options.secret)) {
|
|
230
|
-
send(response, 401,
|
|
230
|
+
send(response, 401, unauthorized);
|
|
231
231
|
return;
|
|
232
232
|
}
|
|
233
233
|
if (request.method !== 'POST' || (request.url ?? '') !== '/rpc') {
|
package/dist/daemon/run.d.ts
CHANGED
|
@@ -6,6 +6,12 @@ export interface RunDaemonOptions {
|
|
|
6
6
|
/** 0 means never exit on idle. Defaults to PAGE_SCANNER_IDLE_MINUTES or 15. */
|
|
7
7
|
idleMinutes?: number;
|
|
8
8
|
log?: (message: string) => void;
|
|
9
|
+
/**
|
|
10
|
+
* Stop on SIGINT and SIGTERM. True unless the daemon shares its process with
|
|
11
|
+
* something else: a listener on either signal replaces Node's default of
|
|
12
|
+
* exiting, so a host told to terminate would close the daemon and live on.
|
|
13
|
+
*/
|
|
14
|
+
handleSignals?: boolean;
|
|
9
15
|
/** Resolves when the daemon has stopped. Awaited by `serve` in the foreground. */
|
|
10
16
|
onListening?: (info: {
|
|
11
17
|
bridgePort: number;
|
package/dist/daemon/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/daemon/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/daemon/run.ts"],"names":[],"mappings":"AAgBA,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAGvC,MAAM,WAAW,gBAAgB;IAC/B,qEAAqE;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kFAAkF;IAClF,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACvE;AAUD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8H7E"}
|
package/dist/daemon/run.js
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* The daemon process: the bridge listener plus its RPC control surface.
|
|
3
3
|
*
|
|
4
4
|
* `page-scanner serve` runs it in the foreground; `serve --daemon` is what
|
|
5
|
-
* `connectDaemon` spawns behind a command that needed one. Both end up here
|
|
5
|
+
* `connectDaemon` spawns behind a command that needed one. Both end up here,
|
|
6
|
+
* and so does `startDaemonInProcess`, for a host that refuses the spawn.
|
|
6
7
|
*/
|
|
7
8
|
import { randomBytes } from 'node:crypto';
|
|
8
9
|
import { readConfig } from '../config.js';
|
|
@@ -29,6 +30,7 @@ function idleMinutesFrom(explicit) {
|
|
|
29
30
|
*/
|
|
30
31
|
export async function runDaemon(options = {}) {
|
|
31
32
|
const log = options.log ?? ((message) => process.stderr.write(`${message}\n`));
|
|
33
|
+
const handleSignals = options.handleSignals ?? true;
|
|
32
34
|
const existing = readDaemonState();
|
|
33
35
|
if (existing) {
|
|
34
36
|
log(`page-scanner is already running (pid ${existing.pid}, rpc port ${existing.rpcPort}).`);
|
|
@@ -65,14 +67,16 @@ export async function runDaemon(options = {}) {
|
|
|
65
67
|
});
|
|
66
68
|
// Assigned as each one comes up, so a shutdown arriving between two awaits
|
|
67
69
|
// tears down whatever exists rather than tripping over a binding that is not
|
|
68
|
-
//
|
|
70
|
+
// initialized yet.
|
|
69
71
|
let rpc = null;
|
|
70
72
|
let idleTimer = null;
|
|
71
73
|
const shutdown = async () => {
|
|
72
74
|
if (idleTimer)
|
|
73
75
|
clearInterval(idleTimer);
|
|
74
|
-
|
|
75
|
-
|
|
76
|
+
if (handleSignals) {
|
|
77
|
+
process.off('SIGINT', stop);
|
|
78
|
+
process.off('SIGTERM', stop);
|
|
79
|
+
}
|
|
76
80
|
if (rpc)
|
|
77
81
|
await rpc.close();
|
|
78
82
|
await bridge.close();
|
|
@@ -122,8 +126,10 @@ export async function runDaemon(options = {}) {
|
|
|
122
126
|
}, IDLE_CHECK_INTERVAL_MS)
|
|
123
127
|
: null;
|
|
124
128
|
idleTimer?.unref();
|
|
125
|
-
|
|
126
|
-
|
|
129
|
+
if (handleSignals) {
|
|
130
|
+
process.on('SIGINT', stop);
|
|
131
|
+
process.on('SIGTERM', stop);
|
|
132
|
+
}
|
|
127
133
|
await stopped;
|
|
128
134
|
}
|
|
129
135
|
//# sourceMappingURL=run.js.map
|
package/dist/daemon/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/daemon/run.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/daemon/run.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/self.d.ts
CHANGED
|
@@ -20,4 +20,24 @@ export declare function packageEntry(moduleUrl?: string): string | undefined;
|
|
|
20
20
|
* bundled path where there is no bin at all.
|
|
21
21
|
*/
|
|
22
22
|
export declare function selfCommand(argv?: string[], execPath?: string, findEntry?: () => string | undefined): SelfCommand;
|
|
23
|
+
/**
|
|
24
|
+
* Whether this process can run its own CLI again as a child at all.
|
|
25
|
+
*
|
|
26
|
+
* Not inside an Electron utility process, which is where Claude Desktop runs
|
|
27
|
+
* an installed `.mcpb` when its built-in Node.js satisfies the manifest (the
|
|
28
|
+
* default). `process.execPath` there is the app's own helper executable, not
|
|
29
|
+
* Node, and the host wraps `child_process` to refuse spawning any executable
|
|
30
|
+
* of the app: the spawn errors, the daemon never starts, and every tool call
|
|
31
|
+
* used to fail with "the daemon did not come up within 5s". Seen on macOS and
|
|
32
|
+
* Windows 11 with page-scanner-mcp 0.3.0; the refusal is in Claude Desktop's
|
|
33
|
+
* `mcp-runtime/nodeHost.js` and is not platform-specific.
|
|
34
|
+
* `ELECTRON_RUN_AS_NODE` does not help: the helper refuses to start without
|
|
35
|
+
* `--type` either way.
|
|
36
|
+
*
|
|
37
|
+
* `process.parentPort` exists only in a utility process, so a plain Node, and
|
|
38
|
+
* an Electron binary run as Node by an editor, still spawn as before.
|
|
39
|
+
* @param versions defaults to process.versions, injectable for tests.
|
|
40
|
+
* @param hasParentPort defaults to whether process.parentPort exists.
|
|
41
|
+
*/
|
|
42
|
+
export declare function canSpawnSelf(versions?: NodeJS.ProcessVersions, hasParentPort?: boolean): boolean;
|
|
23
43
|
//# sourceMappingURL=self.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"self.d.ts","sourceRoot":"","sources":["../../src/daemon/self.ts"],"names":[],"mappings":"AAmCA,MAAM,WAAW,WAAW;IAC1B,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,SAAS,SAAkB,GAAG,MAAM,GAAG,SAAS,CAW5E;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,IAAI,GAAE,MAAM,EAAiB,EAC7B,QAAQ,SAAmB,EAC3B,SAAS,GAAE,MAAM,MAAM,GAAG,SAAwB,GACjD,WAAW,CAkBb"}
|
|
1
|
+
{"version":3,"file":"self.d.ts","sourceRoot":"","sources":["../../src/daemon/self.ts"],"names":[],"mappings":"AAmCA,MAAM,WAAW,WAAW;IAC1B,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,SAAS,SAAkB,GAAG,MAAM,GAAG,SAAS,CAW5E;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,IAAI,GAAE,MAAM,EAAiB,EAC7B,QAAQ,SAAmB,EAC3B,SAAS,GAAE,MAAM,MAAM,GAAG,SAAwB,GACjD,WAAW,CAkBb;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,GAAE,MAAM,CAAC,eAAkC,EACnD,aAAa,UAA0B,GACtC,OAAO,CAET"}
|
package/dist/daemon/self.js
CHANGED
|
@@ -73,4 +73,26 @@ export function selfCommand(argv = process.argv, execPath = process.execPath, fi
|
|
|
73
73
|
}
|
|
74
74
|
return { command: execPath, args: [script] };
|
|
75
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Whether this process can run its own CLI again as a child at all.
|
|
78
|
+
*
|
|
79
|
+
* Not inside an Electron utility process, which is where Claude Desktop runs
|
|
80
|
+
* an installed `.mcpb` when its built-in Node.js satisfies the manifest (the
|
|
81
|
+
* default). `process.execPath` there is the app's own helper executable, not
|
|
82
|
+
* Node, and the host wraps `child_process` to refuse spawning any executable
|
|
83
|
+
* of the app: the spawn errors, the daemon never starts, and every tool call
|
|
84
|
+
* used to fail with "the daemon did not come up within 5s". Seen on macOS and
|
|
85
|
+
* Windows 11 with page-scanner-mcp 0.3.0; the refusal is in Claude Desktop's
|
|
86
|
+
* `mcp-runtime/nodeHost.js` and is not platform-specific.
|
|
87
|
+
* `ELECTRON_RUN_AS_NODE` does not help: the helper refuses to start without
|
|
88
|
+
* `--type` either way.
|
|
89
|
+
*
|
|
90
|
+
* `process.parentPort` exists only in a utility process, so a plain Node, and
|
|
91
|
+
* an Electron binary run as Node by an editor, still spawn as before.
|
|
92
|
+
* @param versions defaults to process.versions, injectable for tests.
|
|
93
|
+
* @param hasParentPort defaults to whether process.parentPort exists.
|
|
94
|
+
*/
|
|
95
|
+
export function canSpawnSelf(versions = process.versions, hasParentPort = 'parentPort' in process) {
|
|
96
|
+
return versions.electron === undefined || !hasParentPort;
|
|
97
|
+
}
|
|
76
98
|
//# sourceMappingURL=self.js.map
|
package/dist/daemon/self.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"self.js","sourceRoot":"","sources":["../../src/daemon/self.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAShD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG;IACtD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CACzB,OAAiB,OAAO,CAAC,IAAI,EAC7B,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAC3B,YAAsC,YAAY;IAElD,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;IAErE,4EAA4E;IAC5E,mCAAmC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAC1C,2EAA2E;QAC3E,0EAA0E;QAC1E,eAAe;QACf,MAAM,IAAI,gBAAgB,CACxB,eAAe,EACf,qGAAqG,EACrG,gHAAgH,CACjH,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;AAC/C,CAAC"}
|
|
1
|
+
{"version":3,"file":"self.js","sourceRoot":"","sources":["../../src/daemon/self.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAShD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG;IACtD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CACzB,OAAiB,OAAO,CAAC,IAAI,EAC7B,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAC3B,YAAsC,YAAY;IAElD,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;IAErE,4EAA4E;IAC5E,mCAAmC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAC1C,2EAA2E;QAC3E,0EAA0E;QAC1E,eAAe;QACf,MAAM,IAAI,gBAAgB,CACxB,eAAe,EACf,qGAAqG,EACrG,gHAAgH,CACjH,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,YAAY,CAC1B,WAAmC,OAAO,CAAC,QAAQ,EACnD,aAAa,GAAG,YAAY,IAAI,OAAO;IAEvC,OAAO,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC;AAC3D,CAAC"}
|
package/dist/daemon/state.js
CHANGED
|
@@ -58,7 +58,7 @@ export function readDaemonState() {
|
|
|
58
58
|
if (typeof startedAt !== 'number' || !Number.isFinite(startedAt))
|
|
59
59
|
return null;
|
|
60
60
|
// The liveness check comes last so a malformed file is rejected on its own
|
|
61
|
-
// terms rather than by
|
|
61
|
+
// terms rather than by signaling whatever the garbage in `pid` points at.
|
|
62
62
|
if (!processAlive(pid))
|
|
63
63
|
return null;
|
|
64
64
|
return { pid, rpcPort, secret, bridgePort, version, startedAt };
|
package/dist/daemon/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/daemon/state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAezC,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,YAAY,CAAC,CAAC;AACzC,CAAC;AAED,mGAAmG;AACnG,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC;AAC7F,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAiC,CAAC;IAEjD,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IACxE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACzD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACzE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9E,2EAA2E;IAC3E,
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/daemon/state.ts"],"names":[],"mappings":"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"}
|
package/dist/diff/image.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export const CELL = 8;
|
|
2
2
|
export const TOLERANCE = 48;
|
|
3
3
|
export const MERGE_GAP = 16;
|
|
4
|
-
/** The outline's
|
|
4
|
+
/** The outline's color and width, and how far it sits outside its region. */
|
|
5
5
|
const OUTLINE = [230, 40, 40, 255];
|
|
6
6
|
const OUTLINE_WIDTH = 3;
|
|
7
7
|
const OUTLINE_MARGIN = 3;
|
package/dist/diff/image.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/diff/image.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;AACtB,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAC5B,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAC5B,
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/diff/image.ts"],"names":[],"mappings":"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"}
|
package/dist/diff/png.d.ts
CHANGED
|
@@ -7,6 +7,6 @@ export interface Rgba {
|
|
|
7
7
|
export declare class PngError extends Error {
|
|
8
8
|
}
|
|
9
9
|
export declare function decodePng(bytes: Uint8Array): Rgba;
|
|
10
|
-
/** RGBA as a PNG, each row filtered Up, which suits a page's long runs of flat
|
|
10
|
+
/** RGBA as a PNG, each row filtered Up, which suits a page's long runs of flat color. */
|
|
11
11
|
export declare function encodePng(image: Rgba): Buffer;
|
|
12
12
|
//# sourceMappingURL=png.d.ts.map
|
package/dist/diff/png.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"png.d.ts","sourceRoot":"","sources":["../../src/diff/png.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,qBAAa,QAAS,SAAQ,KAAK;CAAG;AAYtC,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAwGjD;AAWD,
|
|
1
|
+
{"version":3,"file":"png.d.ts","sourceRoot":"","sources":["../../src/diff/png.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,qBAAa,QAAS,SAAQ,KAAK;CAAG;AAYtC,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAwGjD;AAWD,yFAAyF;AACzF,wBAAgB,SAAS,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAuB7C"}
|
package/dist/diff/png.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* The CLI ships one runtime dependency, and an image library would be a
|
|
5
5
|
* second for one command. A capture's PNG is the plainest kind there is: 8
|
|
6
|
-
* bits a channel, not interlaced. Decoding covers every
|
|
7
|
-
* (
|
|
6
|
+
* bits a channel, not interlaced. Decoding covers every color type at 8 bits
|
|
7
|
+
* (gray, RGB, palette, gray with alpha, RGBA), which is what Chrome, a canvas
|
|
8
8
|
* and most tools write; anything else is refused by name. Encoding writes
|
|
9
9
|
* RGBA only.
|
|
10
10
|
*/
|
|
@@ -46,7 +46,7 @@ export function decodePng(bytes) {
|
|
|
46
46
|
if (interlace !== 0)
|
|
47
47
|
throw new PngError('an interlaced PNG, which is not read');
|
|
48
48
|
if (CHANNELS[colorType] === undefined)
|
|
49
|
-
throw new PngError(`PNG
|
|
49
|
+
throw new PngError(`PNG color type ${colorType}`);
|
|
50
50
|
}
|
|
51
51
|
else if (type === 'PLTE')
|
|
52
52
|
palette = body;
|
|
@@ -141,7 +141,7 @@ function chunk(type, body) {
|
|
|
141
141
|
tail.writeUInt32BE(crc32(Buffer.concat([head.subarray(4), body])) >>> 0, 0);
|
|
142
142
|
return Buffer.concat([head, body, tail]);
|
|
143
143
|
}
|
|
144
|
-
/** RGBA as a PNG, each row filtered Up, which suits a page's long runs of flat
|
|
144
|
+
/** RGBA as a PNG, each row filtered Up, which suits a page's long runs of flat color. */
|
|
145
145
|
export function encodePng(image) {
|
|
146
146
|
const stride = image.width * 4;
|
|
147
147
|
const raw = Buffer.alloc((stride + 1) * image.height);
|
package/dist/diff/png.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"png.js","sourceRoot":"","sources":["../../src/diff/png.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"png.js","sourceRoot":"","sources":["../../src/diff/png.ts"],"names":[],"mappings":"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"}
|
package/dist/diff/text.js
CHANGED
|
@@ -20,10 +20,10 @@ export const MAX_EDIT_DISTANCE = 2000;
|
|
|
20
20
|
export const CONTEXT_LINES = 3;
|
|
21
21
|
/** The YAML front matter a Markdown export starts with, taken off the text. */
|
|
22
22
|
export function splitFrontMatter(text) {
|
|
23
|
-
const
|
|
24
|
-
const match = /^---\n([\s\S]*?)\n---\n?/.exec(
|
|
23
|
+
const normalized = text.replace(/\r\n?/g, '\n');
|
|
24
|
+
const match = /^---\n([\s\S]*?)\n---\n?/.exec(normalized);
|
|
25
25
|
if (!match)
|
|
26
|
-
return { fields: {}, body:
|
|
26
|
+
return { fields: {}, body: normalized };
|
|
27
27
|
const fields = {};
|
|
28
28
|
for (const line of match[1].split('\n')) {
|
|
29
29
|
const colon = line.indexOf(':');
|
|
@@ -41,7 +41,7 @@ export function splitFrontMatter(text) {
|
|
|
41
41
|
}
|
|
42
42
|
fields[line.slice(0, colon).trim()] = value;
|
|
43
43
|
}
|
|
44
|
-
return { fields, body:
|
|
44
|
+
return { fields, body: normalized.slice(match[0].length) };
|
|
45
45
|
}
|
|
46
46
|
/** The edit script from `a` to `b`, as a line each: kept, removed or added. */
|
|
47
47
|
export function diffLines(a, b) {
|
package/dist/errors.d.ts
CHANGED
|
@@ -31,7 +31,7 @@ export declare class PageScannerError extends Error {
|
|
|
31
31
|
export declare function isPageScannerError(value: unknown): value is PageScannerError;
|
|
32
32
|
/**
|
|
33
33
|
* Turns whatever was thrown into a PageScannerError, so every exit goes
|
|
34
|
-
* through the same reporting path. An
|
|
34
|
+
* through the same reporting path. An unrecognized failure is SCAN_FAILED
|
|
35
35
|
* rather than a crash: the caller still gets a code and a message.
|
|
36
36
|
*/
|
|
37
37
|
export declare function toPageScannerError(value: unknown): PageScannerError;
|
package/dist/errors.js
CHANGED
|
@@ -60,7 +60,7 @@ export function isPageScannerError(value) {
|
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
62
62
|
* Turns whatever was thrown into a PageScannerError, so every exit goes
|
|
63
|
-
* through the same reporting path. An
|
|
63
|
+
* through the same reporting path. An unrecognized failure is SCAN_FAILED
|
|
64
64
|
* rather than a crash: the caller still gets a code and a message.
|
|
65
65
|
*/
|
|
66
66
|
export function toPageScannerError(value) {
|
package/dist/index.d.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
export { listBrowsers, listTabs, pair, scan, scanMany, checkBatch, checkOutput, MARKDOWN_MODES, status, stop, waitForBrowser, type CommonOptions, type PairResult, type ScanOptions, type ScanResult, type BatchItem, type BatchOptions, type BatchResult, type MarkdownMode, type PageText, type StatusReport, type TabsResult, } from './api.js';
|
|
9
9
|
export { configDir, configPath, configFileIsOwnerOnly, ensureConfig, readConfig, DEFAULT_PORT, type PairingConfig, } from './config.js';
|
|
10
10
|
export { exitCodeFor, isPageScannerError, toPageScannerError, PageScannerError, ERROR_CODES, type ErrorCode, } from './errors.js';
|
|
11
|
-
export { outputNamesAFile, resolveOutputPath, withExtension, writeScanFile, writeTextFile, } from './output.js';
|
|
11
|
+
export { defaultOutputDirectory, expandHome, outputNamesAFile, resolveOutputPath, withExtension, writeScanFile, writeTextFile, type OutputDirectoryContext, } from './output.js';
|
|
12
12
|
export { diffCaptures, type DiffOptions, type DiffResult, type TextDiffResult, type VisualDiffResult, } from './diff/index.js';
|
|
13
13
|
export { verifyCapture, type VerifyResult } from './verify.js';
|
|
14
14
|
export { MAX_BATCH_URLS, NAME_FIELDS, checkNameTemplate, fillNameTemplate, readUrlList, type NameField, } from './batch.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,WAAW,EACX,cAAc,EACd,MAAM,EACN,IAAI,EACJ,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,UAAU,GAChB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,KAAK,SAAS,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,WAAW,EACX,cAAc,EACd,MAAM,EACN,IAAI,EACJ,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,UAAU,GAChB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,KAAK,SAAS,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,sBAAsB,EACtB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,EACb,KAAK,sBAAsB,GAC5B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EACL,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,KAAK,SAAS,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,aAAa,EACb,UAAU,EACV,uBAAuB,EACvB,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,EACf,KAAK,WAAW,GACjB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,cAAc,EACd,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
export { listBrowsers, listTabs, pair, scan, scanMany, checkBatch, checkOutput, MARKDOWN_MODES, status, stop, waitForBrowser, } from './api.js';
|
|
9
9
|
export { configDir, configPath, configFileIsOwnerOnly, ensureConfig, readConfig, DEFAULT_PORT, } from './config.js';
|
|
10
10
|
export { exitCodeFor, isPageScannerError, toPageScannerError, PageScannerError, ERROR_CODES, } from './errors.js';
|
|
11
|
-
export { outputNamesAFile, resolveOutputPath, withExtension, writeScanFile, writeTextFile, } from './output.js';
|
|
11
|
+
export { defaultOutputDirectory, expandHome, outputNamesAFile, resolveOutputPath, withExtension, writeScanFile, writeTextFile, } from './output.js';
|
|
12
12
|
export { diffCaptures, } from './diff/index.js';
|
|
13
13
|
export { verifyCapture } from './verify.js';
|
|
14
14
|
export { MAX_BATCH_URLS, NAME_FIELDS, checkNameTemplate, fillNameTemplate, readUrlList, } from './batch.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,WAAW,EACX,cAAc,EACd,MAAM,EACN,IAAI,EACJ,cAAc,GAYf,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,YAAY,GAEb,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,GAEZ,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,WAAW,EACX,cAAc,EACd,MAAM,EACN,IAAI,EACJ,cAAc,GAYf,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,YAAY,GAEb,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,GAEZ,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,sBAAsB,EACtB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,GAEd,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,YAAY,GAKb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,aAAa,EAAqB,MAAM,aAAa,CAAC;AAE/D,OAAO,EACL,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,GAEZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,aAAa,EACb,UAAU,EACV,uBAAuB,GAGxB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,GAEhB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,cAAc,EACd,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,eAAe,GAYhB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/output.d.ts
CHANGED
|
@@ -11,6 +11,30 @@ export declare function resolveOutputPath(outputPath: string | undefined, sugges
|
|
|
11
11
|
* there. A batch (#59) writes several files, so it needs the directory.
|
|
12
12
|
*/
|
|
13
13
|
export declare function outputNamesAFile(outputPath: string, cwd?: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* A leading `~` as the home directory: `~` alone, `~/…`, and `~\…` off a
|
|
16
|
+
* Windows agent. A shell does this for the command line, and nothing does it
|
|
17
|
+
* for a path an agent passes to a tool, so `~/Downloads` used to resolve to
|
|
18
|
+
* `/~/Downloads` under Claude Desktop and fail to be created. `~user` is left
|
|
19
|
+
* alone: there is no portable way to look another account up.
|
|
20
|
+
*/
|
|
21
|
+
export declare function expandHome(path: string, home?: string): string;
|
|
22
|
+
export interface OutputDirectoryContext {
|
|
23
|
+
cwd?: string;
|
|
24
|
+
home?: string;
|
|
25
|
+
/** In an app's Electron utility process, whose working directory is the app's. */
|
|
26
|
+
hosted?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* What a missing or relative output path is taken from, for a caller with no
|
|
30
|
+
* person standing in a directory: the MCP server. Its working directory is
|
|
31
|
+
* whatever its host started it in. Under Claude Code that is the project and
|
|
32
|
+
* worth keeping; under Claude Desktop on macOS it is `/`, which nothing may
|
|
33
|
+
* write, so a scan with no `outputPath` failed, and inside Desktop's built-in
|
|
34
|
+
* Node.js it is the app's, never a place the user chose. Those take
|
|
35
|
+
* `~/Downloads`, or the home directory when there is none.
|
|
36
|
+
*/
|
|
37
|
+
export declare function defaultOutputDirectory(context?: OutputDirectoryContext): string;
|
|
14
38
|
/** The same path with another extension: `page.pdf` to `page.md`. */
|
|
15
39
|
export declare function withExtension(path: string, extension: string): string;
|
|
16
40
|
/** Text as UTF-8, its directories made on the way, as `writeScanFile` does for bytes. */
|
package/dist/output.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAkCA;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,aAAa,EAAE,MAAM,EACrB,GAAG,GAAE,MAAsB,GAC1B,MAAM,CAKR;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAOzF;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,MAAM,CAIzE;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,sBAA2B,GAAG,MAAM,CAOnF;AA8BD,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKrE;AAED,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAGhE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAGvE"}
|
package/dist/output.js
CHANGED
|
@@ -6,8 +6,10 @@
|
|
|
6
6
|
* was started from some other terminal at some other time and its cwd has
|
|
7
7
|
* nothing to do with where the person typing the command is standing.
|
|
8
8
|
*/
|
|
9
|
-
import { mkdirSync, statSync, writeFileSync } from 'node:fs';
|
|
10
|
-
import {
|
|
9
|
+
import { accessSync, constants, mkdirSync, statSync, writeFileSync } from 'node:fs';
|
|
10
|
+
import { homedir } from 'node:os';
|
|
11
|
+
import { basename, dirname, join, parse, resolve } from 'node:path';
|
|
12
|
+
import { canSpawnSelf } from './daemon/self.js';
|
|
11
13
|
/**
|
|
12
14
|
* A trailing separator is how the user says "this is a directory", and the only
|
|
13
15
|
* way to say it about a directory that does not exist yet.
|
|
@@ -49,6 +51,47 @@ export function outputNamesAFile(outputPath, cwd = process.cwd()) {
|
|
|
49
51
|
FILE_EXTENSION.test(target) &&
|
|
50
52
|
!isExistingDirectory(target));
|
|
51
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* A leading `~` as the home directory: `~` alone, `~/…`, and `~\…` off a
|
|
56
|
+
* Windows agent. A shell does this for the command line, and nothing does it
|
|
57
|
+
* for a path an agent passes to a tool, so `~/Downloads` used to resolve to
|
|
58
|
+
* `/~/Downloads` under Claude Desktop and fail to be created. `~user` is left
|
|
59
|
+
* alone: there is no portable way to look another account up.
|
|
60
|
+
*/
|
|
61
|
+
export function expandHome(path, home = homedir()) {
|
|
62
|
+
if (path === '~')
|
|
63
|
+
return home;
|
|
64
|
+
if (/^~[\\/]/.test(path))
|
|
65
|
+
return join(home, path.slice(2));
|
|
66
|
+
return path;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* What a missing or relative output path is taken from, for a caller with no
|
|
70
|
+
* person standing in a directory: the MCP server. Its working directory is
|
|
71
|
+
* whatever its host started it in. Under Claude Code that is the project and
|
|
72
|
+
* worth keeping; under Claude Desktop on macOS it is `/`, which nothing may
|
|
73
|
+
* write, so a scan with no `outputPath` failed, and inside Desktop's built-in
|
|
74
|
+
* Node.js it is the app's, never a place the user chose. Those take
|
|
75
|
+
* `~/Downloads`, or the home directory when there is none.
|
|
76
|
+
*/
|
|
77
|
+
export function defaultOutputDirectory(context = {}) {
|
|
78
|
+
const cwd = context.cwd ?? process.cwd();
|
|
79
|
+
const home = context.home ?? homedir();
|
|
80
|
+
const hosted = context.hosted ?? !canSpawnSelf();
|
|
81
|
+
if (!hosted && cwd !== parse(cwd).root && isWritable(cwd))
|
|
82
|
+
return cwd;
|
|
83
|
+
const downloads = join(home, 'Downloads');
|
|
84
|
+
return isExistingDirectory(downloads) ? downloads : home;
|
|
85
|
+
}
|
|
86
|
+
function isWritable(directory) {
|
|
87
|
+
try {
|
|
88
|
+
accessSync(directory, constants.W_OK);
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
52
95
|
/**
|
|
53
96
|
* An existing directory wins over the extension rule, so `--out ./v1.2` writes
|
|
54
97
|
* into the directory the user already made rather than over it.
|
package/dist/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED