yuangs 5.47.0 → 5.50.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/commands/git/resolve.js +32 -6
- package/dist/commands/git/resolve.js.map +1 -1
- package/dist/core/git/ConflictResolver.d.ts +4 -0
- package/dist/core/git/ConflictResolver.js +62 -1
- package/dist/core/git/ConflictResolver.js.map +1 -1
- package/dist/core/git/ContextGatherer.d.ts +2 -0
- package/dist/core/git/ContextGatherer.js +22 -1
- package/dist/core/git/ContextGatherer.js.map +1 -1
- package/dist/core/git/semantic/SemanticDiffEngine.d.ts +8 -0
- package/dist/core/git/semantic/SemanticDiffEngine.js +48 -20
- package/dist/core/git/semantic/SemanticDiffEngine.js.map +1 -1
- package/dist/core/git/semantic/types.d.ts +3 -1
- package/dist/core/git/semantic/types.js +2 -0
- package/dist/core/git/semantic/types.js.map +1 -1
- package/dist/core/kernel/ASTParser.d.ts +84 -5
- package/dist/core/kernel/ASTParser.js +425 -44
- package/dist/core/kernel/ASTParser.js.map +1 -1
- package/dist/core/kernel/FastScanner.js +5 -6
- package/dist/core/kernel/FastScanner.js.map +1 -1
- package/package.json +3 -3
|
@@ -10,6 +10,7 @@ const path_1 = __importDefault(require("path"));
|
|
|
10
10
|
const GitService_1 = require("../../core/git/GitService");
|
|
11
11
|
const ConflictResolver_1 = require("../../core/git/ConflictResolver");
|
|
12
12
|
const constants_1 = require("../../core/git/constants");
|
|
13
|
+
const llm_1 = require("../../agent/llm");
|
|
13
14
|
const p_limit_1 = __importDefault(require("p-limit"));
|
|
14
15
|
function registerResolveCommand(gitCmd) {
|
|
15
16
|
gitCmd
|
|
@@ -34,6 +35,22 @@ function registerResolveCommand(gitCmd) {
|
|
|
34
35
|
if (!isStandardModel) {
|
|
35
36
|
spinner.warn(`非官方推荐模型: ${chalk_1.default.yellow(options.model)} (可能解析效果不佳)`);
|
|
36
37
|
}
|
|
38
|
+
// 额外验证模型是否真实可用
|
|
39
|
+
try {
|
|
40
|
+
await (0, llm_1.runLLM)({
|
|
41
|
+
prompt: {
|
|
42
|
+
system: "请回复 'OK'",
|
|
43
|
+
messages: [{ role: 'user', content: '测试模型连接' }]
|
|
44
|
+
},
|
|
45
|
+
model: options.model,
|
|
46
|
+
stream: false
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
51
|
+
spinner.fail(`模型不可用: ${options.model} (${errorMessage})`);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
37
54
|
try {
|
|
38
55
|
if (!(await gitService.isGitRepository())) {
|
|
39
56
|
spinner.fail('当前目录不是 Git 仓库');
|
|
@@ -46,7 +63,7 @@ function registerResolveCommand(gitCmd) {
|
|
|
46
63
|
}
|
|
47
64
|
spinner.succeed(`发现 ${conflictedFiles.length} 个冲突文件:\n` +
|
|
48
65
|
conflictedFiles.map(f => chalk_1.default.red(` • ${f}`)).join('\n') + '\n');
|
|
49
|
-
const concurrency = parseInt(options.concurrency, 10) || 2;
|
|
66
|
+
const concurrency = Math.max(1, Math.min(10, parseInt(options.concurrency, 10) || 2)); // 限制并发数在1-10之间
|
|
50
67
|
const limit = (0, p_limit_1.default)(concurrency);
|
|
51
68
|
const results = [];
|
|
52
69
|
const tasks = conflictedFiles.map(file => limit(async () => {
|
|
@@ -77,12 +94,21 @@ function registerResolveCommand(gitCmd) {
|
|
|
77
94
|
}
|
|
78
95
|
catch (err) {
|
|
79
96
|
taskSpinner.fail(`执行异常: ${chalk_1.default.red(file)}`);
|
|
80
|
-
console.log(chalk_1.default.red(` 错误: ${err.message}`));
|
|
81
|
-
return { file, success: false, error: err.message };
|
|
97
|
+
console.log(chalk_1.default.red(` 错误: ${err.message || String(err)}`));
|
|
98
|
+
return { file, success: false, error: err.message || String(err) };
|
|
82
99
|
}
|
|
83
100
|
}));
|
|
84
|
-
|
|
85
|
-
|
|
101
|
+
// 使用更安全的 Promise.allSettled 替代,确保单个文件失败不会影响其他文件
|
|
102
|
+
const promiseResults = await Promise.allSettled(tasks);
|
|
103
|
+
for (const result of promiseResults) {
|
|
104
|
+
if (result.status === 'fulfilled') {
|
|
105
|
+
results.push(result.value);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// 处理 rejected 的情况
|
|
109
|
+
console.log(chalk_1.default.red(` 任务执行异常: ${result.reason.message || String(result.reason)}`));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
86
112
|
const successCount = results.filter(r => r.success).length;
|
|
87
113
|
console.log(chalk_1.default.bold(`\n✨ 完成!成功解决 ${successCount}/${results.length} 个文件的冲突\n`));
|
|
88
114
|
if (options.dryRun) {
|
|
@@ -96,7 +122,7 @@ function registerResolveCommand(gitCmd) {
|
|
|
96
122
|
}
|
|
97
123
|
}
|
|
98
124
|
catch (error) {
|
|
99
|
-
const errMsg = error instanceof Error ? error.message : String(error);
|
|
125
|
+
const errMsg = error instanceof Error ? error.message : (typeof error === 'string' ? error : String(error));
|
|
100
126
|
spinner.fail(`执行过程中出现错误: ${errMsg}`);
|
|
101
127
|
}
|
|
102
128
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/commands/git/resolve.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/commands/git/resolve.ts"],"names":[],"mappings":";;;;;AAUA,wDA6HC;AAtID,kDAA0B;AAC1B,8CAAsB;AACtB,gDAAwB;AACxB,0DAAuD;AACvD,sEAA6F;AAC7F,wDAAiF;AACjF,yCAAyC;AACzC,sDAA6B;AAE7B,SAAgB,sBAAsB,CAAC,MAAe;IAClD,MAAM;SACD,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,qBAAqB,EAAE,WAAW,EAAE,4BAAgB,CAAC;SAC5D,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,KAAK,CAAC;SACpD,MAAM,CAAC,WAAW,EAAE,gBAAgB,EAAE,KAAK,CAAC;SAC5C,MAAM,CAAC,aAAa,EAAE,gBAAgB,EAAE,KAAK,CAAC;SAC9C,MAAM,CAAC,4BAA4B,EAAE,QAAQ,EAAE,GAAG,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,MAAM,UAAU,GAAG,IAAI,uBAAU,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,mCAAgB,CAAC,UAAU,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,aAAa,CAAC,CAAC,KAAK,EAAE,CAAC;QAE3C,uBAAuB;QACvB,MAAM,eAAe,GAAG,+BAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,aAAa,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE/D,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAC5C,OAAO;QACX,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,YAAY,eAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACvE,CAAC;QAED,eAAe;QACf,IAAI,CAAC;YACD,MAAM,IAAA,YAAM,EAAC;gBACT,MAAM,EAAE;oBACJ,MAAM,EAAE,UAAU;oBAClB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;iBAClD;gBACD,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,KAAK;aAChB,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,KAAK,KAAK,YAAY,GAAG,CAAC,CAAC;YAC1D,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC9B,OAAO;YACX,CAAC;YAED,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,kBAAkB,EAAE,CAAC;YAE9D,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAC7B,OAAO;YACX,CAAC;YAED,OAAO,CAAC,OAAO,CAAC,MAAM,eAAe,CAAC,MAAM,WAAW;gBACnD,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,eAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAEvE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe;YACtG,MAAM,KAAK,GAAG,IAAA,iBAAM,EAAC,WAAW,CAAC,CAAC;YAClC,MAAM,OAAO,GAA+B,EAAE,CAAC;YAE/C,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CACrC,KAAK,CAAC,KAAK,IAAI,EAAE;gBACb,MAAM,WAAW,GAAG,IAAA,aAAG,EAAC,SAAS,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;gBAChE,IAAI,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE;wBAC5C,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;wBACtB,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,KAAK;qBACnC,CAAC,CAAC;oBAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACjB,WAAW,CAAC,OAAO,CAAC,SAAS,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAClD,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;4BACvC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,eAAe,cAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;wBAC/E,CAAC;wBACD,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;4BACrC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;4BACpC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,CAAC;wBACxD,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACJ,WAAW,CAAC,IAAI,CAAC,SAAS,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAC7C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;4BACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,YAAY,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;wBAC1D,CAAC;oBACL,CAAC;oBACD,OAAO,MAAM,CAAC;gBAClB,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAChB,WAAW,CAAC,IAAI,CAAC,SAAS,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC7C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;oBACjE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvE,CAAC;YACL,CAAC,CAAC,CACL,CAAC;YAEF,gDAAgD;YAChD,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAEvD,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;gBAClC,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBAChC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACJ,kBAAkB;oBAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7F,CAAC;YACL,CAAC;YAED,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,eAAe,YAAY,IAAI,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC,CAAC;YAElF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAC9D,CAAC;iBAAM,IAAI,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;gBACvC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAC1D,CAAC;iBAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;YACjE,CAAC;QAEL,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5G,OAAO,CAAC,IAAI,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC;QACzC,CAAC;IACL,CAAC,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
@@ -69,6 +102,11 @@ class ConflictResolver {
|
|
|
69
102
|
if (syntaxError) {
|
|
70
103
|
return { file: filePath, success: false, error: `AI 生成的代码存在基础语法风险: ${syntaxError}` };
|
|
71
104
|
}
|
|
105
|
+
// 5. 更严格的语法校验(根据文件类型)
|
|
106
|
+
const advancedSyntaxError = await this.validateAdvancedSyntax(filePath, resolvedContent);
|
|
107
|
+
if (advancedSyntaxError) {
|
|
108
|
+
return { file: filePath, success: false, error: `AI 生成的代码存在高级语法错误: ${advancedSyntaxError}` };
|
|
109
|
+
}
|
|
72
110
|
if (dryRun) {
|
|
73
111
|
return { file: filePath, success: true, suggestion: 'Dry-run: 内容已生成但未写回文件' };
|
|
74
112
|
}
|
|
@@ -83,7 +121,7 @@ class ConflictResolver {
|
|
|
83
121
|
return { file: filePath, success: true, backupFile };
|
|
84
122
|
}
|
|
85
123
|
catch (error) {
|
|
86
|
-
const errMsg = error instanceof Error ? error.message : String(error);
|
|
124
|
+
const errMsg = error instanceof Error ? error.message : (typeof error === 'string' ? error : String(error));
|
|
87
125
|
return { file: filePath, success: false, error: errMsg };
|
|
88
126
|
}
|
|
89
127
|
}
|
|
@@ -116,6 +154,29 @@ class ConflictResolver {
|
|
|
116
154
|
}
|
|
117
155
|
return null;
|
|
118
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* 高级语法校验(如 TypeScript 语法解析)
|
|
159
|
+
*/
|
|
160
|
+
async validateAdvancedSyntax(filePath, content) {
|
|
161
|
+
const ext = path_1.default.extname(filePath).toLowerCase();
|
|
162
|
+
// 对于 TypeScript 文件,尝试进行更深入的语法检查
|
|
163
|
+
if (ext === '.ts' || ext === '.tsx') {
|
|
164
|
+
try {
|
|
165
|
+
const tsModule = await Promise.resolve().then(() => __importStar(require('typescript')));
|
|
166
|
+
const ts = tsModule.default || tsModule;
|
|
167
|
+
// 创建一个虚拟源文件进行语法检查
|
|
168
|
+
// 如果内容有严重语法错误,createSourceFile 可能会抛出异常
|
|
169
|
+
ts.createSourceFile('temp' + ext, content, ts.ScriptTarget.Latest, true);
|
|
170
|
+
// 如果没有抛出异常,说明基本的语法结构是正确的
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
catch (e) {
|
|
174
|
+
// 如果 TypeScript 解析失败,说明有语法错误
|
|
175
|
+
return `TypeScript 语法错误: ${e.message || String(e)}`;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
119
180
|
}
|
|
120
181
|
exports.ConflictResolver = ConflictResolver;
|
|
121
182
|
//# sourceMappingURL=ConflictResolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConflictResolver.js","sourceRoot":"","sources":["../../../src/core/git/ConflictResolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ConflictResolver.js","sourceRoot":"","sources":["../../../src/core/git/ConflictResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ exports.ContextGatherer = void 0;
|
|
|
7
7
|
const fs_1 = __importDefault(require("fs"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
9
|
const ContextMeta_1 = require("../context/ContextMeta");
|
|
10
|
+
const ASTParser_1 = require("../kernel/ASTParser");
|
|
10
11
|
/**
|
|
11
12
|
* 项目上下文采集器
|
|
12
13
|
* 负责为 LLM 提供项目现状的真实快照
|
|
@@ -15,8 +16,12 @@ class ContextGatherer {
|
|
|
15
16
|
gitService;
|
|
16
17
|
MAX_FILE_CONTENT_LENGTH = 10000; // 单个文件读取上限
|
|
17
18
|
MAX_TOTAL_CONTEXT_LENGTH = 50000; // 总上限
|
|
19
|
+
SUMMARY_THRESHOLD = 2000; // 文件大小超过此阈值时进行摘要
|
|
20
|
+
astParser; // Reuse AST parser instance
|
|
18
21
|
constructor(gitService) {
|
|
19
22
|
this.gitService = gitService;
|
|
23
|
+
// Initialize AST parser for semantic summarization (created once to avoid performance issues)
|
|
24
|
+
this.astParser = new ASTParser_1.EnhancedASTParser();
|
|
20
25
|
}
|
|
21
26
|
/**
|
|
22
27
|
* 采集项目上下文
|
|
@@ -178,7 +183,23 @@ class ContextGatherer {
|
|
|
178
183
|
try {
|
|
179
184
|
if (fs_1.default.existsSync(fullPath) && fs_1.default.statSync(fullPath).isFile()) {
|
|
180
185
|
let content = fs_1.default.readFileSync(fullPath, 'utf8');
|
|
181
|
-
if
|
|
186
|
+
// Determine if the file should be summarized based on size and file type
|
|
187
|
+
const isReferenceOnly = !description.includes(filePath); // If the file path is not explicitly mentioned in the description
|
|
188
|
+
const isTooLarge = content.length > this.SUMMARY_THRESHOLD;
|
|
189
|
+
const isTSFile = filePath.endsWith('.ts') || filePath.endsWith('.tsx');
|
|
190
|
+
if (isReferenceOnly && isTooLarge && isTSFile) {
|
|
191
|
+
// Generate semantic summary for large TS files that are not directly referenced
|
|
192
|
+
try {
|
|
193
|
+
content = this.astParser.generateSummary(filePath, content);
|
|
194
|
+
console.log(`[Economy] ✂️ Summarized ${filePath} to save tokens.`);
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
console.warn(`[ContextGatherer] 警告:摘要生成失败 "${filePath}": ${error.message}`);
|
|
198
|
+
// 如果摘要生成失败,回退到截断内容
|
|
199
|
+
content = content.substring(0, this.MAX_FILE_CONTENT_LENGTH) + '\n... (内容过长已截断,摘要生成失败)';
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else if (content.length > this.MAX_FILE_CONTENT_LENGTH) {
|
|
182
203
|
content = content.substring(0, this.MAX_FILE_CONTENT_LENGTH) + '\n... (内容过长已截断)';
|
|
183
204
|
}
|
|
184
205
|
results.push({ path: filePath, content });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextGatherer.js","sourceRoot":"","sources":["../../../src/core/git/ContextGatherer.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AAExB,wDAAqF;
|
|
1
|
+
{"version":3,"file":"ContextGatherer.js","sourceRoot":"","sources":["../../../src/core/git/ContextGatherer.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,15 @@ export declare class SemanticDiffEngine {
|
|
|
10
10
|
* 解析 Git Diff 输出并提取语义变更
|
|
11
11
|
*/
|
|
12
12
|
static analyze(diff: string): SemanticDiffResult;
|
|
13
|
+
/**
|
|
14
|
+
* 验证 diff 格式的基本有效性
|
|
15
|
+
*/
|
|
16
|
+
private static validateDiffFormat;
|
|
13
17
|
private static splitDiffIntoFiles;
|
|
18
|
+
/**
|
|
19
|
+
* 解析文件路径,优先使用 --- / +++ 行
|
|
20
|
+
*/
|
|
21
|
+
private static extractFilePaths;
|
|
14
22
|
private static analyzeFileBlock;
|
|
15
23
|
private static analyzeTSJSChanges;
|
|
16
24
|
private static generateFileSummary;
|
|
@@ -16,6 +16,10 @@ class SemanticDiffEngine {
|
|
|
16
16
|
if (!diff || typeof diff !== 'string') {
|
|
17
17
|
return { files: [], isBreaking: false, overallSummary: '无变更内容或格式错误' };
|
|
18
18
|
}
|
|
19
|
+
// 验证 diff 格式的基本有效性
|
|
20
|
+
if (!this.validateDiffFormat(diff)) {
|
|
21
|
+
return { files: [], isBreaking: false, overallSummary: '无效的 diff 格式' };
|
|
22
|
+
}
|
|
19
23
|
const fileBlocks = this.splitDiffIntoFiles(diff);
|
|
20
24
|
const fileDiffs = [];
|
|
21
25
|
for (const block of fileBlocks) {
|
|
@@ -31,6 +35,13 @@ class SemanticDiffEngine {
|
|
|
31
35
|
overallSummary: this.generateOverallSummary(fileDiffs)
|
|
32
36
|
};
|
|
33
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* 验证 diff 格式的基本有效性
|
|
40
|
+
*/
|
|
41
|
+
static validateDiffFormat(diff) {
|
|
42
|
+
// 检查是否包含基本的 diff 标识符
|
|
43
|
+
return diff.includes('diff --git');
|
|
44
|
+
}
|
|
34
45
|
static splitDiffIntoFiles(diff) {
|
|
35
46
|
const blocks = [];
|
|
36
47
|
const lines = diff.split('\n');
|
|
@@ -51,36 +62,53 @@ class SemanticDiffEngine {
|
|
|
51
62
|
}
|
|
52
63
|
return blocks;
|
|
53
64
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
65
|
+
/**
|
|
66
|
+
* 解析文件路径,优先使用 --- / +++ 行
|
|
67
|
+
*/
|
|
68
|
+
static extractFilePaths(header, sourceLine, targetLine) {
|
|
69
|
+
// 优先使用 --- / +++ 行来获取路径
|
|
59
70
|
if (targetLine && targetLine !== '+++ /dev/null') {
|
|
60
|
-
|
|
71
|
+
const targetMatch = targetLine.match(/^\+\+\+ (a\/)?(.+)$/);
|
|
72
|
+
if (targetMatch) {
|
|
73
|
+
// targetMatch[2] 是去掉 a/ 或 b/ 前缀的实际路径
|
|
74
|
+
return { targetPath: targetMatch[2] };
|
|
75
|
+
}
|
|
61
76
|
}
|
|
62
|
-
|
|
63
|
-
|
|
77
|
+
if (sourceLine && sourceLine !== '--- /dev/null') {
|
|
78
|
+
const sourceMatch = sourceLine.match(/^--- (a\/)?(.+)$/);
|
|
79
|
+
if (sourceMatch) {
|
|
80
|
+
// sourceMatch[2] 是去掉 a/ 或 b/ 前缀的实际路径
|
|
81
|
+
return { sourcePath: sourceMatch[2] };
|
|
82
|
+
}
|
|
64
83
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const
|
|
70
|
-
|
|
84
|
+
// 回退到使用 diff --git 行
|
|
85
|
+
const pathMatch = header.match(/diff --git (?:a\/)?(.+?) (?:b\/)?(.+?)$/);
|
|
86
|
+
if (pathMatch) {
|
|
87
|
+
// 提取并清理路径,移除 a/ 和 b/ 前缀
|
|
88
|
+
const sourcePath = pathMatch[1].replace(/^[ab]\//, '');
|
|
89
|
+
const targetPath = pathMatch[2].replace(/^[ab]\//, '');
|
|
90
|
+
return { sourcePath, targetPath };
|
|
71
91
|
}
|
|
92
|
+
return { sourcePath: 'unknown', targetPath: 'unknown' };
|
|
93
|
+
}
|
|
94
|
+
static analyzeFileBlock(block) {
|
|
95
|
+
const lines = block.split('\n');
|
|
96
|
+
// 查找 diff header、source 和 target 行
|
|
97
|
+
const headerLine = lines.find(l => l.startsWith('diff --git '));
|
|
98
|
+
const targetLine = lines.find(l => l.startsWith('+++ '));
|
|
99
|
+
const sourceLine = lines.find(l => l.startsWith('--- '));
|
|
100
|
+
if (!headerLine)
|
|
101
|
+
return null;
|
|
102
|
+
// 使用改进的路径提取方法
|
|
103
|
+
const { targetPath, sourcePath } = this.extractFilePaths(headerLine, sourceLine, targetLine);
|
|
104
|
+
// 优先使用 targetPath,如果不存在则使用 sourcePath(适用于删除文件的情况)
|
|
105
|
+
const filePath = targetPath || sourcePath || 'unknown';
|
|
72
106
|
const extension = filePath.split('.').pop()?.toLowerCase();
|
|
73
107
|
const changes = [];
|
|
74
108
|
// 目前主要针对 TS/JS 进行正则分析
|
|
75
109
|
if (['ts', 'js', 'tsx', 'jsx'].includes(extension || '')) {
|
|
76
110
|
this.analyzeTSJSChanges(lines, changes);
|
|
77
111
|
}
|
|
78
|
-
// 如果路径是 /dev/null 说明是彻底删除文件
|
|
79
|
-
if (filePath === '/dev/null') {
|
|
80
|
-
const sourceLine = lines.find(l => l.startsWith('--- a/'));
|
|
81
|
-
if (sourceLine)
|
|
82
|
-
filePath = sourceLine.substring(6);
|
|
83
|
-
}
|
|
84
112
|
return {
|
|
85
113
|
path: filePath,
|
|
86
114
|
changes,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SemanticDiffEngine.js","sourceRoot":"","sources":["../../../../src/core/git/semantic/SemanticDiffEngine.ts"],"names":[],"mappings":";;;AAAA,mCAMiB;AAEjB;;;;;GAKG;AACH,MAAa,kBAAkB;IAC3B;;OAEG;IACI,MAAM,CAAC,OAAO,CAAC,IAAY;QAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;QAC1E,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,SAAS,GAAuB,EAAE,CAAC;QAEzC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,QAAQ,EAAE,CAAC;gBACX,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAE1E,OAAO;YACH,KAAK,EAAE,SAAS;YAChB,UAAU;YACV,cAAc,EAAE,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC;SACzD,CAAC;IACN,CAAC;IAEO,MAAM,CAAC,kBAAkB,CAAC,IAAY;QAC1C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,YAAY,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBACjC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACzC,CAAC;gBACD,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;iBAAM,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC;QACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;
|
|
1
|
+
{"version":3,"file":"SemanticDiffEngine.js","sourceRoot":"","sources":["../../../../src/core/git/semantic/SemanticDiffEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@ var ChangeType;
|
|
|
5
5
|
(function (ChangeType) {
|
|
6
6
|
ChangeType["ADDITION"] = "addition";
|
|
7
7
|
ChangeType["DELETION"] = "deletion";
|
|
8
|
+
ChangeType["MODIFICATION"] = "modification";
|
|
9
|
+
ChangeType["RENAME"] = "rename";
|
|
8
10
|
})(ChangeType || (exports.ChangeType = ChangeType = {}));
|
|
9
11
|
var SemanticCategory;
|
|
10
12
|
(function (SemanticCategory) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/git/semantic/types.ts"],"names":[],"mappings":";;;AAAA,IAAY,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/git/semantic/types.ts"],"names":[],"mappings":";;;AAAA,IAAY,UAKX;AALD,WAAY,UAAU;IAClB,mCAAqB,CAAA;IACrB,mCAAqB,CAAA;IACrB,2CAA6B,CAAA;IAC7B,+BAAiB,CAAA;AACrB,CAAC,EALW,UAAU,0BAAV,UAAU,QAKrB;AAED,IAAY,gBAOX;AAPD,WAAY,gBAAgB;IACxB,yCAAqB,CAAA;IACrB,mCAAe,CAAA;IACf,2CAAuB,CAAA;IACvB,iCAAa,CAAA;IACb,yCAAqB,CAAA;IACrB,uCAAmB,CAAA;AACvB,CAAC,EAPW,gBAAgB,gCAAhB,gBAAgB,QAO3B"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Enhanced AST Parser for
|
|
2
|
+
* Enhanced AST Parser for Auditable Execution Kernel
|
|
3
3
|
*
|
|
4
|
-
* 增强版 AST
|
|
5
|
-
* 1.
|
|
4
|
+
* 增强版 AST 解析器,作为内核的 "事实提取器",支持:
|
|
5
|
+
* 1. 提取导出符号(函数、类、接口、类型别名、变量等)
|
|
6
6
|
* 2. 提取 JSDoc 注释和标签
|
|
7
|
-
* 3. 提供符号的完整元数据(名称、类型、JSDoc
|
|
7
|
+
* 3. 提供符号的完整元数据(名称、类型、JSDoc、行号、符号哈希等)
|
|
8
|
+
* 4. 支持嵌套结构(类中的方法、函数中的函数等)
|
|
9
|
+
* 5. 处理匿名函数和箭头函数
|
|
10
|
+
* 6. 生成符号哈希用于审计验证
|
|
11
|
+
* 7. 集成 TypeChecker 以支持跨文件类型解析
|
|
8
12
|
*
|
|
9
13
|
* 使用 TypeScript Compiler API 实现精确解析
|
|
10
14
|
*/
|
|
@@ -20,8 +24,36 @@ export interface SymbolMetadata {
|
|
|
20
24
|
jsDoc: string;
|
|
21
25
|
/** 起始行号(从1开始) */
|
|
22
26
|
startLine: number;
|
|
27
|
+
/** 结束行号(从1开始) */
|
|
28
|
+
endLine: number;
|
|
23
29
|
/** 是否已导出 */
|
|
24
30
|
isExported: boolean;
|
|
31
|
+
/** 符号内容的哈希值(用于审计验证) */
|
|
32
|
+
hash: string;
|
|
33
|
+
/** 符号的完整源码内容 */
|
|
34
|
+
content: string;
|
|
35
|
+
/** 访问修饰符(public, private, protected) */
|
|
36
|
+
accessibility?: 'public' | 'private' | 'protected';
|
|
37
|
+
/** 参数列表(如果是函数/方法) */
|
|
38
|
+
parameters?: ParameterInfo[];
|
|
39
|
+
/** 返回类型(如果是函数) */
|
|
40
|
+
returnType?: string;
|
|
41
|
+
/** 泛型参数(如果有) */
|
|
42
|
+
typeParameters?: string[];
|
|
43
|
+
/** 父级符号名称(用于嵌套结构) */
|
|
44
|
+
parentName?: string;
|
|
45
|
+
/** 是否是匿名函数 */
|
|
46
|
+
isAnonymous?: boolean;
|
|
47
|
+
/** 符号的完整路径(如:ClassName.methodName) */
|
|
48
|
+
fullPath?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 参数信息接口
|
|
52
|
+
*/
|
|
53
|
+
export interface ParameterInfo {
|
|
54
|
+
name: string;
|
|
55
|
+
type: string;
|
|
56
|
+
optional: boolean;
|
|
25
57
|
}
|
|
26
58
|
/**
|
|
27
59
|
* AST 解析结果
|
|
@@ -37,7 +69,7 @@ export interface ASTParseResult {
|
|
|
37
69
|
/**
|
|
38
70
|
* 增强版 AST 解析器
|
|
39
71
|
*
|
|
40
|
-
*
|
|
72
|
+
* 作为可审计执行内核的 "事实提取器",提供精确的符号提取能力
|
|
41
73
|
*/
|
|
42
74
|
export declare class EnhancedASTParser {
|
|
43
75
|
/**
|
|
@@ -60,8 +92,34 @@ export declare class EnhancedASTParser {
|
|
|
60
92
|
*
|
|
61
93
|
* @param node - AST 节点
|
|
62
94
|
* @param symbols - 符号列表(输出参数)
|
|
95
|
+
* @param parentStack - 父级符号栈(用于嵌套结构)
|
|
96
|
+
* @param typeChecker - TypeScript 类型检查器
|
|
63
97
|
*/
|
|
64
98
|
private visitAndExtractSymbols;
|
|
99
|
+
/**
|
|
100
|
+
* Extract modifier information (export, access modifiers) from a node
|
|
101
|
+
*/
|
|
102
|
+
private extractModifiers;
|
|
103
|
+
/**
|
|
104
|
+
* Extract symbol information from a node
|
|
105
|
+
*/
|
|
106
|
+
private extractSymbolInfo;
|
|
107
|
+
/**
|
|
108
|
+
* 判断是否应将符号推入父级栈
|
|
109
|
+
*/
|
|
110
|
+
private shouldPushToParentStack;
|
|
111
|
+
/**
|
|
112
|
+
* 生成匿名函数的唯一名称
|
|
113
|
+
*/
|
|
114
|
+
private generateAnonymousName;
|
|
115
|
+
/**
|
|
116
|
+
* 提取函数参数信息
|
|
117
|
+
*/
|
|
118
|
+
private extractParameters;
|
|
119
|
+
/**
|
|
120
|
+
* 提取类型信息
|
|
121
|
+
*/
|
|
122
|
+
private extractType;
|
|
65
123
|
/**
|
|
66
124
|
* 从节点提取 JSDoc 注释
|
|
67
125
|
*
|
|
@@ -69,6 +127,14 @@ export declare class EnhancedASTParser {
|
|
|
69
127
|
* @returns 提取的 JSDoc 文档字符串
|
|
70
128
|
*/
|
|
71
129
|
private extractJSDoc;
|
|
130
|
+
/**
|
|
131
|
+
* 计算内容的哈希值(用于审计验证)
|
|
132
|
+
*/
|
|
133
|
+
private calculateHash;
|
|
134
|
+
/**
|
|
135
|
+
* 规范化代码(移除空格和注释) using AST-based approach to avoid issues with string literals
|
|
136
|
+
*/
|
|
137
|
+
private normalizeCode;
|
|
72
138
|
/**
|
|
73
139
|
* 将 TypeScript 节点类型映射为可读字符串
|
|
74
140
|
*
|
|
@@ -83,4 +149,17 @@ export declare class EnhancedASTParser {
|
|
|
83
149
|
* @returns 导出符号名称数组
|
|
84
150
|
*/
|
|
85
151
|
getExportedSymbolNames(filePath: string): Promise<string[]>;
|
|
152
|
+
/**
|
|
153
|
+
* 比较两个解析结果,找出差异(用于审计目的)
|
|
154
|
+
*/
|
|
155
|
+
compareResults(oldResult: ASTParseResult, newResult: ASTParseResult): {
|
|
156
|
+
added: SymbolMetadata[];
|
|
157
|
+
removed: SymbolMetadata[];
|
|
158
|
+
modified: SymbolMetadata[];
|
|
159
|
+
};
|
|
160
|
+
/**
|
|
161
|
+
* 将庞大的文件内容压缩为"语义摘要"
|
|
162
|
+
* 仅保留 Export 声明和 JSDoc,剔除函数体实现
|
|
163
|
+
*/
|
|
164
|
+
generateSummary(filePath: string, content: string): string;
|
|
86
165
|
}
|