@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.
Files changed (142) hide show
  1. package/dist/app-sidecar/app-settings.d.ts +6 -2
  2. package/dist/app-sidecar/app-settings.js +39 -20
  3. package/dist/app-sidecar/app-settings.js.map +1 -1
  4. package/dist/app-sidecar/git-target.d.ts +17 -0
  5. package/dist/app-sidecar/git-target.js +31 -0
  6. package/dist/app-sidecar/git-target.js.map +1 -0
  7. package/dist/app-sidecar/goal-routes.d.ts +6 -0
  8. package/dist/app-sidecar/goal-routes.js +360 -0
  9. package/dist/app-sidecar/goal-routes.js.map +1 -0
  10. package/dist/app-sidecar/history-routes.d.ts +13 -0
  11. package/dist/app-sidecar/history-routes.js +37 -27
  12. package/dist/app-sidecar/history-routes.js.map +1 -1
  13. package/dist/app-sidecar/mcp-routes.js +1 -2
  14. package/dist/app-sidecar/mcp-routes.js.map +1 -1
  15. package/dist/app-sidecar/prompt-routes.js +1 -2
  16. package/dist/app-sidecar/prompt-routes.js.map +1 -1
  17. package/dist/app-sidecar/route-context.d.ts +12 -0
  18. package/dist/app-sidecar/run-control-routes.js +2 -1
  19. package/dist/app-sidecar/run-control-routes.js.map +1 -1
  20. package/dist/app-sidecar/session-routes.js +41 -0
  21. package/dist/app-sidecar/session-routes.js.map +1 -1
  22. package/dist/app-sidecar/session-types.d.ts +2 -0
  23. package/dist/app-sidecar/workspace-routes.js +13 -95
  24. package/dist/app-sidecar/workspace-routes.js.map +1 -1
  25. package/dist/app-sidecar.js +219 -67
  26. package/dist/app-sidecar.js.map +1 -1
  27. package/dist/cli/shared.js +1 -1
  28. package/dist/cli/shared.js.map +1 -1
  29. package/dist/core/acceptance-checks.js +17 -4
  30. package/dist/core/acceptance-checks.js.map +1 -1
  31. package/dist/core/agent-notifications.d.ts +1 -1
  32. package/dist/core/agent-session.d.ts +90 -5
  33. package/dist/core/agent-session.js +185 -63
  34. package/dist/core/agent-session.js.map +1 -1
  35. package/dist/core/ask-user.d.ts +11 -0
  36. package/dist/core/ask-user.js +6 -1
  37. package/dist/core/ask-user.js.map +1 -1
  38. package/dist/core/auth-providers.d.ts +2 -80
  39. package/dist/core/auth-providers.js +4 -183
  40. package/dist/core/auth-providers.js.map +1 -1
  41. package/dist/core/cache-diagnostics.d.ts +1 -1
  42. package/dist/core/cache-diagnostics.js +2 -1
  43. package/dist/core/cache-diagnostics.js.map +1 -1
  44. package/dist/core/compaction/tool-result-pruner.d.ts +10 -0
  45. package/dist/core/compaction/tool-result-pruner.js +12 -0
  46. package/dist/core/compaction/tool-result-pruner.js.map +1 -1
  47. package/dist/core/context-files.d.ts +8 -0
  48. package/dist/core/context-files.js +46 -0
  49. package/dist/core/context-files.js.map +1 -0
  50. package/dist/core/custom-commands.d.ts +6 -0
  51. package/dist/core/custom-commands.js +17 -0
  52. package/dist/core/custom-commands.js.map +1 -1
  53. package/dist/core/env-delta.d.ts +9 -1
  54. package/dist/core/env-delta.js +20 -0
  55. package/dist/core/env-delta.js.map +1 -1
  56. package/dist/core/goal-summary.d.ts +32 -0
  57. package/dist/core/goal-summary.js +104 -0
  58. package/dist/core/goal-summary.js.map +1 -0
  59. package/dist/core/goals-store.d.ts +208 -0
  60. package/dist/core/goals-store.js +521 -0
  61. package/dist/core/goals-store.js.map +1 -0
  62. package/dist/core/local-endpoint-store.js +15 -11
  63. package/dist/core/local-endpoint-store.js.map +1 -1
  64. package/dist/core/plan-handoff.d.ts +8 -0
  65. package/dist/core/plan-handoff.js +11 -0
  66. package/dist/core/plan-handoff.js.map +1 -1
  67. package/dist/core/project-discovery.d.ts +7 -0
  68. package/dist/core/project-discovery.js +9 -3
  69. package/dist/core/project-discovery.js.map +1 -1
  70. package/dist/core/radio.d.ts +2 -3
  71. package/dist/core/radio.js.map +1 -1
  72. package/dist/core/session-manager.d.ts +7 -1
  73. package/dist/core/session-manager.js +17 -7
  74. package/dist/core/session-manager.js.map +1 -1
  75. package/dist/core/session-storage.d.ts +3 -0
  76. package/dist/core/session-storage.js +8 -2
  77. package/dist/core/session-storage.js.map +1 -1
  78. package/dist/core/steroids.d.ts +8 -0
  79. package/dist/core/steroids.js +19 -3
  80. package/dist/core/steroids.js.map +1 -1
  81. package/dist/core/subagent-manager.d.ts +51 -0
  82. package/dist/core/subagent-manager.js +103 -16
  83. package/dist/core/subagent-manager.js.map +1 -1
  84. package/dist/core/subagent-store.js +2 -1
  85. package/dist/core/subagent-store.js.map +1 -1
  86. package/dist/goals-agent/goal-team.d.ts +2 -0
  87. package/dist/goals-agent/goal-team.js +83 -0
  88. package/dist/goals-agent/goal-team.js.map +1 -0
  89. package/dist/goals-agent/goals-agent.d.ts +90 -0
  90. package/dist/goals-agent/goals-agent.js +246 -0
  91. package/dist/goals-agent/goals-agent.js.map +1 -0
  92. package/dist/index.js +1 -1
  93. package/dist/index.js.map +1 -1
  94. package/dist/interactive.js +4 -3
  95. package/dist/interactive.js.map +1 -1
  96. package/dist/modes/acp-autopilot.d.ts +27 -0
  97. package/dist/modes/acp-autopilot.js +54 -0
  98. package/dist/modes/acp-autopilot.js.map +1 -0
  99. package/dist/modes/acp-goals.d.ts +48 -0
  100. package/dist/modes/acp-goals.js +103 -0
  101. package/dist/modes/acp-goals.js.map +1 -0
  102. package/dist/modes/acp-mode.d.ts +128 -3
  103. package/dist/modes/acp-mode.js +1082 -52
  104. package/dist/modes/acp-mode.js.map +1 -1
  105. package/dist/modes/subagent-worker-mode.d.ts +14 -0
  106. package/dist/modes/subagent-worker-mode.js +32 -1
  107. package/dist/modes/subagent-worker-mode.js.map +1 -1
  108. package/dist/system-prompt.d.ts +8 -0
  109. package/dist/system-prompt.js +21 -9
  110. package/dist/system-prompt.js.map +1 -1
  111. package/dist/tools/bash-read-evidence.d.ts +13 -0
  112. package/dist/tools/bash-read-evidence.js +48 -1
  113. package/dist/tools/bash-read-evidence.js.map +1 -1
  114. package/dist/tools/grep-scan.d.ts +96 -0
  115. package/dist/tools/grep-scan.js +283 -0
  116. package/dist/tools/grep-scan.js.map +1 -0
  117. package/dist/tools/grep.d.ts +10 -0
  118. package/dist/tools/grep.js +418 -10
  119. package/dist/tools/grep.js.map +1 -1
  120. package/dist/tools/index.d.ts +7 -1
  121. package/dist/tools/index.js +10 -2
  122. package/dist/tools/index.js.map +1 -1
  123. package/dist/tools/read-tracker.d.ts +6 -12
  124. package/dist/tools/read-tracker.js +21 -36
  125. package/dist/tools/read-tracker.js.map +1 -1
  126. package/dist/tools/read.js +2 -2
  127. package/dist/tools/read.js.map +1 -1
  128. package/dist/tools/subagent-control.js +22 -3
  129. package/dist/tools/subagent-control.js.map +1 -1
  130. package/dist/tools/write.js +110 -8
  131. package/dist/tools/write.js.map +1 -1
  132. package/dist/ui/components/ActivityIndicator.d.ts +5 -5
  133. package/dist/ui/components/InputArea.d.ts +2 -2
  134. package/dist/ui/components/InputArea.js +3 -3
  135. package/dist/ui/components/InputArea.js.map +1 -1
  136. package/dist/ui/components/ToolExecution.d.ts +2 -2
  137. package/dist/ui/hooks/useContextCompaction.js +38 -31
  138. package/dist/ui/hooks/useContextCompaction.js.map +1 -1
  139. package/dist/utils/format.d.ts +0 -4
  140. package/dist/utils/format.js +0 -7
  141. package/dist/utils/format.js.map +1 -1
  142. 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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"}
@@ -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 {};