@x-code-cli/core 0.1.3 → 0.1.5
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/LICENSE +21 -0
- package/README.en.md +15 -0
- package/README.md +15 -0
- package/dist/agent/api-errors.d.ts +11 -0
- package/dist/agent/api-errors.d.ts.map +1 -0
- package/dist/agent/api-errors.js +134 -0
- package/dist/agent/api-errors.js.map +1 -0
- package/dist/agent/context-window.d.ts +26 -0
- package/dist/agent/context-window.d.ts.map +1 -0
- package/dist/agent/context-window.js +126 -0
- package/dist/agent/context-window.js.map +1 -0
- package/dist/agent/loop-state.d.ts +14 -0
- package/dist/agent/loop-state.d.ts.map +1 -0
- package/dist/agent/loop-state.js +12 -0
- package/dist/agent/loop-state.js.map +1 -0
- package/dist/agent/loop.d.ts +11 -15
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +213 -381
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/messages.d.ts +0 -2
- package/dist/agent/messages.d.ts.map +1 -1
- package/dist/agent/messages.js +0 -32
- package/dist/agent/messages.js.map +1 -1
- package/dist/agent/provider-compat.d.ts +17 -0
- package/dist/agent/provider-compat.d.ts.map +1 -0
- package/dist/agent/provider-compat.js +31 -0
- package/dist/agent/provider-compat.js.map +1 -0
- package/dist/agent/stream-utils.d.ts +33 -0
- package/dist/agent/stream-utils.d.ts.map +1 -0
- package/dist/agent/stream-utils.js +14 -0
- package/dist/agent/stream-utils.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +1 -3
- package/dist/agent/system-prompt.d.ts.map +1 -1
- package/dist/agent/system-prompt.js +34 -23
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/agent/tool-execution.d.ts +11 -0
- package/dist/agent/tool-execution.d.ts.map +1 -0
- package/dist/agent/tool-execution.js +171 -0
- package/dist/agent/tool-execution.js.map +1 -0
- package/dist/config/index.d.ts +19 -8
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +66 -32
- package/dist/config/index.js.map +1 -1
- package/dist/index.d.ts +7 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -6
- package/dist/index.js.map +1 -1
- package/dist/knowledge/auto-memory.d.ts +1 -1
- package/dist/knowledge/auto-memory.d.ts.map +1 -1
- package/dist/knowledge/auto-memory.js +55 -16
- package/dist/knowledge/auto-memory.js.map +1 -1
- package/dist/knowledge/init.d.ts +1 -2
- package/dist/knowledge/init.d.ts.map +1 -1
- package/dist/knowledge/init.js +83 -69
- package/dist/knowledge/init.js.map +1 -1
- package/dist/knowledge/loader.d.ts +0 -9
- package/dist/knowledge/loader.d.ts.map +1 -1
- package/dist/knowledge/loader.js +54 -99
- package/dist/knowledge/loader.js.map +1 -1
- package/dist/knowledge/session.d.ts +1 -1
- package/dist/knowledge/session.d.ts.map +1 -1
- package/dist/knowledge/session.js +2 -1
- package/dist/knowledge/session.js.map +1 -1
- package/dist/permissions/index.d.ts +2 -0
- package/dist/permissions/index.d.ts.map +1 -1
- package/dist/permissions/index.js +35 -14
- package/dist/permissions/index.js.map +1 -1
- package/dist/tools/glob.d.ts.map +1 -1
- package/dist/tools/glob.js +3 -1
- package/dist/tools/glob.js.map +1 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +7 -2
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/index.d.ts +3 -7
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -5
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list-dir.d.ts.map +1 -1
- package/dist/tools/list-dir.js +3 -1
- package/dist/tools/list-dir.js.map +1 -1
- package/dist/tools/progress.d.ts +6 -0
- package/dist/tools/progress.d.ts.map +1 -0
- package/dist/tools/progress.js +14 -0
- package/dist/tools/progress.js.map +1 -0
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +3 -1
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/save-knowledge.d.ts +2 -2
- package/dist/tools/save-knowledge.d.ts.map +1 -1
- package/dist/tools/save-knowledge.js +31 -6
- package/dist/tools/save-knowledge.js.map +1 -1
- package/dist/tools/shell-utils.d.ts.map +1 -1
- package/dist/tools/shell-utils.js +7 -0
- package/dist/tools/shell-utils.js.map +1 -1
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +88 -19
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +85 -12
- package/dist/tools/web-search.js.map +1 -1
- package/dist/types/index.d.ts +60 -21
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +64 -6
- package/dist/types/index.js.map +1 -1
- package/dist/utils.d.ts +3 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +32 -0
- package/dist/utils.js.map +1 -1
- package/package.json +6 -6
- package/dist/agent/plan-mode.d.ts +0 -11
- package/dist/agent/plan-mode.d.ts.map +0 -1
- package/dist/agent/plan-mode.js +0 -37
- package/dist/agent/plan-mode.js.map +0 -1
- package/dist/agent/pricing.d.ts +0 -9
- package/dist/agent/pricing.d.ts.map +0 -1
- package/dist/agent/pricing.js +0 -47
- package/dist/agent/pricing.js.map +0 -1
- package/dist/knowledge/hooks.d.ts +0 -3
- package/dist/knowledge/hooks.d.ts.map +0 -1
- package/dist/knowledge/hooks.js +0 -59
- package/dist/knowledge/hooks.js.map +0 -1
- package/dist/tools/enter-plan-mode.d.ts +0 -2
- package/dist/tools/enter-plan-mode.d.ts.map +0 -1
- package/dist/tools/enter-plan-mode.js +0 -11
- package/dist/tools/enter-plan-mode.js.map +0 -1
- package/dist/tools/exit-plan-mode.d.ts +0 -2
- package/dist/tools/exit-plan-mode.d.ts.map +0 -1
- package/dist/tools/exit-plan-mode.js +0 -9
- package/dist/tools/exit-plan-mode.js.map +0 -1
package/dist/knowledge/loader.js
CHANGED
|
@@ -1,124 +1,80 @@
|
|
|
1
|
-
// @x-code-cli/core — Knowledge loader
|
|
2
|
-
|
|
3
|
-
|
|
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 =
|
|
8
|
-
/**
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
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":"AAAA,+EAA+E;AAC/E,
|
|
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,
|
|
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;
|
|
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;
|
|
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
|
-
|
|
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
|
|
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"}
|
package/dist/tools/glob.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,IAAI;;;UAqBf,CAAA"}
|
package/dist/tools/glob.js
CHANGED
|
@@ -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,
|
package/dist/tools/glob.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/tools/grep.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,IAAI;;;;;UAmCf,CAAA"}
|
package/dist/tools/grep.js
CHANGED
|
@@ -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
|
-
|
|
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) {
|
package/dist/tools/grep.js.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -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: "
|
|
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,
|
|
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,
|
|
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"}
|
package/dist/tools/index.js
CHANGED
|
@@ -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,
|
|
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 */
|
package/dist/tools/index.js.map
CHANGED
|
@@ -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,
|
|
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":"
|
|
1
|
+
{"version":3,"file":"list-dir.d.ts","sourceRoot":"","sources":["../../src/tools/list-dir.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,OAAO;;UAmBlB,CAAA"}
|
package/dist/tools/list-dir.js
CHANGED
|
@@ -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;
|
|
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":"
|
|
1
|
+
{"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,QAAQ;;;;UAsBnB,CAAA"}
|
package/dist/tools/read-file.js
CHANGED
|
@@ -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;
|
|
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"}
|