@x-code-cli/core 0.1.3 → 0.1.4

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 (126) hide show
  1. package/dist/agent/api-errors.d.ts +11 -0
  2. package/dist/agent/api-errors.d.ts.map +1 -0
  3. package/dist/agent/api-errors.js +134 -0
  4. package/dist/agent/api-errors.js.map +1 -0
  5. package/dist/agent/context-window.d.ts +26 -0
  6. package/dist/agent/context-window.d.ts.map +1 -0
  7. package/dist/agent/context-window.js +126 -0
  8. package/dist/agent/context-window.js.map +1 -0
  9. package/dist/agent/loop-state.d.ts +14 -0
  10. package/dist/agent/loop-state.d.ts.map +1 -0
  11. package/dist/agent/loop-state.js +12 -0
  12. package/dist/agent/loop-state.js.map +1 -0
  13. package/dist/agent/loop.d.ts +11 -15
  14. package/dist/agent/loop.d.ts.map +1 -1
  15. package/dist/agent/loop.js +213 -381
  16. package/dist/agent/loop.js.map +1 -1
  17. package/dist/agent/messages.d.ts +0 -2
  18. package/dist/agent/messages.d.ts.map +1 -1
  19. package/dist/agent/messages.js +0 -32
  20. package/dist/agent/messages.js.map +1 -1
  21. package/dist/agent/provider-compat.d.ts +17 -0
  22. package/dist/agent/provider-compat.d.ts.map +1 -0
  23. package/dist/agent/provider-compat.js +31 -0
  24. package/dist/agent/provider-compat.js.map +1 -0
  25. package/dist/agent/stream-utils.d.ts +33 -0
  26. package/dist/agent/stream-utils.d.ts.map +1 -0
  27. package/dist/agent/stream-utils.js +14 -0
  28. package/dist/agent/stream-utils.js.map +1 -0
  29. package/dist/agent/system-prompt.d.ts +1 -3
  30. package/dist/agent/system-prompt.d.ts.map +1 -1
  31. package/dist/agent/system-prompt.js +34 -23
  32. package/dist/agent/system-prompt.js.map +1 -1
  33. package/dist/agent/tool-execution.d.ts +11 -0
  34. package/dist/agent/tool-execution.d.ts.map +1 -0
  35. package/dist/agent/tool-execution.js +171 -0
  36. package/dist/agent/tool-execution.js.map +1 -0
  37. package/dist/config/index.d.ts +19 -8
  38. package/dist/config/index.d.ts.map +1 -1
  39. package/dist/config/index.js +66 -32
  40. package/dist/config/index.js.map +1 -1
  41. package/dist/index.d.ts +7 -8
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +5 -6
  44. package/dist/index.js.map +1 -1
  45. package/dist/knowledge/auto-memory.d.ts +1 -1
  46. package/dist/knowledge/auto-memory.d.ts.map +1 -1
  47. package/dist/knowledge/auto-memory.js +55 -16
  48. package/dist/knowledge/auto-memory.js.map +1 -1
  49. package/dist/knowledge/init.d.ts +1 -2
  50. package/dist/knowledge/init.d.ts.map +1 -1
  51. package/dist/knowledge/init.js +83 -69
  52. package/dist/knowledge/init.js.map +1 -1
  53. package/dist/knowledge/loader.d.ts +0 -9
  54. package/dist/knowledge/loader.d.ts.map +1 -1
  55. package/dist/knowledge/loader.js +54 -99
  56. package/dist/knowledge/loader.js.map +1 -1
  57. package/dist/knowledge/session.d.ts +1 -1
  58. package/dist/knowledge/session.d.ts.map +1 -1
  59. package/dist/knowledge/session.js +2 -1
  60. package/dist/knowledge/session.js.map +1 -1
  61. package/dist/permissions/index.d.ts +2 -0
  62. package/dist/permissions/index.d.ts.map +1 -1
  63. package/dist/permissions/index.js +35 -14
  64. package/dist/permissions/index.js.map +1 -1
  65. package/dist/tools/glob.d.ts.map +1 -1
  66. package/dist/tools/glob.js +3 -1
  67. package/dist/tools/glob.js.map +1 -1
  68. package/dist/tools/grep.d.ts.map +1 -1
  69. package/dist/tools/grep.js +7 -2
  70. package/dist/tools/grep.js.map +1 -1
  71. package/dist/tools/index.d.ts +3 -7
  72. package/dist/tools/index.d.ts.map +1 -1
  73. package/dist/tools/index.js +1 -5
  74. package/dist/tools/index.js.map +1 -1
  75. package/dist/tools/list-dir.d.ts.map +1 -1
  76. package/dist/tools/list-dir.js +3 -1
  77. package/dist/tools/list-dir.js.map +1 -1
  78. package/dist/tools/progress.d.ts +6 -0
  79. package/dist/tools/progress.d.ts.map +1 -0
  80. package/dist/tools/progress.js +14 -0
  81. package/dist/tools/progress.js.map +1 -0
  82. package/dist/tools/read-file.d.ts.map +1 -1
  83. package/dist/tools/read-file.js +3 -1
  84. package/dist/tools/read-file.js.map +1 -1
  85. package/dist/tools/save-knowledge.d.ts +2 -2
  86. package/dist/tools/save-knowledge.d.ts.map +1 -1
  87. package/dist/tools/save-knowledge.js +31 -6
  88. package/dist/tools/save-knowledge.js.map +1 -1
  89. package/dist/tools/shell-utils.d.ts.map +1 -1
  90. package/dist/tools/shell-utils.js +7 -0
  91. package/dist/tools/shell-utils.js.map +1 -1
  92. package/dist/tools/web-fetch.d.ts.map +1 -1
  93. package/dist/tools/web-fetch.js +88 -19
  94. package/dist/tools/web-fetch.js.map +1 -1
  95. package/dist/tools/web-search.d.ts.map +1 -1
  96. package/dist/tools/web-search.js +85 -12
  97. package/dist/tools/web-search.js.map +1 -1
  98. package/dist/types/index.d.ts +60 -21
  99. package/dist/types/index.d.ts.map +1 -1
  100. package/dist/types/index.js +64 -6
  101. package/dist/types/index.js.map +1 -1
  102. package/dist/utils.d.ts +3 -0
  103. package/dist/utils.d.ts.map +1 -1
  104. package/dist/utils.js +32 -0
  105. package/dist/utils.js.map +1 -1
  106. package/package.json +1 -1
  107. package/dist/agent/plan-mode.d.ts +0 -11
  108. package/dist/agent/plan-mode.d.ts.map +0 -1
  109. package/dist/agent/plan-mode.js +0 -37
  110. package/dist/agent/plan-mode.js.map +0 -1
  111. package/dist/agent/pricing.d.ts +0 -9
  112. package/dist/agent/pricing.d.ts.map +0 -1
  113. package/dist/agent/pricing.js +0 -47
  114. package/dist/agent/pricing.js.map +0 -1
  115. package/dist/knowledge/hooks.d.ts +0 -3
  116. package/dist/knowledge/hooks.d.ts.map +0 -1
  117. package/dist/knowledge/hooks.js +0 -59
  118. package/dist/knowledge/hooks.js.map +0 -1
  119. package/dist/tools/enter-plan-mode.d.ts +0 -2
  120. package/dist/tools/enter-plan-mode.d.ts.map +0 -1
  121. package/dist/tools/enter-plan-mode.js +0 -11
  122. package/dist/tools/enter-plan-mode.js.map +0 -1
  123. package/dist/tools/exit-plan-mode.d.ts +0 -2
  124. package/dist/tools/exit-plan-mode.d.ts.map +0 -1
  125. package/dist/tools/exit-plan-mode.js +0 -9
  126. package/dist/tools/exit-plan-mode.js.map +0 -1
