@kenkaiiii/ggcoder 5.37.0 → 5.39.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 (170) hide show
  1. package/dist/app-sidecar.js +31 -18
  2. package/dist/app-sidecar.js.map +1 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +12 -1
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config.d.ts +15 -4
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +34 -75
  9. package/dist/config.js.map +1 -1
  10. package/dist/config.test.js +19 -11
  11. package/dist/config.test.js.map +1 -1
  12. package/dist/core/agent-session-tool-tiers.test.d.ts +2 -0
  13. package/dist/core/agent-session-tool-tiers.test.d.ts.map +1 -0
  14. package/dist/core/agent-session-tool-tiers.test.js +138 -0
  15. package/dist/core/agent-session-tool-tiers.test.js.map +1 -0
  16. package/dist/core/agent-session.d.ts +43 -3
  17. package/dist/core/agent-session.d.ts.map +1 -1
  18. package/dist/core/agent-session.js +77 -11
  19. package/dist/core/agent-session.js.map +1 -1
  20. package/dist/core/agents.d.ts +29 -1
  21. package/dist/core/agents.d.ts.map +1 -1
  22. package/dist/core/agents.js +47 -97
  23. package/dist/core/agents.js.map +1 -1
  24. package/dist/core/agents.test.js +85 -5
  25. package/dist/core/agents.test.js.map +1 -1
  26. package/dist/core/bundled-agents.d.ts +3 -0
  27. package/dist/core/bundled-agents.d.ts.map +1 -0
  28. package/dist/core/bundled-agents.js +252 -0
  29. package/dist/core/bundled-agents.js.map +1 -0
  30. package/dist/core/code-retrieval-chunkers.d.ts +27 -0
  31. package/dist/core/code-retrieval-chunkers.d.ts.map +1 -0
  32. package/dist/core/code-retrieval-chunkers.js +264 -0
  33. package/dist/core/code-retrieval-chunkers.js.map +1 -0
  34. package/dist/core/code-retrieval-chunkers.test.d.ts +2 -0
  35. package/dist/core/code-retrieval-chunkers.test.d.ts.map +1 -0
  36. package/dist/core/code-retrieval-chunkers.test.js +203 -0
  37. package/dist/core/code-retrieval-chunkers.test.js.map +1 -0
  38. package/dist/core/code-retrieval.d.ts +6 -0
  39. package/dist/core/code-retrieval.d.ts.map +1 -1
  40. package/dist/core/code-retrieval.js +38 -1
  41. package/dist/core/code-retrieval.js.map +1 -1
  42. package/dist/core/lsp/client-navigation.test.d.ts +2 -0
  43. package/dist/core/lsp/client-navigation.test.d.ts.map +1 -0
  44. package/dist/core/lsp/client-navigation.test.js +119 -0
  45. package/dist/core/lsp/client-navigation.test.js.map +1 -0
  46. package/dist/core/lsp/client.d.ts +62 -0
  47. package/dist/core/lsp/client.d.ts.map +1 -1
  48. package/dist/core/lsp/client.js +147 -0
  49. package/dist/core/lsp/client.js.map +1 -1
  50. package/dist/core/lsp/manager-navigation.test.d.ts +2 -0
  51. package/dist/core/lsp/manager-navigation.test.d.ts.map +1 -0
  52. package/dist/core/lsp/manager-navigation.test.js +119 -0
  53. package/dist/core/lsp/manager-navigation.test.js.map +1 -0
  54. package/dist/core/lsp/manager.d.ts +35 -1
  55. package/dist/core/lsp/manager.d.ts.map +1 -1
  56. package/dist/core/lsp/manager.js +92 -0
  57. package/dist/core/lsp/manager.js.map +1 -1
  58. package/dist/core/mcp/deferred-catalog.d.ts +1 -1
  59. package/dist/core/mcp/deferred-catalog.js +1 -1
  60. package/dist/core/settings-manager.d.ts +2 -0
  61. package/dist/core/settings-manager.d.ts.map +1 -1
  62. package/dist/core/settings-manager.js +10 -1
  63. package/dist/core/settings-manager.js.map +1 -1
  64. package/dist/core/shutdown.d.ts +71 -0
  65. package/dist/core/shutdown.d.ts.map +1 -0
  66. package/dist/core/shutdown.js +144 -0
  67. package/dist/core/shutdown.js.map +1 -0
  68. package/dist/core/shutdown.test.d.ts +2 -0
  69. package/dist/core/shutdown.test.d.ts.map +1 -0
  70. package/dist/core/shutdown.test.js +160 -0
  71. package/dist/core/shutdown.test.js.map +1 -0
  72. package/dist/core/subagent-manager.d.ts +9 -0
  73. package/dist/core/subagent-manager.d.ts.map +1 -1
  74. package/dist/core/subagent-manager.js +45 -12
  75. package/dist/core/subagent-manager.js.map +1 -1
  76. package/dist/core/subagent-manager.test.js +13 -7
  77. package/dist/core/subagent-manager.test.js.map +1 -1
  78. package/dist/modes/agent-home-mode.d.ts.map +1 -1
  79. package/dist/modes/agent-home-mode.js +15 -11
  80. package/dist/modes/agent-home-mode.js.map +1 -1
  81. package/dist/modes/json-mode.d.ts +8 -0
  82. package/dist/modes/json-mode.d.ts.map +1 -1
  83. package/dist/modes/json-mode.js +2 -0
  84. package/dist/modes/json-mode.js.map +1 -1
  85. package/dist/modes/serve-mode.d.ts +2 -1
  86. package/dist/modes/serve-mode.d.ts.map +1 -1
  87. package/dist/modes/serve-mode.js +15 -9
  88. package/dist/modes/serve-mode.js.map +1 -1
  89. package/dist/modes/subagent-worker-mode.d.ts +5 -0
  90. package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
  91. package/dist/modes/subagent-worker-mode.js.map +1 -1
  92. package/dist/system-prompt.d.ts +37 -1
  93. package/dist/system-prompt.d.ts.map +1 -1
  94. package/dist/system-prompt.js +108 -4
  95. package/dist/system-prompt.js.map +1 -1
  96. package/dist/system-prompt.test.js +48 -1
  97. package/dist/system-prompt.test.js.map +1 -1
  98. package/dist/system-prompt.tiering.test.d.ts +2 -0
  99. package/dist/system-prompt.tiering.test.d.ts.map +1 -0
  100. package/dist/system-prompt.tiering.test.js +103 -0
  101. package/dist/system-prompt.tiering.test.js.map +1 -0
  102. package/dist/tools/code-nav.d.ts +30 -0
  103. package/dist/tools/code-nav.d.ts.map +1 -0
  104. package/dist/tools/code-nav.js +247 -0
  105. package/dist/tools/code-nav.js.map +1 -0
  106. package/dist/tools/code-nav.test.d.ts +2 -0
  107. package/dist/tools/code-nav.test.d.ts.map +1 -0
  108. package/dist/tools/code-nav.test.js +109 -0
  109. package/dist/tools/code-nav.test.js.map +1 -0
  110. package/dist/tools/grep-parity.test.d.ts +2 -0
  111. package/dist/tools/grep-parity.test.d.ts.map +1 -0
  112. package/dist/tools/grep-parity.test.js +92 -0
  113. package/dist/tools/grep-parity.test.js.map +1 -0
  114. package/dist/tools/grep-recall.test.d.ts +2 -0
  115. package/dist/tools/grep-recall.test.d.ts.map +1 -0
  116. package/dist/tools/grep-recall.test.js +114 -0
  117. package/dist/tools/grep-recall.test.js.map +1 -0
  118. package/dist/tools/grep-spawn.test.d.ts +2 -0
  119. package/dist/tools/grep-spawn.test.d.ts.map +1 -0
  120. package/dist/tools/grep-spawn.test.js +66 -0
  121. package/dist/tools/grep-spawn.test.js.map +1 -0
  122. package/dist/tools/grep.d.ts +13 -3
  123. package/dist/tools/grep.d.ts.map +1 -1
  124. package/dist/tools/grep.js +340 -40
  125. package/dist/tools/grep.js.map +1 -1
  126. package/dist/tools/grep.test.js +11 -8
  127. package/dist/tools/grep.test.js.map +1 -1
  128. package/dist/tools/index.d.ts +7 -0
  129. package/dist/tools/index.d.ts.map +1 -1
  130. package/dist/tools/index.js +8 -1
  131. package/dist/tools/index.js.map +1 -1
  132. package/dist/tools/prompt-hints.d.ts +9 -0
  133. package/dist/tools/prompt-hints.d.ts.map +1 -1
  134. package/dist/tools/prompt-hints.js +61 -8
  135. package/dist/tools/prompt-hints.js.map +1 -1
  136. package/dist/tools/search-code.d.ts.map +1 -1
  137. package/dist/tools/search-code.js +7 -6
  138. package/dist/tools/search-code.js.map +1 -1
  139. package/dist/tools/search-code.test.js +8 -2
  140. package/dist/tools/search-code.test.js.map +1 -1
  141. package/dist/tools/subagent-control.d.ts.map +1 -1
  142. package/dist/tools/subagent-control.js +20 -5
  143. package/dist/tools/subagent-control.js.map +1 -1
  144. package/dist/tools/subagent-control.test.js +34 -1
  145. package/dist/tools/subagent-control.test.js.map +1 -1
  146. package/dist/tools/subagent-shared.d.ts +19 -0
  147. package/dist/tools/subagent-shared.d.ts.map +1 -1
  148. package/dist/tools/subagent-shared.js +32 -5
  149. package/dist/tools/subagent-shared.js.map +1 -1
  150. package/dist/tools/subagent-shared.test.js +42 -8
  151. package/dist/tools/subagent-shared.test.js.map +1 -1
  152. package/dist/tools/subagent.d.ts.map +1 -1
  153. package/dist/tools/subagent.js +11 -8
  154. package/dist/tools/subagent.js.map +1 -1
  155. package/dist/tools/subagent.test.js +3 -0
  156. package/dist/tools/subagent.test.js.map +1 -1
  157. package/dist/tools/tool-search.d.ts.map +1 -1
  158. package/dist/tools/tool-search.js +2 -1
  159. package/dist/tools/tool-search.js.map +1 -1
  160. package/dist/tools/tool-tiers.d.ts +42 -0
  161. package/dist/tools/tool-tiers.d.ts.map +1 -0
  162. package/dist/tools/tool-tiers.js +77 -0
  163. package/dist/tools/tool-tiers.js.map +1 -0
  164. package/dist/tools/tool-tiers.test.d.ts +2 -0
  165. package/dist/tools/tool-tiers.test.d.ts.map +1 -0
  166. package/dist/tools/tool-tiers.test.js +48 -0
  167. package/dist/tools/tool-tiers.test.js.map +1 -0
  168. package/dist/ui/hooks/useAgentLoop.js +1 -1
  169. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  170. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep-spawn.test.d.ts","sourceRoot":"","sources":["../../src/tools/grep-spawn.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import fs from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ const spawnMock = vi.hoisted(() => vi.fn());
