agim-cli 1.2.56 → 1.2.58

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/CHANGELOG.md CHANGED
@@ -4,6 +4,76 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.2.58] - 2026-05-25
8
+
9
+ ### Added
10
+
11
+ - **5 native filesystem tools** (`fs-dispatcher.ts`) — closes the biggest
12
+ gap vs nanobot / Claude / Codex. Before v1.2.58 the native agent had
13
+ to A2A-delegate every "read this file" / "list this dir" / "grep
14
+ for X" to a CLI sub-agent, which paid the full claude-code spawn
15
+ cost and risked the 30-min hard timeout:
16
+ - `native_read_file(path, max_bytes?)` — UTF-8 read, truncates over 256KB
17
+ - `native_write_file(path, content, mode?)` — overwrite or append, 1MB cap
18
+ - `native_list_dir(path, max_entries?)` — entry name + type + size
19
+ - `native_glob(pattern, root?, max_results?)` — uses ripgrep when
20
+ available; falls back to fs walk with a minimatch-style matcher
21
+ - `native_grep(pattern, path?, glob?, output_mode?, max_matches?,
22
+ case_insensitive?)` — ripgrep wrapper (rg required for now)
23
+ - **Workspace restriction** — default-on via `IMHUB_NATIVE_FS_RESTRICT`
24
+ (`'0'` disables). When on, every fs tool's path must resolve under
25
+ the per-thread native cwd subtree (typically
26
+ `~/.agim-workspaces/native/<thread>/`). Sensitive-path denylist
27
+ (`sensitive-paths.ts`) applies even when restriction is off.
28
+ - **Per-tool wall-clock** — every fs tool races against
29
+ `IMHUB_NATIVE_FS_TIMEOUT_MS` (default 60_000). Prevents a slow
30
+ remote-mounted file from hanging the whole agent loop.
31
+ - **Default auto-allow** for the 4 read-only fs tools
32
+ (`native_read_file` / `native_list_dir` / `native_glob` /
33
+ `native_grep`) so native doesn't pop an IM card for every file
34
+ inspection. `native_write_file` stays approval-gated by default —
35
+ operators who trust native can add it via
36
+ `IMHUB_NATIVE_AGENT_AUTOALLOW`.
37
+
38
+ ### Deferred
39
+
40
+ - `native_exec` (one-shot shell), `web_fetch`, `web_search` (duckduckgo
41
+ → metaso fallback), `long_task` / `complete_goal` MCP tools, and the
42
+ bwrap sandbox path are scheduled for v1.2.59 — kept separate so the
43
+ higher-risk pieces can be reviewed without dragging the fs additions.
44
+
45
+ ## [1.2.57] - 2026-05-25
46
+
47
+ ### Added
48
+
49
+ - **9 new builtin skills** inspired by nanobot's skill catalog, dropped
50
+ into `src/core/skills/builtin/`. All are pure-markdown SKILL.md
51
+ packages — they teach the agent procedural knowledge and trigger
52
+ phrases without adding code. Available to every agim agent that
53
+ reads `agim skills available` (native injects into prompt; CLI
54
+ agents load via `mcp__imhub__read_skill`):
55
+ - `weather` — wttr.in + Open-Meteo, no API key
56
+ - `summarize` — URL / article / YouTube / PDF summarisation flow
57
+ - `github` — `gh` CLI patterns (PR, issue, CI runs, gh api)
58
+ - `my` — agent self-introspection (what model, what cwd, what tools)
59
+ - `skill-creator` — meta-skill for writing new SKILL.md packages
60
+ - `tmux` — interactive-TTY guidance with isolated-socket convention
61
+ - `long-goal` — sustained multi-turn objectives via `/goal set`,
62
+ progress logging, and acceptance-criteria rules (adapted from
63
+ nanobot but mapped onto agim's existing goals.ts)
64
+ - `agim-reminders` — replaces nanobot's `cron`; teaches the
65
+ `mcp__imhub__create_reminder` family with concrete examples
66
+ - `agim-memory` — replaces nanobot's `memory`; teaches the
67
+ `memory_*` + `*_memo` tools and the 5W1H taxonomy
68
+
69
+ ### Deferred
70
+
71
+ - `long_task` / `complete_goal` MCP tools (nanobot-style auto-register)
72
+ intentionally deferred to v1.2.58 — the `long-goal` skill currently
73
+ routes through the existing `/goal set` slash command. Will revisit
74
+ after observing how often agents reach for self-registered goals
75
+ in real IM use.
76
+
7
77
  ## [1.2.56] - 2026-05-25
8
78
 
9
79
  ### Fixed
@@ -0,0 +1,9 @@
1
+ import type { ToolDef } from './provider-base.js';
2
+ import type { ToolDispatcher } from './tool-dispatcher.js';
3
+ export declare function isFsToolName(name: string): boolean;
4
+ export declare function getFsTools(): ToolDef[];
5
+ export interface FsContext {
6
+ cwd: string;
7
+ }
8
+ export declare function buildFsDispatcher(ctx: FsContext): ToolDispatcher;
9
+ //# sourceMappingURL=fs-dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-dispatcher.d.ts","sourceRoot":"","sources":["../../../src/core/llm/fs-dispatcher.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAmB5E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,UAAU,IAAI,OAAO,EAAE,CAsFtC;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,GAAG,cAAc,CAkBhE"}
@@ -0,0 +1,506 @@
1
+ // fs-dispatcher — filesystem + content-search tools for the native agent.
2
+ //
3
+ // Closes a major gap vs nanobot / Claude / Codex: native could read its
4
+ // own skill catalog and call sub-agents, but it had no `read_file` /
5
+ // `write_file` / `list_dir` / `glob` / `grep`. That forced every
6
+ // "look at this file" / "what's in this dir" request to fan out to a
7
+ // CLI sub-agent over A2A — slow, costly, and a 30-min hard timeout
8
+ // landmine (see the v1.2.56 crash-loop fix).
9
+ //
10
+ // All five tools are constrained by default to the native agent's per-
11
+ // thread cwd subtree (typically ~/.agim-workspaces/native/<thread>/).
12
+ // Operators who want broader access set IMHUB_NATIVE_FS_RESTRICT=0 —
13
+ // even then, the sensitive-paths.ts denylist still applies so
14
+ // ~/.agim/, /etc/shadow, etc. remain blocked.
15
+ //
16
+ // Tools shipped here:
17
+ // * native_read_file(path, max_bytes?)
18
+ // * native_write_file(path, content, mode?)
19
+ // * native_list_dir(path, max_entries?)
20
+ // * native_glob(pattern, root?, max_results?)
21
+ // * native_grep(pattern, path?, glob?, output_mode?, max_matches?, case_insensitive?)
22
+ //
23
+ // Per-tool wall-clock: each handler races against IMHUB_NATIVE_FS_TIMEOUT_MS
24
+ // (default 60_000). Honors the loop AbortSignal too.
25
+ import { promises as fs, statSync } from 'node:fs';
26
+ import { resolve as resolvePath, isAbsolute, relative, sep } from 'node:path';
27
+ import { spawn } from 'node:child_process';
28
+ import { homedir } from 'node:os';
29
+ import { logger as rootLogger } from '../logger.js';
30
+ import { isSensitivePath } from '../sensitive-paths.js';
31
+ const log = rootLogger.child({ component: 'fs-dispatcher' });
32
+ const DEFAULT_TIMEOUT_MS = 60_000;
33
+ const DEFAULT_READ_MAX_BYTES = 256 * 1024; // 256 KB
34
+ const DEFAULT_WRITE_MAX_BYTES = 1 * 1024 * 1024; // 1 MB
35
+ const DEFAULT_LIST_MAX_ENTRIES = 500;
36
+ const DEFAULT_GLOB_MAX_RESULTS = 500;
37
+ const DEFAULT_GREP_MAX_MATCHES = 200;
38
+ const FS_TOOL_NAMES = [
39
+ 'native_read_file',
40
+ 'native_write_file',
41
+ 'native_list_dir',
42
+ 'native_glob',
43
+ 'native_grep',
44
+ ];
45
+ export function isFsToolName(name) {
46
+ return FS_TOOL_NAMES.includes(name);
47
+ }
48
+ export function getFsTools() {
49
+ return [
50
+ {
51
+ name: 'native_read_file',
52
+ description: 'Read a UTF-8 text file by path. Default max 256KB. Paths resolve against the agent cwd; ' +
53
+ 'absolute paths are allowed but constrained to the workspace subtree unless ' +
54
+ 'IMHUB_NATIVE_FS_RESTRICT=0. Sensitive paths (~/.agim, /etc/shadow, etc.) are always denied.',
55
+ parameters: {
56
+ type: 'object',
57
+ properties: {
58
+ path: { type: 'string', description: 'File path (absolute or relative to cwd).' },
59
+ max_bytes: { type: 'number', description: 'Max bytes to read (default 262144).' },
60
+ },
61
+ required: ['path'],
62
+ additionalProperties: false,
63
+ },
64
+ },
65
+ {
66
+ name: 'native_write_file',
67
+ description: 'Write or overwrite a UTF-8 text file. Default max 1MB. Same path-safety rules as ' +
68
+ 'native_read_file. Creates parent directories as needed.',
69
+ parameters: {
70
+ type: 'object',
71
+ properties: {
72
+ path: { type: 'string', description: 'File path.' },
73
+ content: { type: 'string', description: 'Full file content (overwrites).' },
74
+ mode: { type: 'string', enum: ['overwrite', 'append'], description: 'overwrite (default) or append.' },
75
+ },
76
+ required: ['path', 'content'],
77
+ additionalProperties: false,
78
+ },
79
+ },
80
+ {
81
+ name: 'native_list_dir',
82
+ description: 'List entries in a directory. Returns up to 500 entries with type (file|dir|symlink|other) ' +
83
+ 'and byte size. Hidden entries (starting with .) included.',
84
+ parameters: {
85
+ type: 'object',
86
+ properties: {
87
+ path: { type: 'string', description: 'Directory path.' },
88
+ max_entries: { type: 'number', description: 'Max entries returned (default 500).' },
89
+ },
90
+ required: ['path'],
91
+ additionalProperties: false,
92
+ },
93
+ },
94
+ {
95
+ name: 'native_glob',
96
+ description: 'Find files matching a glob pattern. Pattern syntax matches "**/*.ts", "src/**/*.{js,ts}", etc. ' +
97
+ 'Returned paths are relative to root (default: agent cwd).',
98
+ parameters: {
99
+ type: 'object',
100
+ properties: {
101
+ pattern: { type: 'string', description: 'Glob pattern.' },
102
+ root: { type: 'string', description: 'Root directory (default cwd).' },
103
+ max_results: { type: 'number', description: 'Max paths returned (default 500).' },
104
+ },
105
+ required: ['pattern'],
106
+ additionalProperties: false,
107
+ },
108
+ },
109
+ {
110
+ name: 'native_grep',
111
+ description: 'Search file contents with a regex. Uses ripgrep when available, falls back to a fs walk. ' +
112
+ 'output_mode: "content" returns matching lines, "files" returns matching file paths, ' +
113
+ '"count" returns per-file counts. Default "content".',
114
+ parameters: {
115
+ type: 'object',
116
+ properties: {
117
+ pattern: { type: 'string', description: 'Regex pattern.' },
118
+ path: { type: 'string', description: 'File or directory to search (default cwd).' },
119
+ glob: { type: 'string', description: 'Optional glob filter, e.g. "*.ts".' },
120
+ output_mode: { type: 'string', enum: ['content', 'files', 'count'] },
121
+ max_matches: { type: 'number', description: 'Max match lines (default 200).' },
122
+ case_insensitive: { type: 'boolean' },
123
+ },
124
+ required: ['pattern'],
125
+ additionalProperties: false,
126
+ },
127
+ },
128
+ ];
129
+ }
130
+ export function buildFsDispatcher(ctx) {
131
+ return async (call, signal) => {
132
+ if (!isFsToolName(call.name)) {
133
+ return { text: `not handled: ${call.name}`, isError: true, source: 'unknown' };
134
+ }
135
+ const timeoutMs = resolveTimeoutMs();
136
+ try {
137
+ return await raceTimeout(runOne(call.name, call.arguments, ctx, signal), timeoutMs, call.name);
138
+ }
139
+ catch (err) {
140
+ const msg = err instanceof Error ? err.message : String(err);
141
+ log.warn({ event: 'fs.tool.error', tool: call.name, err: msg });
142
+ return { text: `${call.name} failed: ${msg}`, isError: true, source: 'fs' };
143
+ }
144
+ };
145
+ }
146
+ async function runOne(name, args, ctx, signal) {
147
+ switch (name) {
148
+ case 'native_read_file': return runReadFile(args, ctx);
149
+ case 'native_write_file': return runWriteFile(args, ctx);
150
+ case 'native_list_dir': return runListDir(args, ctx);
151
+ case 'native_glob': return runGlob(args, ctx, signal);
152
+ case 'native_grep': return runGrep(args, ctx, signal);
153
+ default:
154
+ return { text: `unknown fs tool: ${name}`, isError: true, source: 'fs' };
155
+ }
156
+ }
157
+ // ─── path safety ─────────────────────────────────────────────────────
158
+ /** Default-on workspace restriction. Operators can set
159
+ * IMHUB_NATIVE_FS_RESTRICT=0 to allow paths outside cwd subtree;
160
+ * sensitive-paths.ts still applies even when this is off. */
161
+ function workspaceRestricted() {
162
+ return process.env.IMHUB_NATIVE_FS_RESTRICT !== '0';
163
+ }
164
+ function resolveAndCheck(input, ctx) {
165
+ if (typeof input !== 'string' || input.length === 0) {
166
+ return { abs: '', ok: false, reason: 'path must be a non-empty string' };
167
+ }
168
+ let raw = input;
169
+ if (raw === '~')
170
+ raw = homedir();
171
+ else if (raw.startsWith('~/'))
172
+ raw = homedir() + raw.slice(1);
173
+ const abs = isAbsolute(raw) ? raw : resolvePath(ctx.cwd, raw);
174
+ const sens = isSensitivePath(abs, { cwd: ctx.cwd });
175
+ if (sens.sensitive)
176
+ return { abs, ok: false, reason: `sensitive path: ${sens.reason}` };
177
+ if (workspaceRestricted()) {
178
+ const rel = relative(ctx.cwd, abs);
179
+ if (rel.startsWith('..') || (rel.length > 0 && isAbsolute(rel))) {
180
+ return {
181
+ abs,
182
+ ok: false,
183
+ reason: `path "${abs}" is outside workspace "${ctx.cwd}". ` +
184
+ 'Set IMHUB_NATIVE_FS_RESTRICT=0 to allow broader access.',
185
+ };
186
+ }
187
+ }
188
+ return { abs, ok: true };
189
+ }
190
+ // ─── tools ───────────────────────────────────────────────────────────
191
+ async function runReadFile(args, ctx) {
192
+ const p = resolveAndCheck(args.path, ctx);
193
+ if (!p.ok)
194
+ return { text: p.reason ?? 'invalid path', isError: true, source: 'fs' };
195
+ const maxBytes = clampNumber(args.max_bytes, DEFAULT_READ_MAX_BYTES, 1, 8 * 1024 * 1024);
196
+ try {
197
+ const st = await fs.stat(p.abs);
198
+ if (!st.isFile())
199
+ return { text: `not a file: ${p.abs}`, isError: true, source: 'fs' };
200
+ if (st.size > maxBytes) {
201
+ const head = await fs.open(p.abs, 'r');
202
+ try {
203
+ const buf = Buffer.alloc(maxBytes);
204
+ const { bytesRead } = await head.read(buf, 0, maxBytes, 0);
205
+ return {
206
+ text: `[truncated: file is ${st.size} bytes, read first ${bytesRead}]\n${buf.subarray(0, bytesRead).toString('utf-8')}`,
207
+ isError: false,
208
+ source: 'fs',
209
+ };
210
+ }
211
+ finally {
212
+ await head.close();
213
+ }
214
+ }
215
+ const data = await fs.readFile(p.abs, 'utf-8');
216
+ return { text: data, isError: false, source: 'fs' };
217
+ }
218
+ catch (err) {
219
+ return { text: `read_file failed: ${errMsg(err)}`, isError: true, source: 'fs' };
220
+ }
221
+ }
222
+ async function runWriteFile(args, ctx) {
223
+ const p = resolveAndCheck(args.path, ctx);
224
+ if (!p.ok)
225
+ return { text: p.reason ?? 'invalid path', isError: true, source: 'fs' };
226
+ const content = typeof args.content === 'string' ? args.content : '';
227
+ if (Buffer.byteLength(content, 'utf-8') > DEFAULT_WRITE_MAX_BYTES) {
228
+ return {
229
+ text: `write_file refused: content > ${DEFAULT_WRITE_MAX_BYTES} bytes`,
230
+ isError: true,
231
+ source: 'fs',
232
+ };
233
+ }
234
+ const mode = args.mode === 'append' ? 'append' : 'overwrite';
235
+ try {
236
+ const parent = p.abs.includes(sep) ? p.abs.slice(0, p.abs.lastIndexOf(sep)) : '.';
237
+ await fs.mkdir(parent, { recursive: true });
238
+ if (mode === 'append')
239
+ await fs.appendFile(p.abs, content, 'utf-8');
240
+ else
241
+ await fs.writeFile(p.abs, content, 'utf-8');
242
+ const after = await fs.stat(p.abs);
243
+ return {
244
+ text: `wrote ${after.size} bytes to ${p.abs} (${mode})`,
245
+ isError: false,
246
+ source: 'fs',
247
+ };
248
+ }
249
+ catch (err) {
250
+ return { text: `write_file failed: ${errMsg(err)}`, isError: true, source: 'fs' };
251
+ }
252
+ }
253
+ async function runListDir(args, ctx) {
254
+ const p = resolveAndCheck(args.path, ctx);
255
+ if (!p.ok)
256
+ return { text: p.reason ?? 'invalid path', isError: true, source: 'fs' };
257
+ const maxEntries = clampNumber(args.max_entries, DEFAULT_LIST_MAX_ENTRIES, 1, 5000);
258
+ try {
259
+ const entries = await fs.readdir(p.abs, { withFileTypes: true });
260
+ const rows = [];
261
+ for (const e of entries.slice(0, maxEntries)) {
262
+ const type = e.isDirectory() ? 'dir'
263
+ : e.isFile() ? 'file'
264
+ : e.isSymbolicLink() ? 'symlink'
265
+ : 'other';
266
+ let size;
267
+ if (type === 'file') {
268
+ try {
269
+ size = (await fs.stat(resolvePath(p.abs, e.name))).size;
270
+ }
271
+ catch { /* ignore */ }
272
+ }
273
+ rows.push({ name: e.name, type, ...(size !== undefined ? { size } : {}) });
274
+ }
275
+ const truncated = entries.length > maxEntries;
276
+ return {
277
+ text: JSON.stringify({ path: p.abs, total: entries.length, returned: rows.length, truncated, entries: rows }, null, 2),
278
+ isError: false,
279
+ source: 'fs',
280
+ };
281
+ }
282
+ catch (err) {
283
+ return { text: `list_dir failed: ${errMsg(err)}`, isError: true, source: 'fs' };
284
+ }
285
+ }
286
+ async function runGlob(args, ctx, signal) {
287
+ const pattern = typeof args.pattern === 'string' ? args.pattern : '';
288
+ if (!pattern)
289
+ return { text: 'pattern required', isError: true, source: 'fs' };
290
+ const rootInput = typeof args.root === 'string' ? args.root : '.';
291
+ const p = resolveAndCheck(rootInput, ctx);
292
+ if (!p.ok)
293
+ return { text: p.reason ?? 'invalid root', isError: true, source: 'fs' };
294
+ const maxResults = clampNumber(args.max_results, DEFAULT_GLOB_MAX_RESULTS, 1, 5000);
295
+ // Use ripgrep --files if available — it's faster + respects .gitignore.
296
+ // Otherwise fall back to a recursive walk + minimatch-style suffix
297
+ // matching (intentionally simple; agent can re-narrow with grep).
298
+ try {
299
+ const rgResult = await tryRipgrepFiles(p.abs, pattern, maxResults, signal);
300
+ if (rgResult.ok) {
301
+ return { text: rgResult.text, isError: false, source: 'fs' };
302
+ }
303
+ const fallback = await walkAndMatch(p.abs, pattern, maxResults, signal);
304
+ return { text: fallback, isError: false, source: 'fs' };
305
+ }
306
+ catch (err) {
307
+ return { text: `glob failed: ${errMsg(err)}`, isError: true, source: 'fs' };
308
+ }
309
+ }
310
+ async function runGrep(args, ctx, signal) {
311
+ const pattern = typeof args.pattern === 'string' ? args.pattern : '';
312
+ if (!pattern)
313
+ return { text: 'pattern required', isError: true, source: 'fs' };
314
+ const inputPath = typeof args.path === 'string' ? args.path : '.';
315
+ const p = resolveAndCheck(inputPath, ctx);
316
+ if (!p.ok)
317
+ return { text: p.reason ?? 'invalid path', isError: true, source: 'fs' };
318
+ const glob = typeof args.glob === 'string' ? args.glob : undefined;
319
+ const mode = args.output_mode === 'files' || args.output_mode === 'count' ? args.output_mode : 'content';
320
+ const maxMatches = clampNumber(args.max_matches, DEFAULT_GREP_MAX_MATCHES, 1, 2000);
321
+ const ci = args.case_insensitive === true;
322
+ try {
323
+ const r = await runRipgrepSearch(pattern, p.abs, { glob, mode, maxMatches, ci, signal });
324
+ if (r.ok)
325
+ return { text: r.text, isError: false, source: 'fs' };
326
+ return { text: `grep failed: ${r.reason}`, isError: true, source: 'fs' };
327
+ }
328
+ catch (err) {
329
+ return { text: `grep failed: ${errMsg(err)}`, isError: true, source: 'fs' };
330
+ }
331
+ }
332
+ // ─── ripgrep wrappers ────────────────────────────────────────────────
333
+ async function tryRipgrepFiles(root, pattern, max, signal) {
334
+ if (!hasRipgrep())
335
+ return { ok: false, text: '' };
336
+ const args = ['--files', '--glob', pattern, '--no-messages'];
337
+ try {
338
+ const out = await runCmd('rg', args, { cwd: root, signal });
339
+ if (out.exitCode !== 0 && out.stdout.length === 0)
340
+ return { ok: false, text: out.stderr };
341
+ const lines = out.stdout.split('\n').filter((l) => l.length > 0);
342
+ const slice = lines.slice(0, max);
343
+ return {
344
+ ok: true,
345
+ text: JSON.stringify({ root, count: lines.length, truncated: lines.length > max, files: slice }, null, 2),
346
+ };
347
+ }
348
+ catch {
349
+ return { ok: false, text: '' };
350
+ }
351
+ }
352
+ async function runRipgrepSearch(pattern, path, opts) {
353
+ if (!hasRipgrep())
354
+ return { ok: false, text: '', reason: 'ripgrep not installed (only rg-based grep supported in v1.2.58)' };
355
+ const args = ['--no-messages'];
356
+ if (opts.ci)
357
+ args.push('-i');
358
+ if (opts.glob)
359
+ args.push('--glob', opts.glob);
360
+ if (opts.mode === 'files')
361
+ args.push('-l');
362
+ if (opts.mode === 'count')
363
+ args.push('-c');
364
+ if (opts.mode === 'content')
365
+ args.push('-n', `-m`, String(opts.maxMatches));
366
+ args.push('--', pattern, path);
367
+ const out = await runCmd('rg', args, { signal: opts.signal });
368
+ if (out.exitCode !== 0 && out.exitCode !== 1) {
369
+ return { ok: false, text: '', reason: out.stderr.trim() || `rg exit ${out.exitCode}` };
370
+ }
371
+ const lines = out.stdout.split('\n').filter((l) => l.length > 0);
372
+ const slice = opts.mode === 'content' ? lines.slice(0, opts.maxMatches) : lines;
373
+ return {
374
+ ok: true,
375
+ text: JSON.stringify({
376
+ pattern,
377
+ path,
378
+ mode: opts.mode,
379
+ total: lines.length,
380
+ truncated: opts.mode === 'content' && lines.length > opts.maxMatches,
381
+ results: slice,
382
+ }, null, 2),
383
+ };
384
+ }
385
+ let _rgCheckCache;
386
+ function hasRipgrep() {
387
+ if (_rgCheckCache !== undefined)
388
+ return _rgCheckCache;
389
+ try {
390
+ statSync('/usr/bin/rg');
391
+ _rgCheckCache = true;
392
+ return true;
393
+ }
394
+ catch { /* try PATH below */ }
395
+ try {
396
+ statSync('/usr/local/bin/rg');
397
+ _rgCheckCache = true;
398
+ return true;
399
+ }
400
+ catch { /* fall through */ }
401
+ _rgCheckCache = false;
402
+ return false;
403
+ }
404
+ function runCmd(bin, args, opts) {
405
+ return new Promise((resolve) => {
406
+ const child = spawn(bin, args, { cwd: opts.cwd, signal: opts.signal });
407
+ let stdout = '';
408
+ let stderr = '';
409
+ child.stdout.setEncoding('utf-8');
410
+ child.stderr.setEncoding('utf-8');
411
+ child.stdout.on('data', (chunk) => { stdout += chunk; });
412
+ child.stderr.on('data', (chunk) => { stderr += chunk; });
413
+ child.on('close', (code) => resolve({ exitCode: code ?? -1, stdout, stderr }));
414
+ child.on('error', (err) => resolve({ exitCode: -1, stdout, stderr: err.message }));
415
+ });
416
+ }
417
+ // ─── fallback glob (no rg) ───────────────────────────────────────────
418
+ async function walkAndMatch(root, pattern, max, signal) {
419
+ const matcher = simpleGlobToRegex(pattern);
420
+ const out = [];
421
+ const queue = [root];
422
+ while (queue.length > 0 && out.length < max) {
423
+ if (signal.aborted)
424
+ break;
425
+ const dir = queue.shift();
426
+ let entries = [];
427
+ try {
428
+ entries = await fs.readdir(dir, { withFileTypes: true });
429
+ }
430
+ catch {
431
+ continue;
432
+ }
433
+ for (const e of entries) {
434
+ const full = resolvePath(dir, e.name);
435
+ const rel = relative(root, full);
436
+ if (e.isDirectory()) {
437
+ if (e.name === 'node_modules' || e.name === '.git')
438
+ continue;
439
+ queue.push(full);
440
+ }
441
+ else if (e.isFile() && matcher.test(rel)) {
442
+ out.push(rel);
443
+ if (out.length >= max)
444
+ break;
445
+ }
446
+ }
447
+ }
448
+ return JSON.stringify({ root, count: out.length, truncated: out.length >= max, files: out }, null, 2);
449
+ }
450
+ function simpleGlobToRegex(pattern) {
451
+ // Tiny glob→regex matching fast-glob / minimatch behavior closely
452
+ // enough for typical patterns:
453
+ // "**/" → (?:.*/)? (zero or more dirs incl. root)
454
+ // "**" → .*
455
+ // "*" → [^/]*
456
+ // "?" → .
457
+ // everything else literal
458
+ //
459
+ // CRITICAL: the glob `?` → regex `.` replacement must happen BEFORE
460
+ // we insert any regex construct that contains a literal `?` (e.g.
461
+ // `(?:.*/)?`). Otherwise the inserted `?` gets clobbered. Same for
462
+ // `*` — escape glob wildcards into placeholders first, then expand
463
+ // the placeholders last.
464
+ const escaped = pattern
465
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
466
+ .replace(/\?/g, '.')
467
+ .replace(/\*\*\//g, '__DBSTAR_SLASH__')
468
+ .replace(/\*\*/g, '__DBSTAR__')
469
+ .replace(/\*/g, '[^/]*')
470
+ .replace(/__DBSTAR_SLASH__/g, '(?:.*/)?')
471
+ .replace(/__DBSTAR__/g, '.*');
472
+ return new RegExp(`^${escaped}$`);
473
+ }
474
+ // ─── helpers ─────────────────────────────────────────────────────────
475
+ function resolveTimeoutMs() {
476
+ const raw = process.env.IMHUB_NATIVE_FS_TIMEOUT_MS;
477
+ if (raw) {
478
+ const n = Number(raw);
479
+ if (Number.isFinite(n) && n > 0 && n <= 600_000)
480
+ return n;
481
+ }
482
+ return DEFAULT_TIMEOUT_MS;
483
+ }
484
+ async function raceTimeout(p, ms, tag) {
485
+ let timer;
486
+ const timeout = new Promise((_, reject) => {
487
+ timer = setTimeout(() => reject(new Error(`${tag} timed out after ${ms}ms`)), ms);
488
+ });
489
+ try {
490
+ return await Promise.race([p, timeout]);
491
+ }
492
+ finally {
493
+ if (timer)
494
+ clearTimeout(timer);
495
+ }
496
+ }
497
+ function clampNumber(input, dflt, min, max) {
498
+ const n = typeof input === 'number' ? input : Number(input);
499
+ if (!Number.isFinite(n))
500
+ return dflt;
501
+ return Math.max(min, Math.min(max, Math.floor(n)));
502
+ }
503
+ function errMsg(err) {
504
+ return err instanceof Error ? err.message : String(err);
505
+ }
506
+ //# sourceMappingURL=fs-dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-dispatcher.js","sourceRoot":"","sources":["../../../src/core/llm/fs-dispatcher.ts"],"names":[],"mappings":"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"}