yuangs 6.2.3 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/AgentRuntime.d.ts +7 -23
- package/dist/agent/AgentRuntime.js +35 -542
- package/dist/agent/AgentRuntime.js.map +1 -1
- package/dist/agent/DualAgentRuntime.js +16 -16
- package/dist/agent/DualAgentRuntime.js.map +1 -1
- package/dist/agent/ExecutionCompleter.d.ts +31 -0
- package/dist/agent/ExecutionCompleter.js +83 -0
- package/dist/agent/ExecutionCompleter.js.map +1 -0
- package/dist/agent/ExecutionHandler.d.ts +34 -0
- package/dist/agent/ExecutionHandler.js +227 -0
- package/dist/agent/ExecutionHandler.js.map +1 -0
- package/dist/agent/ExecutionLearning.d.ts +8 -0
- package/dist/agent/ExecutionLearning.js +31 -0
- package/dist/agent/ExecutionLearning.js.map +1 -0
- package/dist/agent/ExecutionRecovery.d.ts +26 -0
- package/dist/agent/ExecutionRecovery.js +99 -0
- package/dist/agent/ExecutionRecovery.js.map +1 -0
- package/dist/agent/ExecutionStabilizer.d.ts +20 -0
- package/dist/agent/ExecutionStabilizer.js +101 -0
- package/dist/agent/ExecutionStabilizer.js.map +1 -0
- package/dist/agent/ExecutionTypes.d.ts +13 -0
- package/dist/agent/ExecutionTypes.js +9 -0
- package/dist/agent/ExecutionTypes.js.map +1 -0
- package/dist/agent/LLMCaller.d.ts +19 -0
- package/dist/agent/LLMCaller.js +103 -0
- package/dist/agent/LLMCaller.js.map +1 -0
- package/dist/agent/PreFlightChecker.d.ts +51 -0
- package/dist/agent/PreFlightChecker.js +148 -0
- package/dist/agent/PreFlightChecker.js.map +1 -0
- package/dist/agent/commandSemantics.js +12 -0
- package/dist/agent/commandSemantics.js.map +1 -1
- package/dist/agent/errorTracker.d.ts +10 -0
- package/dist/agent/errorTracker.js +36 -0
- package/dist/agent/errorTracker.js.map +1 -1
- package/dist/agent/executor.d.ts +12 -90
- package/dist/agent/executor.js +59 -881
- package/dist/agent/executor.js.map +1 -1
- package/dist/agent/governance/core.js.map +1 -1
- package/dist/agent/governance/riskScoring.js +6 -3
- package/dist/agent/governance/riskScoring.js.map +1 -1
- package/dist/agent/governance.js +4 -36
- package/dist/agent/governance.js.map +1 -1
- package/dist/agent/llm.js +11 -17
- package/dist/agent/llm.js.map +1 -1
- package/dist/agent/policy/engine.d.ts +2 -5
- package/dist/agent/policy/engine.js.map +1 -1
- package/dist/agent/policy/index.d.ts +1 -0
- package/dist/agent/policy/index.js +1 -0
- package/dist/agent/policy/index.js.map +1 -1
- package/dist/agent/policy/policies/WorkdirWrite.d.ts +11 -0
- package/dist/agent/policy/policies/WorkdirWrite.js +65 -0
- package/dist/agent/policy/policies/WorkdirWrite.js.map +1 -0
- package/dist/agent/policy/policies/noDangerousShell.js +1 -1
- package/dist/agent/policy/policies/noDangerousShell.js.map +1 -1
- package/dist/agent/policy/types.d.ts +6 -4
- package/dist/agent/skills.d.ts +12 -17
- package/dist/agent/skills.js +45 -52
- package/dist/agent/skills.js.map +1 -1
- package/dist/agent/state.d.ts +33 -3
- package/dist/agent/state.js +14 -0
- package/dist/agent/state.js.map +1 -1
- package/dist/agent/tools/AnalyzeDependencies.d.ts +9 -0
- package/dist/agent/tools/AnalyzeDependencies.js +91 -0
- package/dist/agent/tools/AnalyzeDependencies.js.map +1 -0
- package/dist/agent/tools/AppendFile.d.ts +8 -0
- package/dist/agent/tools/AppendFile.js +36 -0
- package/dist/agent/tools/AppendFile.js.map +1 -0
- package/dist/agent/tools/CodeDiff.d.ts +8 -0
- package/dist/agent/tools/CodeDiff.js +36 -0
- package/dist/agent/tools/CodeDiff.js.map +1 -0
- package/dist/agent/tools/ContinueReading.d.ts +8 -0
- package/dist/agent/tools/ContinueReading.js +59 -0
- package/dist/agent/tools/ContinueReading.js.map +1 -0
- package/dist/agent/tools/FileInfo.d.ts +8 -0
- package/dist/agent/tools/FileInfo.js +43 -0
- package/dist/agent/tools/FileInfo.js.map +1 -0
- package/dist/agent/tools/GitDiff.d.ts +8 -0
- package/dist/agent/tools/GitDiff.js +40 -0
- package/dist/agent/tools/GitDiff.js.map +1 -0
- package/dist/agent/tools/GitLog.d.ts +8 -0
- package/dist/agent/tools/GitLog.js +36 -0
- package/dist/agent/tools/GitLog.js.map +1 -0
- package/dist/agent/tools/GitStatus.d.ts +8 -0
- package/dist/agent/tools/GitStatus.js +38 -0
- package/dist/agent/tools/GitStatus.js.map +1 -0
- package/dist/agent/tools/ListDirectoryTree.d.ts +9 -0
- package/dist/agent/tools/ListDirectoryTree.js +63 -0
- package/dist/agent/tools/ListDirectoryTree.js.map +1 -0
- package/dist/agent/tools/ListFiles.d.ts +9 -0
- package/dist/agent/tools/ListFiles.js +53 -0
- package/dist/agent/tools/ListFiles.js.map +1 -0
- package/dist/agent/tools/ReadFile.d.ts +8 -0
- package/dist/agent/tools/ReadFile.js +33 -0
- package/dist/agent/tools/ReadFile.js.map +1 -0
- package/dist/agent/tools/ReadFileLines.d.ts +8 -0
- package/dist/agent/tools/ReadFileLines.js +45 -0
- package/dist/agent/tools/ReadFileLines.js.map +1 -0
- package/dist/agent/tools/ReadFileLinesFromEnd.d.ts +8 -0
- package/dist/agent/tools/ReadFileLinesFromEnd.js +48 -0
- package/dist/agent/tools/ReadFileLinesFromEnd.js.map +1 -0
- package/dist/agent/tools/SearchInFiles.d.ts +8 -0
- package/dist/agent/tools/SearchInFiles.js +70 -0
- package/dist/agent/tools/SearchInFiles.js.map +1 -0
- package/dist/agent/tools/SearchSymbol.d.ts +8 -0
- package/dist/agent/tools/SearchSymbol.js +62 -0
- package/dist/agent/tools/SearchSymbol.js.map +1 -0
- package/dist/agent/tools/ShellCmd.d.ts +8 -0
- package/dist/agent/tools/ShellCmd.js +40 -0
- package/dist/agent/tools/ShellCmd.js.map +1 -0
- package/dist/agent/tools/WriteFile.d.ts +8 -0
- package/dist/agent/tools/WriteFile.js +35 -0
- package/dist/agent/tools/WriteFile.js.map +1 -0
- package/dist/agent/tools/index.d.ts +20 -0
- package/dist/agent/tools/index.js +50 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/tools/pathSafety.d.ts +9 -0
- package/dist/agent/tools/pathSafety.js +85 -0
- package/dist/agent/tools/pathSafety.js.map +1 -0
- package/dist/agent/tools/registry.d.ts +40 -0
- package/dist/agent/tools/registry.js +77 -0
- package/dist/agent/tools/registry.js.map +1 -0
- package/dist/agent/tools/types.d.ts +21 -0
- package/dist/agent/tools/types.js +3 -0
- package/dist/agent/tools/types.js.map +1 -0
- package/dist/agent/tools/utils.d.ts +43 -0
- package/dist/agent/tools/utils.js +158 -0
- package/dist/agent/tools/utils.js.map +1 -0
- package/dist/agent/types.d.ts +5 -3
- package/dist/ai/client.d.ts +2 -2
- package/dist/ai/client.js +16 -23
- package/dist/ai/client.js.map +1 -1
- package/dist/audit/timeline.js +7 -5
- package/dist/audit/timeline.js.map +1 -1
- package/dist/cli.js +12 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/handleAIChat.js +1 -1
- package/dist/commands/handleAIChat.js.map +1 -1
- package/dist/commands/handleAICommand.js +3 -3
- package/dist/commands/handleAICommand.js.map +1 -1
- package/dist/commands/skillsCommands.js +4 -42
- package/dist/commands/skillsCommands.js.map +1 -1
- package/dist/core/ConfigService.d.ts +87 -0
- package/dist/core/ConfigService.js +259 -0
- package/dist/core/ConfigService.js.map +1 -0
- package/dist/core/executionRecord.d.ts +1 -1
- package/dist/core/explain.js +2 -2
- package/dist/core/explain.js.map +1 -1
- package/dist/core/git/BackupManager.d.ts +30 -0
- package/dist/core/git/BackupManager.js +153 -0
- package/dist/core/git/BackupManager.js.map +1 -0
- package/dist/core/git/ConflictResolver.js.map +1 -1
- package/dist/core/replayDiff.js +5 -5
- package/dist/core/replayDiff.js.map +1 -1
- package/dist/core/skillTypes.d.ts +22 -0
- package/dist/core/skillTypes.js +17 -0
- package/dist/core/skillTypes.js.map +1 -0
- package/dist/utils/Logger.d.ts +24 -5
- package/dist/utils/Logger.js +89 -63
- package/dist/utils/Logger.js.map +1 -1
- package/dist/utils/storage.d.ts +22 -0
- package/dist/utils/storage.js +62 -0
- package/dist/utils/storage.js.map +1 -0
- package/package.json +3 -1
- package/dist/core/ConfigManager.d.ts +0 -39
- package/dist/core/ConfigManager.js +0 -127
- package/dist/core/ConfigManager.js.map +0 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SearchSymbol = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const util_1 = require("util");
|
|
6
|
+
const utils_1 = require("./utils");
|
|
7
|
+
const pathSafety_1 = require("./pathSafety");
|
|
8
|
+
const executor_1 = require("../executor");
|
|
9
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
10
|
+
class SearchSymbol {
|
|
11
|
+
name = 'search_symbol';
|
|
12
|
+
description = '搜索代码符号(函数、类、变量等)';
|
|
13
|
+
parameters = [
|
|
14
|
+
{ name: 'symbol', type: 'string', required: true, description: '符号名称' },
|
|
15
|
+
{ name: 'symbol_type', type: 'string', required: false, description: '符号类型(function/class/interface)' },
|
|
16
|
+
{ name: 'path', type: 'string', required: false, description: '搜索路径' },
|
|
17
|
+
{ name: 'file_pattern', type: 'string', required: false, description: '文件名模式' }
|
|
18
|
+
];
|
|
19
|
+
async execute(params) {
|
|
20
|
+
const symbol = params.symbol;
|
|
21
|
+
const symbolType = params.symbol_type;
|
|
22
|
+
const searchPath = params.path || '.';
|
|
23
|
+
const filePattern = params.file_pattern;
|
|
24
|
+
try {
|
|
25
|
+
const safePath = await (0, pathSafety_1.resolveAndValidate)(searchPath, executor_1.ToolExecutor.getAllowedCwd());
|
|
26
|
+
let pattern = symbol;
|
|
27
|
+
switch (symbolType) {
|
|
28
|
+
case 'function':
|
|
29
|
+
pattern = `function\\s+${symbol}|${symbol}\\s*[:=]\\s*function|const\\s+${symbol}\\s*=`;
|
|
30
|
+
break;
|
|
31
|
+
case 'class':
|
|
32
|
+
pattern = `class\\s+${symbol}`;
|
|
33
|
+
break;
|
|
34
|
+
case 'interface':
|
|
35
|
+
pattern = `interface\\s+${symbol}`;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
let grepCmd = `grep -rn --color=never -E "${pattern}" ${safePath}`;
|
|
39
|
+
if (filePattern)
|
|
40
|
+
grepCmd += ` --include="${filePattern}"`;
|
|
41
|
+
const { stdout } = await execAsync(grepCmd, {
|
|
42
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
43
|
+
cwd: process.cwd()
|
|
44
|
+
});
|
|
45
|
+
if (!stdout.trim()) {
|
|
46
|
+
return (0, utils_1.successResult)(`未找到符号 "${symbol}"`);
|
|
47
|
+
}
|
|
48
|
+
return (0, utils_1.successResult)(stdout);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (error.message?.includes('Access denied')) {
|
|
52
|
+
return (0, utils_1.failResult)(error.message);
|
|
53
|
+
}
|
|
54
|
+
if (error.code === 1) {
|
|
55
|
+
return (0, utils_1.successResult)(`未找到符号 "${symbol}"`);
|
|
56
|
+
}
|
|
57
|
+
return (0, utils_1.failResult)(error.message);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.SearchSymbol = SearchSymbol;
|
|
62
|
+
//# sourceMappingURL=SearchSymbol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchSymbol.js","sourceRoot":"","sources":["../../../src/agent/tools/SearchSymbol.ts"],"names":[],"mappings":";;;AAAA,iDAAqC;AACrC,+BAAiC;AAGjC,mCAAoD;AACpD,6CAAkD;AAClD,0CAA2C;AAE3C,MAAM,SAAS,GAAG,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAC;AAElC,MAAa,YAAY;IACvB,IAAI,GAAG,eAAe,CAAC;IACvB,WAAW,GAAG,kBAAkB,CAAC;IACjC,UAAU,GAAoB;QAC5B,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE;QACvE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,gCAAgC,EAAE;QACvG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE;QACtE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE;KAChF,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,MAA2B;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC;QACtC,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC;QAExC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,+BAAkB,EAAC,UAAU,EAAE,uBAAY,CAAC,aAAa,EAAE,CAAC,CAAC;YACpF,IAAI,OAAO,GAAG,MAAM,CAAC;YACrB,QAAQ,UAAU,EAAE,CAAC;gBACnB,KAAK,UAAU;oBACb,OAAO,GAAG,eAAe,MAAM,IAAI,MAAM,iCAAiC,MAAM,OAAO,CAAC;oBACxF,MAAM;gBACR,KAAK,OAAO;oBACV,OAAO,GAAG,YAAY,MAAM,EAAE,CAAC;oBAC/B,MAAM;gBACR,KAAK,WAAW;oBACd,OAAO,GAAG,gBAAgB,MAAM,EAAE,CAAC;oBACnC,MAAM;YACV,CAAC;YAED,IAAI,OAAO,GAAG,8BAA8B,OAAO,KAAK,QAAQ,EAAE,CAAC;YACnE,IAAI,WAAW;gBAAE,OAAO,IAAI,eAAe,WAAW,GAAG,CAAC;YAE1D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE;gBAC1C,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;gBAC3B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;aACnB,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnB,OAAO,IAAA,qBAAa,EAAC,UAAU,MAAM,GAAG,CAAC,CAAC;YAC5C,CAAC;YAED,OAAO,IAAA,qBAAa,EAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC7C,OAAO,IAAA,kBAAU,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,IAAA,qBAAa,EAAC,UAAU,MAAM,GAAG,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,IAAA,kBAAU,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;CACF;AAtDD,oCAsDC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Tool, ToolParameter } from './types';
|
|
2
|
+
import { ToolExecutionResult } from '../state';
|
|
3
|
+
export declare class ShellCmd implements Tool {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
parameters: ToolParameter[];
|
|
7
|
+
execute(params: Record<string, any>): Promise<ToolExecutionResult>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ShellCmd = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const util_1 = require("util");
|
|
6
|
+
const utils_1 = require("./utils");
|
|
7
|
+
const toolResultStorage_1 = require("../toolResultStorage");
|
|
8
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
9
|
+
class ShellCmd {
|
|
10
|
+
name = 'shell_cmd';
|
|
11
|
+
description = '执行 shell 命令';
|
|
12
|
+
parameters = [
|
|
13
|
+
{ name: 'command', type: 'string', required: true, description: '要执行的命令' }
|
|
14
|
+
];
|
|
15
|
+
async execute(params) {
|
|
16
|
+
const command = params.command;
|
|
17
|
+
try {
|
|
18
|
+
const { stdout, stderr } = await execAsync(command, {
|
|
19
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
20
|
+
cwd: process.cwd()
|
|
21
|
+
});
|
|
22
|
+
let output = stdout || stderr || '';
|
|
23
|
+
const baseCmd = command.split(/\s+/)[0];
|
|
24
|
+
const persisted = await (0, toolResultStorage_1.persistToolResult)(output, baseCmd);
|
|
25
|
+
if (persisted) {
|
|
26
|
+
output = `${persisted.preview}\n\n[⚠️ 输出已截断,完整结果已保存到 ${persisted.filepath}(${(0, toolResultStorage_1.formatFileSize)(persisted.originalSize)})]`;
|
|
27
|
+
}
|
|
28
|
+
return (0, utils_1.successResult)(output, persisted ? [persisted.filepath] : []);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
return {
|
|
32
|
+
success: false,
|
|
33
|
+
error: error.message,
|
|
34
|
+
output: error.stdout || error.stderr || ''
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.ShellCmd = ShellCmd;
|
|
40
|
+
//# sourceMappingURL=ShellCmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShellCmd.js","sourceRoot":"","sources":["../../../src/agent/tools/ShellCmd.ts"],"names":[],"mappings":";;;AAAA,iDAAqC;AACrC,+BAAiC;AAGjC,mCAAoD;AACpD,4DAAyE;AAEzE,MAAM,SAAS,GAAG,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAC;AAElC,MAAa,QAAQ;IACnB,IAAI,GAAG,WAAW,CAAC;IACnB,WAAW,GAAG,aAAa,CAAC;IAC5B,UAAU,GAAoB;QAC5B,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE;KAC3E,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,MAA2B;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAE/B,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE;gBAClD,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;gBAC3B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;aACnB,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,IAAI,EAAE,CAAC;YAEpC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,SAAS,GAAG,MAAM,IAAA,qCAAiB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC3D,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,0BAA0B,SAAS,CAAC,QAAQ,IAAI,IAAA,kCAAc,EAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC;YAC1H,CAAC;YAED,OAAO,IAAA,qBAAa,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,CAAC,OAAO;gBACpB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE;aAC3C,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAjCD,4BAiCC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Tool, ToolParameter } from './types';
|
|
2
|
+
import { ToolExecutionResult } from '../state';
|
|
3
|
+
export declare class WriteFile implements Tool {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
parameters: ToolParameter[];
|
|
7
|
+
execute(params: Record<string, any>): Promise<ToolExecutionResult>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WriteFile = void 0;
|
|
7
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const utils_1 = require("./utils");
|
|
10
|
+
const pathSafety_1 = require("./pathSafety");
|
|
11
|
+
const executor_1 = require("../executor");
|
|
12
|
+
class WriteFile {
|
|
13
|
+
name = 'write_file';
|
|
14
|
+
description = '写入文件内容(覆盖或创建)';
|
|
15
|
+
parameters = [
|
|
16
|
+
{ name: 'path', type: 'string', required: true, description: '文件路径' },
|
|
17
|
+
{ name: 'content', type: 'string', required: true, description: '文件内容' }
|
|
18
|
+
];
|
|
19
|
+
async execute(params) {
|
|
20
|
+
try {
|
|
21
|
+
const safePath = await (0, pathSafety_1.resolveAndValidate)(params.path, executor_1.ToolExecutor.getAllowedCwd());
|
|
22
|
+
await promises_1.default.mkdir(path_1.default.dirname(safePath), { recursive: true });
|
|
23
|
+
await promises_1.default.writeFile(safePath, params.content, 'utf-8');
|
|
24
|
+
return (0, utils_1.successResult)(`Successfully wrote ${safePath}`, [safePath]);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (error.message?.includes('Access denied')) {
|
|
28
|
+
return (0, utils_1.failResult)(error.message);
|
|
29
|
+
}
|
|
30
|
+
return (0, utils_1.failResult)(error.message);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.WriteFile = WriteFile;
|
|
35
|
+
//# sourceMappingURL=WriteFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WriteFile.js","sourceRoot":"","sources":["../../../src/agent/tools/WriteFile.ts"],"names":[],"mappings":";;;;;;AAAA,2DAA6B;AAC7B,gDAAwB;AAGxB,mCAAoD;AACpD,6CAAkD;AAClD,0CAA2C;AAE3C,MAAa,SAAS;IACpB,IAAI,GAAG,YAAY,CAAC;IACpB,WAAW,GAAG,eAAe,CAAC;IAC9B,UAAU,GAAoB;QAC5B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE;QACrE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE;KACzE,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,MAA2B;QACvC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,+BAAkB,EAAC,MAAM,CAAC,IAAI,EAAE,uBAAY,CAAC,aAAa,EAAE,CAAC,CAAC;YACrF,MAAM,kBAAE,CAAC,KAAK,CAAC,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACtD,OAAO,IAAA,qBAAa,EAAC,sBAAsB,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC7C,OAAO,IAAA,kBAAU,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;YACD,OAAO,IAAA,kBAAU,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;CACF;AArBD,8BAqBC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export { Tool, ToolParameter } from './types';
|
|
2
|
+
export { ToolRegistry } from './registry';
|
|
3
|
+
export { maybeTruncateOutput, formatBytes, getFriendlyError, getReadPosition, setReadPosition, clearReadPosition, getMaxOutputLength, failResult, successResult } from './utils';
|
|
4
|
+
export { ReadFile } from './ReadFile';
|
|
5
|
+
export { ReadFileLines } from './ReadFileLines';
|
|
6
|
+
export { ReadFileLinesFromEnd } from './ReadFileLinesFromEnd';
|
|
7
|
+
export { WriteFile } from './WriteFile';
|
|
8
|
+
export { AppendFile } from './AppendFile';
|
|
9
|
+
export { FileInfo } from './FileInfo';
|
|
10
|
+
export { ContinueReading } from './ContinueReading';
|
|
11
|
+
export { ListFiles } from './ListFiles';
|
|
12
|
+
export { ListDirectoryTree } from './ListDirectoryTree';
|
|
13
|
+
export { SearchInFiles } from './SearchInFiles';
|
|
14
|
+
export { SearchSymbol } from './SearchSymbol';
|
|
15
|
+
export { AnalyzeDependencies } from './AnalyzeDependencies';
|
|
16
|
+
export { GitStatus } from './GitStatus';
|
|
17
|
+
export { GitDiff } from './GitDiff';
|
|
18
|
+
export { GitLog } from './GitLog';
|
|
19
|
+
export { ShellCmd } from './ShellCmd';
|
|
20
|
+
export { CodeDiff } from './CodeDiff';
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CodeDiff = exports.ShellCmd = exports.GitLog = exports.GitDiff = exports.GitStatus = exports.AnalyzeDependencies = exports.SearchSymbol = exports.SearchInFiles = exports.ListDirectoryTree = exports.ListFiles = exports.ContinueReading = exports.FileInfo = exports.AppendFile = exports.WriteFile = exports.ReadFileLinesFromEnd = exports.ReadFileLines = exports.ReadFile = exports.successResult = exports.failResult = exports.getMaxOutputLength = exports.clearReadPosition = exports.setReadPosition = exports.getReadPosition = exports.getFriendlyError = exports.formatBytes = exports.maybeTruncateOutput = exports.ToolRegistry = void 0;
|
|
4
|
+
var registry_1 = require("./registry");
|
|
5
|
+
Object.defineProperty(exports, "ToolRegistry", { enumerable: true, get: function () { return registry_1.ToolRegistry; } });
|
|
6
|
+
var utils_1 = require("./utils");
|
|
7
|
+
Object.defineProperty(exports, "maybeTruncateOutput", { enumerable: true, get: function () { return utils_1.maybeTruncateOutput; } });
|
|
8
|
+
Object.defineProperty(exports, "formatBytes", { enumerable: true, get: function () { return utils_1.formatBytes; } });
|
|
9
|
+
Object.defineProperty(exports, "getFriendlyError", { enumerable: true, get: function () { return utils_1.getFriendlyError; } });
|
|
10
|
+
Object.defineProperty(exports, "getReadPosition", { enumerable: true, get: function () { return utils_1.getReadPosition; } });
|
|
11
|
+
Object.defineProperty(exports, "setReadPosition", { enumerable: true, get: function () { return utils_1.setReadPosition; } });
|
|
12
|
+
Object.defineProperty(exports, "clearReadPosition", { enumerable: true, get: function () { return utils_1.clearReadPosition; } });
|
|
13
|
+
Object.defineProperty(exports, "getMaxOutputLength", { enumerable: true, get: function () { return utils_1.getMaxOutputLength; } });
|
|
14
|
+
Object.defineProperty(exports, "failResult", { enumerable: true, get: function () { return utils_1.failResult; } });
|
|
15
|
+
Object.defineProperty(exports, "successResult", { enumerable: true, get: function () { return utils_1.successResult; } });
|
|
16
|
+
var ReadFile_1 = require("./ReadFile");
|
|
17
|
+
Object.defineProperty(exports, "ReadFile", { enumerable: true, get: function () { return ReadFile_1.ReadFile; } });
|
|
18
|
+
var ReadFileLines_1 = require("./ReadFileLines");
|
|
19
|
+
Object.defineProperty(exports, "ReadFileLines", { enumerable: true, get: function () { return ReadFileLines_1.ReadFileLines; } });
|
|
20
|
+
var ReadFileLinesFromEnd_1 = require("./ReadFileLinesFromEnd");
|
|
21
|
+
Object.defineProperty(exports, "ReadFileLinesFromEnd", { enumerable: true, get: function () { return ReadFileLinesFromEnd_1.ReadFileLinesFromEnd; } });
|
|
22
|
+
var WriteFile_1 = require("./WriteFile");
|
|
23
|
+
Object.defineProperty(exports, "WriteFile", { enumerable: true, get: function () { return WriteFile_1.WriteFile; } });
|
|
24
|
+
var AppendFile_1 = require("./AppendFile");
|
|
25
|
+
Object.defineProperty(exports, "AppendFile", { enumerable: true, get: function () { return AppendFile_1.AppendFile; } });
|
|
26
|
+
var FileInfo_1 = require("./FileInfo");
|
|
27
|
+
Object.defineProperty(exports, "FileInfo", { enumerable: true, get: function () { return FileInfo_1.FileInfo; } });
|
|
28
|
+
var ContinueReading_1 = require("./ContinueReading");
|
|
29
|
+
Object.defineProperty(exports, "ContinueReading", { enumerable: true, get: function () { return ContinueReading_1.ContinueReading; } });
|
|
30
|
+
var ListFiles_1 = require("./ListFiles");
|
|
31
|
+
Object.defineProperty(exports, "ListFiles", { enumerable: true, get: function () { return ListFiles_1.ListFiles; } });
|
|
32
|
+
var ListDirectoryTree_1 = require("./ListDirectoryTree");
|
|
33
|
+
Object.defineProperty(exports, "ListDirectoryTree", { enumerable: true, get: function () { return ListDirectoryTree_1.ListDirectoryTree; } });
|
|
34
|
+
var SearchInFiles_1 = require("./SearchInFiles");
|
|
35
|
+
Object.defineProperty(exports, "SearchInFiles", { enumerable: true, get: function () { return SearchInFiles_1.SearchInFiles; } });
|
|
36
|
+
var SearchSymbol_1 = require("./SearchSymbol");
|
|
37
|
+
Object.defineProperty(exports, "SearchSymbol", { enumerable: true, get: function () { return SearchSymbol_1.SearchSymbol; } });
|
|
38
|
+
var AnalyzeDependencies_1 = require("./AnalyzeDependencies");
|
|
39
|
+
Object.defineProperty(exports, "AnalyzeDependencies", { enumerable: true, get: function () { return AnalyzeDependencies_1.AnalyzeDependencies; } });
|
|
40
|
+
var GitStatus_1 = require("./GitStatus");
|
|
41
|
+
Object.defineProperty(exports, "GitStatus", { enumerable: true, get: function () { return GitStatus_1.GitStatus; } });
|
|
42
|
+
var GitDiff_1 = require("./GitDiff");
|
|
43
|
+
Object.defineProperty(exports, "GitDiff", { enumerable: true, get: function () { return GitDiff_1.GitDiff; } });
|
|
44
|
+
var GitLog_1 = require("./GitLog");
|
|
45
|
+
Object.defineProperty(exports, "GitLog", { enumerable: true, get: function () { return GitLog_1.GitLog; } });
|
|
46
|
+
var ShellCmd_1 = require("./ShellCmd");
|
|
47
|
+
Object.defineProperty(exports, "ShellCmd", { enumerable: true, get: function () { return ShellCmd_1.ShellCmd; } });
|
|
48
|
+
var CodeDiff_1 = require("./CodeDiff");
|
|
49
|
+
Object.defineProperty(exports, "CodeDiff", { enumerable: true, get: function () { return CodeDiff_1.CodeDiff; } });
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/tools/index.ts"],"names":[],"mappings":";;;AACA,uCAA0C;AAAjC,wGAAA,YAAY,OAAA;AACrB,iCAUiB;AATf,4GAAA,mBAAmB,OAAA;AACnB,oGAAA,WAAW,OAAA;AACX,yGAAA,gBAAgB,OAAA;AAChB,wGAAA,eAAe,OAAA;AACf,wGAAA,eAAe,OAAA;AACf,0GAAA,iBAAiB,OAAA;AACjB,2GAAA,kBAAkB,OAAA;AAClB,mGAAA,UAAU,OAAA;AACV,sGAAA,aAAa,OAAA;AAGf,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AACtB,+DAA8D;AAArD,4HAAA,oBAAoB,OAAA;AAC7B,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAClB,2CAA0C;AAAjC,wGAAA,UAAU,OAAA;AACnB,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,qDAAoD;AAA3C,kHAAA,eAAe,OAAA;AACxB,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAClB,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAC1B,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AACtB,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,6DAA4D;AAAnD,0HAAA,mBAAmB,OAAA;AAC5B,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAClB,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,mCAAkC;AAAzB,gGAAA,MAAM,OAAA;AACf,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a path and validate it's safe to access.
|
|
3
|
+
*
|
|
4
|
+
* @param targetPath The path to validate (may be relative or contain symlinks)
|
|
5
|
+
* @param allowedCwd The root directory that access should be confined to
|
|
6
|
+
* @returns The resolved absolute path if safe
|
|
7
|
+
* @throws Error if the path is outside allowedCwd or points to a system path
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveAndValidate(targetPath: string, allowedCwd: string): Promise<string>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.resolveAndValidate = resolveAndValidate;
|
|
7
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
/**
|
|
10
|
+
* Known dangerous system paths that should never be accessed,
|
|
11
|
+
* even if they happen to be under allowedCwd (e.g. via symlink).
|
|
12
|
+
*/
|
|
13
|
+
const SYSTEM_PATHS = [
|
|
14
|
+
'/etc', '/usr', '/var', '/tmp', '/root', '/home',
|
|
15
|
+
'/System', '/Library', '/Applications',
|
|
16
|
+
'/dev', '/proc', '/sys', '/boot'
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Resolve a path and validate it's safe to access.
|
|
20
|
+
*
|
|
21
|
+
* @param targetPath The path to validate (may be relative or contain symlinks)
|
|
22
|
+
* @param allowedCwd The root directory that access should be confined to
|
|
23
|
+
* @returns The resolved absolute path if safe
|
|
24
|
+
* @throws Error if the path is outside allowedCwd or points to a system path
|
|
25
|
+
*/
|
|
26
|
+
async function resolveAndValidate(targetPath, allowedCwd) {
|
|
27
|
+
// 1. Normalize to absolute path
|
|
28
|
+
const resolved = path_1.default.resolve(allowedCwd, targetPath);
|
|
29
|
+
// 2. Check against known system paths (string-level check, fast)
|
|
30
|
+
for (const sysPath of SYSTEM_PATHS) {
|
|
31
|
+
if (resolved === sysPath || resolved.startsWith(sysPath + '/')) {
|
|
32
|
+
throw new Error(`Access denied: ${resolved} is a protected system path`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// 3. Resolve symlinks to get the real path
|
|
36
|
+
let realPath;
|
|
37
|
+
try {
|
|
38
|
+
realPath = await promises_1.default.realpath(resolved);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
// File may not exist yet (e.g. write_file creating new file)
|
|
42
|
+
// For non-existent files, validate the parent directory
|
|
43
|
+
const parentDir = path_1.default.dirname(resolved);
|
|
44
|
+
try {
|
|
45
|
+
const realParent = await promises_1.default.realpath(parentDir);
|
|
46
|
+
if (!isPathInScope(realParent, allowedCwd)) {
|
|
47
|
+
throw new Error(`Access denied: parent directory of ${resolved} is outside allowed workspace`);
|
|
48
|
+
}
|
|
49
|
+
return resolved;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Parent doesn't exist either — allow it (write_file will create dirs)
|
|
53
|
+
// But still check that the resolved path is under allowedCwd
|
|
54
|
+
if (!isPathInScope(resolved, allowedCwd)) {
|
|
55
|
+
throw new Error(`Access denied: ${resolved} is outside allowed workspace`);
|
|
56
|
+
}
|
|
57
|
+
return resolved;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// 4. Validate real path is under allowedCwd
|
|
61
|
+
if (!isPathInScope(realPath, allowedCwd)) {
|
|
62
|
+
throw new Error(`Access denied: ${realPath} resolves outside allowed workspace (${allowedCwd})`);
|
|
63
|
+
}
|
|
64
|
+
// 5. Double-check: real path shouldn't point to system paths (symlink escape)
|
|
65
|
+
for (const sysPath of SYSTEM_PATHS) {
|
|
66
|
+
if (realPath === sysPath || realPath.startsWith(sysPath + '/')) {
|
|
67
|
+
throw new Error(`Access denied: ${targetPath} resolves to protected system path ${realPath}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return realPath;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check if a resolved path is within the allowed scope.
|
|
74
|
+
* Both paths should already be absolute/normalized.
|
|
75
|
+
*/
|
|
76
|
+
function isPathInScope(targetPath, allowedCwd) {
|
|
77
|
+
const normalizedTarget = path_1.default.normalize(targetPath);
|
|
78
|
+
const normalizedCwd = path_1.default.normalize(allowedCwd);
|
|
79
|
+
// Ensure allowedCwd has a trailing separator for proper prefix check
|
|
80
|
+
const cwdPrefix = normalizedCwd.endsWith(path_1.default.sep)
|
|
81
|
+
? normalizedCwd
|
|
82
|
+
: normalizedCwd + path_1.default.sep;
|
|
83
|
+
return normalizedTarget === normalizedCwd || normalizedTarget.startsWith(cwdPrefix);
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=pathSafety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathSafety.js","sourceRoot":"","sources":["../../../src/agent/tools/pathSafety.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Tool } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Tool registry — manages tool registration and lookup.
|
|
4
|
+
*/
|
|
5
|
+
export declare class ToolRegistry {
|
|
6
|
+
private tools;
|
|
7
|
+
/**
|
|
8
|
+
* Register a tool instance.
|
|
9
|
+
*/
|
|
10
|
+
register(tool: Tool): void;
|
|
11
|
+
/**
|
|
12
|
+
* Register multiple tools at once.
|
|
13
|
+
*/
|
|
14
|
+
registerAll(tools: Tool[]): void;
|
|
15
|
+
/**
|
|
16
|
+
* Get a tool by name.
|
|
17
|
+
*/
|
|
18
|
+
get(name: string): Tool | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Check if a tool exists.
|
|
21
|
+
*/
|
|
22
|
+
has(name: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Get all registered tool names.
|
|
25
|
+
*/
|
|
26
|
+
names(): string[];
|
|
27
|
+
/**
|
|
28
|
+
* Get all registered tool instances.
|
|
29
|
+
*/
|
|
30
|
+
all(): Tool[];
|
|
31
|
+
/**
|
|
32
|
+
* Generate tool definitions for LLM prompt (JSON schema format).
|
|
33
|
+
*/
|
|
34
|
+
generateDefinitions(): Array<{
|
|
35
|
+
name: string;
|
|
36
|
+
description: string;
|
|
37
|
+
parameters: Record<string, any>;
|
|
38
|
+
}>;
|
|
39
|
+
private parametersToSchema;
|
|
40
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ToolRegistry = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Tool registry — manages tool registration and lookup.
|
|
6
|
+
*/
|
|
7
|
+
class ToolRegistry {
|
|
8
|
+
tools = new Map();
|
|
9
|
+
/**
|
|
10
|
+
* Register a tool instance.
|
|
11
|
+
*/
|
|
12
|
+
register(tool) {
|
|
13
|
+
this.tools.set(tool.name, tool);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Register multiple tools at once.
|
|
17
|
+
*/
|
|
18
|
+
registerAll(tools) {
|
|
19
|
+
for (const t of tools) {
|
|
20
|
+
this.register(t);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get a tool by name.
|
|
25
|
+
*/
|
|
26
|
+
get(name) {
|
|
27
|
+
return this.tools.get(name);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if a tool exists.
|
|
31
|
+
*/
|
|
32
|
+
has(name) {
|
|
33
|
+
return this.tools.has(name);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get all registered tool names.
|
|
37
|
+
*/
|
|
38
|
+
names() {
|
|
39
|
+
return Array.from(this.tools.keys());
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get all registered tool instances.
|
|
43
|
+
*/
|
|
44
|
+
all() {
|
|
45
|
+
return Array.from(this.tools.values());
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Generate tool definitions for LLM prompt (JSON schema format).
|
|
49
|
+
*/
|
|
50
|
+
generateDefinitions() {
|
|
51
|
+
return this.all().map(t => ({
|
|
52
|
+
name: t.name,
|
|
53
|
+
description: t.description,
|
|
54
|
+
parameters: this.parametersToSchema(t.parameters)
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
parametersToSchema(params) {
|
|
58
|
+
const properties = {};
|
|
59
|
+
const required = [];
|
|
60
|
+
for (const p of params) {
|
|
61
|
+
properties[p.name] = {
|
|
62
|
+
type: p.type === 'array' ? 'array' : p.type,
|
|
63
|
+
description: p.description
|
|
64
|
+
};
|
|
65
|
+
if (p.required) {
|
|
66
|
+
required.push(p.name);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
type: 'object',
|
|
71
|
+
properties,
|
|
72
|
+
required
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.ToolRegistry = ToolRegistry;
|
|
77
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/agent/tools/registry.ts"],"names":[],"mappings":";;;AAGA;;GAEG;AACH,MAAa,YAAY;IACf,KAAK,GAAsB,IAAI,GAAG,EAAE,CAAC;IAE7C;;OAEG;IACH,QAAQ,CAAC,IAAU;QACjB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAAa;QACvB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,GAAG;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,UAAU,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC;SAClD,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,kBAAkB,CAAC,MAAuB;QAChD,MAAM,UAAU,GAAwB,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG;gBACnB,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;gBAC3C,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC;YACF,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACf,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,QAAQ;SACT,CAAC;IACJ,CAAC;CACF;AA9ED,oCA8EC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ToolExecutionResult } from '../state';
|
|
2
|
+
import { CapabilityLevel } from '../../core/capability/CapabilityLevel';
|
|
3
|
+
/**
|
|
4
|
+
* Parameter definition for a tool.
|
|
5
|
+
*/
|
|
6
|
+
export interface ToolParameter {
|
|
7
|
+
name: string;
|
|
8
|
+
type: 'string' | 'number' | 'boolean' | 'array';
|
|
9
|
+
required: boolean;
|
|
10
|
+
description: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Abstract tool interface — each tool implementation must satisfy this.
|
|
14
|
+
*/
|
|
15
|
+
export interface Tool {
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
parameters: ToolParameter[];
|
|
19
|
+
capabilityLevel?: CapabilityLevel;
|
|
20
|
+
execute(params: Record<string, any>): Promise<ToolExecutionResult>;
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/agent/tools/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ToolExecutionResult } from '../state';
|
|
2
|
+
/**
|
|
3
|
+
* Get stored read position for a file (used by continue_reading).
|
|
4
|
+
*/
|
|
5
|
+
export declare function getReadPosition(filePath: string): number | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* Set read position for a file.
|
|
8
|
+
*/
|
|
9
|
+
export declare function setReadPosition(filePath: string, position: number): void;
|
|
10
|
+
/**
|
|
11
|
+
* Clear read position for a file.
|
|
12
|
+
*/
|
|
13
|
+
export declare function clearReadPosition(filePath: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Get the maximum output length threshold.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getMaxOutputLength(): number;
|
|
18
|
+
/**
|
|
19
|
+
* Intelligently truncate output.
|
|
20
|
+
* When output exceeds the limit, returns truncated text with a suggestion block.
|
|
21
|
+
*/
|
|
22
|
+
export declare function maybeTruncateOutput(output: string, toolName?: string, filePath?: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Format byte count into human-readable string.
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatBytes(bytes: number): string;
|
|
27
|
+
/**
|
|
28
|
+
* Get user-friendly error message and suggestion for a given tool.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getFriendlyError(toolName: string, error: Error | {
|
|
31
|
+
message: string;
|
|
32
|
+
}): {
|
|
33
|
+
message: string;
|
|
34
|
+
suggestion: string;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Create a failed ToolExecutionResult from an error.
|
|
38
|
+
*/
|
|
39
|
+
export declare function failResult(error: string, output?: string): ToolExecutionResult;
|
|
40
|
+
/**
|
|
41
|
+
* Create a success ToolExecutionResult.
|
|
42
|
+
*/
|
|
43
|
+
export declare function successResult(output: string, artifacts?: string[]): ToolExecutionResult;
|