6
+ // Importing `spawn` from the mocked module would hand back the mock itself, so
7
+ // delegating to it recurses. Capture the genuine implementation inside the mock
8
+ // factory instead.
9
+ const actualSpawn = vi.hoisted(() => ({ fn: undefined }));
10
+ vi.mock("node:child_process", async () => {
11
+ const actual = await vi.importActual("node:child_process");
12
+ actualSpawn.fn = actual.spawn;
13
+ return { ...actual, spawn: spawnMock };
14
+ });
15
+ const { createGrepTool, detectExternalScanner, resetExternalScannerProbe } = await import("./grep.js");
16
+ function context() {
17
+ return { signal: new AbortController().signal, toolCallId: "test" };
18
+ }
19
+ let tmpDir;
20
+ beforeEach(async () => {
21
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-grep-spawn-"));
22
+ await fs.writeFile(path.join(tmpDir, "a.ts"), "const marker = 1;\n");
23
+ resetExternalScannerProbe();
24
+ spawnMock.mockReset();
25
+ // Delegate to the genuine spawn so the tool behaves normally; we only assert
26
+ // the options it was handed.
27
+ spawnMock.mockImplementation((...args) => actualSpawn.fn(...args));
28
+ });
29
+ afterEach(async () => {
30
+ resetExternalScannerProbe();
31
+ await fs.rm(tmpDir, { recursive: true, force: true });
32
+ });
33
+ describe("grep external scanner spawn options", () => {
34
+ it("hides the console window when probing for the scanner", async () => {
35
+ await detectExternalScanner();
36
+ expect(spawnMock).toHaveBeenCalledWith("rg", ["--version"], expect.objectContaining({ windowsHide: true }));
37
+ });
38
+ it("hides the console window when running a search", async () => {
39
+ const tool = createGrepTool(tmpDir, undefined, { useExternalScanner: () => true });
40
+ await tool.execute({ pattern: "marker" }, context());
41
+ const searchCall = spawnMock.mock.calls.find((call) => Array.isArray(call[1]) && !call[1].includes("--version"));
42
+ // `rg` is optional. When it is absent the in-process path legitimately
43
+ // never spawns — but assert that is the actual reason, so this test can
44
+ // never pass merely because the search silently failed to run.
45
+ if (!searchCall) {
46
+ expect(await detectExternalScanner()).toBeUndefined();
47
+ return;
48
+ }
49
+ expect(searchCall[2]).toEqual(expect.objectContaining({ windowsHide: true }));
50
+ expect(searchCall[2]).toEqual(expect.objectContaining({ cwd: tmpDir }));
51
+ });
52
+ it("never spawns a scan once the budget is already spent", async () => {
53
+ const tool = createGrepTool(tmpDir, undefined, {
54
+ useExternalScanner: () => true,
55
+ deadlineMs: 0,
56
+ });
57
+ const result = String(await tool.execute({ pattern: "marker" }, context()));
58
+ // The child's budget is floored at 1ms, so spawning here would race the
59
+ // scanner: whenever the child won, an expired budget still returned real
60
+ // matches — and only sometimes, which is how it slipped through as a flake.
61
+ expect(spawnMock).not.toHaveBeenCalled();
62
+ expect(result).toContain("No matches found.");
63
+ expect(result).not.toContain("a.ts:1:");
64
+ });
65
+ });
66
+ //# sourceMappingURL=grep-spawn.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep-spawn.test.js","sourceRoot":"","sources":["../../src/tools/grep-spawn.test.ts"],"names":[],"mappings":"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"}
@@ -8,8 +8,18 @@ declare const GrepParams: z.ZodObject<{
8
8
  max_results: z.ZodOptional<z.ZodNumber>;
9
9
  case_insensitive: z.ZodOptional<z.ZodBoolean>;
10
10
  }, z.core.$strip>;