@@ -1,124 +1,80 @@
1
- // @x-code-cli/core — Knowledge loader (layered loading + 4 rule loading modes)
2
- import fs from 'node:fs/promises';
3
- import os from 'node:os';
1
+ // @x-code-cli/core — Knowledge loader
2
+ //
3
+ // Layered project context loading. Sources (root-to-leaf precedence within a
4
+ // section; sections concatenated in the order below):
5
+ //
6
+ // 1. Global AGENTS.md (~/.x-code/AGENTS.md) — user's cross-project prefs
7
+ // 2. Global auto memory (~/.x-code/memory/auto.md) — AI-written via saveKnowledge
8
+ // 3. Project AGENTS.md chain — walked up from cwd to repo root
9
+ // 4. Project auto memory (.x-code/memory/auto.md) — AI-written via saveKnowledge
10
+ // 5. Local preferences (.x-code/local/preferences.md) — personal, gitignored
11
+ //
12
+ // Later sections in the resulting string carry more weight for the model, so
13
+ // monorepo sub-packages (deepest in the chain) override shared context, and
14
+ // local personal preferences override team-shared AGENTS.md content.
4
15
  import path from 'node:path';
5
- import { XCODE_DIR, readFileSafe } from '../utils.js';
16
+ import { GLOBAL_XCODE_DIR, XCODE_DIR, fileExists, readFileSafe } from '../utils.js';
6
17
  import { getAutoMemory } from './auto-memory.js';
