@prestyj/cli 5.30.2 → 5.31.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/dist/app-sidecar/app-settings.d.ts +6 -2
- package/dist/app-sidecar/app-settings.js +39 -20
- package/dist/app-sidecar/app-settings.js.map +1 -1
- package/dist/app-sidecar/git-target.d.ts +17 -0
- package/dist/app-sidecar/git-target.js +31 -0
- package/dist/app-sidecar/git-target.js.map +1 -0
- package/dist/app-sidecar/goal-routes.d.ts +6 -0
- package/dist/app-sidecar/goal-routes.js +360 -0
- package/dist/app-sidecar/goal-routes.js.map +1 -0
- package/dist/app-sidecar/history-routes.d.ts +13 -0
- package/dist/app-sidecar/history-routes.js +37 -27
- package/dist/app-sidecar/history-routes.js.map +1 -1
- package/dist/app-sidecar/mcp-routes.js +1 -2
- package/dist/app-sidecar/mcp-routes.js.map +1 -1
- package/dist/app-sidecar/prompt-routes.js +1 -2
- package/dist/app-sidecar/prompt-routes.js.map +1 -1
- package/dist/app-sidecar/route-context.d.ts +12 -0
- package/dist/app-sidecar/run-control-routes.js +2 -1
- package/dist/app-sidecar/run-control-routes.js.map +1 -1
- package/dist/app-sidecar/session-routes.js +41 -0
- package/dist/app-sidecar/session-routes.js.map +1 -1
- package/dist/app-sidecar/session-types.d.ts +2 -0
- package/dist/app-sidecar/workspace-routes.js +13 -95
- package/dist/app-sidecar/workspace-routes.js.map +1 -1
- package/dist/app-sidecar.js +219 -67
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli/shared.js +1 -1
- package/dist/cli/shared.js.map +1 -1
- package/dist/core/acceptance-checks.js +17 -4
- package/dist/core/acceptance-checks.js.map +1 -1
- package/dist/core/agent-notifications.d.ts +1 -1
- package/dist/core/agent-session.d.ts +90 -5
- package/dist/core/agent-session.js +185 -63
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/ask-user.d.ts +11 -0
- package/dist/core/ask-user.js +6 -1
- package/dist/core/ask-user.js.map +1 -1
- package/dist/core/auth-providers.d.ts +2 -80
- package/dist/core/auth-providers.js +4 -183
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/cache-diagnostics.d.ts +1 -1
- package/dist/core/cache-diagnostics.js +2 -1
- package/dist/core/cache-diagnostics.js.map +1 -1
- package/dist/core/compaction/tool-result-pruner.d.ts +10 -0
- package/dist/core/compaction/tool-result-pruner.js +12 -0
- package/dist/core/compaction/tool-result-pruner.js.map +1 -1
- package/dist/core/context-files.d.ts +8 -0
- package/dist/core/context-files.js +46 -0
- package/dist/core/context-files.js.map +1 -0
- package/dist/core/custom-commands.d.ts +6 -0
- package/dist/core/custom-commands.js +17 -0
- package/dist/core/custom-commands.js.map +1 -1
- package/dist/core/env-delta.d.ts +9 -1
- package/dist/core/env-delta.js +20 -0
- package/dist/core/env-delta.js.map +1 -1
- package/dist/core/goal-summary.d.ts +32 -0
- package/dist/core/goal-summary.js +104 -0
- package/dist/core/goal-summary.js.map +1 -0
- package/dist/core/goals-store.d.ts +208 -0
- package/dist/core/goals-store.js +521 -0
- package/dist/core/goals-store.js.map +1 -0
- package/dist/core/local-endpoint-store.js +15 -11
- package/dist/core/local-endpoint-store.js.map +1 -1
- package/dist/core/plan-handoff.d.ts +8 -0
- package/dist/core/plan-handoff.js +11 -0
- package/dist/core/plan-handoff.js.map +1 -1
- package/dist/core/project-discovery.d.ts +7 -0
- package/dist/core/project-discovery.js +9 -3
- package/dist/core/project-discovery.js.map +1 -1
- package/dist/core/radio.d.ts +2 -3
- package/dist/core/radio.js.map +1 -1
- package/dist/core/session-manager.d.ts +7 -1
- package/dist/core/session-manager.js +17 -7
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-storage.d.ts +3 -0
- package/dist/core/session-storage.js +8 -2
- package/dist/core/session-storage.js.map +1 -1
- package/dist/core/steroids.d.ts +8 -0
- package/dist/core/steroids.js +19 -3
- package/dist/core/steroids.js.map +1 -1
- package/dist/core/subagent-manager.d.ts +51 -0
- package/dist/core/subagent-manager.js +103 -16
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/subagent-store.js +2 -1
- package/dist/core/subagent-store.js.map +1 -1
- package/dist/goals-agent/goal-team.d.ts +2 -0
- package/dist/goals-agent/goal-team.js +83 -0
- package/dist/goals-agent/goal-team.js.map +1 -0
- package/dist/goals-agent/goals-agent.d.ts +90 -0
- package/dist/goals-agent/goals-agent.js +246 -0
- package/dist/goals-agent/goals-agent.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/interactive.js +4 -3
- package/dist/interactive.js.map +1 -1
- package/dist/modes/acp-autopilot.d.ts +27 -0
- package/dist/modes/acp-autopilot.js +54 -0
- package/dist/modes/acp-autopilot.js.map +1 -0
- package/dist/modes/acp-goals.d.ts +48 -0
- package/dist/modes/acp-goals.js +103 -0
- package/dist/modes/acp-goals.js.map +1 -0
- package/dist/modes/acp-mode.d.ts +128 -3
- package/dist/modes/acp-mode.js +1082 -52
- package/dist/modes/acp-mode.js.map +1 -1
- package/dist/modes/subagent-worker-mode.d.ts +14 -0
- package/dist/modes/subagent-worker-mode.js +32 -1
- package/dist/modes/subagent-worker-mode.js.map +1 -1
- package/dist/system-prompt.d.ts +8 -0
- package/dist/system-prompt.js +21 -9
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/bash-read-evidence.d.ts +13 -0
- package/dist/tools/bash-read-evidence.js +48 -1
- package/dist/tools/bash-read-evidence.js.map +1 -1
- package/dist/tools/grep-scan.d.ts +96 -0
- package/dist/tools/grep-scan.js +283 -0
- package/dist/tools/grep-scan.js.map +1 -0
- package/dist/tools/grep.d.ts +10 -0
- package/dist/tools/grep.js +418 -10
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/index.d.ts +7 -1
- package/dist/tools/index.js +10 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/read-tracker.d.ts +6 -12
- package/dist/tools/read-tracker.js +21 -36
- package/dist/tools/read-tracker.js.map +1 -1
- package/dist/tools/read.js +2 -2
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/subagent-control.js +22 -3
- package/dist/tools/subagent-control.js.map +1 -1
- package/dist/tools/write.js +110 -8
- package/dist/tools/write.js.map +1 -1
- package/dist/ui/components/ActivityIndicator.d.ts +5 -5
- package/dist/ui/components/InputArea.d.ts +2 -2
- package/dist/ui/components/InputArea.js +3 -3
- package/dist/ui/components/InputArea.js.map +1 -1
- package/dist/ui/components/ToolExecution.d.ts +2 -2
- package/dist/ui/hooks/useContextCompaction.js +38 -31
- package/dist/ui/hooks/useContextCompaction.js.map +1 -1
- package/dist/utils/format.d.ts +0 -4
- package/dist/utils/format.js +0 -7
- package/dist/utils/format.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash-read-evidence.js","sourceRoot":"","sources":["../../src/tools/bash-read-evidence.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"bash-read-evidence.js","sourceRoot":"","sources":["../../src/tools/bash-read-evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The in-process grep engine: one search implementation shared by the main
|
|
3
|
+
* thread and a small pool of worker threads.
|
|
4
|
+
*
|
|
5
|
+
* Why workers: on a warm page cache, a scan is per-file syscall and callback
|
|
6
|
+
* overhead, and every async `fs` call funnels through the main thread's event
|
|
7
|
+
* loop. Workers reading synchronously in parallel halve the scan time and keep
|
|
8
|
+
* the daemon's event loop free while they do it. Measured on macOS, four
|
|
9
|
+
* workers beat both fewer and more (more contend on file-open locks).
|
|
10
|
+
*
|
|
11
|
+
* The three functions marked SELF-CONTAINED are serialized into the worker
|
|
12
|
+
* with `Function.prototype.toString`, so the worker runs the exact code the
|
|
13
|
+
* main thread runs. They may reference only their parameters and globals —
|
|
14
|
+
* no imports, no module constants. The sidecar is one bundled file, so the
|
|
15
|
+
* worker is built from source text rather than loaded from a separate module.
|
|
16
|
+
*/
|
|
17
|
+
import type fs from "node:fs";
|
|
18
|
+
export interface ScanTextOptions {
|
|
19
|
+
source: string;
|
|
20
|
+
flags: string;
|
|
21
|
+
/** Reject a file with one regex pass over its whole text first (unsafe with lookaround). */
|
|
22
|
+
prefilter: boolean;
|
|
23
|
+
maxResults: number;
|
|
24
|
+
/** Epoch ms after which the scan stops. */
|
|
25
|
+
expiresAt: number;
|
|
26
|
+
maxLineLength: number;
|
|
27
|
+
/** Check the clock every N lines. */
|
|
28
|
+
checkInterval: number;
|
|
29
|
+
/** Lines checked for a NUL byte before the file is treated as binary. */
|
|
30
|
+
sniffLines: number;
|
|
31
|
+
}
|
|
32
|
+
export interface ScanTextResult {
|
|
33
|
+
lines: string[];
|
|
34
|
+
/** The deadline passed mid-file; `lines` holds what was found before it. */
|
|
35
|
+
expired: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* SELF-CONTAINED. Search in-memory file text with the streaming scanner's
|
|
39
|
+
* semantics: same lines, same line numbers, same matches, same truncation.
|
|
40
|
+
*/
|
|
41
|
+
export declare function scanText(input: string, relPath: string, o: ScanTextOptions): ScanTextResult;
|
|
42
|
+
/** Cheap "could this file match at all?" check on undecoded bytes. */
|
|
43
|
+
export type ByteFilter = (bytes: Buffer) => boolean;
|
|
44
|
+
/**
|
|
45
|
+
* SELF-CONTAINED. A filter passing only bytes that contain one of `literals`.
|
|
46
|
+
*
|
|
47
|
+
* Literals are ASCII only (see `requiredLiterals`): ASCII bytes never occur
|
|
48
|
+
* inside a multi-byte UTF-8 sequence or its replacement, so "the bytes contain
|
|
49
|
+
* it" and "the decoded text contains it" agree. For case-insensitive search
|
|
50
|
+
* the bytes are viewed as latin1 (a near-free copy): non-Unicode JS case
|
|
51
|
+
* folding never maps a non-ASCII character onto ASCII, so the same holds.
|
|
52
|
+
*/
|
|
53
|
+
export declare function makeByteFilter(literals: readonly string[] | undefined, caseInsensitive: boolean): ByteFilter | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* SELF-CONTAINED. Synchronously read a regular file of at most `limit` bytes
|
|
56
|
+
* into `scratch`, refusing symlinks like `readFileBounded`. The returned view
|
|
57
|
+
* aliases `scratch`: use it before the next call. `undefined` means "not
|
|
58
|
+
* readable this way" and sends the file to the main thread's slower path.
|
|
59
|
+
*/
|
|
60
|
+
export declare function readSmallFileSync(fsModule: typeof fs, filePath: string, limit: number, scratch: Buffer): Buffer | undefined;
|
|
61
|
+
/** One file to scan: absolute path for reading, display path for output. */
|
|
62
|
+
export type ScanTarget = readonly [absolutePath: string, relativePath: string];
|
|
63
|
+
export interface ScanJob {
|
|
64
|
+
files: readonly ScanTarget[];
|
|
65
|
+
options: ScanTextOptions;
|
|
66
|
+
literals: readonly string[] | undefined;
|
|
67
|
+
caseInsensitive: boolean;
|
|
68
|
+
/** Largest file read whole; larger files come back as `null`. */
|
|
69
|
+
readLimit: number;
|
|
70
|
+
/** Stop the chunk once this many lines are found (see `scanWithWorkers`). */
|
|
71
|
+
stopAfter: number;
|
|
72
|
+
}
|
|
73
|
+
export interface ScanJobResult {
|
|
74
|
+
/** Per file, in order: matched lines, or `null` for "scan on the main thread". */
|
|
75
|
+
results: Array<string[] | null>;
|
|
76
|
+
expired: boolean;
|
|
77
|
+
}
|
|
78
|
+
export declare class GrepWorkerPool {
|
|
79
|
+
private readonly idle;
|
|
80
|
+
private readonly waiters;
|
|
81
|
+
private readonly all;
|
|
82
|
+
private idleTimer;
|
|
83
|
+
private disposed;
|
|
84
|
+
constructor(size: number, readLimit: number);
|
|
85
|
+
get size(): number;
|
|
86
|
+
get isDisposed(): boolean;
|
|
87
|
+
/** Run one job; rejects if the pool is or becomes unusable. */
|
|
88
|
+
run(job: ScanJob): Promise<ScanJobResult>;
|
|
89
|
+
dispose(): void;
|
|
90
|
+
private acquire;
|
|
91
|
+
private release;
|
|
92
|
+
private armIdleTimer;
|
|
93
|
+
}
|
|
94
|
+
export declare function getGrepWorkerPool(readLimit: number): GrepWorkerPool | undefined;
|
|
95
|
+
/** Test seam: stop the shared pool's workers. */
|
|
96
|
+
export declare function disposeGrepWorkerPool(): void;
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import { Worker } from "node:worker_threads";
|
|
3
|
+
import { log } from "../core/logger.js";
|
|
4
|
+
/**
|
|
5
|
+
* SELF-CONTAINED. Search in-memory file text with the streaming scanner's
|
|
6
|
+
* semantics: same lines, same line numbers, same matches, same truncation.
|
|
7
|
+
*/
|
|
8
|
+
export function scanText(input, relPath, o) {
|
|
9
|
+
let text = input;
|
|
10
|
+
// readline breaks lines on `\r\n`, a lone `\r` and `\n`. Folding the first
|
|
11
|
+
// two into `\n` reproduces its line numbering, and lets a multiline `$` see
|
|
12
|
+
// CRLF line ends in the prefilter below.
|
|
13
|
+
if (text.includes("\r"))
|
|
14
|
+
text = text.replace(/\r\n?/g, "\n");
|
|
15
|
+
// Reject the whole file in one native regex pass. Sound only when no
|
|
16
|
+
// per-line match can vanish once lines sit side by side: with the `m` flag,
|
|
17
|
+
// `^`/`$` still match at line boundaries and `\b` treats `\n` like the end of
|
|
18
|
+
// input, so a pass over the joined text finds every per-line match (plus,
|
|
19
|
+
// at most, extra ones that cross lines, which the per-line pass discards).
|
|
20
|
+
if (o.prefilter && !new RegExp(o.source, `${o.flags.replace("g", "")}m`).test(text)) {
|
|
21
|
+
return { lines: [], expired: false };
|
|
22
|
+
}
|
|
23
|
+
const regex = new RegExp(o.source, o.flags);
|
|
24
|
+
const lines = text.split("\n");
|
|
25
|
+
// readline emits no empty line after a trailing newline.
|
|
26
|
+
if (lines[lines.length - 1] === "")
|
|
27
|
+
lines.pop();
|
|
28
|
+
const found = [];
|
|
29
|
+
for (let i = 0; i < lines.length; i++) {
|
|
30
|
+
const line = lines[i] ?? "";
|
|
31
|
+
const lineNum = i + 1;
|
|
32
|
+
if (lineNum % o.checkInterval === 0 && Date.now() >= o.expiresAt) {
|
|
33
|
+
return { lines: found, expired: true };
|
|
34
|
+
}
|
|
35
|
+
// A NUL byte early on means a binary file the extension check missed.
|
|
36
|
+
if (lineNum <= o.sniffLines && line.includes("\0"))
|
|
37
|
+
break;
|
|
38
|
+
regex.lastIndex = 0;
|
|
39
|
+
if (regex.test(line)) {
|
|
40
|
+
let shown = line;
|
|
41
|
+
if (line.length > o.maxLineLength) {
|
|
42
|
+
// Same cut as @prestyj/ai's sliceHead: never split an astral character.
|
|
43
|
+
const last = line.charCodeAt(o.maxLineLength - 1);
|
|
44
|
+
const end = last >= 0xd800 && last <= 0xdbff ? o.maxLineLength - 1 : o.maxLineLength;
|
|
45
|
+
shown = `${line.slice(0, end)}…`;
|
|
46
|
+
}
|
|
47
|
+
found.push(`${relPath}:${lineNum}:${shown}`);
|
|
48
|
+
if (found.length >= o.maxResults)
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return { lines: found, expired: false };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* SELF-CONTAINED. A filter passing only bytes that contain one of `literals`.
|
|
56
|
+
*
|
|
57
|
+
* Literals are ASCII only (see `requiredLiterals`): ASCII bytes never occur
|
|
58
|
+
* inside a multi-byte UTF-8 sequence or its replacement, so "the bytes contain
|
|
59
|
+
* it" and "the decoded text contains it" agree. For case-insensitive search
|
|
60
|
+
* the bytes are viewed as latin1 (a near-free copy): non-Unicode JS case
|
|
61
|
+
* folding never maps a non-ASCII character onto ASCII, so the same holds.
|
|
62
|
+
*/
|
|
63
|
+
export function makeByteFilter(literals, caseInsensitive) {
|
|
64
|
+
if (!literals || literals.length === 0)
|
|
65
|
+
return undefined;
|
|
66
|
+
if (caseInsensitive) {
|
|
67
|
+
const escaped = literals.map((literal) => literal.replace(/[\\^$.*+?()[\]{}|/-]/g, "\\$&"));
|
|
68
|
+
const anyLiteral = new RegExp(escaped.join("|"), "i");
|
|
69
|
+
return (bytes) => anyLiteral.test(bytes.toString("latin1"));
|
|
70
|
+
}
|
|
71
|
+
return (bytes) => literals.some((literal) => bytes.includes(literal));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* SELF-CONTAINED. Synchronously read a regular file of at most `limit` bytes
|
|
75
|
+
* into `scratch`, refusing symlinks like `readFileBounded`. The returned view
|
|
76
|
+
* aliases `scratch`: use it before the next call. `undefined` means "not
|
|
77
|
+
* readable this way" and sends the file to the main thread's slower path.
|
|
78
|
+
*/
|
|
79
|
+
export function readSmallFileSync(fsModule, filePath, limit, scratch) {
|
|
80
|
+
const c = fsModule.constants;
|
|
81
|
+
let fd;
|
|
82
|
+
try {
|
|
83
|
+
fd = fsModule.openSync(filePath, c.O_RDONLY | (c.O_NOFOLLOW ?? 0) | (c.O_NONBLOCK ?? 0));
|
|
84
|
+
const stat = fsModule.fstatSync(fd);
|
|
85
|
+
if (!stat.isFile() || stat.size > limit)
|
|
86
|
+
return undefined;
|
|
87
|
+
// Read to EOF, one byte past the limit, so a file that grew since the
|
|
88
|
+
// stat is caught rather than silently truncated.
|
|
89
|
+
let total = 0;
|
|
90
|
+
for (;;) {
|
|
91
|
+
const room = Math.min(scratch.length, limit + 1) - total;
|
|
92
|
+
if (room <= 0)
|
|
93
|
+
break;
|
|
94
|
+
const read = fsModule.readSync(fd, scratch, total, room, null);
|
|
95
|
+
if (read === 0)
|
|
96
|
+
break;
|
|
97
|
+
total += read;
|
|
98
|
+
}
|
|
99
|
+
return total > limit ? undefined : scratch.subarray(0, total);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
if (fd !== undefined)
|
|
106
|
+
fsModule.closeSync(fd);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// An eval worker runs as CommonJS unless the process was started with flags
|
|
110
|
+
// that make it ESM (workers inherit execArgv, e.g. --input-type=module), where
|
|
111
|
+
// `require` does not exist. `process.getBuiltinModule` works in both.
|
|
112
|
+
const WORKER_SOURCE = (readLimit) => `"use strict";
|
|
113
|
+
const load = typeof require === "function" ? require : (id) => process.getBuiltinModule(id);
|
|
114
|
+
const { parentPort } = load("node:worker_threads");
|
|
115
|
+
const fs = load("node:fs");
|
|
116
|
+
const scanText = ${scanText.toString()};
|
|
117
|
+
const makeByteFilter = ${makeByteFilter.toString()};
|
|
118
|
+
const readSmallFileSync = ${readSmallFileSync.toString()};
|
|
119
|
+
const scratch = Buffer.allocUnsafe(${readLimit + 1});
|
|
120
|
+
parentPort.on("message", (job) => {
|
|
121
|
+
const filter = makeByteFilter(job.literals, job.caseInsensitive);
|
|
122
|
+
const results = [];
|
|
123
|
+
let expired = false;
|
|
124
|
+
let found = 0;
|
|
125
|
+
for (const [abs, rel] of job.files) {
|
|
126
|
+
if (Date.now() >= job.options.expiresAt) { expired = true; break; }
|
|
127
|
+
const bytes = readSmallFileSync(fs, abs, job.readLimit, scratch);
|
|
128
|
+
if (bytes === undefined) { results.push(null); continue; }
|
|
129
|
+
if (filter && !filter(bytes)) { results.push([]); continue; }
|
|
130
|
+
const scanned = scanText(bytes.toString("utf8"), rel, job.options);
|
|
131
|
+
results.push(scanned.lines);
|
|
132
|
+
found += scanned.lines.length;
|
|
133
|
+
if (scanned.expired) { expired = true; break; }
|
|
134
|
+
if (found >= job.stopAfter) break;
|
|
135
|
+
}
|
|
136
|
+
parentPort.postMessage({ results, expired });
|
|
137
|
+
});`;
|
|
138
|
+
/** Idle workers cost ~7 MB each; release them between bursts of searching. */
|
|
139
|
+
const POOL_IDLE_MS = 30_000;
|
|
140
|
+
/** Four measured fastest on macOS; more contend on file-open locks. */
|
|
141
|
+
const MAX_POOL_SIZE = 4;
|
|
142
|
+
export class GrepWorkerPool {
|
|
143
|
+
idle = [];
|
|
144
|
+
waiters = [];
|
|
145
|
+
all;
|
|
146
|
+
idleTimer;
|
|
147
|
+
disposed = false;
|
|
148
|
+
constructor(size, readLimit) {
|
|
149
|
+
const source = WORKER_SOURCE(readLimit);
|
|
150
|
+
this.all = Array.from({ length: size }, () => {
|
|
151
|
+
const worker = new Worker(source, { eval: true });
|
|
152
|
+
// An idle pool must never keep the process alive; a busy one is ref'd.
|
|
153
|
+
worker.unref();
|
|
154
|
+
// A crashed worker poisons the pool: callers fall back to the main
|
|
155
|
+
// thread, and the next scan builds a fresh pool.
|
|
156
|
+
// Logged because the fallback is silent otherwise: results stay correct,
|
|
157
|
+
// only slower, so a broken pool would never surface as a failure.
|
|
158
|
+
worker.once("error", (err) => {
|
|
159
|
+
log("WARN", "grep", "worker failed; scanning on the main thread", {
|
|
160
|
+
message: err instanceof Error ? err.message : String(err),
|
|
161
|
+
});
|
|
162
|
+
this.dispose();
|
|
163
|
+
});
|
|
164
|
+
worker.once("exit", () => this.dispose());
|
|
165
|
+
return worker;
|
|
166
|
+
});
|
|
167
|
+
this.idle.push(...this.all);
|
|
168
|
+
this.armIdleTimer();
|
|
169
|
+
}
|
|
170
|
+
get size() {
|
|
171
|
+
return this.all.length;
|
|
172
|
+
}
|
|
173
|
+
get isDisposed() {
|
|
174
|
+
return this.disposed;
|
|
175
|
+
}
|
|
176
|
+
/** Run one job; rejects if the pool is or becomes unusable. */
|
|
177
|
+
async run(job) {
|
|
178
|
+
const worker = await this.acquire();
|
|
179
|
+
if (!worker)
|
|
180
|
+
throw new Error("grep worker pool disposed");
|
|
181
|
+
worker.ref();
|
|
182
|
+
try {
|
|
183
|
+
return await new Promise((resolve, reject) => {
|
|
184
|
+
const onMessage = (result) => {
|
|
185
|
+
cleanup();
|
|
186
|
+
resolve(result);
|
|
187
|
+
};
|
|
188
|
+
const onFailure = () => {
|
|
189
|
+
cleanup();
|
|
190
|
+
reject(new Error("grep worker failed"));
|
|
191
|
+
};
|
|
192
|
+
const cleanup = () => {
|
|
193
|
+
worker.off("message", onMessage);
|
|
194
|
+
worker.off("error", onFailure);
|
|
195
|
+
worker.off("exit", onFailure);
|
|
196
|
+
};
|
|
197
|
+
worker.on("message", onMessage);
|
|
198
|
+
worker.on("error", onFailure);
|
|
199
|
+
worker.on("exit", onFailure);
|
|
200
|
+
worker.postMessage(job);
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
worker.unref();
|
|
205
|
+
this.release(worker);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
dispose() {
|
|
209
|
+
if (this.disposed)
|
|
210
|
+
return;
|
|
211
|
+
this.disposed = true;
|
|
212
|
+
if (this.idleTimer)
|
|
213
|
+
clearTimeout(this.idleTimer);
|
|
214
|
+
for (const waiter of this.waiters.splice(0))
|
|
215
|
+
waiter(undefined);
|
|
216
|
+
for (const worker of this.all)
|
|
217
|
+
void worker.terminate();
|
|
218
|
+
}
|
|
219
|
+
acquire() {
|
|
220
|
+
if (this.disposed)
|
|
221
|
+
return Promise.resolve(undefined);
|
|
222
|
+
if (this.idleTimer)
|
|
223
|
+
clearTimeout(this.idleTimer);
|
|
224
|
+
const worker = this.idle.pop();
|
|
225
|
+
if (worker)
|
|
226
|
+
return Promise.resolve(worker);
|
|
227
|
+
return new Promise((resolve) => this.waiters.push(resolve));
|
|
228
|
+
}
|
|
229
|
+
release(worker) {
|
|
230
|
+
if (this.disposed)
|
|
231
|
+
return;
|
|
232
|
+
const waiter = this.waiters.shift();
|
|
233
|
+
if (waiter) {
|
|
234
|
+
waiter(worker);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
this.idle.push(worker);
|
|
238
|
+
if (this.idle.length === this.all.length)
|
|
239
|
+
this.armIdleTimer();
|
|
240
|
+
}
|
|
241
|
+
armIdleTimer() {
|
|
242
|
+
if (this.idleTimer)
|
|
243
|
+
clearTimeout(this.idleTimer);
|
|
244
|
+
this.idleTimer = setTimeout(() => this.dispose(), POOL_IDLE_MS);
|
|
245
|
+
this.idleTimer.unref();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* The process-wide pool, created on first use. Like the external-scanner
|
|
250
|
+
* probe in grep.ts this is deliberately module state: workers are a
|
|
251
|
+
* process resource shared by every session in the daemon.
|
|
252
|
+
*/
|
|
253
|
+
let sharedPool;
|
|
254
|
+
let workersUnavailable = false;
|
|
255
|
+
export function getGrepWorkerPool(readLimit) {
|
|
256
|
+
if (workersUnavailable)
|
|
257
|
+
return undefined;
|
|
258
|
+
if (sharedPool && !sharedPool.isDisposed)
|
|
259
|
+
return sharedPool;
|
|
260
|
+
const size = Math.min(MAX_POOL_SIZE, os.availableParallelism() - 1);
|
|
261
|
+
if (size < 1) {
|
|
262
|
+
workersUnavailable = true;
|
|
263
|
+
return undefined;
|
|
264
|
+
}
|
|
265
|
+
try {
|
|
266
|
+
sharedPool = new GrepWorkerPool(size, readLimit);
|
|
267
|
+
return sharedPool;
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
// Worker threads unavailable in this runtime: stay on the main thread.
|
|
271
|
+
log("WARN", "grep", "worker threads unavailable; scanning on the main thread", {
|
|
272
|
+
message: err instanceof Error ? err.message : String(err),
|
|
273
|
+
});
|
|
274
|
+
workersUnavailable = true;
|
|
275
|
+
return undefined;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/** Test seam: stop the shared pool's workers. */
|
|
279
|
+
export function disposeGrepWorkerPool() {
|
|
280
|
+
sharedPool?.dispose();
|
|
281
|
+
sharedPool = undefined;
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=grep-scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep-scan.js","sourceRoot":"","sources":["../../src/tools/grep-scan.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/grep.d.ts
CHANGED
|
@@ -16,9 +16,19 @@ export interface GrepToolOptions {
|
|
|
16
16
|
* lazily so a settings change takes effect without rebuilding the toolset.
|
|
17
17
|
*/
|
|
18
18
|
useExternalScanner?: () => boolean;
|
|
19
|
+
/** Test seam: smallest scan that uses worker threads (default WORKER_MIN_FILES). */
|
|
20
|
+
workerMinFiles?: number;
|
|
19
21
|
}
|
|
20
22
|
export declare function createGrepTool(cwd: string, ops?: ToolOperations, options?: GrepToolOptions): AgentTool<typeof GrepParams>;
|
|
21
23
|
export declare function detectExternalScanner(): Promise<string | undefined>;
|
|
22
24
|
/** Test seam: forget the cached probe result. */
|
|
23
25
|
export declare function resetExternalScannerProbe(): void;
|
|
26
|
+
/**
|
|
27
|
+
* For each top-level alternative, the longest run of literal characters every
|
|
28
|
+
* match of that alternative contains. `undefined` when any alternative has no
|
|
29
|
+
* such run, since that alternative could match a file containing none of them.
|
|
30
|
+
* Deliberately conservative: groups, classes, escapes of letters/digits and
|
|
31
|
+
* anything non-ASCII end a run instead of being reasoned about.
|
|
32
|
+
*/
|
|
33
|
+
export declare function requiredLiterals(pattern: string): string[] | undefined;
|
|
24
34
|
export {};
|