11
- export declare function createGrepTool(cwd: string, ops?: ToolOperations,
12
- /** Wall-clock budget for one call. Overridable so tests can trip it without a 5s wait. */
13
- deadlineMs?: number): AgentTool<typeof GrepParams>;
11
+ export interface GrepToolOptions {
12
+ /** Wall-clock budget for one call. Overridable so tests can trip it without a 5s wait. */
13
+ deadlineMs?: number;
14
+ /**
15
+ * Whether the external `rg` scanner may be used when it is on PATH. Read
16
+ * lazily so a settings change takes effect without rebuilding the toolset.
17
+ */
18
+ useExternalScanner?: () => boolean;
19
+ }
20
+ export declare function createGrepTool(cwd: string, ops?: ToolOperations, options?: GrepToolOptions): AgentTool<typeof GrepParams>;
21
+ export declare function detectExternalScanner(): Promise<string | undefined>;
22
+ /** Test seam: forget the cached probe result. */
23
+ export declare function resetExternalScannerProbe(): void;
14
24
  export {};
15
25
  //# sourceMappingURL=grep.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrD,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEvE,QAAA,MAAM,UAAU;;;;;;iBAWd,CAAC;AAiHH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,cAAgC;AACrC,0FAA0F;AAC1F,UAAU,GAAE,MAAyB,GACpC,SAAS,CAAC,OAAO,UAAU,CAAC,CA+F9B"}
