code-gate 1.1.3 → 1.3.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/README.md +107 -6
- package/README_ZH.md +105 -5
- package/dist/agent/index.d.ts +8 -0
- package/dist/agent/index.js +10 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +13 -0
- package/dist/agent/orchestrator.js +109 -0
- package/dist/agent/orchestrator.js.map +1 -0
- package/dist/agent/prompts/system.d.ts +14 -0
- package/dist/agent/prompts/system.js +108 -0
- package/dist/agent/prompts/system.js.map +1 -0
- package/dist/agent/tools/index.d.ts +15 -0
- package/dist/agent/tools/index.js +57 -0
- package/dist/agent/tools/index.js.map +1 -0
- package/dist/agent/tools/list-directory.d.ts +13 -0
- package/dist/agent/tools/list-directory.js +162 -0
- package/dist/agent/tools/list-directory.js.map +1 -0
- package/dist/agent/tools/read-file.d.ts +13 -0
- package/dist/agent/tools/read-file.js +106 -0
- package/dist/agent/tools/read-file.js.map +1 -0
- package/dist/agent/tools/search-content.d.ts +13 -0
- package/dist/agent/tools/search-content.js +110 -0
- package/dist/agent/tools/search-content.js.map +1 -0
- package/dist/agent/tools/types.d.ts +71 -0
- package/dist/agent/tools/types.js +5 -0
- package/dist/agent/tools/types.js.map +1 -0
- package/dist/agent/types.d.ts +55 -0
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli/commands/hook.js +18 -3
- package/dist/cli/commands/hook.js.map +1 -1
- package/dist/cli/commands/review.js +18 -3
- package/dist/cli/commands/review.js.map +1 -1
- package/dist/config/defaults.js +5 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/types.d.ts +6 -0
- package/dist/core/context/manager.d.ts +14 -0
- package/dist/core/context/manager.js +78 -0
- package/dist/core/context/manager.js.map +1 -0
- package/dist/core/context/parser/java.d.ts +18 -0
- package/dist/core/context/parser/java.js +70 -0
- package/dist/core/context/parser/java.js.map +1 -0
- package/dist/core/git.d.ts +3 -0
- package/dist/core/git.js +20 -0
- package/dist/core/git.js.map +1 -1
- package/dist/core/review.d.ts +2 -1
- package/dist/core/review.js +129 -55
- package/dist/core/review.js.map +1 -1
- package/dist/llm/base.d.ts +20 -0
- package/dist/llm/base.js +15 -0
- package/dist/llm/base.js.map +1 -1
- package/dist/llm/index.d.ts +13 -1
- package/dist/llm/index.js +25 -0
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/providers/deepseek.d.ts +20 -2
- package/dist/llm/providers/deepseek.js +89 -4
- package/dist/llm/providers/deepseek.js.map +1 -1
- package/dist/llm/providers/zhipu.d.ts +20 -2
- package/dist/llm/providers/zhipu.js +80 -4
- package/dist/llm/providers/zhipu.js.map +1 -1
- package/dist/locales/de.js +3 -0
- package/dist/locales/de.js.map +1 -1
- package/dist/locales/en.js +3 -0
- package/dist/locales/en.js.map +1 -1
- package/dist/locales/fr.js +3 -0
- package/dist/locales/fr.js.map +1 -1
- package/dist/locales/ja.js +3 -0
- package/dist/locales/ja.js.map +1 -1
- package/dist/locales/ko.js +3 -0
- package/dist/locales/ko.js.map +1 -1
- package/dist/locales/types.d.ts +3 -0
- package/dist/locales/zh-CN.js +3 -0
- package/dist/locales/zh-CN.js.map +1 -1
- package/dist/locales/zh-TW.js +3 -0
- package/dist/locales/zh-TW.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 工具注册入口
|
|
3
|
+
* 统一管理所有 Agent 工具的定义和执行
|
|
4
|
+
*/
|
|
5
|
+
import { readFileTool, executeReadFile } from './read-file.js';
|
|
6
|
+
import { searchContentTool, executeSearchContent } from './search-content.js';
|
|
7
|
+
import { listDirectoryTool, executeListDirectory } from './list-directory.js';
|
|
8
|
+
// ============ 工具定义列表 ============
|
|
9
|
+
export const toolDefinitions = [
|
|
10
|
+
readFileTool,
|
|
11
|
+
searchContentTool,
|
|
12
|
+
listDirectoryTool
|
|
13
|
+
];
|
|
14
|
+
const executors = {
|
|
15
|
+
read_file: executeReadFile,
|
|
16
|
+
search_content: executeSearchContent,
|
|
17
|
+
list_directory: executeListDirectory
|
|
18
|
+
};
|
|
19
|
+
// ============ 工具执行函数 ============
|
|
20
|
+
/**
|
|
21
|
+
* 执行单个工具调用
|
|
22
|
+
*/
|
|
23
|
+
export async function executeTool(call) {
|
|
24
|
+
const executor = executors[call.name];
|
|
25
|
+
if (!executor) {
|
|
26
|
+
return {
|
|
27
|
+
id: call.id,
|
|
28
|
+
name: call.name,
|
|
29
|
+
result: null,
|
|
30
|
+
error: `Unknown tool: ${call.name}`
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const result = await executor(call.arguments);
|
|
35
|
+
return {
|
|
36
|
+
id: call.id,
|
|
37
|
+
name: call.name,
|
|
38
|
+
result
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
const error = e instanceof Error ? e.message : String(e);
|
|
43
|
+
return {
|
|
44
|
+
id: call.id,
|
|
45
|
+
name: call.name,
|
|
46
|
+
result: null,
|
|
47
|
+
error
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 并行执行多个工具调用
|
|
53
|
+
*/
|
|
54
|
+
export async function executeTools(calls) {
|
|
55
|
+
return Promise.all(calls.map(executeTool));
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC7E,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE7E,mCAAmC;AAEnC,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C,YAAY;IACZ,iBAAiB;IACjB,iBAAiB;CAClB,CAAA;AAOD,MAAM,SAAS,GAAmC;IAChD,SAAS,EAAE,eAAe;IAC1B,cAAc,EAAE,oBAAoB;IACpC,cAAc,EAAE,oBAAoB;CACrC,CAAA;AAED,mCAAmC;AAEnC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAErC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,iBAAiB,IAAI,CAAC,IAAI,EAAE;SACpC,CAAA;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC7C,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM;SACP,CAAA;IACH,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACxD,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI;YACZ,KAAK;SACN,CAAA;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAiB;IAClD,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAA;AAC5C,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* list_directory 工具实现
|
|
3
|
+
* 列出目录内容,支持递归和分页
|
|
4
|
+
*/
|
|
5
|
+
import type { ToolDefinition, ListDirectoryParams, ListDirectoryResult } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* 工具定义
|
|
8
|
+
*/
|
|
9
|
+
export declare const listDirectoryTool: ToolDefinition;
|
|
10
|
+
/**
|
|
11
|
+
* 执行 list_directory 工具
|
|
12
|
+
*/
|
|
13
|
+
export declare function executeListDirectory(params: ListDirectoryParams): Promise<ListDirectoryResult>;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* list_directory 工具实现
|
|
3
|
+
* 列出目录内容,支持递归和分页
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import nodePath from 'node:path';
|
|
7
|
+
import { getGitRoot } from '../../core/git.js';
|
|
8
|
+
// 默认值
|
|
9
|
+
const DEFAULT_DEPTH = 1;
|
|
10
|
+
const DEFAULT_OFFSET = 0;
|
|
11
|
+
const DEFAULT_LIMIT = 50;
|
|
12
|
+
// 排除的目录/文件
|
|
13
|
+
const EXCLUDED_NAMES = [
|
|
14
|
+
'node_modules',
|
|
15
|
+
'.git',
|
|
16
|
+
'.idea',
|
|
17
|
+
'.vscode',
|
|
18
|
+
'dist',
|
|
19
|
+
'build',
|
|
20
|
+
'coverage',
|
|
21
|
+
'__pycache__',
|
|
22
|
+
'.DS_Store',
|
|
23
|
+
'Thumbs.db'
|
|
24
|
+
];
|
|
25
|
+
/**
|
|
26
|
+
* 工具定义
|
|
27
|
+
*/
|
|
28
|
+
export const listDirectoryTool = {
|
|
29
|
+
type: 'function',
|
|
30
|
+
function: {
|
|
31
|
+
name: 'list_directory',
|
|
32
|
+
description: '列出目录内容,了解项目结构。可以递归列出子目录。',
|
|
33
|
+
parameters: {
|
|
34
|
+
type: 'object',
|
|
35
|
+
properties: {
|
|
36
|
+
path: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
description: '目录路径(相对于项目根目录)'
|
|
39
|
+
},
|
|
40
|
+
depth: {
|
|
41
|
+
type: 'number',
|
|
42
|
+
description: `递归深度,默认 ${DEFAULT_DEPTH}(只列出直接子项)`
|
|
43
|
+
},
|
|
44
|
+
offset: {
|
|
45
|
+
type: 'number',
|
|
46
|
+
description: `跳过前 N 条结果,默认 ${DEFAULT_OFFSET}`
|
|
47
|
+
},
|
|
48
|
+
limit: {
|
|
49
|
+
type: 'number',
|
|
50
|
+
description: `返回最大条数,默认 ${DEFAULT_LIMIT}`
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
required: ['path']
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* 判断是否应该排除
|
|
59
|
+
*/
|
|
60
|
+
function shouldExclude(name) {
|
|
61
|
+
// 排除隐藏文件(以 . 开头,但不包括 . 和 ..)
|
|
62
|
+
if (name.startsWith('.') && name !== '.' && name !== '..') {
|
|
63
|
+
// 允许一些常见的配置文件
|
|
64
|
+
const allowedDotFiles = ['.codegate.js', '.codegate.ts', '.codegate.json', '.eslintrc.js', '.prettierrc'];
|
|
65
|
+
if (!allowedDotFiles.some(f => name.startsWith(f.split('.')[1]))) {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return EXCLUDED_NAMES.includes(name);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 递归收集目录内容
|
|
73
|
+
*/
|
|
74
|
+
function collectEntries(dirPath, basePath, maxDepth, currentDepth = 0) {
|
|
75
|
+
if (currentDepth >= maxDepth) {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
const entries = [];
|
|
79
|
+
try {
|
|
80
|
+
const items = fs.readdirSync(dirPath);
|
|
81
|
+
for (const item of items) {
|
|
82
|
+
// 跳过排除的文件/目录
|
|
83
|
+
if (shouldExclude(item)) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const fullPath = nodePath.join(dirPath, item);
|
|
87
|
+
const relativePath = nodePath.relative(basePath, fullPath);
|
|
88
|
+
try {
|
|
89
|
+
const stats = fs.statSync(fullPath);
|
|
90
|
+
if (stats.isDirectory()) {
|
|
91
|
+
entries.push({
|
|
92
|
+
name: relativePath,
|
|
93
|
+
type: 'dir'
|
|
94
|
+
});
|
|
95
|
+
// 递归子目录
|
|
96
|
+
if (currentDepth + 1 < maxDepth) {
|
|
97
|
+
const subEntries = collectEntries(fullPath, basePath, maxDepth, currentDepth + 1);
|
|
98
|
+
entries.push(...subEntries);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else if (stats.isFile()) {
|
|
102
|
+
entries.push({
|
|
103
|
+
name: relativePath,
|
|
104
|
+
type: 'file',
|
|
105
|
+
size: stats.size
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// 忽略无法访问的文件
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// 忽略无法访问的目录
|
|
116
|
+
}
|
|
117
|
+
return entries;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 执行 list_directory 工具
|
|
121
|
+
*/
|
|
122
|
+
export async function executeListDirectory(params) {
|
|
123
|
+
const { path: dirPath, depth = DEFAULT_DEPTH, offset = DEFAULT_OFFSET, limit = DEFAULT_LIMIT } = params;
|
|
124
|
+
// 获取项目根目录
|
|
125
|
+
const root = getGitRoot();
|
|
126
|
+
if (!root) {
|
|
127
|
+
throw new Error('Not in a git repository');
|
|
128
|
+
}
|
|
129
|
+
// 解析目录路径
|
|
130
|
+
const absolutePath = nodePath.resolve(root, dirPath);
|
|
131
|
+
// 安全检查:路径必须在项目根目录内
|
|
132
|
+
if (!absolutePath.startsWith(root)) {
|
|
133
|
+
throw new Error('Access denied: path outside project root');
|
|
134
|
+
}
|
|
135
|
+
// 检查目录存在
|
|
136
|
+
if (!fs.existsSync(absolutePath)) {
|
|
137
|
+
throw new Error(`Directory not found: ${dirPath}`);
|
|
138
|
+
}
|
|
139
|
+
// 检查是否为目录
|
|
140
|
+
const stats = fs.statSync(absolutePath);
|
|
141
|
+
if (!stats.isDirectory()) {
|
|
142
|
+
throw new Error(`Not a directory: ${dirPath}`);
|
|
143
|
+
}
|
|
144
|
+
// 收集所有条目
|
|
145
|
+
const allEntries = collectEntries(absolutePath, absolutePath, depth);
|
|
146
|
+
const total = allEntries.length;
|
|
147
|
+
// 排序:目录在前,文件在后;同类型按名称排序
|
|
148
|
+
allEntries.sort((a, b) => {
|
|
149
|
+
if (a.type !== b.type) {
|
|
150
|
+
return a.type === 'dir' ? -1 : 1;
|
|
151
|
+
}
|
|
152
|
+
return a.name.localeCompare(b.name);
|
|
153
|
+
});
|
|
154
|
+
// 分页
|
|
155
|
+
const pagedEntries = allEntries.slice(offset, offset + limit);
|
|
156
|
+
return {
|
|
157
|
+
entries: pagedEntries,
|
|
158
|
+
total,
|
|
159
|
+
hasMore: offset + limit < total
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=list-directory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-directory.js","sourceRoot":"","sources":["../../../src/agent/tools/list-directory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* read_file 工具实现
|
|
3
|
+
* 读取文件内容,支持分页
|
|
4
|
+
*/
|
|
5
|
+
import type { ToolDefinition, ReadFileParams, ReadFileResult } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* 工具定义
|
|
8
|
+
*/
|
|
9
|
+
export declare const readFileTool: ToolDefinition;
|
|
10
|
+
/**
|
|
11
|
+
* 执行 read_file 工具
|
|
12
|
+
*/
|
|
13
|
+
export declare function executeReadFile(params: ReadFileParams): Promise<ReadFileResult>;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* read_file 工具实现
|
|
3
|
+
* 读取文件内容,支持分页
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import nodePath from 'node:path';
|
|
7
|
+
import { getGitRoot } from '../../core/git.js';
|
|
8
|
+
// 安全配置
|
|
9
|
+
const MAX_FILE_SIZE = 100 * 1024; // 100KB
|
|
10
|
+
const BLOCKED_PATTERNS = ['.env', '.git/objects', 'node_modules'];
|
|
11
|
+
// 默认值
|
|
12
|
+
const DEFAULT_START_LINE = 1;
|
|
13
|
+
const DEFAULT_MAX_LINES = 200;
|
|
14
|
+
/**
|
|
15
|
+
* 工具定义
|
|
16
|
+
*/
|
|
17
|
+
export const readFileTool = {
|
|
18
|
+
type: 'function',
|
|
19
|
+
function: {
|
|
20
|
+
name: 'read_file',
|
|
21
|
+
description: '读取文件内容,支持分页。用于查看完整的源代码文件、类型定义、配置文件等。',
|
|
22
|
+
parameters: {
|
|
23
|
+
type: 'object',
|
|
24
|
+
properties: {
|
|
25
|
+
path: {
|
|
26
|
+
type: 'string',
|
|
27
|
+
description: '文件路径(相对于项目根目录)'
|
|
28
|
+
},
|
|
29
|
+
startLine: {
|
|
30
|
+
type: 'number',
|
|
31
|
+
description: `起始行号(从 1 开始),默认 ${DEFAULT_START_LINE}`
|
|
32
|
+
},
|
|
33
|
+
maxLines: {
|
|
34
|
+
type: 'number',
|
|
35
|
+
description: `最大读取行数,默认 ${DEFAULT_MAX_LINES}`
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
required: ['path']
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* 检查路径是否安全
|
|
44
|
+
*/
|
|
45
|
+
function isPathSafe(filePath, root, absolutePath) {
|
|
46
|
+
// 检查路径遍历
|
|
47
|
+
if (!absolutePath.startsWith(root)) {
|
|
48
|
+
return { safe: false, error: 'Access denied: path outside project root' };
|
|
49
|
+
}
|
|
50
|
+
// 检查敏感文件
|
|
51
|
+
for (const pattern of BLOCKED_PATTERNS) {
|
|
52
|
+
if (filePath.includes(pattern)) {
|
|
53
|
+
return { safe: false, error: `Access denied: ${pattern} files are blocked` };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return { safe: true };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 执行 read_file 工具
|
|
60
|
+
*/
|
|
61
|
+
export async function executeReadFile(params) {
|
|
62
|
+
const { path: filePath, startLine = DEFAULT_START_LINE, maxLines = DEFAULT_MAX_LINES } = params;
|
|
63
|
+
// 获取项目根目录
|
|
64
|
+
const root = getGitRoot();
|
|
65
|
+
if (!root) {
|
|
66
|
+
throw new Error('Not in a git repository');
|
|
67
|
+
}
|
|
68
|
+
// 解析绝对路径
|
|
69
|
+
const absolutePath = nodePath.resolve(root, filePath);
|
|
70
|
+
// 安全检查
|
|
71
|
+
const safeCheck = isPathSafe(filePath, root, absolutePath);
|
|
72
|
+
if (!safeCheck.safe) {
|
|
73
|
+
throw new Error(safeCheck.error);
|
|
74
|
+
}
|
|
75
|
+
// 检查文件存在
|
|
76
|
+
if (!fs.existsSync(absolutePath)) {
|
|
77
|
+
throw new Error(`File not found: ${filePath}`);
|
|
78
|
+
}
|
|
79
|
+
// 检查是否为文件
|
|
80
|
+
const stats = fs.statSync(absolutePath);
|
|
81
|
+
if (!stats.isFile()) {
|
|
82
|
+
throw new Error(`Not a file: ${filePath}`);
|
|
83
|
+
}
|
|
84
|
+
// 检查文件大小
|
|
85
|
+
if (stats.size > MAX_FILE_SIZE) {
|
|
86
|
+
throw new Error(`File too large: ${stats.size} bytes (max ${MAX_FILE_SIZE})`);
|
|
87
|
+
}
|
|
88
|
+
// 读取文件
|
|
89
|
+
const content = fs.readFileSync(absolutePath, 'utf8');
|
|
90
|
+
const lines = content.split('\n');
|
|
91
|
+
const totalLines = lines.length;
|
|
92
|
+
// 计算分页范围
|
|
93
|
+
const start = Math.max(1, startLine);
|
|
94
|
+
const end = Math.min(totalLines, start + maxLines - 1);
|
|
95
|
+
// 提取指定范围的行
|
|
96
|
+
const selectedLines = lines.slice(start - 1, end);
|
|
97
|
+
return {
|
|
98
|
+
content: selectedLines.join('\n'),
|
|
99
|
+
startLine: start,
|
|
100
|
+
endLine: end,
|
|
101
|
+
totalLines,
|
|
102
|
+
total: totalLines,
|
|
103
|
+
hasMore: end < totalLines
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=read-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../../src/agent/tools/read-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* search_content 工具实现
|
|
3
|
+
* 在项目中搜索文件内容,支持分页
|
|
4
|
+
*/
|
|
5
|
+
import type { ToolDefinition, SearchContentParams, SearchContentResult } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* 工具定义
|
|
8
|
+
*/
|
|
9
|
+
export declare const searchContentTool: ToolDefinition;
|
|
10
|
+
/**
|
|
11
|
+
* 执行 search_content 工具
|
|
12
|
+
*/
|
|
13
|
+
export declare function executeSearchContent(params: SearchContentParams): Promise<SearchContentResult>;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* search_content 工具实现
|
|
3
|
+
* 在项目中搜索文件内容,支持分页
|
|
4
|
+
*/
|
|
5
|
+
import { spawnSync } from 'node:child_process';
|
|
6
|
+
import nodePath from 'node:path';
|
|
7
|
+
import { getGitRoot } from '../../core/git.js';
|
|
8
|
+
// 默认值
|
|
9
|
+
const DEFAULT_OFFSET = 0;
|
|
10
|
+
const DEFAULT_LIMIT = 20;
|
|
11
|
+
const MAX_CONTENT_LENGTH = 200; // 单行内容最大长度
|
|
12
|
+
/**
|
|
13
|
+
* 工具定义
|
|
14
|
+
*/
|
|
15
|
+
export const searchContentTool = {
|
|
16
|
+
type: 'function',
|
|
17
|
+
function: {
|
|
18
|
+
name: 'search_content',
|
|
19
|
+
description: '在项目中搜索文件内容,支持正则表达式。用于查找函数定义、方法调用、类定义等。',
|
|
20
|
+
parameters: {
|
|
21
|
+
type: 'object',
|
|
22
|
+
properties: {
|
|
23
|
+
pattern: {
|
|
24
|
+
type: 'string',
|
|
25
|
+
description: '搜索模式(支持正则表达式)'
|
|
26
|
+
},
|
|
27
|
+
path: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: '搜索路径(相对于项目根目录),默认为项目根目录'
|
|
30
|
+
},
|
|
31
|
+
offset: {
|
|
32
|
+
type: 'number',
|
|
33
|
+
description: `跳过前 N 条结果,默认 ${DEFAULT_OFFSET}`
|
|
34
|
+
},
|
|
35
|
+
limit: {
|
|
36
|
+
type: 'number',
|
|
37
|
+
description: `返回最大条数,默认 ${DEFAULT_LIMIT}`
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
required: ['pattern']
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* 解析 git grep 输出行
|
|
46
|
+
*/
|
|
47
|
+
function parseGrepLine(line) {
|
|
48
|
+
// 格式: file:line:content
|
|
49
|
+
const match = line.match(/^(.+?):(\d+):(.*)$/);
|
|
50
|
+
if (match) {
|
|
51
|
+
return {
|
|
52
|
+
file: match[1],
|
|
53
|
+
line: parseInt(match[2], 10),
|
|
54
|
+
content: match[3].substring(0, MAX_CONTENT_LENGTH)
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 执行 search_content 工具
|
|
61
|
+
*/
|
|
62
|
+
export async function executeSearchContent(params) {
|
|
63
|
+
const { pattern, path: searchPath = '.', offset = DEFAULT_OFFSET, limit = DEFAULT_LIMIT } = params;
|
|
64
|
+
// 获取项目根目录
|
|
65
|
+
const root = getGitRoot();
|
|
66
|
+
if (!root) {
|
|
67
|
+
throw new Error('Not in a git repository');
|
|
68
|
+
}
|
|
69
|
+
// 解析搜索路径
|
|
70
|
+
const absolutePath = nodePath.resolve(root, searchPath);
|
|
71
|
+
// 安全检查:路径必须在项目根目录内
|
|
72
|
+
if (!absolutePath.startsWith(root)) {
|
|
73
|
+
throw new Error('Access denied: path outside project root');
|
|
74
|
+
}
|
|
75
|
+
// 使用 git grep 进行搜索
|
|
76
|
+
// 优点:自动排除 .gitignore 中的文件,速度快
|
|
77
|
+
const result = spawnSync('git', [
|
|
78
|
+
'grep',
|
|
79
|
+
'-n', // 显示行号
|
|
80
|
+
'-I', // 忽略二进制文件
|
|
81
|
+
'--no-color', // 不使用颜色
|
|
82
|
+
'-E', // 使用扩展正则表达式
|
|
83
|
+
pattern,
|
|
84
|
+
'--',
|
|
85
|
+
searchPath
|
|
86
|
+
], {
|
|
87
|
+
cwd: root,
|
|
88
|
+
encoding: 'utf8',
|
|
89
|
+
maxBuffer: 10 * 1024 * 1024 // 10MB
|
|
90
|
+
});
|
|
91
|
+
// 解析结果
|
|
92
|
+
const lines = (result.stdout || '').split('\n').filter(Boolean);
|
|
93
|
+
const total = lines.length;
|
|
94
|
+
// 分页
|
|
95
|
+
const pagedLines = lines.slice(offset, offset + limit);
|
|
96
|
+
// 解析每一行
|
|
97
|
+
const matches = [];
|
|
98
|
+
for (const line of pagedLines) {
|
|
99
|
+
const match = parseGrepLine(line);
|
|
100
|
+
if (match) {
|
|
101
|
+
matches.push(match);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
matches,
|
|
106
|
+
total,
|
|
107
|
+
hasMore: offset + limit < total
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=search-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-content.js","sourceRoot":"","sources":["../../../src/agent/tools/search-content.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent 工具类型定义
|
|
3
|
+
*/
|
|
4
|
+
export interface PaginationParams {
|
|
5
|
+
offset?: number;
|
|
6
|
+
limit?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface PaginationResult {
|
|
9
|
+
total: number;
|
|
10
|
+
hasMore: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface ReadFileParams {
|
|
13
|
+
path: string;
|
|
14
|
+
startLine?: number;
|
|
15
|
+
maxLines?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ReadFileResult extends PaginationResult {
|
|
18
|
+
content: string;
|
|
19
|
+
startLine: number;
|
|
20
|
+
endLine: number;
|
|
21
|
+
totalLines: number;
|
|
22
|
+
}
|
|
23
|
+
export interface SearchContentParams extends PaginationParams {
|
|
24
|
+
pattern: string;
|
|
25
|
+
path?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface SearchMatch {
|
|
28
|
+
file: string;
|
|
29
|
+
line: number;
|
|
30
|
+
content: string;
|
|
31
|
+
}
|
|
32
|
+
export interface SearchContentResult extends PaginationResult {
|
|
33
|
+
matches: SearchMatch[];
|
|
34
|
+
}
|
|
35
|
+
export interface ListDirectoryParams extends PaginationParams {
|
|
36
|
+
path: string;
|
|
37
|
+
depth?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface DirectoryEntry {
|
|
40
|
+
name: string;
|
|
41
|
+
type: 'file' | 'dir';
|
|
42
|
+
size?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface ListDirectoryResult extends PaginationResult {
|
|
45
|
+
entries: DirectoryEntry[];
|
|
46
|
+
}
|
|
47
|
+
export interface ToolCall {
|
|
48
|
+
id: string;
|
|
49
|
+
name: string;
|
|
50
|
+
arguments: Record<string, unknown>;
|
|
51
|
+
}
|
|
52
|
+
export interface ToolResult {
|
|
53
|
+
id: string;
|
|
54
|
+
name: string;
|
|
55
|
+
result: unknown;
|
|
56
|
+
error?: string;
|
|
57
|
+
}
|
|
58
|
+
export interface ToolFunctionDefinition {
|
|
59
|
+
name: string;
|
|
60
|
+
description: string;
|
|
61
|
+
parameters: {
|
|
62
|
+
type: 'object';
|
|
63
|
+
properties: Record<string, unknown>;
|
|
64
|
+
required?: string[];
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export interface ToolDefinition {
|
|
68
|
+
type: 'function';
|
|
69
|
+
function: ToolFunctionDefinition;
|
|
70
|
+
}
|
|
71
|
+
export type ToolExecutor<P = unknown, R = unknown> = (params: P) => Promise<R>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/agent/tools/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent 核心类型定义
|
|
3
|
+
*/
|
|
4
|
+
import type { ToolCall, ToolDefinition } from './tools/types.js';
|
|
5
|
+
export interface AgentMessageBase {
|
|
6
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
7
|
+
content: string | null;
|
|
8
|
+
}
|
|
9
|
+
export interface AgentSystemMessage extends AgentMessageBase {
|
|
10
|
+
role: 'system';
|
|
11
|
+
content: string;
|
|
12
|
+
}
|
|
13
|
+
export interface AgentUserMessage extends AgentMessageBase {
|
|
14
|
+
role: 'user';
|
|
15
|
+
content: string;
|
|
16
|
+
}
|
|
17
|
+
export interface AgentAssistantMessage extends AgentMessageBase {
|
|
18
|
+
role: 'assistant';
|
|
19
|
+
tool_calls?: ToolCall[];
|
|
20
|
+
reasoning_content?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface AgentToolMessage extends AgentMessageBase {
|
|
23
|
+
role: 'tool';
|
|
24
|
+
tool_call_id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
}
|
|
27
|
+
export type AgentMessage = AgentSystemMessage | AgentUserMessage | AgentAssistantMessage | AgentToolMessage;
|
|
28
|
+
export interface AgentReviewInput {
|
|
29
|
+
prompt: string;
|
|
30
|
+
diff: string;
|
|
31
|
+
files: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface AgentReviewOptions {
|
|
34
|
+
maxIterations: number;
|
|
35
|
+
maxToolCalls: number;
|
|
36
|
+
onToolCall?: (call: ToolCall) => void;
|
|
37
|
+
onIteration?: (iteration: number, toolCalls: number) => void;
|
|
38
|
+
}
|
|
39
|
+
export interface OrchestratorState {
|
|
40
|
+
messages: AgentMessage[];
|
|
41
|
+
iteration: number;
|
|
42
|
+
totalToolCalls: number;
|
|
43
|
+
done: boolean;
|
|
44
|
+
}
|
|
45
|
+
export interface AgentProvider {
|
|
46
|
+
reviewWithAgent(input: AgentReviewInput, options: AgentReviewOptions): Promise<string>;
|
|
47
|
+
}
|
|
48
|
+
export type LLMCallFunction = (messages: AgentMessage[], tools: ToolDefinition[]) => Promise<{
|
|
49
|
+
content: string | null;
|
|
50
|
+
toolCalls: ToolCall[];
|
|
51
|
+
reasoning_content?: string;
|
|
52
|
+
}>;
|
|
53
|
+
export interface AgentOrchestrator {
|
|
54
|
+
run(input: AgentReviewInput, options: AgentReviewOptions): Promise<string>;
|
|
55
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|