@yeepay/coderocket-mcp 1.3.1 → 1.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/.crush/crush.db +0 -0
- package/.crush/crush.db-shm +0 -0
- package/.crush/crush.db-wal +0 -0
- package/CHANGELOG.md +24 -8
- package/README.md +1 -1
- package/debug.js +33 -0
- package/dist/ai/SmartAIManager.d.ts +72 -0
- package/dist/ai/SmartAIManager.d.ts.map +1 -0
- package/dist/ai/SmartAIManager.js +232 -0
- package/dist/ai/SmartAIManager.js.map +1 -0
- package/dist/coderocket.d.ts +8 -166
- package/dist/coderocket.d.ts.map +1 -1
- package/dist/coderocket.js +18 -1122
- package/dist/coderocket.js.map +1 -1
- package/dist/config/ConfigManager.d.ts +83 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +215 -0
- package/dist/config/ConfigManager.js.map +1 -0
- package/dist/index.js +47 -81
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +10 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +33 -14
- package/dist/logger.js.map +1 -1
- package/dist/prompts/PromptManager.d.ts +76 -0
- package/dist/prompts/PromptManager.d.ts.map +1 -0
- package/dist/prompts/PromptManager.js +263 -0
- package/dist/prompts/PromptManager.js.map +1 -0
- package/dist/services/CodeRocketService.d.ts +113 -0
- package/dist/services/CodeRocketService.d.ts.map +1 -0
- package/dist/services/CodeRocketService.js +651 -0
- package/dist/services/CodeRocketService.js.map +1 -0
- package/dist/test.d.ts.map +1 -1
- package/dist/test.js +195 -44
- package/dist/test.js.map +1 -1
- package/dist/toolDefinitions.d.ts.map +1 -1
- package/dist/toolDefinitions.js +56 -1
- package/dist/toolDefinitions.js.map +1 -1
- package/dist/types.d.ts +172 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +53 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
- package/prompts/code-review-prompt.md +101 -0
- package/prompts/file-review-prompt.md +165 -0
- package/prompts/git-changes-review-prompt.md +122 -0
- package/prompts/git-commit-review-prompt.md +314 -0
- package/simple-test.js +56 -0
- package/AI_SERVICE_SETUP.md +0 -62
- package/dist/banner.d.ts +0 -56
- package/dist/banner.d.ts.map +0 -1
- package/dist/banner.js +0 -138
- package/dist/banner.js.map +0 -1
@@ -0,0 +1,651 @@
|
|
1
|
+
import { execSync } from 'child_process';
|
2
|
+
import { readFile, writeFile, mkdir } from 'fs/promises';
|
3
|
+
import { join } from 'path';
|
4
|
+
import { existsSync } from 'fs';
|
5
|
+
import { ConfigManager } from '../config/ConfigManager.js';
|
6
|
+
import { PromptManager } from '../prompts/PromptManager.js';
|
7
|
+
import { SmartAIManager } from '../ai/SmartAIManager.js';
|
8
|
+
import { GitError, FileError, logger } from '../logger.js';
|
9
|
+
/**
|
10
|
+
* CodeRocket 核心服务类
|
11
|
+
*
|
12
|
+
* 提供所有MCP工具的实现:
|
13
|
+
* - 代码片段审查
|
14
|
+
* - Git变更审查
|
15
|
+
* - Git提交审查
|
16
|
+
* - 文件批量审查
|
17
|
+
* - AI服务配置管理
|
18
|
+
* - 服务状态监控
|
19
|
+
*/
|
20
|
+
export class CodeRocketService {
|
21
|
+
aiManager;
|
22
|
+
constructor() {
|
23
|
+
// 确保配置和提示词系统已初始化
|
24
|
+
this.ensureInitialized();
|
25
|
+
this.aiManager = new SmartAIManager();
|
26
|
+
}
|
27
|
+
/**
|
28
|
+
* 确保所有依赖系统已初始化
|
29
|
+
*/
|
30
|
+
ensureInitialized() {
|
31
|
+
if (!ConfigManager.isInitialized()) {
|
32
|
+
throw new Error('ConfigManager 未初始化,请先调用 ConfigManager.initialize()');
|
33
|
+
}
|
34
|
+
}
|
35
|
+
/**
|
36
|
+
* 审查代码片段
|
37
|
+
*/
|
38
|
+
async reviewCode(request) {
|
39
|
+
logger.info('开始代码片段审查', {
|
40
|
+
codeLength: request.code.length,
|
41
|
+
language: request.language,
|
42
|
+
hasContext: !!request.context,
|
43
|
+
});
|
44
|
+
try {
|
45
|
+
// 构建审查提示词
|
46
|
+
const prompt = this.buildCodeReviewPrompt(request);
|
47
|
+
// 确定使用的AI服务
|
48
|
+
const aiService = request.ai_service || ConfigManager.getAIService();
|
49
|
+
// 调用AI服务进行审查
|
50
|
+
const { result, usedService } = await this.aiManager.intelligentCall(aiService, prompt);
|
51
|
+
const response = {
|
52
|
+
status: '✅',
|
53
|
+
summary: '代码审查完成',
|
54
|
+
review: result,
|
55
|
+
ai_service_used: usedService,
|
56
|
+
timestamp: new Date().toISOString(),
|
57
|
+
};
|
58
|
+
logger.info('代码片段审查完成', {
|
59
|
+
aiService: usedService,
|
60
|
+
reviewLength: result.length,
|
61
|
+
});
|
62
|
+
return response;
|
63
|
+
}
|
64
|
+
catch (error) {
|
65
|
+
logger.error('代码片段审查失败', error instanceof Error ? error : new Error(String(error)));
|
66
|
+
return {
|
67
|
+
status: '❌',
|
68
|
+
summary: '代码审查失败',
|
69
|
+
review: `审查过程中发生错误: ${error instanceof Error ? error.message : String(error)}`,
|
70
|
+
ai_service_used: request.ai_service || ConfigManager.getAIService(),
|
71
|
+
timestamp: new Date().toISOString(),
|
72
|
+
};
|
73
|
+
}
|
74
|
+
}
|
75
|
+
/**
|
76
|
+
* 审查Git变更
|
77
|
+
*/
|
78
|
+
async reviewChanges(request) {
|
79
|
+
logger.info('开始Git变更审查', {
|
80
|
+
repositoryPath: request.repository_path,
|
81
|
+
includeStaged: request.include_staged,
|
82
|
+
includeUnstaged: request.include_unstaged,
|
83
|
+
});
|
84
|
+
try {
|
85
|
+
const repoPath = request.repository_path || process.cwd();
|
86
|
+
// 安全检查:验证路径
|
87
|
+
if (!this.isValidPath(repoPath)) {
|
88
|
+
throw new GitError('无效的仓库路径');
|
89
|
+
}
|
90
|
+
// 获取Git变更
|
91
|
+
const changes = await this.getGitChanges(repoPath, request);
|
92
|
+
if (!changes.trim()) {
|
93
|
+
return {
|
94
|
+
status: '📝',
|
95
|
+
summary: '没有发现变更',
|
96
|
+
review: '当前没有需要审查的代码变更。',
|
97
|
+
ai_service_used: request.ai_service || ConfigManager.getAIService(),
|
98
|
+
timestamp: new Date().toISOString(),
|
99
|
+
};
|
100
|
+
}
|
101
|
+
// 构建审查提示词
|
102
|
+
const prompt = this.buildChangesReviewPrompt(changes, request);
|
103
|
+
// 确定使用的AI服务
|
104
|
+
const aiService = request.ai_service || ConfigManager.getAIService();
|
105
|
+
// 调用AI服务进行审查
|
106
|
+
const { result, usedService } = await this.aiManager.intelligentCall(aiService, prompt);
|
107
|
+
const response = {
|
108
|
+
status: '✅',
|
109
|
+
summary: 'Git变更审查完成',
|
110
|
+
review: result,
|
111
|
+
ai_service_used: usedService,
|
112
|
+
timestamp: new Date().toISOString(),
|
113
|
+
};
|
114
|
+
logger.info('Git变更审查完成', {
|
115
|
+
aiService: usedService,
|
116
|
+
changesLength: changes.length,
|
117
|
+
});
|
118
|
+
return response;
|
119
|
+
}
|
120
|
+
catch (error) {
|
121
|
+
logger.error('Git变更审查失败', error instanceof Error ? error : new Error(String(error)));
|
122
|
+
return {
|
123
|
+
status: '❌',
|
124
|
+
summary: 'Git变更审查失败',
|
125
|
+
review: `审查过程中发生错误: ${error instanceof Error ? error.message : String(error)}`,
|
126
|
+
ai_service_used: request.ai_service || ConfigManager.getAIService(),
|
127
|
+
timestamp: new Date().toISOString(),
|
128
|
+
};
|
129
|
+
}
|
130
|
+
}
|
131
|
+
/**
|
132
|
+
* 路径安全验证
|
133
|
+
*/
|
134
|
+
isValidPath(path) {
|
135
|
+
// 基本的路径安全检查
|
136
|
+
if (!path || typeof path !== 'string')
|
137
|
+
return false;
|
138
|
+
if (path.includes('..'))
|
139
|
+
return false; // 防止路径遍历
|
140
|
+
if (path.includes('\0'))
|
141
|
+
return false; // 防止空字节注入
|
142
|
+
return true;
|
143
|
+
}
|
144
|
+
/**
|
145
|
+
* 检查是否为Git仓库
|
146
|
+
*/
|
147
|
+
async checkGitRepository(repositoryPath = process.cwd()) {
|
148
|
+
try {
|
149
|
+
const result = execSync('git rev-parse --git-dir', {
|
150
|
+
cwd: repositoryPath,
|
151
|
+
encoding: 'utf-8',
|
152
|
+
timeout: 5000,
|
153
|
+
});
|
154
|
+
return result.trim() !== '';
|
155
|
+
}
|
156
|
+
catch (error) {
|
157
|
+
return false;
|
158
|
+
}
|
159
|
+
}
|
160
|
+
/**
|
161
|
+
* 安全地执行Git命令
|
162
|
+
*/
|
163
|
+
async executeGitCommand(command, repositoryPath) {
|
164
|
+
try {
|
165
|
+
const result = execSync(command, {
|
166
|
+
cwd: repositoryPath,
|
167
|
+
encoding: 'utf-8',
|
168
|
+
timeout: 30000,
|
169
|
+
maxBuffer: 10 * 1024 * 1024,
|
170
|
+
});
|
171
|
+
return result;
|
172
|
+
}
|
173
|
+
catch (error) {
|
174
|
+
throw new GitError(`Git命令执行失败: ${command} - ${error instanceof Error ? error.message : String(error)}`);
|
175
|
+
}
|
176
|
+
}
|
177
|
+
/**
|
178
|
+
* 解析Git状态输出字符串(用于测试)
|
179
|
+
*/
|
180
|
+
parseGitStatus(statusOutput) {
|
181
|
+
const lines = statusOutput.trim().split('\n').filter(line => line.trim());
|
182
|
+
return lines.map(line => {
|
183
|
+
const status = line.substring(0, 2);
|
184
|
+
const path = line.substring(3);
|
185
|
+
return {
|
186
|
+
path,
|
187
|
+
status,
|
188
|
+
statusDescription: this.getGitStatusDescription(status)
|
189
|
+
};
|
190
|
+
});
|
191
|
+
}
|
192
|
+
/**
|
193
|
+
* 获取Git状态描述
|
194
|
+
*/
|
195
|
+
getGitStatusDescription(status) {
|
196
|
+
const statusMap = {
|
197
|
+
'M ': '已修改(已暂存)',
|
198
|
+
' M': '已修改(未暂存)',
|
199
|
+
'A ': '新增文件(已暂存)',
|
200
|
+
' A': '新增文件(未暂存)',
|
201
|
+
'D ': '已删除(已暂存)',
|
202
|
+
' D': '已删除(未暂存)',
|
203
|
+
'R ': '重命名(已暂存)',
|
204
|
+
' R': '重命名(未暂存)',
|
205
|
+
'C ': '复制(已暂存)',
|
206
|
+
' C': '复制(未暂存)',
|
207
|
+
'U ': '未合并(已暂存)',
|
208
|
+
' U': '未合并(未暂存)',
|
209
|
+
'??': '未跟踪文件',
|
210
|
+
'!!': '已忽略文件'
|
211
|
+
};
|
212
|
+
return statusMap[status] || '未知状态';
|
213
|
+
}
|
214
|
+
/**
|
215
|
+
* 解析Git仓库状态
|
216
|
+
*/
|
217
|
+
async parseGitRepositoryStatus(repositoryPath = process.cwd()) {
|
218
|
+
try {
|
219
|
+
const result = await this.executeGitCommand('git status --porcelain', repositoryPath);
|
220
|
+
const lines = result.split('\n').filter(line => line.trim());
|
221
|
+
const staged = [];
|
222
|
+
const unstaged = [];
|
223
|
+
const untracked = [];
|
224
|
+
for (const line of lines) {
|
225
|
+
const status = line.substring(0, 2);
|
226
|
+
const file = line.substring(3);
|
227
|
+
if (status[0] !== ' ' && status[0] !== '?') {
|
228
|
+
staged.push(file);
|
229
|
+
}
|
230
|
+
if (status[1] !== ' ' && status[1] !== '?') {
|
231
|
+
unstaged.push(file);
|
232
|
+
}
|
233
|
+
if (status === '??') {
|
234
|
+
untracked.push(file);
|
235
|
+
}
|
236
|
+
}
|
237
|
+
return { staged, unstaged, untracked };
|
238
|
+
}
|
239
|
+
catch (error) {
|
240
|
+
throw new GitError(`解析Git状态失败: ${error instanceof Error ? error.message : String(error)}`);
|
241
|
+
}
|
242
|
+
}
|
243
|
+
/**
|
244
|
+
* 获取Git变更(安全版本)
|
245
|
+
*/
|
246
|
+
async getGitChanges(repoPath, request) {
|
247
|
+
const commands = [];
|
248
|
+
// 构建安全的Git命令
|
249
|
+
if (request.include_staged !== false) {
|
250
|
+
commands.push('git diff --cached');
|
251
|
+
}
|
252
|
+
if (request.include_unstaged !== false) {
|
253
|
+
commands.push('git diff');
|
254
|
+
}
|
255
|
+
let allChanges = '';
|
256
|
+
for (const command of commands) {
|
257
|
+
try {
|
258
|
+
const result = execSync(command, {
|
259
|
+
cwd: repoPath,
|
260
|
+
encoding: 'utf-8',
|
261
|
+
timeout: 30000, // 30秒超时
|
262
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB 缓冲区限制
|
263
|
+
});
|
264
|
+
allChanges += result + '\n';
|
265
|
+
}
|
266
|
+
catch (error) {
|
267
|
+
logger.warn(`Git命令执行失败: ${command}`, { error: error instanceof Error ? error.message : String(error) });
|
268
|
+
}
|
269
|
+
}
|
270
|
+
return allChanges;
|
271
|
+
}
|
272
|
+
/**
|
273
|
+
* 构建代码审查提示词
|
274
|
+
*/
|
275
|
+
buildCodeReviewPrompt(request) {
|
276
|
+
const variables = {
|
277
|
+
code: request.code,
|
278
|
+
language: request.language || '未指定',
|
279
|
+
context: request.context || '无额外上下文',
|
280
|
+
};
|
281
|
+
return PromptManager.buildPrompt('review_code', request.code, request.custom_prompt, ConfigManager.getAILanguage());
|
282
|
+
}
|
283
|
+
/**
|
284
|
+
* 构建变更审查提示词
|
285
|
+
*/
|
286
|
+
buildChangesReviewPrompt(changes, request) {
|
287
|
+
// 如果传入的是对象(用于测试),构建详细的提示词
|
288
|
+
if (typeof changes === 'object' && changes.files) {
|
289
|
+
const fileCount = changes.files.length;
|
290
|
+
const fileList = changes.files.map((f) => `- ${f.path} (${f.statusDescription})`).join('\n');
|
291
|
+
let prompt = `请审查以下Git变更:
|
292
|
+
|
293
|
+
变更文件数量: ${fileCount}
|
294
|
+
|
295
|
+
变更文件列表:
|
296
|
+
${fileList}
|
297
|
+
|
298
|
+
变更内容:
|
299
|
+
\`\`\`diff
|
300
|
+
${changes.diff}
|
301
|
+
\`\`\`
|
302
|
+
|
303
|
+
Git状态输出:
|
304
|
+
\`\`\`
|
305
|
+
${changes.statusOutput}
|
306
|
+
\`\`\`
|
307
|
+
`;
|
308
|
+
if (request.custom_prompt) {
|
309
|
+
prompt += `\n特殊要求:${request.custom_prompt}\n`;
|
310
|
+
}
|
311
|
+
prompt += '\n请务必使用中文回复。';
|
312
|
+
return prompt;
|
313
|
+
}
|
314
|
+
// 原有的字符串处理逻辑
|
315
|
+
return PromptManager.buildPrompt('review_changes', changes, request.custom_prompt, ConfigManager.getAILanguage());
|
316
|
+
}
|
317
|
+
/**
|
318
|
+
* 审查Git提交
|
319
|
+
*/
|
320
|
+
async reviewCommit(request) {
|
321
|
+
logger.info('开始Git提交审查', {
|
322
|
+
repositoryPath: request.repository_path,
|
323
|
+
commitHash: request.commit_hash,
|
324
|
+
});
|
325
|
+
try {
|
326
|
+
const repoPath = request.repository_path || process.cwd();
|
327
|
+
// 安全检查:验证路径和提交哈希
|
328
|
+
if (!this.isValidPath(repoPath)) {
|
329
|
+
throw new GitError('无效的仓库路径');
|
330
|
+
}
|
331
|
+
if (request.commit_hash && !this.isValidCommitHash(request.commit_hash)) {
|
332
|
+
throw new GitError('无效的提交哈希');
|
333
|
+
}
|
334
|
+
// 获取提交信息
|
335
|
+
const commitInfo = await this.getCommitInfo(repoPath, request.commit_hash);
|
336
|
+
if (!commitInfo.trim()) {
|
337
|
+
return {
|
338
|
+
status: '📝',
|
339
|
+
summary: '没有找到提交信息',
|
340
|
+
review: '无法获取指定的提交信息。',
|
341
|
+
ai_service_used: request.ai_service || ConfigManager.getAIService(),
|
342
|
+
timestamp: new Date().toISOString(),
|
343
|
+
};
|
344
|
+
}
|
345
|
+
// 构建审查提示词
|
346
|
+
const prompt = this.buildCommitReviewPrompt(commitInfo, request);
|
347
|
+
// 确定使用的AI服务
|
348
|
+
const aiService = request.ai_service || ConfigManager.getAIService();
|
349
|
+
// 调用AI服务进行审查
|
350
|
+
const { result, usedService } = await this.aiManager.intelligentCall(aiService, prompt);
|
351
|
+
const response = {
|
352
|
+
status: '✅',
|
353
|
+
summary: 'Git提交审查完成',
|
354
|
+
review: result,
|
355
|
+
ai_service_used: usedService,
|
356
|
+
timestamp: new Date().toISOString(),
|
357
|
+
};
|
358
|
+
logger.info('Git提交审查完成', {
|
359
|
+
aiService: usedService,
|
360
|
+
commitHash: request.commit_hash,
|
361
|
+
});
|
362
|
+
return response;
|
363
|
+
}
|
364
|
+
catch (error) {
|
365
|
+
logger.error('Git提交审查失败', error instanceof Error ? error : new Error(String(error)));
|
366
|
+
return {
|
367
|
+
status: '❌',
|
368
|
+
summary: 'Git提交审查失败',
|
369
|
+
review: `审查过程中发生错误: ${error instanceof Error ? error.message : String(error)}`,
|
370
|
+
ai_service_used: request.ai_service || ConfigManager.getAIService(),
|
371
|
+
timestamp: new Date().toISOString(),
|
372
|
+
};
|
373
|
+
}
|
374
|
+
}
|
375
|
+
/**
|
376
|
+
* 验证提交哈希格式
|
377
|
+
*/
|
378
|
+
isValidCommitHash(hash) {
|
379
|
+
// Git提交哈希应该是40个十六进制字符,或者是短哈希(7-40个字符)
|
380
|
+
const hashRegex = /^[a-f0-9]{7,40}$/i;
|
381
|
+
return hashRegex.test(hash);
|
382
|
+
}
|
383
|
+
/**
|
384
|
+
* 获取提交信息(安全版本)
|
385
|
+
*/
|
386
|
+
async getCommitInfo(repoPath, commitHash) {
|
387
|
+
try {
|
388
|
+
const hash = commitHash || 'HEAD';
|
389
|
+
const command = `git show ${hash} --pretty=fuller --stat`;
|
390
|
+
const result = execSync(command, {
|
391
|
+
cwd: repoPath,
|
392
|
+
encoding: 'utf-8',
|
393
|
+
timeout: 30000, // 30秒超时
|
394
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB 缓冲区限制
|
395
|
+
});
|
396
|
+
return result;
|
397
|
+
}
|
398
|
+
catch (error) {
|
399
|
+
throw new GitError(`获取提交信息失败: ${error instanceof Error ? error.message : String(error)}`);
|
400
|
+
}
|
401
|
+
}
|
402
|
+
/**
|
403
|
+
* 构建提交审查提示词
|
404
|
+
*/
|
405
|
+
buildCommitReviewPrompt(commitInfo, request) {
|
406
|
+
return PromptManager.buildPrompt('review_commit', commitInfo, request.custom_prompt, ConfigManager.getAILanguage());
|
407
|
+
}
|
408
|
+
/**
|
409
|
+
* 审查多个文件
|
410
|
+
*/
|
411
|
+
async reviewFiles(request) {
|
412
|
+
logger.info('开始文件批量审查', {
|
413
|
+
fileCount: request.files.length,
|
414
|
+
repositoryPath: request.repository_path,
|
415
|
+
});
|
416
|
+
try {
|
417
|
+
const repoPath = request.repository_path || process.cwd();
|
418
|
+
// 安全检查:验证路径
|
419
|
+
if (!this.isValidPath(repoPath)) {
|
420
|
+
throw new FileError('无效的仓库路径');
|
421
|
+
}
|
422
|
+
// 读取并处理文件内容
|
423
|
+
const fileContents = await this.readMultipleFiles(request.files, repoPath);
|
424
|
+
if (fileContents.length === 0) {
|
425
|
+
return {
|
426
|
+
status: '📝',
|
427
|
+
summary: '没有找到可读取的文件',
|
428
|
+
review: '指定的文件都无法读取或不存在。',
|
429
|
+
ai_service_used: request.ai_service || ConfigManager.getAIService(),
|
430
|
+
timestamp: new Date().toISOString(),
|
431
|
+
};
|
432
|
+
}
|
433
|
+
// 构建审查内容
|
434
|
+
const reviewContent = this.buildFileReviewContent(fileContents);
|
435
|
+
// 构建审查提示词
|
436
|
+
const prompt = this.buildFilesReviewPrompt(reviewContent, request);
|
437
|
+
// 确定使用的AI服务
|
438
|
+
const aiService = request.ai_service || ConfigManager.getAIService();
|
439
|
+
// 调用AI服务进行审查
|
440
|
+
const { result, usedService } = await this.aiManager.intelligentCall(aiService, prompt);
|
441
|
+
const response = {
|
442
|
+
status: '✅',
|
443
|
+
summary: '文件批量审查完成',
|
444
|
+
review: result,
|
445
|
+
ai_service_used: usedService,
|
446
|
+
timestamp: new Date().toISOString(),
|
447
|
+
};
|
448
|
+
logger.info('文件批量审查完成', {
|
449
|
+
aiService: usedService,
|
450
|
+
fileCount: fileContents.length,
|
451
|
+
});
|
452
|
+
return response;
|
453
|
+
}
|
454
|
+
catch (error) {
|
455
|
+
logger.error('文件批量审查失败', error instanceof Error ? error : new Error(String(error)));
|
456
|
+
return {
|
457
|
+
status: '❌',
|
458
|
+
summary: '文件批量审查失败',
|
459
|
+
review: `审查过程中发生错误: ${error instanceof Error ? error.message : String(error)}`,
|
460
|
+
ai_service_used: request.ai_service || ConfigManager.getAIService(),
|
461
|
+
timestamp: new Date().toISOString(),
|
462
|
+
};
|
463
|
+
}
|
464
|
+
}
|
465
|
+
/**
|
466
|
+
* 读取多个文件内容(安全版本)
|
467
|
+
*/
|
468
|
+
async readMultipleFiles(files, basePath) {
|
469
|
+
const results = [];
|
470
|
+
const maxFileSize = 1024 * 1024; // 1MB 限制
|
471
|
+
const charLimit = parseInt(ConfigManager.get('FILE_CONTENT_CHAR_LIMIT', '5000'), 10);
|
472
|
+
for (const file of files) {
|
473
|
+
try {
|
474
|
+
// 安全检查:验证文件路径
|
475
|
+
if (!this.isValidPath(file)) {
|
476
|
+
results.push({
|
477
|
+
path: file,
|
478
|
+
content: '',
|
479
|
+
error: '无效的文件路径',
|
480
|
+
});
|
481
|
+
continue;
|
482
|
+
}
|
483
|
+
const filePath = join(basePath, file);
|
484
|
+
// 检查文件是否存在
|
485
|
+
if (!existsSync(filePath)) {
|
486
|
+
results.push({
|
487
|
+
path: file,
|
488
|
+
content: '',
|
489
|
+
error: '文件不存在',
|
490
|
+
});
|
491
|
+
continue;
|
492
|
+
}
|
493
|
+
// 读取文件内容
|
494
|
+
let content = await readFile(filePath, 'utf-8');
|
495
|
+
// 内容截断处理
|
496
|
+
if (content.length > charLimit) {
|
497
|
+
content = content.substring(0, charLimit) + '\n\n[... 内容已截断 ...]';
|
498
|
+
}
|
499
|
+
results.push({
|
500
|
+
path: file,
|
501
|
+
content,
|
502
|
+
});
|
503
|
+
}
|
504
|
+
catch (error) {
|
505
|
+
results.push({
|
506
|
+
path: file,
|
507
|
+
content: '',
|
508
|
+
error: error instanceof Error ? error.message : String(error),
|
509
|
+
});
|
510
|
+
}
|
511
|
+
}
|
512
|
+
return results.filter(result => result.content || result.error);
|
513
|
+
}
|
514
|
+
/**
|
515
|
+
* 构建文件审查内容
|
516
|
+
*/
|
517
|
+
buildFileReviewContent(fileContents) {
|
518
|
+
let content = '文件审查内容:\n\n';
|
519
|
+
for (const file of fileContents) {
|
520
|
+
content += `## 文件: ${file.path}\n\n`;
|
521
|
+
if (file.error) {
|
522
|
+
content += `错误: ${file.error}\n\n`;
|
523
|
+
}
|
524
|
+
else {
|
525
|
+
content += `\`\`\`\n${file.content}\n\`\`\`\n\n`;
|
526
|
+
}
|
527
|
+
}
|
528
|
+
return content;
|
529
|
+
}
|
530
|
+
/**
|
531
|
+
* 构建文件审查提示词
|
532
|
+
*/
|
533
|
+
buildFilesReviewPrompt(content, request) {
|
534
|
+
return PromptManager.buildPrompt('review_files', content, request.custom_prompt, ConfigManager.getAILanguage());
|
535
|
+
}
|
536
|
+
/**
|
537
|
+
* 配置AI服务
|
538
|
+
*/
|
539
|
+
async configureAIService(request) {
|
540
|
+
logger.info('开始配置AI服务', {
|
541
|
+
service: request.service,
|
542
|
+
scope: request.scope,
|
543
|
+
hasApiKey: !!request.api_key,
|
544
|
+
});
|
545
|
+
try {
|
546
|
+
const service = request.service;
|
547
|
+
const scope = request.scope || 'project';
|
548
|
+
// 验证服务类型
|
549
|
+
if (!['gemini', 'claudecode'].includes(service)) {
|
550
|
+
throw new Error(`不支持的AI服务: ${service}`);
|
551
|
+
}
|
552
|
+
// 获取配置路径
|
553
|
+
const { dir: configDir, file: configFile } = ConfigManager.getConfigPath(scope);
|
554
|
+
// 确保配置目录存在
|
555
|
+
if (!existsSync(configDir)) {
|
556
|
+
await mkdir(configDir, { recursive: true });
|
557
|
+
}
|
558
|
+
// 读取现有配置
|
559
|
+
let existingConfig = {};
|
560
|
+
if (existsSync(configFile)) {
|
561
|
+
try {
|
562
|
+
const content = await readFile(configFile, 'utf-8');
|
563
|
+
existingConfig = ConfigManager.parseEnvContent(content);
|
564
|
+
}
|
565
|
+
catch (error) {
|
566
|
+
logger.warn('读取现有配置失败,将创建新配置', { error: error instanceof Error ? error.message : String(error) });
|
567
|
+
}
|
568
|
+
}
|
569
|
+
// 更新配置
|
570
|
+
if (request.api_key) {
|
571
|
+
const envVar = ConfigManager.getAPIKeyEnvVar(service);
|
572
|
+
existingConfig[envVar] = request.api_key;
|
573
|
+
}
|
574
|
+
if (request.timeout) {
|
575
|
+
existingConfig['AI_TIMEOUT'] = request.timeout.toString();
|
576
|
+
}
|
577
|
+
if (request.max_retries) {
|
578
|
+
existingConfig['AI_MAX_RETRIES'] = request.max_retries.toString();
|
579
|
+
}
|
580
|
+
// 语言配置已移除,使用默认配置
|
581
|
+
// 写入配置文件
|
582
|
+
const configContent = Object.entries(existingConfig)
|
583
|
+
.map(([key, value]) => `${key}=${value}`)
|
584
|
+
.join('\n');
|
585
|
+
await writeFile(configFile, configContent, 'utf-8');
|
586
|
+
// 重新初始化AI管理器
|
587
|
+
this.aiManager.reinitialize();
|
588
|
+
const response = {
|
589
|
+
success: true,
|
590
|
+
message: `AI服务 ${service} 配置成功`,
|
591
|
+
config_path: configFile,
|
592
|
+
restart_required: false,
|
593
|
+
};
|
594
|
+
logger.info('AI服务配置完成', {
|
595
|
+
service,
|
596
|
+
configPath: configFile,
|
597
|
+
});
|
598
|
+
return response;
|
599
|
+
}
|
600
|
+
catch (error) {
|
601
|
+
logger.error('AI服务配置失败', error instanceof Error ? error : new Error(String(error)));
|
602
|
+
return {
|
603
|
+
success: false,
|
604
|
+
message: `配置失败: ${error instanceof Error ? error.message : String(error)}`,
|
605
|
+
config_path: '',
|
606
|
+
restart_required: false,
|
607
|
+
};
|
608
|
+
}
|
609
|
+
}
|
610
|
+
/**
|
611
|
+
* 获取AI服务状态
|
612
|
+
*/
|
613
|
+
async getAIServiceStatus(request) {
|
614
|
+
logger.info('开始获取AI服务状态');
|
615
|
+
try {
|
616
|
+
// 刷新服务状态
|
617
|
+
await this.aiManager.refreshServiceStatus();
|
618
|
+
// 获取服务状态
|
619
|
+
const serviceStatus = this.aiManager.getServiceStatus();
|
620
|
+
const availableServices = this.aiManager.getAvailableServices();
|
621
|
+
// 构建详细状态信息
|
622
|
+
const services = Object.entries(serviceStatus).map(([service, available]) => {
|
623
|
+
const apiKey = ConfigManager.getAPIKey(service);
|
624
|
+
return {
|
625
|
+
service: service,
|
626
|
+
available,
|
627
|
+
configured: !!apiKey,
|
628
|
+
};
|
629
|
+
});
|
630
|
+
const response = {
|
631
|
+
services,
|
632
|
+
current_service: ConfigManager.getAIService(),
|
633
|
+
auto_switch_enabled: ConfigManager.isAutoSwitchEnabled(),
|
634
|
+
};
|
635
|
+
logger.info('AI服务状态获取完成', {
|
636
|
+
availableCount: availableServices.length,
|
637
|
+
totalCount: services.length,
|
638
|
+
});
|
639
|
+
return response;
|
640
|
+
}
|
641
|
+
catch (error) {
|
642
|
+
logger.error('获取AI服务状态失败', error instanceof Error ? error : new Error(String(error)));
|
643
|
+
return {
|
644
|
+
services: [],
|
645
|
+
current_service: 'gemini',
|
646
|
+
auto_switch_enabled: false,
|
647
|
+
};
|
648
|
+
}
|
649
|
+
}
|
650
|
+
}
|
651
|
+
//# sourceMappingURL=CodeRocketService.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"CodeRocketService.js","sourceRoot":"","sources":["../../src/services/CodeRocketService.ts"],"names":[],"mappings":"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"}
|