1
+ {"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrD,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEvE,QAAA,MAAM,UAAU;;;;;;iBAcd,CAAC;AA0HH,MAAM,WAAW,eAAe;IAC9B,0FAA0F;IAC1F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC;CACpC;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,cAAgC,EACrC,OAAO,GAAE,eAAoB,GAC5B,SAAS,CAAC,OAAO,UAAU,CAAC,CA4F9B;AA6JD,wBAAgB,qBAAqB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgBnE;AAED,iDAAiD;AACjD,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
@@ -1,5 +1,6 @@
1
1
  import readline from "node:readline";
2
2
  import path from "node:path";
3
+ import { spawn } from "node:child_process";
3
4
  import { z } from "zod";
4
5
  import { sliceHead } from "@kenkaiiii/gg-ai";
5
6
  import { resolvePath } from "./path-utils.js";
@@ -8,7 +9,10 @@ import { localOperations } from "./operations.js";
8
9
  const GrepParams = z.object({
9
10
  pattern: z.string().describe("Search pattern (JavaScript regex; leading (?i) is supported)"),
10
11
  path: z.string().optional().describe("File or directory to search (defaults to cwd)"),
11
- include: z.string().optional().describe("Glob pattern to filter files (e.g. '*.ts')"),
12
+ include: z
13
+ .string()
14
+ .optional()
15
+ .describe("Glob pattern to filter files, matched at any depth (e.g. '*.ts')"),
12
16
  max_results: z
13
17
  .number()
14
18
  .int()
@@ -24,6 +28,15 @@ const MAX_FILE_SIZE = 10 * 1024 * 1024;
24
28
  const MAX_CANDIDATE_FILES = 10_000;
25
29
  /** Wall-clock budget for a single grep call — catastrophic backtracking is count-bounded but not time-bounded */
26
30
  const GREP_DEADLINE_MS = 5_000;
31
+ /**
32
+ * Files scanned concurrently on the in-process path. A grep call is almost
33
+ * entirely I/O wait, so scanning one file at a time turned "slow" into
34
+ * "incomplete": the wall-clock budget expired mid-directory and the model saw a
35
+ * partial answer as if it were the whole one.
36
+ */
37
+ const SCAN_CONCURRENCY = 12;
38
+ /** Cap on bytes accepted from the external scanner before results are ranked. */
39
+ const MAX_EXTERNAL_OUTPUT_BYTES = 8 * 1024 * 1024;
27
40
  /** Long patterns are almost always mistakes and raise the cost of every pathological shape */
28
41
  const MAX_PATTERN_LENGTH = 1_000;
29
42
  /** Check the clock every N lines inside a file scan — cheap enough to be free, dense enough to bound one bad line */
@@ -118,13 +131,19 @@ function containsQuantifier(body) {
118
131
  }
119
132
  return false;
120
133
  }
121
- export function createGrepTool(cwd, ops = localOperations,
122
- /** Wall-clock budget for one call. Overridable so tests can trip it without a 5s wait. */
123
- deadlineMs = GREP_DEADLINE_MS) {
134
+ export function createGrepTool(cwd, ops = localOperations, options = {}) {
135
+ const deadlineMs = options.deadlineMs ?? GREP_DEADLINE_MS;
136
+ // The external scanner reads the real filesystem, so it is only valid when
137
+ // this tool is also pointed at the real filesystem. Remote operations
138
+ // (SSH/Docker) must stay on the in-process path.
139
+ const externalAllowed = ops === localOperations;
124
140
  return {
125
141
  name: "grep",
126
- description: "Search file contents using regex. Returns filepath:line_number:content for matches. " +
127
- "Respects .gitignore. Skips binary files.",
142
+ description: "Search file contents using regex. Returns filepath:line_number:content for matches, " +
143
+ "ordered by path. Skips files matched by the search root's .gitignore (pass an explicit " +
144
+ "`path` inside an ignored directory to search it anyway), skips binary files, and searches " +
145
+ "dot-directories. " +
146
+ "Lookaround and backreferences are supported but scan more slowly.",
128
147
  parameters: GrepParams,
129
148
  async execute({ pattern, path: searchPath, include, max_results, case_insensitive }) {
130
149
  const dir = searchPath ? resolvePath(cwd, searchPath) : cwd;
@@ -158,46 +177,327 @@ deadlineMs = GREP_DEADLINE_MS) {
158
177
  const results = await searchFile(dir, regex, cwd, maxResults, ops, deadline);
159
178
  return formatResults(results, maxResults, false, deadline.hit, deadlineMs);
160
179
  }
161
- // Enumerate files
162
- const fg = await import("fast-glob");
163
- // Backslashes are picomatch ESCAPES, not separators: a Windows-shaped
164
- // `include` (e.g. `src\**\*.ts`) would match nothing.
165
- const globPattern = (include ?? "**/*").replace(/\\/g, "/");
166
- const entries = await fg.default(globPattern, {
167
- cwd: dir,
168
- dot: false,
169
- onlyFiles: true,
170
- ignore: ["**/node_modules/**", "**/.git/**"],
171
- suppressErrors: true,
172
- followSymbolicLinks: false,
173
- objectMode: true,
174
- stats: false,
175
- });
176
- const results = [];
177
- let scannedCandidates = 0;
178
- let candidateLimitHit = false;
179
- for (const item of entries) {
180
- if (results.length >= maxResults)
181
- break;
182
- if (isExpired(deadline))
183
- break;
184
- if (scannedCandidates >= MAX_CANDIDATE_FILES) {
185
- candidateLimitHit = true;
186
- break;
180
+ // An already-spent budget must not start a scan it cannot honour.
181
+ // `runExternalScan` floors the child's budget at 1ms, so without this
182
+ // guard an expired deadline still races ripgrep and returns real matches
183
+ // whenever the child wins reporting results the caller's budget had
184
+ // already ruled out, and non-deterministically at that. The in-process
185
+ // path below reports the expiry directly instead.
186
+ const useExternal = externalAllowed &&
187
+ !isExpired(deadline) &&
188
+ (options.useExternalScanner?.() ?? true) &&
189
+ isExternallySupported(normalizedPattern) &&
190
+ (await detectExternalScanner()) !== undefined;
191
+ if (useExternal) {
192
+ const external = await runExternalScan({
193
+ dir,
194
+ cwd,
195
+ pattern: normalizedPattern,
196
+ include,
197
+ caseInsensitive: flags.includes("i"),
198
+ maxResults,
199
+ deadline,
200
+ deadlineMs,
201
+ });
202
+ // A scanner failure is a tooling problem, not a search result — retry
203
+ // the query in-process rather than reporting a false "no matches".
204
+ if (external) {
205
+ return formatResults(external, maxResults, false, deadline.hit, deadlineMs);
187
206
  }
188
- scannedCandidates += 1;
189
- const entry = typeof item === "string" ? item : item.path;
190
- const ext = path.extname(entry).toLowerCase();
191
- if (BINARY_EXTENSIONS.has(ext))
192
- continue;
193
- const filePath = path.join(dir, entry);
194
- const fileResults = await searchFile(filePath, regex, cwd, maxResults - results.length, ops, deadline);
195
- results.push(...fileResults);
196
207
  }
208
+ const { files, candidateLimitHit } = await enumerateCandidates(dir, include);
209
+ const results = await scanFiles(files, dir, regex, cwd, maxResults, ops, deadline);
197
210
  return formatResults(results, maxResults, candidateLimitHit, deadline.hit, deadlineMs);
198
211
  },
199
212
  };
200
213
  }
214
+ /**
215
+ * Build the candidate file list for one directory scan.
216
+ *
217
+ * Two recall fixes live here. Dot-entries are included, because `.github/`,
218
+ * `.changeset/` and similar directories hold real, searchable project files.
219
+ * And `.gitignore` is applied for real (it previously was not, despite being
220
+ * advertised), so build output and vendored trees stop crowding out source.
221
+ * An explicit `path` INTO an ignored directory still searches it: the ignore
222
+ * file is read relative to the scan root, so scoping past it is the escape
223
+ * hatch.
224
+ *
225
+ * The list is sorted so results are deterministic and byte-comparable across
226
+ * scanners; the parallel scan below relies on that order too.
227
+ */
228
+ async function enumerateCandidates(dir, include) {
229
+ const fg = await import("fast-glob");
230
+ const ignoreModule = await import("ignore");
231
+ const ig = ignoreModule.default();
232
+ ig.add(await loadIgnorePatterns(dir));
233
+ const globPattern = normalizeIncludeGlob(include);
234
+ const entries = await fg.default(globPattern, {
235
+ cwd: dir,
236
+ dot: true,
237
+ onlyFiles: true,
238
+ ignore: ["**/node_modules/**", "**/.git/**"],
239
+ suppressErrors: true,
240
+ followSymbolicLinks: false,
241
+ });
242
+ const kept = entries
243
+ .filter((entry) => !BINARY_EXTENSIONS.has(path.extname(entry).toLowerCase()))
244
+ .filter((entry) => !ig.ignores(entry))
245
+ .sort();
246
+ return {
247
+ files: kept.slice(0, MAX_CANDIDATE_FILES),
248
+ candidateLimitHit: kept.length > MAX_CANDIDATE_FILES,
249
+ };
250
+ }
251
+ /**
252
+ * Normalize an `include` glob to gitignore-style semantics: a bare pattern
253
+ * with no separator matches at any depth. Models write `*.ts` meaning "every
254
+ * TypeScript file", and a root-only interpretation silently returned nothing
255
+ * for any project that keeps its sources in a subdirectory.
256
+ */
257
+ function normalizeIncludeGlob(include) {
258
+ // Backslashes are picomatch ESCAPES, not separators: a Windows-shaped
259
+ // `include` (e.g. `src\**\*.ts`) would match nothing.
260
+ const normalized = (include ?? "**/*").replace(/\\/g, "/");
261
+ return normalized.includes("/") ? normalized : `**/${normalized}`;
262
+ }
263
+ async function fileExists(filePath) {
264
+ try {
265
+ const fs = await import("node:fs/promises");
266
+ await fs.access(filePath);
267
+ return true;
268
+ }
269
+ catch {
270
+ return false;
271
+ }
272
+ }
273
+ async function loadIgnorePatterns(dir) {
274
+ try {
275
+ const fs = await import("node:fs/promises");
276
+ const content = await fs.readFile(path.join(dir, ".gitignore"), "utf-8");
277
+ return content
278
+ .split("\n")
279
+ .map((line) => line.trim())
280
+ .filter((line) => line && !line.startsWith("#"));
281
+ }
282
+ catch {
283
+ return [];
284
+ }
285
+ }
286
+ /**
287
+ * Scan candidates with a bounded worker pool, emitting results in candidate
288
+ * order regardless of completion order: each file writes into its own slot and
289
+ * the slots are flattened at the end. Ordering is therefore identical to a
290
+ * sequential scan over the same list.
291
+ *
292
+ * Scheduling stops as soon as enough matches exist. Because candidates are in
293
+ * sorted order and every scheduled index precedes every unscheduled one, the
294
+ * first `maxResults` entries of the flattened array are exactly the ones a
295
+ * sequential scan would have produced before stopping.
296
+ */
297
+ async function scanFiles(files, dir, regex, cwd, maxResults, ops, deadline) {
298
+ const slots = new Array(files.length).fill(undefined).map(() => []);
299
+ let next = 0;
300
+ let collected = 0;
301
+ const worker = async () => {
302
+ for (;;) {
303
+ if (collected >= maxResults || isExpired(deadline))
304
+ return;
305
+ const index = next++;
306
+ if (index >= files.length)
307
+ return;
308
+ // Each worker owns a private RegExp: `lastIndex` on a shared global regex
309
+ // is mutated during `test`, so concurrent scans would corrupt each other.
310
+ const own = new RegExp(regex.source, regex.flags);
311
+ const fileResults = await searchFile(path.join(dir, files[index]), own, cwd, maxResults, ops, deadline);
312
+ slots[index] = fileResults;
313
+ collected += fileResults.length;
314
+ }
315
+ };
316
+ await Promise.all(Array.from({ length: Math.min(SCAN_CONCURRENCY, files.length || 1) }, () => worker()));
317
+ const results = [];
318
+ for (const slot of slots) {
319
+ for (const line of slot) {
320
+ results.push(line);
321
+ if (results.length >= maxResults)
322
+ return results;
323
+ }
324
+ }
325
+ return results;
326
+ }
327
+ /**
328
+ * Constructs the external scanner's regex engine cannot execute. It uses a
329
+ * finite-automaton engine with linear-time guarantees, which is exactly why it
330
+ * is fast — and exactly why lookaround and backreferences are missing. Those
331
+ * patterns fall back to the in-process backtracking scanner, which is the
332
+ * semantic reference for this tool.
333
+ */
334
+ const EXTERNALLY_UNSUPPORTED = /\(\?=|\(\?!|\(\?</;
335
+ const BACKREFERENCE = /\\[1-9]/;
336
+ function isExternallySupported(pattern) {
337
+ return !EXTERNALLY_UNSUPPORTED.test(pattern) && !BACKREFERENCE.test(pattern);
338
+ }
339
+ /** Resolved once per process: probing costs a spawn, and the answer cannot change. */
340
+ let externalScannerProbe;
341
+ export function detectExternalScanner() {
342
+ externalScannerProbe ??= new Promise((resolve) => {
343
+ let child;
344
+ try {
345
+ // windowsHide: a bare spawn pops a console window on Windows. `grep` is
346
+ // one of the most-called tools, so without it a search session strobes
347
+ // the user's screen. No-op on other platforms.
348
+ child = spawn("rg", ["--version"], { stdio: "ignore", windowsHide: true });
349
+ }
350
+ catch {
351
+ resolve(undefined);
352
+ return;
353
+ }
354
+ child.once("error", () => resolve(undefined));
355
+ child.once("close", (code) => resolve(code === 0 ? "rg" : undefined));
356
+ });
357
+ return externalScannerProbe;
358
+ }
359
+ /** Test seam: forget the cached probe result. */
360
+ export function resetExternalScannerProbe() {
361
+ externalScannerProbe = undefined;
362
+ }
363
+ /**
364
+ * Run the external scanner and format its output exactly like the in-process
365
+ * path: same relative paths, same line truncation, same path ordering.
366
+ *
367
+ * Returns `undefined` when the scanner could not complete, which makes the
368
+ * caller retry in-process. Reporting "no matches" for a spawn failure would be
369
+ * a silent recall loss — the failure mode this whole path exists to remove.
370
+ */
371
+ async function runExternalScan(req) {
372
+ const args = [
373
+ "--no-config",
374
+ "--line-number",
375
+ "--no-heading",
376
+ "--with-filename",
377
+ "--color",
378
+ "never",
379
+ "--no-messages",
380
+ "--hidden",
381
+ // Apply exactly one ignore file — the scan root's .gitignore, wired in
382
+ // below — and nothing else: no nested, parent, global, or non-VCS ignore
383
+ // files. The in-process scanner is this tool's semantic reference and it
384
+ // reads that one file; anything wider would make the two paths disagree
385
+ // about which files exist.
386
+ "--no-ignore",
387
+ "--max-filesize",
388
+ String(MAX_FILE_SIZE),
389
+ "--max-count",
390
+ String(req.maxResults),
391
+ "--glob",
392
+ "!**/.git/**",
393
+ "--glob",
394
+ "!**/node_modules/**",
395
+ ];
396
+ const rootIgnore = path.join(req.dir, ".gitignore");
397
+ if (await fileExists(rootIgnore))
398
+ args.push("--ignore-file", rootIgnore);
399
+ if (req.caseInsensitive)
400
+ args.push("--ignore-case");
401
+ if (req.include)
402
+ args.push("--glob", req.include.replace(/\\/g, "/"));
403
+ // Relative root on purpose — `formatExternalMatches` parses `path:line:text`
404
+ // by first colon, which an absolute Windows path would break.
405
+ args.push("--regexp", req.pattern, "--", ".");
406
+ const remainingMs = Math.max(1, req.deadline.expiresAt - Date.now());
407
+ const output = await new Promise((resolve) => {
408
+ let child;
409
+ try {
410
+ child = spawn("rg", args, { cwd: req.dir, windowsHide: true });
411
+ }
412
+ catch {
413
+ resolve(undefined);
414
+ return;
415
+ }
416
+ let stdout = "";
417
+ let bytes = 0;
418
+ let timedOut = false;
419
+ let settled = false;
420
+ const timer = setTimeout(() => {
421
+ timedOut = true;
422
+ child.kill("SIGKILL");
423
+ }, remainingMs);
424
+ const finish = (value) => {
425
+ if (settled)
426
+ return;
427
+ settled = true;
428
+ clearTimeout(timer);
429
+ resolve(value);
430
+ };
431
+ child.stdout?.setEncoding("utf-8");
432
+ child.stdout?.on("data", (chunk) => {
433
+ bytes += chunk.length;
434
+ if (bytes > MAX_EXTERNAL_OUTPUT_BYTES) {
435
+ child.kill("SIGKILL");
436
+ return;
437
+ }
438
+ stdout += chunk;
439
+ });
440
+ child.stderr?.resume();
441
+ child.once("error", () => finish(undefined));
442
+ // Exit 0 = matches, 1 = no matches. Anything else is a real failure.
443
+ child.once("close", (code) => finish({ stdout, ok: code === 0 || code === 1, timedOut }));
444
+ });
445
+ if (!output)
446
+ return undefined;
447
+ if (output.timedOut)
448
+ req.deadline.hit = true;
449
+ else if (!output.ok)
450
+ return undefined;
451
+ return formatExternalMatches(output.stdout, req);
452
+ }
453
+ /**
454
+ * Parse `path:line:text` records into this tool's output shape. The scanner
455
+ * emits paths relative to the scan root, so they are re-based onto the tool's
456
+ * cwd and re-sorted into candidate order before truncation.
457
+ */
458
+ function formatExternalMatches(stdout, req) {
459
+ const byPath = new Map();
460
+ for (const raw of stdout.split("\n")) {
461
+ if (!raw)
462
+ continue;
463
+ // Splitting on the first colon is only safe because the scan is rooted at a
464
+ // RELATIVE path (see the `.` argument above), so no Windows drive prefix
465
+ // ("C:\") can appear here. Keep it that way: the guards below fail CLOSED,
466
+ // so a misparsed line number drops the match silently — the exact
467
+ // "silence looks like no results" failure this scanner exists to avoid.
468
+ const firstSep = raw.indexOf(":");
469
+ if (firstSep <= 0)
470
+ continue;
471
+ const secondSep = raw.indexOf(":", firstSep + 1);
472
+ if (secondSep < 0)
473
+ continue;
474
+ const lineNum = raw.slice(firstSep + 1, secondSep);
475
+ if (!/^\d+$/.test(lineNum))
476
+ continue;
477
+ const scanRelative = raw.slice(0, firstSep).replace(/^\.[\\/]/, "");
478
+ if (BINARY_EXTENSIONS.has(path.extname(scanRelative).toLowerCase()))
479
+ continue;
480
+ const text = raw.slice(secondSep + 1).replace(/\r$/, "");
481
+ const relPath = path.relative(req.cwd, path.join(req.dir, scanRelative));
482
+ const truncated = text.length > MAX_LINE_LENGTH ? sliceHead(text, MAX_LINE_LENGTH) + "…" : text;
483
+ const key = scanRelative.replace(/\\/g, "/");
484
+ const bucket = byPath.get(key);
485
+ const formatted = `${relPath}:${lineNum}:${truncated}`;
486
+ if (bucket)
487
+ bucket.push(formatted);
488
+ else
489
+ byPath.set(key, [formatted]);
490
+ }
491
+ const results = [];
492
+ for (const key of [...byPath.keys()].sort()) {
493
+ for (const line of byPath.get(key)) {
494
+ results.push(line);
495
+ if (results.length >= req.maxResults)
496
+ return results;
497
+ }
498
+ }
499
+ return results;
500
+ }
201
501
  async function searchFile(filePath, regex, cwd, maxResults, ops, deadline) {
202
502
  const results = [];
203
503
  const relPath = path.relative(cwd, filePath);
@@ -1 +1 @@
1
- {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"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"}
@@ -52,26 +52,29 @@ describe("createGrepTool", () => {
52
52
  });
53
53
  it("returns partial results plus a notice when the deadline expires", async () => {
54
54
  const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-grep-deadline-"));
55
- await fs.writeFile(path.join(tmpDir, "a.txt"), "needle\n");
56
- await fs.writeFile(path.join(tmpDir, "z.txt"), "needle\n");
55
+ // More candidates than the scan pool is wide, so the files past the first
56
+ // wave are genuinely never reached once the budget expires.
57
+ const names = Array.from({ length: 40 }, (_, i) => `f${String(i).padStart(2, "0")}.txt`);
58
+ for (const name of names)
59
+ await fs.writeFile(path.join(tmpDir, name), "needle\n");
57
60
  const slowOps = {
58
61
  ...localOperations,
59
62
  stat: async (p) => {
60
63
  const stat = await localOperations.stat(p);
61
64
  if (stat.isFile())
62
- await new Promise((resolve) => setTimeout(resolve, 40));
65
+ await new Promise((resolve) => setTimeout(resolve, 400));
63
66
  return stat;
64
67
  },
65
68
  };
66
- const result = await createGrepTool(tmpDir, slowOps, 20).execute({ pattern: "needle", include: "*.txt" }, context());
67
- expect(result).toContain("a.txt:1:needle");
68
- expect(result).not.toContain("z.txt:1:needle");
69
- expect(result).toContain("Stopped after 0.02s");
69
+ const result = await createGrepTool(tmpDir, slowOps, { deadlineMs: 300 }).execute({ pattern: "needle", include: "*.txt", max_results: 100 }, context());
70
+ expect(result).toContain("f00.txt:1:needle");
71
+ expect(result).not.toContain("f39.txt:1:needle");
72
+ expect(result).toContain("Stopped after 0.3s");
70
73
  });
71
74
  it("reports the deadline notice when nothing matched", async () => {
72
75
  const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-grep-deadline-empty-"));
73
76
  await fs.writeFile(path.join(tmpDir, "a.txt"), "needle\n");
74
- const result = await createGrepTool(tmpDir, localOperations, 0).execute({ pattern: "needle", include: "*.txt" }, context());
77
+ const result = await createGrepTool(tmpDir, localOperations, { deadlineMs: 0 }).execute({ pattern: "needle", include: "*.txt" }, context());
75
78
  expect(result).toContain("No matches found.");
76
79
  expect(result).toContain("narrow the pattern");
77
80
  });