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.
Files changed (166) hide show
  1. package/dist/agent/AgentRuntime.d.ts +7 -23
  2. package/dist/agent/AgentRuntime.js +35 -542
  3. package/dist/agent/AgentRuntime.js.map +1 -1
  4. package/dist/agent/DualAgentRuntime.js +16 -16
  5. package/dist/agent/DualAgentRuntime.js.map +1 -1
  6. package/dist/agent/ExecutionCompleter.d.ts +31 -0
  7. package/dist/agent/ExecutionCompleter.js +83 -0
  8. package/dist/agent/ExecutionCompleter.js.map +1 -0
  9. package/dist/agent/ExecutionHandler.d.ts +34 -0
  10. package/dist/agent/ExecutionHandler.js +227 -0
  11. package/dist/agent/ExecutionHandler.js.map +1 -0
  12. package/dist/agent/ExecutionLearning.d.ts +8 -0
  13. package/dist/agent/ExecutionLearning.js +31 -0
  14. package/dist/agent/ExecutionLearning.js.map +1 -0
  15. package/dist/agent/ExecutionRecovery.d.ts +26 -0
  16. package/dist/agent/ExecutionRecovery.js +99 -0
  17. package/dist/agent/ExecutionRecovery.js.map +1 -0
  18. package/dist/agent/ExecutionStabilizer.d.ts +20 -0
  19. package/dist/agent/ExecutionStabilizer.js +101 -0
  20. package/dist/agent/ExecutionStabilizer.js.map +1 -0
  21. package/dist/agent/ExecutionTypes.d.ts +13 -0
  22. package/dist/agent/ExecutionTypes.js +9 -0
  23. package/dist/agent/ExecutionTypes.js.map +1 -0
  24. package/dist/agent/LLMCaller.d.ts +19 -0
  25. package/dist/agent/LLMCaller.js +103 -0
  26. package/dist/agent/LLMCaller.js.map +1 -0
  27. package/dist/agent/PreFlightChecker.d.ts +51 -0
  28. package/dist/agent/PreFlightChecker.js +148 -0
  29. package/dist/agent/PreFlightChecker.js.map +1 -0
  30. package/dist/agent/commandSemantics.js +12 -0
  31. package/dist/agent/commandSemantics.js.map +1 -1
  32. package/dist/agent/errorTracker.d.ts +10 -0
  33. package/dist/agent/errorTracker.js +36 -0
  34. package/dist/agent/errorTracker.js.map +1 -1
  35. package/dist/agent/executor.d.ts +12 -90
  36. package/dist/agent/executor.js +59 -881
  37. package/dist/agent/executor.js.map +1 -1
  38. package/dist/agent/governance/core.js.map +1 -1
  39. package/dist/agent/governance/riskScoring.js +6 -3
  40. package/dist/agent/governance/riskScoring.js.map +1 -1
  41. package/dist/agent/governance.js +4 -36
  42. package/dist/agent/governance.js.map +1 -1
  43. package/dist/agent/llm.js +11 -17
  44. package/dist/agent/llm.js.map +1 -1
  45. package/dist/agent/policy/engine.d.ts +2 -5
  46. package/dist/agent/policy/engine.js.map +1 -1
  47. package/dist/agent/policy/index.d.ts +1 -0
  48. package/dist/agent/policy/index.js +1 -0
  49. package/dist/agent/policy/index.js.map +1 -1
  50. package/dist/agent/policy/policies/WorkdirWrite.d.ts +11 -0
  51. package/dist/agent/policy/policies/WorkdirWrite.js +65 -0
  52. package/dist/agent/policy/policies/WorkdirWrite.js.map +1 -0
  53. package/dist/agent/policy/policies/noDangerousShell.js +1 -1
  54. package/dist/agent/policy/policies/noDangerousShell.js.map +1 -1
  55. package/dist/agent/policy/types.d.ts +6 -4
  56. package/dist/agent/skills.d.ts +12 -17
  57. package/dist/agent/skills.js +45 -52
  58. package/dist/agent/skills.js.map +1 -1
  59. package/dist/agent/state.d.ts +33 -3
  60. package/dist/agent/state.js +14 -0
  61. package/dist/agent/state.js.map +1 -1
  62. package/dist/agent/tools/AnalyzeDependencies.d.ts +9 -0
  63. package/dist/agent/tools/AnalyzeDependencies.js +91 -0
  64. package/dist/agent/tools/AnalyzeDependencies.js.map +1 -0
  65. package/dist/agent/tools/AppendFile.d.ts +8 -0
  66. package/dist/agent/tools/AppendFile.js +36 -0
  67. package/dist/agent/tools/AppendFile.js.map +1 -0
  68. package/dist/agent/tools/CodeDiff.d.ts +8 -0
  69. package/dist/agent/tools/CodeDiff.js +36 -0
  70. package/dist/agent/tools/CodeDiff.js.map +1 -0
  71. package/dist/agent/tools/ContinueReading.d.ts +8 -0
  72. package/dist/agent/tools/ContinueReading.js +59 -0
  73. package/dist/agent/tools/ContinueReading.js.map +1 -0
  74. package/dist/agent/tools/FileInfo.d.ts +8 -0
  75. package/dist/agent/tools/FileInfo.js +43 -0
  76. package/dist/agent/tools/FileInfo.js.map +1 -0
  77. package/dist/agent/tools/GitDiff.d.ts +8 -0
  78. package/dist/agent/tools/GitDiff.js +40 -0
  79. package/dist/agent/tools/GitDiff.js.map +1 -0
  80. package/dist/agent/tools/GitLog.d.ts +8 -0
  81. package/dist/agent/tools/GitLog.js +36 -0
  82. package/dist/agent/tools/GitLog.js.map +1 -0
  83. package/dist/agent/tools/GitStatus.d.ts +8 -0
  84. package/dist/agent/tools/GitStatus.js +38 -0
  85. package/dist/agent/tools/GitStatus.js.map +1 -0
  86. package/dist/agent/tools/ListDirectoryTree.d.ts +9 -0
  87. package/dist/agent/tools/ListDirectoryTree.js +63 -0
  88. package/dist/agent/tools/ListDirectoryTree.js.map +1 -0
  89. package/dist/agent/tools/ListFiles.d.ts +9 -0
  90. package/dist/agent/tools/ListFiles.js +53 -0
  91. package/dist/agent/tools/ListFiles.js.map +1 -0
  92. package/dist/agent/tools/ReadFile.d.ts +8 -0
  93. package/dist/agent/tools/ReadFile.js +33 -0
  94. package/dist/agent/tools/ReadFile.js.map +1 -0
  95. package/dist/agent/tools/ReadFileLines.d.ts +8 -0
  96. package/dist/agent/tools/ReadFileLines.js +45 -0
  97. package/dist/agent/tools/ReadFileLines.js.map +1 -0
  98. package/dist/agent/tools/ReadFileLinesFromEnd.d.ts +8 -0
  99. package/dist/agent/tools/ReadFileLinesFromEnd.js +48 -0
  100. package/dist/agent/tools/ReadFileLinesFromEnd.js.map +1 -0
  101. package/dist/agent/tools/SearchInFiles.d.ts +8 -0
  102. package/dist/agent/tools/SearchInFiles.js +70 -0
  103. package/dist/agent/tools/SearchInFiles.js.map +1 -0
  104. package/dist/agent/tools/SearchSymbol.d.ts +8 -0
  105. package/dist/agent/tools/SearchSymbol.js +62 -0
  106. package/dist/agent/tools/SearchSymbol.js.map +1 -0
  107. package/dist/agent/tools/ShellCmd.d.ts +8 -0
  108. package/dist/agent/tools/ShellCmd.js +40 -0
  109. package/dist/agent/tools/ShellCmd.js.map +1 -0
  110. package/dist/agent/tools/WriteFile.d.ts +8 -0
  111. package/dist/agent/tools/WriteFile.js +35 -0
  112. package/dist/agent/tools/WriteFile.js.map +1 -0
  113. package/dist/agent/tools/index.d.ts +20 -0
  114. package/dist/agent/tools/index.js +50 -0
  115. package/dist/agent/tools/index.js.map +1 -0
  116. package/dist/agent/tools/pathSafety.d.ts +9 -0
  117. package/dist/agent/tools/pathSafety.js +85 -0
  118. package/dist/agent/tools/pathSafety.js.map +1 -0
  119. package/dist/agent/tools/registry.d.ts +40 -0
  120. package/dist/agent/tools/registry.js +77 -0
  121. package/dist/agent/tools/registry.js.map +1 -0
  122. package/dist/agent/tools/types.d.ts +21 -0
  123. package/dist/agent/tools/types.js +3 -0
  124. package/dist/agent/tools/types.js.map +1 -0
  125. package/dist/agent/tools/utils.d.ts +43 -0
  126. package/dist/agent/tools/utils.js +158 -0
  127. package/dist/agent/tools/utils.js.map +1 -0
  128. package/dist/agent/types.d.ts +5 -3
  129. package/dist/ai/client.d.ts +2 -2
  130. package/dist/ai/client.js +16 -23
  131. package/dist/ai/client.js.map +1 -1
  132. package/dist/audit/timeline.js +7 -5
  133. package/dist/audit/timeline.js.map +1 -1
  134. package/dist/cli.js +12 -6
  135. package/dist/cli.js.map +1 -1
  136. package/dist/commands/handleAIChat.js +1 -1
  137. package/dist/commands/handleAIChat.js.map +1 -1
  138. package/dist/commands/handleAICommand.js +3 -3
  139. package/dist/commands/handleAICommand.js.map +1 -1
  140. package/dist/commands/skillsCommands.js +4 -42
  141. package/dist/commands/skillsCommands.js.map +1 -1
  142. package/dist/core/ConfigService.d.ts +87 -0
  143. package/dist/core/ConfigService.js +259 -0
  144. package/dist/core/ConfigService.js.map +1 -0
  145. package/dist/core/executionRecord.d.ts +1 -1
  146. package/dist/core/explain.js +2 -2
  147. package/dist/core/explain.js.map +1 -1
  148. package/dist/core/git/BackupManager.d.ts +30 -0
  149. package/dist/core/git/BackupManager.js +153 -0
  150. package/dist/core/git/BackupManager.js.map +1 -0
  151. package/dist/core/git/ConflictResolver.js.map +1 -1
  152. package/dist/core/replayDiff.js +5 -5
  153. package/dist/core/replayDiff.js.map +1 -1
  154. package/dist/core/skillTypes.d.ts +22 -0
  155. package/dist/core/skillTypes.js +17 -0
  156. package/dist/core/skillTypes.js.map +1 -0
  157. package/dist/utils/Logger.d.ts +24 -5
  158. package/dist/utils/Logger.js +89 -63
  159. package/dist/utils/Logger.js.map +1 -1
  160. package/dist/utils/storage.d.ts +22 -0
  161. package/dist/utils/storage.js +62 -0
  162. package/dist/utils/storage.js.map +1 -0
  163. package/package.json +3 -1
  164. package/dist/core/ConfigManager.d.ts +0 -39
  165. package/dist/core/ConfigManager.js +0 -127
  166. package/dist/core/ConfigManager.js.map +0 -1
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitDiff = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const util_1 = require("util");
6
+ const utils_1 = require("./utils");
7
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
8
+ class GitDiff {
9
+ name = 'git_diff';
10
+ description = '查看 Git 差异';
11
+ parameters = [
12
+ { name: 'file', type: 'string', required: false, description: '指定文件' },
13
+ { name: 'cached', type: 'boolean', required: false, description: '是否查看已暂存的差异' },
14
+ { name: 'lines', type: 'number', required: false, description: '限制显示行数' }
15
+ ];
16
+ async execute(params) {
17
+ try {
18
+ let cmd = 'git diff';
19
+ if (params.cached)
20
+ cmd += ' --cached';
21
+ if (params.file)
22
+ cmd += ` -- ${params.file}`;
23
+ if (params.lines)
24
+ cmd += ` | head -n ${params.lines}`;
25
+ const { stdout } = await execAsync(cmd, {
26
+ maxBuffer: 10 * 1024 * 1024,
27
+ cwd: process.cwd()
28
+ });
29
+ if (!stdout.trim()) {
30
+ return (0, utils_1.successResult)(params.file ? `文件 ${params.file} 没有更改` : '没有更改');
31
+ }
32
+ return (0, utils_1.successResult)(stdout);
33
+ }
34
+ catch (error) {
35
+ return (0, utils_1.failResult)(error.message);
36
+ }
37
+ }
38
+ }
39
+ exports.GitDiff = GitDiff;
40
+ //# sourceMappingURL=GitDiff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitDiff.js","sourceRoot":"","sources":["../../../src/agent/tools/GitDiff.ts"],"names":[],"mappings":";;;AAAA,iDAAqC;AACrC,+BAAiC;AAGjC,mCAAoD;AAEpD,MAAM,SAAS,GAAG,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAC;AAElC,MAAa,OAAO;IAClB,IAAI,GAAG,UAAU,CAAC;IAClB,WAAW,GAAG,WAAW,CAAC;IAC1B,UAAU,GAAoB;QAC5B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE;QACtE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE;QAC/E,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE;KAC1E,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,MAA2B;QACvC,IAAI,CAAC;YACH,IAAI,GAAG,GAAG,UAAU,CAAC;YACrB,IAAI,MAAM,CAAC,MAAM;gBAAE,GAAG,IAAI,WAAW,CAAC;YACtC,IAAI,MAAM,CAAC,IAAI;gBAAE,GAAG,IAAI,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;YAC7C,IAAI,MAAM,CAAC,KAAK;gBAAE,GAAG,IAAI,cAAc,MAAM,CAAC,KAAK,EAAE,CAAC;YAEtD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;gBACtC,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,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACxE,CAAC;YAED,OAAO,IAAA,qBAAa,EAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,IAAA,kBAAU,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;CACF;AA9BD,0BA8BC"}
@@ -0,0 +1,8 @@
1
+ import { Tool, ToolParameter } from './types';
2
+ import { ToolExecutionResult } from '../state';
3
+ export declare class GitLog implements Tool {
4
+ name: string;
5
+ description: string;
6
+ parameters: ToolParameter[];
7
+ execute(params: Record<string, any>): Promise<ToolExecutionResult>;
8
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitLog = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const util_1 = require("util");
6
+ const utils_1 = require("./utils");
7
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
8
+ class GitLog {
9
+ name = 'git_log';
10
+ description = '查看 Git 提交历史';
11
+ parameters = [
12
+ { name: 'max_count', type: 'number', required: false, description: '最大显示条数' },
13
+ { name: 'file', type: 'string', required: false, description: '指定文件的历史' },
14
+ { name: 'oneline', type: 'boolean', required: false, description: '是否单行显示' }
15
+ ];
16
+ async execute(params) {
17
+ try {
18
+ const maxCount = params.max_count || 10;
19
+ const oneline = params.oneline !== false;
20
+ let cmd = `git log -n ${maxCount}`;
21
+ if (oneline)
22
+ cmd += ' --oneline';
23
+ if (params.file)
24
+ cmd += ` -- ${params.file}`;
25
+ const { stdout } = await execAsync(cmd, {
26
+ cwd: process.cwd()
27
+ });
28
+ return (0, utils_1.successResult)(stdout || '没有提交历史');
29
+ }
30
+ catch (error) {
31
+ return (0, utils_1.failResult)(error.message);
32
+ }
33
+ }
34
+ }
35
+ exports.GitLog = GitLog;
36
+ //# sourceMappingURL=GitLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitLog.js","sourceRoot":"","sources":["../../../src/agent/tools/GitLog.ts"],"names":[],"mappings":";;;AAAA,iDAAqC;AACrC,+BAAiC;AAGjC,mCAAoD;AAEpD,MAAM,SAAS,GAAG,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAC;AAElC,MAAa,MAAM;IACjB,IAAI,GAAG,SAAS,CAAC;IACjB,WAAW,GAAG,aAAa,CAAC;IAC5B,UAAU,GAAoB;QAC5B,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE;QAC7E,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE;QACzE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE;KAC7E,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,MAA2B;QACvC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC;YAEzC,IAAI,GAAG,GAAG,cAAc,QAAQ,EAAE,CAAC;YACnC,IAAI,OAAO;gBAAE,GAAG,IAAI,YAAY,CAAC;YACjC,IAAI,MAAM,CAAC,IAAI;gBAAE,GAAG,IAAI,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;YAE7C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;gBACtC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;aACnB,CAAC,CAAC;YAEH,OAAO,IAAA,qBAAa,EAAC,MAAM,IAAI,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,IAAA,kBAAU,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;CACF;AA3BD,wBA2BC"}
@@ -0,0 +1,8 @@
1
+ import { Tool, ToolParameter } from './types';
2
+ import { ToolExecutionResult } from '../state';
3
+ export declare class GitStatus implements Tool {
4
+ name: string;
5
+ description: string;
6
+ parameters: ToolParameter[];
7
+ execute(params: Record<string, any>): Promise<ToolExecutionResult>;
8
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitStatus = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const util_1 = require("util");
6
+ const utils_1 = require("./utils");
7
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
8
+ class GitStatus {
9
+ name = 'git_status';
10
+ description = '查看 Git 仓库当前状态';
11
+ parameters = [
12
+ { name: 'path', type: 'string', required: false, description: '仓库路径' }
13
+ ];
14
+ async execute(params) {
15
+ const repoPath = params.path || '.';
16
+ try {
17
+ const { stdout: porcelain } = await execAsync(`git -C ${repoPath} status --porcelain -b`, {
18
+ cwd: process.cwd()
19
+ });
20
+ const { stdout: branchInfo } = await execAsync(`git -C ${repoPath} branch --show-current`, {
21
+ cwd: process.cwd()
22
+ });
23
+ let output = `当前分支: ${branchInfo.trim()}\n\n`;
24
+ if (!porcelain.trim()) {
25
+ output += '工作区干净,没有未提交的更改';
26
+ }
27
+ else {
28
+ output += '未提交的更改:\n' + porcelain;
29
+ }
30
+ return (0, utils_1.successResult)(output);
31
+ }
32
+ catch (error) {
33
+ return (0, utils_1.failResult)(error.message, '不是 Git 仓库或 Git 命令执行失败');
34
+ }
35
+ }
36
+ }
37
+ exports.GitStatus = GitStatus;
38
+ //# sourceMappingURL=GitStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitStatus.js","sourceRoot":"","sources":["../../../src/agent/tools/GitStatus.ts"],"names":[],"mappings":";;;AAAA,iDAAqC;AACrC,+BAAiC;AAGjC,mCAAoD;AAEpD,MAAM,SAAS,GAAG,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAC;AAElC,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,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE;KACvE,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,MAA2B;QACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,SAAS,CAAC,UAAU,QAAQ,wBAAwB,EAAE;gBACxF,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;aACnB,CAAC,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,SAAS,CAAC,UAAU,QAAQ,wBAAwB,EAAE;gBACzF,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;aACnB,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,SAAS,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC;YAC9C,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,gBAAgB,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,WAAW,GAAG,SAAS,CAAC;YACpC,CAAC;YAED,OAAO,IAAA,qBAAa,EAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,IAAA,kBAAU,EAAC,KAAK,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;CACF;AA9BD,8BA8BC"}
@@ -0,0 +1,9 @@
1
+ import { Tool, ToolParameter } from './types';
2
+ import { ToolExecutionResult } from '../state';
3
+ export declare class ListDirectoryTree implements Tool {
4
+ name: string;
5
+ description: string;
6
+ parameters: ToolParameter[];
7
+ execute(params: Record<string, any>): Promise<ToolExecutionResult>;
8
+ private buildTree;
9
+ }
@@ -0,0 +1,63 @@
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.ListDirectoryTree = 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 ListDirectoryTree {
13
+ name = 'list_directory_tree';
14
+ description = '生成目录结构的树形展示';
15
+ parameters = [
16
+ { name: 'path', type: 'string', required: false, description: '目录路径' },
17
+ { name: 'max_depth', type: 'number', required: false, description: '最大深度' },
18
+ { name: 'include_files', type: 'boolean', required: false, description: '是否包含文件' },
19
+ { name: 'exclude_patterns', type: 'array', required: false, description: '排除的模式列表' }
20
+ ];
21
+ async execute(params) {
22
+ const dirPath = params.path || '.';
23
+ const maxDepth = params.max_depth || 3;
24
+ const includeFiles = params.include_files !== false;
25
+ const excludePatterns = params.exclude_patterns || ['node_modules', '.git', 'dist', 'build'];
26
+ try {
27
+ const safeDir = await (0, pathSafety_1.resolveAndValidate)(dirPath, executor_1.ToolExecutor.getAllowedCwd());
28
+ const tree = await this.buildTree(safeDir, maxDepth, includeFiles, excludePatterns, 0);
29
+ return (0, utils_1.successResult)(tree);
30
+ }
31
+ catch (error) {
32
+ if (error.message?.includes('Access denied')) {
33
+ return (0, utils_1.failResult)(error.message);
34
+ }
35
+ return (0, utils_1.failResult)(error.message);
36
+ }
37
+ }
38
+ async buildTree(dirPath, maxDepth, includeFiles, excludePatterns, currentDepth) {
39
+ if (currentDepth >= maxDepth)
40
+ return '';
41
+ const entries = await promises_1.default.readdir(dirPath, { withFileTypes: true });
42
+ const lines = [];
43
+ for (let i = 0; i < entries.length; i++) {
44
+ const entry = entries[i];
45
+ if (excludePatterns.some(pattern => entry.name.includes(pattern)))
46
+ continue;
47
+ const prefix = currentDepth === 0 ? '' : '│ '.repeat(currentDepth);
48
+ const connector = i === entries.length - 1 ? '└── ' : '├── ';
49
+ if (entry.isDirectory()) {
50
+ lines.push(`${prefix}${connector}${entry.name}/`);
51
+ const subTree = await this.buildTree(path_1.default.join(dirPath, entry.name), maxDepth, includeFiles, excludePatterns, currentDepth + 1);
52
+ if (subTree)
53
+ lines.push(subTree);
54
+ }
55
+ else if (includeFiles) {
56
+ lines.push(`${prefix}${connector}${entry.name}`);
57
+ }
58
+ }
59
+ return lines.join('\n');
60
+ }
61
+ }
62
+ exports.ListDirectoryTree = ListDirectoryTree;
63
+ //# sourceMappingURL=ListDirectoryTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListDirectoryTree.js","sourceRoot":"","sources":["../../../src/agent/tools/ListDirectoryTree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Tool, ToolParameter } from './types';
2
+ import { ToolExecutionResult } from '../state';
3
+ export declare class ListFiles implements Tool {
4
+ name: string;
5
+ description: string;
6
+ parameters: ToolParameter[];
7
+ execute(params: Record<string, any>): Promise<ToolExecutionResult>;
8
+ private getFiles;
9
+ }
@@ -0,0 +1,53 @@
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.ListFiles = void 0;
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ const utils_1 = require("./utils");
9
+ const pathSafety_1 = require("./pathSafety");
10
+ const executor_1 = require("../executor");
11
+ class ListFiles {
12
+ name = 'list_files';
13
+ description = '列出目录中的文件和子目录';
14
+ parameters = [
15
+ { name: 'path', type: 'string', required: false, description: '目录路径' },
16
+ { name: 'recursive', type: 'boolean', required: false, description: '是否递归列出子目录' }
17
+ ];
18
+ async execute(params) {
19
+ const dirPath = params.path || '.';
20
+ const recursive = params.recursive || false;
21
+ try {
22
+ const safeDir = await (0, pathSafety_1.resolveAndValidate)(dirPath, executor_1.ToolExecutor.getAllowedCwd());
23
+ const files = await this.getFiles(safeDir, recursive);
24
+ return (0, utils_1.successResult)(JSON.stringify(files, null, 2), files.map(f => f.path));
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
+ async getFiles(dir, recursive) {
34
+ const entries = await promises_1.default.readdir(dir, { withFileTypes: true });
35
+ const files = [];
36
+ for (const entry of entries) {
37
+ const fullPath = `${dir}/${entry.name}`;
38
+ if (entry.isDirectory()) {
39
+ files.push({ path: fullPath, type: 'directory' });
40
+ if (recursive) {
41
+ const subFiles = await this.getFiles(fullPath, recursive);
42
+ files.push(...subFiles);
43
+ }
44
+ }
45
+ else {
46
+ files.push({ path: fullPath, type: 'file' });
47
+ }
48
+ }
49
+ return files;
50
+ }
51
+ }
52
+ exports.ListFiles = ListFiles;
53
+ //# sourceMappingURL=ListFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListFiles.js","sourceRoot":"","sources":["../../../src/agent/tools/ListFiles.ts"],"names":[],"mappings":";;;;;;AAAA,2DAA6B;AAG7B,mCAAoD;AACpD,6CAAkD;AAClD,0CAA2C;AAE3C,MAAa,SAAS;IACpB,IAAI,GAAG,YAAY,CAAC;IACpB,WAAW,GAAG,cAAc,CAAC;IAC7B,UAAU,GAAoB;QAC5B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE;QACtE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE;KAClF,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,MAA2B;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC;QACnC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC;QAE5C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,+BAAkB,EAAC,OAAO,EAAE,uBAAY,CAAC,aAAa,EAAE,CAAC,CAAC;YAChF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACtD,OAAO,IAAA,qBAAa,EAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/E,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;IAEO,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,SAAkB;QACpD,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,MAAM,KAAK,GAA0C,EAAE,CAAC;QAExD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAExC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;gBAClD,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;oBAC1D,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA5CD,8BA4CC"}
@@ -0,0 +1,8 @@
1
+ import { Tool, ToolParameter } from './types';
2
+ import { ToolExecutionResult } from '../state';
3
+ export declare class ReadFile implements Tool {
4
+ name: string;
5
+ description: string;
6
+ parameters: ToolParameter[];
7
+ execute(params: Record<string, any>): Promise<ToolExecutionResult>;
8
+ }
@@ -0,0 +1,33 @@
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.ReadFile = void 0;
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ const utils_1 = require("./utils");
9
+ const pathSafety_1 = require("./pathSafety");
10
+ const executor_1 = require("../executor");
11
+ class ReadFile {
12
+ name = 'read_file';
13
+ description = '读取文件的完整内容';
14
+ parameters = [
15
+ { name: 'path', type: 'string', required: true, description: '文件路径' }
16
+ ];
17
+ async execute(params) {
18
+ try {
19
+ const safePath = await (0, pathSafety_1.resolveAndValidate)(params.path, executor_1.ToolExecutor.getAllowedCwd());
20
+ const content = await promises_1.default.readFile(safePath, 'utf-8');
21
+ return (0, utils_1.successResult)(content, [safePath]);
22
+ }
23
+ catch (error) {
24
+ if (error.message?.includes('Access denied')) {
25
+ return (0, utils_1.failResult)(error.message);
26
+ }
27
+ const friendly = (0, utils_1.getFriendlyError)(this.name, error);
28
+ return { success: false, error: friendly.message, output: friendly.suggestion };
29
+ }
30
+ }
31
+ }
32
+ exports.ReadFile = ReadFile;
33
+ //# sourceMappingURL=ReadFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadFile.js","sourceRoot":"","sources":["../../../src/agent/tools/ReadFile.ts"],"names":[],"mappings":";;;;;;AAAA,2DAA6B;AAG7B,mCAAsE;AACtE,6CAAkD;AAClD,0CAA2C;AAE3C,MAAa,QAAQ;IACnB,IAAI,GAAG,WAAW,CAAC;IACnB,WAAW,GAAG,WAAW,CAAC;IAC1B,UAAU,GAAoB;QAC5B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE;KACtE,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,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,IAAA,qBAAa,EAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5C,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,MAAM,QAAQ,GAAG,IAAA,wBAAgB,EAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACpD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;QAClF,CAAC;IACH,CAAC;CACF;AApBD,4BAoBC"}
@@ -0,0 +1,8 @@
1
+ import { Tool, ToolParameter } from './types';
2
+ import { ToolExecutionResult } from '../state';
3
+ export declare class ReadFileLines implements Tool {
4
+ name: string;
5
+ description: string;
6
+ parameters: ToolParameter[];
7
+ execute(params: Record<string, any>): Promise<ToolExecutionResult>;
8
+ }
@@ -0,0 +1,45 @@
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.ReadFileLines = void 0;
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ const utils_1 = require("./utils");
9
+ const pathSafety_1 = require("./pathSafety");
10
+ const executor_1 = require("../executor");
11
+ class ReadFileLines {
12
+ name = 'read_file_lines';
13
+ description = '读取文件的指定行范围';
14
+ parameters = [
15
+ { name: 'path', type: 'string', required: true, description: '文件路径' },
16
+ { name: 'start_line', type: 'number', required: false, description: '起始行号(从1开始)' },
17
+ { name: 'end_line', type: 'number', required: false, description: '结束行号(包含)' },
18
+ { name: 'encoding', type: 'string', required: false, description: '文件编码' }
19
+ ];
20
+ async execute(params) {
21
+ try {
22
+ const safePath = await (0, pathSafety_1.resolveAndValidate)(params.path, executor_1.ToolExecutor.getAllowedCwd());
23
+ const content = await promises_1.default.readFile(safePath, params.encoding || 'utf-8');
24
+ const lines = String(content).split('\n');
25
+ const startIndex = Math.max(0, (params.start_line || 1) - 1);
26
+ const endIndex = params.end_line ? Math.min(lines.length, params.end_line) : lines.length;
27
+ if (startIndex >= lines.length) {
28
+ return (0, utils_1.failResult)(`起始行号 ${params.start_line || 1} 超出文件范围(文件共 ${lines.length} 行)`);
29
+ }
30
+ const selectedLines = lines.slice(startIndex, endIndex);
31
+ const result = selectedLines
32
+ .map((line, idx) => `${startIndex + idx + 1}: ${line}`)
33
+ .join('\n');
34
+ return (0, utils_1.successResult)(result, [safePath]);
35
+ }
36
+ catch (error) {
37
+ if (error.message?.includes('Access denied')) {
38
+ return (0, utils_1.failResult)(error.message);
39
+ }
40
+ return (0, utils_1.failResult)(error.message);
41
+ }
42
+ }
43
+ }
44
+ exports.ReadFileLines = ReadFileLines;
45
+ //# sourceMappingURL=ReadFileLines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadFileLines.js","sourceRoot":"","sources":["../../../src/agent/tools/ReadFileLines.ts"],"names":[],"mappings":";;;;;;AAAA,2DAA6B;AAG7B,mCAAoD;AACpD,6CAAkD;AAClD,0CAA2C;AAE3C,MAAa,aAAa;IACxB,IAAI,GAAG,iBAAiB,CAAC;IACzB,WAAW,GAAG,YAAY,CAAC;IAC3B,UAAU,GAAoB;QAC5B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE;QACrE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE;QAClF,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE;QAC9E,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE;KAC3E,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,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAE1C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;YAE1F,IAAI,UAAU,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC/B,OAAO,IAAA,kBAAU,EAAC,QAAQ,MAAM,CAAC,UAAU,IAAI,CAAC,eAAe,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;YACpF,CAAC;YAED,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACxD,MAAM,MAAM,GAAG,aAAa;iBACzB,GAAG,CAAC,CAAC,IAAY,EAAE,GAAW,EAAE,EAAE,CAAC,GAAG,UAAU,GAAG,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;iBACtE,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO,IAAA,qBAAa,EAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3C,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;AApCD,sCAoCC"}
@@ -0,0 +1,8 @@
1
+ import { Tool, ToolParameter } from './types';
2
+ import { ToolExecutionResult } from '../state';
3
+ export declare class ReadFileLinesFromEnd implements Tool {
4
+ name: string;
5
+ description: string;
6
+ parameters: ToolParameter[];
7
+ execute(params: Record<string, any>): Promise<ToolExecutionResult>;
8
+ }
@@ -0,0 +1,48 @@
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.ReadFileLinesFromEnd = void 0;
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ const utils_1 = require("./utils");
9
+ const pathSafety_1 = require("./pathSafety");
10
+ const executor_1 = require("../executor");
11
+ class ReadFileLinesFromEnd {
12
+ name = 'read_file_lines_from_end';
13
+ description = '从文件末尾读取指定行数(倒数行)';
14
+ parameters = [
15
+ { name: 'path', type: 'string', required: true, description: '文件路径' },
16
+ { name: 'count', type: 'number', required: false, description: '要读取的行数' },
17
+ { name: 'start_offset', type: 'number', required: false, description: '从倒数第几行开始(0表示从最后一行开始)' },
18
+ { name: 'encoding', type: 'string', required: false, description: '文件编码' }
19
+ ];
20
+ async execute(params) {
21
+ try {
22
+ const safePath = await (0, pathSafety_1.resolveAndValidate)(params.path, executor_1.ToolExecutor.getAllowedCwd());
23
+ const content = await promises_1.default.readFile(safePath, params.encoding || 'utf-8');
24
+ const lines = String(content).split('\n');
25
+ const totalLines = lines.length;
26
+ const count = params.count || 10;
27
+ const startOffset = params.start_offset || 0;
28
+ const startIndex = Math.max(0, totalLines - count - startOffset);
29
+ const endIndex = totalLines;
30
+ if (totalLines === 0) {
31
+ return (0, utils_1.successResult)('(空文件)', [safePath]);
32
+ }
33
+ const selectedLines = lines.slice(startIndex, endIndex);
34
+ const result = selectedLines
35
+ .map((line, idx) => `${startIndex + idx + 1}: ${line}`)
36
+ .join('\n');
37
+ return (0, utils_1.successResult)(result, [safePath]);
38
+ }
39
+ catch (error) {
40
+ if (error.message?.includes('Access denied')) {
41
+ return (0, utils_1.failResult)(error.message);
42
+ }
43
+ return (0, utils_1.failResult)(error.message);
44
+ }
45
+ }
46
+ }
47
+ exports.ReadFileLinesFromEnd = ReadFileLinesFromEnd;
48
+ //# sourceMappingURL=ReadFileLinesFromEnd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadFileLinesFromEnd.js","sourceRoot":"","sources":["../../../src/agent/tools/ReadFileLinesFromEnd.ts"],"names":[],"mappings":";;;;;;AAAA,2DAA6B;AAG7B,mCAAoD;AACpD,6CAAkD;AAClD,0CAA2C;AAE3C,MAAa,oBAAoB;IAC/B,IAAI,GAAG,0BAA0B,CAAC;IAClC,WAAW,GAAG,kBAAkB,CAAC;IACjC,UAAU,GAAoB;QAC5B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE;QACrE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE;QACzE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAE;QAC9F,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE;KAC3E,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,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;YAEhC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;YAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,WAAW,CAAC,CAAC;YACjE,MAAM,QAAQ,GAAG,UAAU,CAAC;YAE5B,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,IAAA,qBAAa,EAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACxD,MAAM,MAAM,GAAG,aAAa;iBACzB,GAAG,CAAC,CAAC,IAAY,EAAE,GAAW,EAAE,EAAE,CAAC,GAAG,UAAU,GAAG,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;iBACtE,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO,IAAA,qBAAa,EAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3C,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;AAvCD,oDAuCC"}
@@ -0,0 +1,8 @@
1
+ import { Tool, ToolParameter } from './types';
2
+ import { ToolExecutionResult } from '../state';
3
+ export declare class SearchInFiles implements Tool {
4
+ name: string;
5
+ description: string;
6
+ parameters: ToolParameter[];
7
+ execute(params: Record<string, any>): Promise<ToolExecutionResult>;
8
+ }
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SearchInFiles = 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 SearchInFiles {
11
+ name = 'search_in_files';
12
+ description = '在文件中搜索指定内容(类似 grep)';
13
+ parameters = [
14
+ { name: 'pattern', type: 'string', required: true, description: '搜索模式/关键词' },
15
+ { name: 'path', type: 'string', required: false, description: '搜索路径' },
16
+ { name: 'file_pattern', type: 'string', required: false, description: '文件名模式' },
17
+ { name: 'ignore_case', type: 'boolean', required: false, description: '是否忽略大小写' },
18
+ { name: 'context_lines', type: 'number', required: false, description: '上下文行数' },
19
+ { name: 'max_results', type: 'number', required: false, description: '最大结果数' }
20
+ ];
21
+ async execute(params) {
22
+ const pattern = params.pattern;
23
+ const searchPath = params.path || '.';
24
+ const filePattern = params.file_pattern;
25
+ const ignoreCase = params.ignore_case || false;
26
+ const contextLines = params.context_lines || 0;
27
+ const maxResults = params.max_results || 100;
28
+ try {
29
+ const safePath = await (0, pathSafety_1.resolveAndValidate)(searchPath, executor_1.ToolExecutor.getAllowedCwd());
30
+ let baseCmd = 'grep';
31
+ if (ignoreCase)
32
+ baseCmd += ' -i';
33
+ baseCmd += ' -r';
34
+ if (contextLines > 0)
35
+ baseCmd += ` -C ${contextLines}`;
36
+ baseCmd += ` -n`;
37
+ const escapedPattern = pattern.replace(/'/g, "'\\''");
38
+ let grepCmd;
39
+ if (filePattern) {
40
+ grepCmd = `find ${safePath} -type f -name '${filePattern}' -exec grep ${ignoreCase ? '-i' : ''} -n -- '${escapedPattern}' {} + 2>/dev/null | head -n ${maxResults}`;
41
+ }
42
+ else {
43
+ grepCmd = `${baseCmd} -- '${escapedPattern}' ${safePath} 2>/dev/null | head -n ${maxResults}`;
44
+ }
45
+ const { stdout } = await execAsync(grepCmd, {
46
+ maxBuffer: 50 * 1024 * 1024,
47
+ cwd: process.cwd(),
48
+ shell: '/bin/bash'
49
+ });
50
+ const output = String(stdout).trim();
51
+ const lines = output.split('\n').filter(line => line.trim());
52
+ const hasMore = lines.length >= maxResults;
53
+ const resultOutput = lines.length > 0
54
+ ? lines.join('\n') + (hasMore ? `\n\n[⚠️] 结果已限制为前 ${maxResults} 条匹配,使用更大的 max_results 参数获取更多结果` : '')
55
+ : '未找到匹配结果';
56
+ return (0, utils_1.successResult)(resultOutput);
57
+ }
58
+ catch (error) {
59
+ if (error.message?.includes('Access denied')) {
60
+ return (0, utils_1.failResult)(error.message);
61
+ }
62
+ if (error.code === 1) {
63
+ return (0, utils_1.successResult)('未找到匹配结果');
64
+ }
65
+ return (0, utils_1.failResult)(error.message);
66
+ }
67
+ }
68
+ }
69
+ exports.SearchInFiles = SearchInFiles;
70
+ //# sourceMappingURL=SearchInFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchInFiles.js","sourceRoot":"","sources":["../../../src/agent/tools/SearchInFiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Tool, ToolParameter } from './types';
2
+ import { ToolExecutionResult } from '../state';
3
+ export declare class SearchSymbol implements Tool {
4
+ name: string;
5
+ description: string;
6
+ parameters: ToolParameter[];
7
+ execute(params: Record<string, any>): Promise<ToolExecutionResult>;
8
+ }