7
- const GLOBAL_DIR = path.join(os.homedir(), '.xcode');
8
- /** Parse frontmatter from a markdown rule file */
9
- function parseFrontmatter(content) {
10
- const match = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
11
- if (!match)
12
- return { frontmatter: {}, body: content };
13
- const frontmatter = {};
14
- const yamlLines = match[1].split('\n');
15
- for (const line of yamlLines) {
16
- const kvMatch = line.match(/^(\w+):\s*(.+)$/);
17
- if (!kvMatch)
18
- continue;
19
- const [, key, value] = kvMatch;
20
- if (key === 'alwaysApply')
21
- frontmatter.alwaysApply = value.trim() === 'true';
22
- else if (key === 'description')
23
- frontmatter.description = value.trim().replace(/^"(.*)"$/, '$1');
24
- else if (key === 'paths') {
25
- // Parse YAML array: ["glob1", "glob2"]
26
- const arrayMatch = value.match(/\[(.+)\]/);
27
- if (arrayMatch) {
28
- frontmatter.paths = arrayMatch[1].split(',').map((p) => p.trim().replace(/^"(.*)"$/, '$1'));
29
- }
30
- }
18
+ const GLOBAL_DIR = GLOBAL_XCODE_DIR;
19
+ /**
20
+ * Walk from `startDir` upward, collecting every AGENTS.md found. Matches the
21
+ * Codex convention: a repo-root AGENTS.md applies to the whole project, and
22
+ * package-level AGENTS.md files (in a monorepo) override it with more specific
23
+ * context. Stops at the first directory that contains `.git` (inclusive) or
24
+ * at the filesystem root.
25
+ *
26
+ * Returns entries in root-to-leaf order so the deepest file is appended last.
27
+ */
28
+ async function collectAgentsMdChain(startDir) {
29
+ const dirs = [];
30
+ let dir = path.resolve(startDir);
31
+ const fsRoot = path.parse(dir).root;
32
+ while (true) {
33
+ dirs.push(dir);
34
+ if (await fileExists(path.join(dir, '.git')))
35
+ break;
36
+ if (dir === fsRoot)
37
+ break;
38
+ const parent = path.dirname(dir);
39
+ if (parent === dir)
40
+ break;
41
+ dir = parent;
31
42
  }
32
- return { frontmatter, body: match[2] };
33
- }
34
- /** Load all rule files from .x-code/rules/ */
35
- async function loadRuleFiles() {
36
- const rulesDir = path.join(process.cwd(), XCODE_DIR, 'rules');
37
- try {
38
- const files = await fs.readdir(rulesDir);
39
- const rules = [];
40
- for (const file of files) {
41
- if (!file.endsWith('.md'))
42
- continue;
43
- const content = await readFileSafe(path.join(rulesDir, file));
44
- const { frontmatter, body } = parseFrontmatter(content);
45
- rules.push({ filename: file.replace('.md', ''), frontmatter, content: body });
46
- }
47
- return rules;
48
- }
49
- catch {
50
- return [];
51
- }
52
- }
53
- /** Check if a file path matches any of the glob patterns (simple matching) */
54
- function matchesPath(filePath, patterns) {
55
- for (const pattern of patterns) {
56
- // Simple glob matching: ** matches any path segment, * matches within segment
57
- const regex = pattern
58
- .replace(/\*\*/g, '___DOUBLESTAR___')
59
- .replace(/\*/g, '[^/]*')
60
- .replace(/___DOUBLESTAR___/g, '.*');
61
- if (new RegExp(regex).test(filePath))
62
- return true;
43
+ const entries = [];
44
+ for (const d of dirs.reverse()) {
45
+ const content = await readFileSafe(path.join(d, 'AGENTS.md'));
46
+ if (content)
47
+ entries.push({ dir: d, content });
63
48
  }
64
- return false;
49
+ return entries;
65
50
  }
66
51
  /** Build the full knowledge context for system prompt injection */
67
52
  export async function buildKnowledgeContext(options) {
68
53
  const sections = [];
69
- // 1. Global preferences
70
- const globalKnowledge = await readFileSafe(path.join(GLOBAL_DIR, 'knowledge.md'));
71
- if (globalKnowledge) {
72
- sections.push('### Global Preferences\n' + globalKnowledge);
54
+ const globalAgents = await readFileSafe(path.join(GLOBAL_DIR, 'AGENTS.md'));
55
+ if (globalAgents) {
56
+ sections.push('### Global Preferences (~/.x-code/AGENTS.md)\n' + globalAgents);
73
57
  }
74
- // 2. Global auto memory
75
58
  const globalMemory = getAutoMemory('global');
76
59
  const globalMemoryContent = globalMemory.getPromptContent();
77
60
  if (globalMemoryContent) {
78
61
  sections.push('### Global Auto Memory\n' + globalMemoryContent);
79
62
  }
80
- // 3. Project knowledge
81
- const projectKnowledge = await readFileSafe(path.join(process.cwd(), XCODE_DIR, 'knowledge.md'));
82
- if (projectKnowledge) {
83
- sections.push('### Project Knowledge\n' + projectKnowledge);
63
+ const cwd = process.cwd();
64
+ const agentsChain = await collectAgentsMdChain(cwd);
65
+ for (const entry of agentsChain) {
66
+ const relPath = path.relative(cwd, entry.dir) || '.';
67
+ sections.push(`### Project AGENTS.md (${relPath})\n${entry.content}`);
84
68
  }
85
- // 4. Project auto memory
86
69
  const projectMemory = getAutoMemory('project');
87
70
  const projectMemoryContent = projectMemory.getPromptContent();
88
71
  if (projectMemoryContent) {
89
72
  sections.push('### Project Auto Memory\n' + projectMemoryContent);
90
73
  }
91
- // 5. Local preferences
92
- const localPrefs = await readFileSafe(path.join(process.cwd(), XCODE_DIR, 'local', 'preferences.md'));
74
+ const localPrefs = await readFileSafe(path.join(cwd, XCODE_DIR, 'local', 'preferences.md'));
93
75
  if (localPrefs) {
94
76
  sections.push('### Local Preferences\n' + localPrefs);
95
77
  }
96
- // 6. Rules (4 loading modes)
97
- const rules = options?.rules ?? (await loadRuleFiles());
98
- // Always rules
99
- for (const rule of rules) {
100
- if (rule.frontmatter.alwaysApply) {
101
- sections.push(`### Rule: ${rule.filename}\n${rule.content}`);
102
- }
103
- }
104
- // Path-match rules
105
- if (options?.activeFilePaths?.length) {
106
- for (const rule of rules) {
107
- if (rule.frontmatter.paths?.length) {
108
- const matched = options.activeFilePaths.some((fp) => matchesPath(fp, rule.frontmatter.paths));
109
- if (matched) {
110
- sections.push(`### Rule: ${rule.filename}\n${rule.content}`);
111
- }
112
- }
113
- }
114
- }
115
- // Agent-requested rules: just list descriptions so model can request
116
- const requestableRules = rules.filter((r) => r.frontmatter.description && !r.frontmatter.alwaysApply);
117
- if (requestableRules.length > 0) {
118
- const list = requestableRules.map((r) => `- @${r.filename}: ${r.frontmatter.description}`).join('\n');
119
- sections.push(`### Available Rules (mention @name to load)\n${list}`);
120
- }
121
- // 7. Session context
122
78
  if (options?.sessionContext) {
123
79
  sections.push(options.sessionContext);
124
80
  }
@@ -126,5 +82,4 @@ export async function buildKnowledgeContext(options) {
126
82
  return '';
127
83
  return '## Project Knowledge\n\n' + sections.join('\n\n');
128
84
  }
129
- export { loadRuleFiles, matchesPath };
130
85
  //# sourceMappingURL=loader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/knowledge/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/knowledge/loader.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ export declare function loadLatestSession(): Promise<SessionSummary | null>;
5
5
  /** Save a session summary */
6
6
  export declare function saveSessionSummary(summary: SessionSummary): Promise<void>;
7
7
  /** Generate a session summary from messages using the model */
8
- export declare function generateSessionSummary(messages: ModelMessage[], model: LanguageModel, sessionId: string, startedAt: string, filesModified: string[]): Promise<SessionSummary>;
8
+ export declare function generateSessionSummary(messages: ModelMessage[], model: LanguageModel, sessionId: string, startedAt: string, filesModified: string[], signal?: AbortSignal): Promise<SessionSummary>;
9
9
  /** Format session summary for system prompt injection */
10
10
  export declare function formatSessionForPrompt(session: SessionSummary): string;
11
11
  //# sourceMappingURL=session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/knowledge/session.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAevD,2CAA2C;AAC3C,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAOxE;AAED,6BAA6B;AAC7B,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/E;AAED,+DAA+D;AAC/D,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,YAAY,EAAE,EACxB,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,cAAc,CAAC,CAgDzB;AAED,yDAAyD;AACzD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAoBtE"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/knowledge/session.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAevD,2CAA2C;AAC3C,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAOxE;AAED,6BAA6B;AAC7B,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/E;AAED,+DAA+D;AAC/D,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,YAAY,EAAE,EACxB,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EAAE,EACvB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAiDzB;AAED,yDAAyD;AACzD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAoBtE"}
@@ -31,9 +31,10 @@ export async function saveSessionSummary(summary) {
31
31
  await fs.writeFile(archivePath, JSON.stringify(summary, null, 2), 'utf-8');
32
32
  }
33
33
  /** Generate a session summary from messages using the model */
34
- export async function generateSessionSummary(messages, model, sessionId, startedAt, filesModified) {
34
+ export async function generateSessionSummary(messages, model, sessionId, startedAt, filesModified, signal) {
35
35
  const { text } = await generateText({
36
36
  model,
37
+ abortSignal: signal,
37
38
  messages: [
38
39
  {
39
40
  role: 'system',
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/knowledge/session.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAIjC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,MAAM,YAAY,GAAG,GAAG,SAAS,WAAW,CAAA;AAC5C,6EAA6E;AAC7E,MAAM,6BAA6B,GAAG,EAAE,CAAA;AAExC,SAAS,cAAc;IACrB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAA;AAC/C,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC,CAAA;AACnD,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC,CAAA;QACvD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAA;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,6BAA6B;AAC7B,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAuB;IAC9D,MAAM,GAAG,GAAG,cAAc,EAAE,CAAA;IAC5B,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAExC,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;IAE9E,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,EAAE,OAAO,CAAC,CAAA;IACxD,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;AAC5E,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,QAAwB,EACxB,KAAoB,EACpB,SAAiB,EACjB,SAAiB,EACjB,aAAuB;IAEvB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;QAClC,KAAK;QACL,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE;;;;;;;;6CAQ4B;aACtC;YACD,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,6BAA6B,CAAC;SAClD;KACF,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAA;QAC1D,OAAO;YACL,EAAE,EAAE,SAAS;YACb,SAAS;YACT,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACjC,aAAa;YACb,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,kBAAkB;YACzC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;YAC7B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;YACnC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;YACrC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;YACjC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,WAAW;SACrC,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,EAAE,EAAE,SAAS;YACb,SAAS;YACT,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACjC,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YAC3B,UAAU,EAAE,EAAE;YACd,WAAW,EAAE,EAAE;YACf,aAAa;YACb,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,WAAW;SACpB,CAAA;IACH,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,sBAAsB,CAAC,OAAuB;IAC5D,MAAM,KAAK,GAAG;QACZ,sBAAsB;QACtB,UAAU,OAAO,CAAC,KAAK,EAAE;QACzB,WAAW,OAAO,CAAC,MAAM,EAAE;QAC3B,YAAY,OAAO,CAAC,OAAO,EAAE;KAC9B,CAAA;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC1B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC1D,CAAC;IACD,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAC3B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC3D,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACxB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACzD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/knowledge/session.ts"],"names":[],"mappings":"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"}
@@ -4,9 +4,11 @@ type PermissionInput = Record<string, unknown>;
4
4
  export declare function getPermissionLevel(toolName: string, input: PermissionInput): PermissionLevel;
5
5
  /** Check permission with trust mode support */
6
6
  export declare function checkPermission(toolCall: {
7
+ toolCallId: string;
7
8
  toolName: string;
8
9
  input: PermissionInput;
9
10
  }, trustMode: boolean, onAskPermission: (toolCall: {
11
+ toolCallId: string;
10
12
  toolName: string;
11
13
  input: PermissionInput;
12
14
  }) => Promise<boolean>): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/permissions/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAExD,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AA6B9C,2CAA2C;AAC3C,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,eAAe,CAI5F;AAED,+CAA+C;AAC/C,wBAAsB,eAAe,CACnC,QAAQ,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,EACtD,SAAS,EAAE,OAAO,EAClB,eAAe,EAAE,CAAC,QAAQ,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAC5F,OAAO,CAAC,OAAO,CAAC,CAKlB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/permissions/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAExD,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAoD9C,2CAA2C;AAC3C,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,eAAe,CAI5F;AAED,+CAA+C;AAC/C,wBAAsB,eAAe,CACnC,QAAQ,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,EAC1E,SAAS,EAAE,OAAO,EAClB,eAAe,EAAE,CAAC,QAAQ,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAChH,OAAO,CAAC,OAAO,CAAC,CAKlB"}
@@ -1,5 +1,39 @@
1
1
  // @x-code-cli/core — Permission system (3-level model)
2
2
  import { isDestructive, isReadOnly, splitShellCommands } from '../tools/shell-utils.js';
3
+ /**
4
+ * Cache of resolved shell permission levels keyed by the exact command string.
5
+ * Destructiveness / read-only patterns are static for the process lifetime,
6
+ * so a plain Map is safe — no TTL needed. An upper bound guards against a
7
+ * long-running agent accumulating unique commands without limit.
8
+ */
9
+ const SHELL_PERMISSION_CACHE_MAX = 256;
10
+ const shellPermissionCache = new Map();
11
+ function evaluateShellPermission(command) {
12
+ const subCommands = splitShellCommands(command);
13
+ // Any sub-command destructive → deny the whole command
14
+ if (subCommands.some(isDestructive))
15
+ return 'deny';
16
+ // All sub-commands read-only → auto-allow
17
+ if (subCommands.every(isReadOnly))
18
+ return 'always-allow';
19
+ // Otherwise → ask
20
+ return 'ask';
21
+ }
22
+ function resolveShellPermission(input) {
23
+ const cmd = input.command ?? '';
24
+ const cached = shellPermissionCache.get(cmd);
25
+ if (cached)
26
+ return cached;
27
+ const level = evaluateShellPermission(cmd);
28
+ if (shellPermissionCache.size >= SHELL_PERMISSION_CACHE_MAX) {
29
+ // Evict the oldest entry (Map preserves insertion order).
30
+ const oldest = shellPermissionCache.keys().next().value;
31
+ if (oldest !== undefined)
32
+ shellPermissionCache.delete(oldest);
33
+ }
34
+ shellPermissionCache.set(cmd, level);
35
+ return level;
36
+ }
3
37
  /** Permission rules for each tool */
4
38
  const rules = {
5
39
  readFile: () => 'always-allow',
@@ -12,20 +46,7 @@ const rules = {
12
46
  saveKnowledge: () => 'always-allow',
13
47
  edit: () => 'ask',
14
48
  writeFile: () => 'ask',
15
- enterPlanMode: () => 'always-allow',
16
- exitPlanMode: () => 'always-allow',
17
- shell: (input) => {
18
- const cmd = input.command ?? '';
19
- const subCommands = splitShellCommands(cmd);
20
- // Any sub-command destructive → deny the whole command
21
- if (subCommands.some(isDestructive))
22
- return 'deny';
23
- // All sub-commands read-only → auto-allow
24
- if (subCommands.every(isReadOnly))
25
- return 'always-allow';
26
- // Otherwise → ask
27
- return 'ask';
28
- },
49
+ shell: resolveShellPermission,
29
50
  };
30
51
  /** Get permission level for a tool call */
31
52
  export function getPermissionLevel(toolName, input) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/permissions/index.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAKvF,qCAAqC;AACrC,MAAM,KAAK,GAAgE;IACzE,QAAQ,EAAE,GAAG,EAAE,CAAC,cAAc;IAC9B,IAAI,EAAE,GAAG,EAAE,CAAC,cAAc;IAC1B,IAAI,EAAE,GAAG,EAAE,CAAC,cAAc;IAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc;IAC7B,SAAS,EAAE,GAAG,EAAE,CAAC,cAAc;IAC/B,QAAQ,EAAE,GAAG,EAAE,CAAC,cAAc;IAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc;IAC7B,aAAa,EAAE,GAAG,EAAE,CAAC,cAAc;IACnC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK;IACjB,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK;IACtB,aAAa,EAAE,GAAG,EAAE,CAAC,cAAc;IACnC,YAAY,EAAE,GAAG,EAAE,CAAC,cAAc;IAClC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,GAAG,GAAI,KAAK,CAAC,OAAkB,IAAI,EAAE,CAAA;QAC3C,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;QAE3C,uDAAuD;QACvD,IAAI,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC;YAAE,OAAO,MAAM,CAAA;QAClD,0CAA0C;QAC1C,IAAI,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC;YAAE,OAAO,cAAc,CAAA;QACxD,kBAAkB;QAClB,OAAO,KAAK,CAAA;IACd,CAAC;CACF,CAAA;AAED,2CAA2C;AAC3C,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,KAAsB;IACzE,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC5B,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA,CAAC,+BAA+B;IACvD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAA;AACpB,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAsD,EACtD,SAAkB,EAClB,eAA6F;IAE7F,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;IACnE,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAA;IAClC,IAAI,KAAK,KAAK,cAAc,IAAI,SAAS;QAAE,OAAO,IAAI,CAAA;IACtD,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAA;AAClC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/permissions/index.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAKvF;;;;;GAKG;AACH,MAAM,0BAA0B,GAAG,GAAG,CAAA;AACtC,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAA2B,CAAA;AAE/D,SAAS,uBAAuB,CAAC,OAAe;IAC9C,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAC/C,uDAAuD;IACvD,IAAI,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC;QAAE,OAAO,MAAM,CAAA;IAClD,0CAA0C;IAC1C,IAAI,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC;QAAE,OAAO,cAAc,CAAA;IACxD,kBAAkB;IAClB,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAsB;IACpD,MAAM,GAAG,GAAI,KAAK,CAAC,OAAkB,IAAI,EAAE,CAAA;IAC3C,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,MAAM,KAAK,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAA;IAE1C,IAAI,oBAAoB,CAAC,IAAI,IAAI,0BAA0B,EAAE,CAAC;QAC5D,0DAA0D;QAC1D,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA;QACvD,IAAI,MAAM,KAAK,SAAS;YAAE,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC/D,CAAC;IACD,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACpC,OAAO,KAAK,CAAA;AACd,CAAC;AAED,qCAAqC;AACrC,MAAM,KAAK,GAAgE;IACzE,QAAQ,EAAE,GAAG,EAAE,CAAC,cAAc;IAC9B,IAAI,EAAE,GAAG,EAAE,CAAC,cAAc;IAC1B,IAAI,EAAE,GAAG,EAAE,CAAC,cAAc;IAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc;IAC7B,SAAS,EAAE,GAAG,EAAE,CAAC,cAAc;IAC/B,QAAQ,EAAE,GAAG,EAAE,CAAC,cAAc;IAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc;IAC7B,aAAa,EAAE,GAAG,EAAE,CAAC,cAAc;IACnC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK;IACjB,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK;IACtB,KAAK,EAAE,sBAAsB;CAC9B,CAAA;AAED,2CAA2C;AAC3C,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,KAAsB;IACzE,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC5B,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA,CAAC,+BAA+B;IACvD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAA;AACpB,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAA0E,EAC1E,SAAkB,EAClB,eAAiH;IAEjH,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;IACnE,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAA;IAClC,IAAI,KAAK,KAAK,cAAc,IAAI,SAAS;QAAE,OAAO,IAAI,CAAA;IACtD,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAA;AAClC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,IAAI;;;UAoBf,CAAA"}
1
+ {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,IAAI;;;UAqBf,CAAA"}
@@ -2,14 +2,16 @@
2
2
  import { globby } from 'globby';
3
3
  import { tool } from 'ai';
4
4
  import { z } from 'zod';
5
+ import { reportProgress } from './progress.js';
5
6
  export const glob = tool({
6
7
  description: 'Find files matching a glob pattern. Returns file paths sorted by modification time.',
7
8
  inputSchema: z.object({
8
9
  pattern: z.string().describe('Glob pattern (e.g. "**/*.ts", "src/**/*.tsx")'),
9
10
  cwd: z.string().optional().describe('Directory to search in (defaults to working directory)'),
10
11
  }),
11
- execute: async ({ pattern, cwd }) => {
12
+ execute: async ({ pattern, cwd }, { toolCallId }) => {
12
13
  try {
14
+ reportProgress(toolCallId, `Matching ${pattern}`);
13
15
  const files = await globby(pattern, {
14
16
  cwd: cwd ?? process.cwd(),
15
17
  gitignore: true,
@@ -1 +1 @@
1
- {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,qFAAqF;IAClG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;QAC7E,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;KAC9F,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE;gBAClC,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;gBACzB,SAAS,EAAE,IAAI;gBACf,QAAQ,EAAE,IAAI;aACf,CAAC,CAAA;YACF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,sCAAsC,CAAA;YACrE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,OAAO,0BAA0B,GAAG,EAAE,CAAA;QACxC,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,qFAAqF;IAClG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;QAC7E,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;KAC9F,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QAClD,IAAI,CAAC;YACH,cAAc,CAAC,UAAU,EAAE,YAAY,OAAO,EAAE,CAAC,CAAA;YACjD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE;gBAClC,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;gBACzB,SAAS,EAAE,IAAI;gBACf,QAAQ,EAAE,IAAI;aACf,CAAC,CAAA;YACF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,sCAAsC,CAAA;YACrE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,OAAO,0BAA0B,GAAG,EAAE,CAAA;QACxC,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,IAAI;;;;;UAgCf,CAAA"}
1
+ {"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,IAAI;;;;;UAmCf,CAAA"}
@@ -3,6 +3,7 @@ import { execFile } from 'node:child_process';
3
3
  import { promisify } from 'node:util';
4
4
  import { tool } from 'ai';
5
5
  import { z } from 'zod';
6
+ import { reportProgress } from './progress.js';
6
7
  const execFileAsync = promisify(execFile);
7
8
  let _rgPath = null;
8
9
  function getRipgrepPath() {
@@ -27,7 +28,7 @@ export const grep = tool({
27
28
  glob: z.string().optional().describe('Glob pattern to filter files (e.g. "*.ts", "*.{ts,tsx}")'),
28
29
  maxResults: z.number().optional().describe('Max number of results (default: 50)'),
29
30
  }),
30
- execute: async ({ pattern, path: searchPath, glob: globPattern, maxResults }) => {
31
+ execute: async ({ pattern, path: searchPath, glob: globPattern, maxResults }, { toolCallId }) => {
31
32
  try {
32
33
  const rgPath = getRipgrepPath();
33
34
  const args = ['--no-heading', '--line-number', '--color', 'never', '--max-count', String(maxResults ?? 50)];
@@ -36,11 +37,15 @@ export const grep = tool({
36
37
  }
37
38
  args.push(pattern);
38
39
  args.push(searchPath ?? process.cwd());
40
+ reportProgress(toolCallId, `Searching for /${pattern}/`);
39
41
  const { stdout } = await execFileAsync(rgPath, args, {
40
42
  maxBuffer: 1024 * 1024,
41
43
  timeout: 30000,
42
44
  });
43
- return stdout.trim() || 'No matches found.';
45
+ const out = stdout.trim();
46
+ if (!out)
47
+ return 'No matches found.';
48
+ return out;
44
49
  }
45
50
  catch (err) {
46
51
  if (err && typeof err === 'object' && 'code' in err && err.code === 1) {
@@ -1 +1 @@
1
- {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAEzC,IAAI,OAAO,GAAkB,IAAI,CAAA;AAEjC,SAAS,cAAc;IACrB,IAAI,OAAO;QAAE,OAAO,OAAO,CAAA;IAC3B,IAAI,CAAC;QACH,2CAA2C;QAC3C,iEAAiE;QACjE,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAuB,CAAA;QAC3D,OAAO,GAAG,EAAE,CAAC,MAAM,CAAA;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC;IACvB,WAAW,EACT,+GAA+G;IACjH,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC3D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;QACtG,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;QAChG,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;KAClF,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE;QAC9E,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;YAC/B,MAAM,IAAI,GAAG,CAAC,cAAc,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAA;YAC3G,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;YAClC,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAClB,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;YAEtC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE;gBACnD,SAAS,EAAE,IAAI,GAAG,IAAI;gBACtB,OAAO,EAAE,KAAK;aACf,CAAC,CAAA;YACF,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,mBAAmB,CAAA;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACtE,OAAO,mBAAmB,CAAA;YAC5B,CAAC;YACD,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,OAAO,oBAAoB,GAAG,EAAE,CAAA;QAClC,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}
1
+ {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,5 @@
1
1
  import { askUser } from './ask-user.js';
2
2
  import { edit } from './edit.js';
3
- import { enterPlanMode } from './enter-plan-mode.js';
4
- import { exitPlanMode } from './exit-plan-mode.js';
5
3
  import { glob } from './glob.js';
6
4
  import { grep } from './grep.js';
7
5
  import { listDir } from './list-dir.js';
@@ -60,16 +58,14 @@ export declare const toolRegistry: {
60
58
  question: string;
61
59
  }, never>;
62
60
  saveKnowledge: import("ai").Tool<{
63
- category: "tech-stack" | "commands" | "conventions" | "preferences" | "context";
64
- key: string;
61
+ category: "user" | "feedback" | "project" | "reference";
65
62
  action: "add" | "delete";
63
+ key: string;
66
64
  fact: string;
67
65
  scope: "project" | "global";
68
66
  }, string>;
69
- enterPlanMode: import("ai").Tool<{}, never>;
70
- exitPlanMode: import("ai").Tool<{}, never>;
71
67
  };
72
- export { readFile, writeFile, edit, shell, glob, grep, listDir, webSearch, webFetch, askUser, saveKnowledge, enterPlanMode, exitPlanMode, };
68
+ export { readFile, writeFile, edit, shell, glob, grep, listDir, webSearch, webFetch, askUser, saveKnowledge, };
73
69
  /** Max characters for tool results before truncation */
74
70
  export declare const MAX_TOOL_RESULT_CHARS = 30000;
75
71
  /** Truncate tool result, keeping head and tail */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAcxB,CAAA;AAED,OAAO,EACL,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,SAAS,EACT,QAAQ,EACR,OAAO,EACP,aAAa,EACb,aAAa,EACb,YAAY,GACb,CAAA;AAED,wDAAwD;AACxD,eAAO,MAAM,qBAAqB,QAAQ,CAAA;AAE1C,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKzD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAYxB,CAAA;AAED,OAAO,EACL,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,SAAS,EACT,QAAQ,EACR,OAAO,EACP,aAAa,GACd,CAAA;AAED,wDAAwD;AACxD,eAAO,MAAM,qBAAqB,QAAQ,CAAA;AAE1C,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKzD"}
@@ -1,8 +1,6 @@
1
1
  // @x-code-cli/core — Tool registry (unified export)
2
2
  import { askUser } from './ask-user.js';
3
3
  import { edit } from './edit.js';
4
- import { enterPlanMode } from './enter-plan-mode.js';
5
- import { exitPlanMode } from './exit-plan-mode.js';
6
4
  import { glob } from './glob.js';
7
5
  import { grep } from './grep.js';
8
6
  import { listDir } from './list-dir.js';
@@ -24,10 +22,8 @@ export const toolRegistry = {
24
22
  webFetch,
25
23
  askUser,
26
24
  saveKnowledge,
27
- enterPlanMode,
28
- exitPlanMode,
29
25
  };
30
- export { readFile, writeFile, edit, shell, glob, grep, listDir, webSearch, webFetch, askUser, saveKnowledge, enterPlanMode, exitPlanMode, };
26
+ export { readFile, writeFile, edit, shell, glob, grep, listDir, webSearch, webFetch, askUser, saveKnowledge, };
31
27
  /** Max characters for tool results before truncation */
32
28
  export const MAX_TOOL_RESULT_CHARS = 30000;
33
29
  /** Truncate tool result, keeping head and tail */
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ;IACR,SAAS;IACT,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,OAAO;IACP,SAAS;IACT,QAAQ;IACR,OAAO;IACP,aAAa;IACb,aAAa;IACb,YAAY;CACb,CAAA;AAED,OAAO,EACL,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,SAAS,EACT,QAAQ,EACR,OAAO,EACP,aAAa,EACb,aAAa,EACb,YAAY,GACb,CAAA;AAED,wDAAwD;AACxD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAA;AAE1C,kDAAkD;AAClD,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,IAAI,MAAM,CAAC,MAAM,IAAI,qBAAqB;QAAE,OAAO,MAAM,CAAA;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAA;IAClD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,GAAG,qBAAqB,CAAA;IAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,sBAAsB,cAAc,sBAAsB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAA;AACjH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ;IACR,SAAS;IACT,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,OAAO;IACP,SAAS;IACT,QAAQ;IACR,OAAO;IACP,aAAa;CACd,CAAA;AAED,OAAO,EACL,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,SAAS,EACT,QAAQ,EACR,OAAO,EACP,aAAa,GACd,CAAA;AAED,wDAAwD;AACxD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAA;AAE1C,kDAAkD;AAClD,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,IAAI,MAAM,CAAC,MAAM,IAAI,qBAAqB;QAAE,OAAO,MAAM,CAAA;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAA;IAClD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,GAAG,qBAAqB,CAAA;IAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,sBAAsB,cAAc,sBAAsB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAA;AACjH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-dir.d.ts","sourceRoot":"","sources":["../../src/tools/list-dir.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,OAAO;;UAkBlB,CAAA"}
1
+ {"version":3,"file":"list-dir.d.ts","sourceRoot":"","sources":["../../src/tools/list-dir.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,OAAO;;UAmBlB,CAAA"}
@@ -2,13 +2,15 @@
2
2
  import fs from 'node:fs/promises';
3
3
  import { tool } from 'ai';
4
4
  import { z } from 'zod';
5
+ import { reportProgress } from './progress.js';
5
6
  export const listDir = tool({
6
7
  description: 'List the contents of a directory. Returns names with type indicators (/ for directories).',
7
8
  inputSchema: z.object({
8
9
  dirPath: z.string().describe('Absolute path to the directory'),
9
10
  }),
10
- execute: async ({ dirPath }) => {
11
+ execute: async ({ dirPath }, { toolCallId }) => {
11
12
  try {
13
+ reportProgress(toolCallId, `Listing ${dirPath}`);
12
14
  const entries = await fs.readdir(dirPath, { withFileTypes: true });
13
15
  const lines = entries.map((e) => {
14
16
  const suffix = e.isDirectory() ? '/' : '';
@@ -1 +1 @@
1
- {"version":3,"file":"list-dir.js","sourceRoot":"","sources":["../../src/tools/list-dir.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEjC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,2FAA2F;IACxG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KAC/D,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;YAClE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC9B,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;gBACzC,OAAO,GAAG,CAAC,CAAC,IAAI,GAAG,MAAM,EAAE,CAAA;YAC7B,CAAC,CAAC,CAAA;YACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAA;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,OAAO,4BAA4B,GAAG,EAAE,CAAA;QAC1C,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}
1
+ {"version":3,"file":"list-dir.js","sourceRoot":"","sources":["../../src/tools/list-dir.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEjC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,2FAA2F;IACxG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KAC/D,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,cAAc,CAAC,UAAU,EAAE,WAAW,OAAO,EAAE,CAAC,CAAA;YAChD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;YAClE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC9B,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;gBACzC,OAAO,GAAG,CAAC,CAAC,IAAI,GAAG,MAAM,EAAE,CAAA;YAC7B,CAAC,CAAC,CAAA;YACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAA;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,OAAO,4BAA4B,GAAG,EAAE,CAAA;QAC1C,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ export type ProgressReporter = (message: string) => void;
2
+ export declare function setProgressReporter(toolCallId: string, fn: ProgressReporter): void;
3
+ export declare function clearProgressReporter(toolCallId: string): void;
4
+ /** No-op if no reporter is registered. Safe to call from anywhere. */
5
+ export declare function reportProgress(toolCallId: string | undefined, message: string): void;
6
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/tools/progress.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;AAIxD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,gBAAgB,GAAG,IAAI,CAElF;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAE9D;AAED,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGpF"}
@@ -0,0 +1,14 @@
1
+ const reporters = new Map();
2
+ export function setProgressReporter(toolCallId, fn) {
3
+ reporters.set(toolCallId, fn);
4
+ }
5
+ export function clearProgressReporter(toolCallId) {
6
+ reporters.delete(toolCallId);
7
+ }
8
+ /** No-op if no reporter is registered. Safe to call from anywhere. */
9
+ export function reportProgress(toolCallId, message) {
10
+ if (!toolCallId)
11
+ return;
12
+ reporters.get(toolCallId)?.(message);
13
+ }
14
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/tools/progress.ts"],"names":[],"mappings":"AAmBA,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAA;AAErD,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,EAAoB;IAC1E,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACtD,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;AAC9B,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,cAAc,CAAC,UAA8B,EAAE,OAAe;IAC5E,IAAI,CAAC,UAAU;QAAE,OAAM;IACvB,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;AACtC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,QAAQ;;;;UAqBnB,CAAA"}
1
+ {"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,QAAQ;;;;UAsBnB,CAAA"}
@@ -2,6 +2,7 @@
2
2
  import fs from 'node:fs/promises';
3
3
  import { tool } from 'ai';
4
4
  import { z } from 'zod';
5
+ import { reportProgress } from './progress.js';
5
6
  export const readFile = tool({
6
7
  description: 'Read the contents of a file at the given path. Returns the file content with line numbers.',
7
8
  inputSchema: z.object({
@@ -9,8 +10,9 @@ export const readFile = tool({
9
10
  offset: z.number().optional().describe('Start line (1-based)'),
10
11
  limit: z.number().optional().describe('Max lines to read'),
11
12
  }),
12
- execute: async ({ filePath, offset, limit }) => {
13
+ execute: async ({ filePath, offset, limit }, { toolCallId }) => {
13
14
  try {
15
+ reportProgress(toolCallId, `Reading ${filePath}`);
14
16
  const content = await fs.readFile(filePath, 'utf-8');
15
17
  const lines = content.split('\n');
16
18
  const start = (offset ?? 1) - 1;
@@ -1 +1 @@
1
- {"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEjC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,4FAA4F;IACzG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC1D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC9D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KAC3D,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACjC,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;YAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAA;YAChD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;YACrE,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,OAAO,uBAAuB,GAAG,EAAE,CAAA;QACrC,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}
1
+ {"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEjC,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,4FAA4F;IACzG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC1D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC9D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KAC3D,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QAC7D,IAAI,CAAC;YACH,cAAc,CAAC,UAAU,EAAE,WAAW,QAAQ,EAAE,CAAC,CAAA;YACjD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACjC,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;YAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAA;YAChD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;YACrE,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,OAAO,uBAAuB,GAAG,EAAE,CAAA;QACrC,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}