yuangs 3.23.0 → 3.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/AgentRuntime.d.ts +2 -1
- package/dist/agent/AgentRuntime.js +69 -4
- package/dist/agent/AgentRuntime.js.map +1 -1
- package/dist/agent/astParser.d.ts +45 -0
- package/dist/agent/astParser.js +232 -0
- package/dist/agent/astParser.js.map +1 -0
- package/dist/agent/codeSummary.d.ts +2 -2
- package/dist/agent/codeSummary.js +36 -76
- package/dist/agent/codeSummary.js.map +1 -1
- package/dist/agent/executor.d.ts +6 -0
- package/dist/agent/executor.js +55 -20
- package/dist/agent/executor.js.map +1 -1
- package/dist/agent/llm.d.ts +1 -1
- package/dist/agent/llm.js +51 -1
- package/dist/agent/llm.js.map +1 -1
- package/dist/agent/llmAdapter.d.ts +1 -1
- package/dist/agent/llmAdapter.js +8 -52
- package/dist/agent/llmAdapter.js.map +1 -1
- package/dist/agent/prompt.js +16 -37
- package/dist/agent/prompt.js.map +1 -1
- package/dist/agent/protocolV2_2.d.ts +22 -0
- package/dist/agent/protocolV2_2.js +217 -0
- package/dist/agent/protocolV2_2.js.map +1 -0
- package/dist/agent/skills.js +14 -6
- package/dist/agent/skills.js.map +1 -1
- package/dist/commands/handleAIChat.js +2 -2
- package/dist/commands/handleAIChat.js.map +1 -1
- package/dist/commands/handleAICommand.js +1 -1
- package/dist/commands/handleAICommand.js.map +1 -1
- package/dist/core/capabilitySystem.d.ts +1 -1
- package/dist/core/capabilitySystem.js +2 -2
- package/dist/core/capabilitySystem.js.map +1 -1
- package/dist/core/executionRecord.d.ts +2 -1
- package/dist/core/executionRecord.js +3 -1
- package/dist/core/executionRecord.js.map +1 -1
- package/dist/core/kernel/ASTParser.d.ts +86 -0
- package/dist/core/kernel/ASTParser.js +208 -0
- package/dist/core/kernel/ASTParser.js.map +1 -0
- package/dist/core/kernel/AtomicTransactionManager.d.ts +119 -0
- package/dist/core/kernel/AtomicTransactionManager.js +268 -0
- package/dist/core/kernel/AtomicTransactionManager.js.map +1 -0
- package/dist/core/kernel/FastScanner.d.ts +77 -0
- package/dist/core/kernel/FastScanner.js +273 -0
- package/dist/core/kernel/FastScanner.js.map +1 -0
- package/dist/core/kernel/PostCheckVerifier.d.ts +86 -0
- package/dist/core/kernel/PostCheckVerifier.js +182 -0
- package/dist/core/kernel/PostCheckVerifier.js.map +1 -0
- package/dist/core/kernel/XResolver.d.ts +76 -0
- package/dist/core/kernel/XResolver.js +217 -0
- package/dist/core/kernel/XResolver.js.map +1 -0
- package/dist/utils/renderer.d.ts +18 -1
- package/dist/utils/renderer.js +56 -8
- package/dist/utils/renderer.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-Check Verifier for Atomic Transactions
|
|
3
|
+
*
|
|
4
|
+
* 后验证检查器 - 确保代码修改后的工程质量
|
|
5
|
+
*
|
|
6
|
+
* 核心功能:
|
|
7
|
+
* 1. 执行 TypeScript 类型检查
|
|
8
|
+
* 2. 运行自定义验证命令
|
|
9
|
+
* 3. 捕获并结构化错误信息
|
|
10
|
+
* 4. 为 AI 提供可修复的反馈
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* 验证结果
|
|
14
|
+
*/
|
|
15
|
+
export interface VerificationResult {
|
|
16
|
+
/** 验证是否通过 */
|
|
17
|
+
passed: boolean;
|
|
18
|
+
/** 输出日志(标准输出) */
|
|
19
|
+
stdout?: string;
|
|
20
|
+
/** 错误日志(标准错误) */
|
|
21
|
+
stderr?: string;
|
|
22
|
+
/** 完整的错误信息 */
|
|
23
|
+
error?: string;
|
|
24
|
+
/** 验证耗时(毫秒) */
|
|
25
|
+
duration: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 验证器配置
|
|
29
|
+
*/
|
|
30
|
+
export interface VerifierConfig {
|
|
31
|
+
/** TypeScript 检查命令(默认: npx tsc --noEmit) */
|
|
32
|
+
typeCheckCommand: string;
|
|
33
|
+
/** 自定义验证命令(可选) */
|
|
34
|
+
customCheckCommand?: string;
|
|
35
|
+
/** 工作目录(默认: 当前目录) */
|
|
36
|
+
cwd?: string;
|
|
37
|
+
/** 超时时间(毫秒) */
|
|
38
|
+
timeout?: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 后验证检查器
|
|
42
|
+
*
|
|
43
|
+
* 执行编译检查和自定义验证,确保代码修改不会破坏项目
|
|
44
|
+
*/
|
|
45
|
+
export declare class PostCheckVerifier {
|
|
46
|
+
private config;
|
|
47
|
+
constructor(config?: Partial<VerifierConfig>);
|
|
48
|
+
/**
|
|
49
|
+
* 执行类型检查
|
|
50
|
+
*
|
|
51
|
+
* @returns 验证结果
|
|
52
|
+
*/
|
|
53
|
+
verifyTypeCheck(): Promise<VerificationResult>;
|
|
54
|
+
/**
|
|
55
|
+
* 执行自定义验证
|
|
56
|
+
*
|
|
57
|
+
* @returns 验证结果
|
|
58
|
+
*/
|
|
59
|
+
verifyCustomCheck(): Promise<VerificationResult>;
|
|
60
|
+
/**
|
|
61
|
+
* 执行所有验证
|
|
62
|
+
*
|
|
63
|
+
* @returns 验证结果(任何一项失败即整体失败)
|
|
64
|
+
*/
|
|
65
|
+
verifyAll(): Promise<VerificationResult>;
|
|
66
|
+
/**
|
|
67
|
+
* 运行单个检查命令
|
|
68
|
+
*/
|
|
69
|
+
private runCheck;
|
|
70
|
+
/**
|
|
71
|
+
* 格式化错误信息,便于 AI 理解
|
|
72
|
+
*/
|
|
73
|
+
formatErrorForAI(result: VerificationResult): string;
|
|
74
|
+
/**
|
|
75
|
+
* 提取文件路径和行号(用于定位错误)
|
|
76
|
+
*/
|
|
77
|
+
extractErrorLocations(result: VerificationResult): Array<{
|
|
78
|
+
file: string;
|
|
79
|
+
line: number;
|
|
80
|
+
message: string;
|
|
81
|
+
}>;
|
|
82
|
+
/**
|
|
83
|
+
* 更新配置
|
|
84
|
+
*/
|
|
85
|
+
updateConfig(config: Partial<VerifierConfig>): void;
|
|
86
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Post-Check Verifier for Atomic Transactions
|
|
4
|
+
*
|
|
5
|
+
* 后验证检查器 - 确保代码修改后的工程质量
|
|
6
|
+
*
|
|
7
|
+
* 核心功能:
|
|
8
|
+
* 1. 执行 TypeScript 类型检查
|
|
9
|
+
* 2. 运行自定义验证命令
|
|
10
|
+
* 3. 捕获并结构化错误信息
|
|
11
|
+
* 4. 为 AI 提供可修复的反馈
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.PostCheckVerifier = void 0;
|
|
15
|
+
const child_process_1 = require("child_process");
|
|
16
|
+
const util_1 = require("util");
|
|
17
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
18
|
+
/**
|
|
19
|
+
* 后验证检查器
|
|
20
|
+
*
|
|
21
|
+
* 执行编译检查和自定义验证,确保代码修改不会破坏项目
|
|
22
|
+
*/
|
|
23
|
+
class PostCheckVerifier {
|
|
24
|
+
config;
|
|
25
|
+
constructor(config) {
|
|
26
|
+
this.config = {
|
|
27
|
+
typeCheckCommand: 'npx tsc --noEmit',
|
|
28
|
+
cwd: process.cwd(),
|
|
29
|
+
timeout: 60000,
|
|
30
|
+
...config
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 执行类型检查
|
|
35
|
+
*
|
|
36
|
+
* @returns 验证结果
|
|
37
|
+
*/
|
|
38
|
+
async verifyTypeCheck() {
|
|
39
|
+
return this.runCheck(this.config.typeCheckCommand, 'Type Check');
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 执行自定义验证
|
|
43
|
+
*
|
|
44
|
+
* @returns 验证结果
|
|
45
|
+
*/
|
|
46
|
+
async verifyCustomCheck() {
|
|
47
|
+
if (!this.config.customCheckCommand) {
|
|
48
|
+
return {
|
|
49
|
+
passed: true,
|
|
50
|
+
duration: 0
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return this.runCheck(this.config.customCheckCommand, 'Custom Check');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 执行所有验证
|
|
57
|
+
*
|
|
58
|
+
* @returns 验证结果(任何一项失败即整体失败)
|
|
59
|
+
*/
|
|
60
|
+
async verifyAll() {
|
|
61
|
+
const typeCheckResult = await this.verifyTypeCheck();
|
|
62
|
+
if (!typeCheckResult.passed) {
|
|
63
|
+
return {
|
|
64
|
+
...typeCheckResult,
|
|
65
|
+
error: `Type check failed:\n${typeCheckResult.error}`
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const customCheckResult = await this.verifyCustomCheck();
|
|
69
|
+
if (!customCheckResult.passed) {
|
|
70
|
+
return {
|
|
71
|
+
...customCheckResult,
|
|
72
|
+
error: `Custom check failed:\n${customCheckResult.error}`
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
passed: true,
|
|
77
|
+
duration: typeCheckResult.duration + customCheckResult.duration
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 运行单个检查命令
|
|
82
|
+
*/
|
|
83
|
+
async runCheck(command, checkName) {
|
|
84
|
+
const startTime = Date.now();
|
|
85
|
+
try {
|
|
86
|
+
console.log(`\n[Verifier] 🛡️ Executing ${checkName}: ${command}...`);
|
|
87
|
+
const { stdout, stderr } = await execAsync(command, {
|
|
88
|
+
cwd: this.config.cwd,
|
|
89
|
+
timeout: this.config.timeout,
|
|
90
|
+
encoding: 'utf-8'
|
|
91
|
+
});
|
|
92
|
+
const duration = Date.now() - startTime;
|
|
93
|
+
return {
|
|
94
|
+
passed: true,
|
|
95
|
+
stdout,
|
|
96
|
+
stderr,
|
|
97
|
+
duration
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
const duration = Date.now() - startTime;
|
|
102
|
+
let errorMessage = '';
|
|
103
|
+
if (error.stdout) {
|
|
104
|
+
errorMessage += error.stdout;
|
|
105
|
+
}
|
|
106
|
+
if (error.stderr) {
|
|
107
|
+
if (errorMessage)
|
|
108
|
+
errorMessage += '\n';
|
|
109
|
+
errorMessage += error.stderr;
|
|
110
|
+
}
|
|
111
|
+
if (error.killed && error.signal === 'SIGTERM') {
|
|
112
|
+
errorMessage += '\nCommand timed out';
|
|
113
|
+
}
|
|
114
|
+
if (!errorMessage) {
|
|
115
|
+
errorMessage = error.message || 'Unknown error';
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
passed: false,
|
|
119
|
+
stdout: error.stdout,
|
|
120
|
+
stderr: error.stderr,
|
|
121
|
+
error: errorMessage,
|
|
122
|
+
duration
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 格式化错误信息,便于 AI 理解
|
|
128
|
+
*/
|
|
129
|
+
formatErrorForAI(result) {
|
|
130
|
+
if (result.passed) {
|
|
131
|
+
return '✅ Verification passed: All checks successful.';
|
|
132
|
+
}
|
|
133
|
+
let formatted = '❌ Verification failed. Please fix the following errors:\n\n';
|
|
134
|
+
if (result.error) {
|
|
135
|
+
const errorLines = result.error.split('\n');
|
|
136
|
+
const relevantLines = errorLines.filter(line => {
|
|
137
|
+
return line.includes('error TS') ||
|
|
138
|
+
line.includes('error ') ||
|
|
139
|
+
line.includes('Error:');
|
|
140
|
+
});
|
|
141
|
+
if (relevantLines.length > 0) {
|
|
142
|
+
formatted += '=== Type Errors ===\n';
|
|
143
|
+
formatted += relevantLines.slice(0, 50).join('\n');
|
|
144
|
+
if (relevantLines.length > 50) {
|
|
145
|
+
formatted += `\n... and ${relevantLines.length - 50} more errors`;
|
|
146
|
+
}
|
|
147
|
+
formatted += '\n\n';
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
formatted += `=== Error Details ===\n${result.error.slice(0, 2000)}\n\n`;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return formatted;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* 提取文件路径和行号(用于定位错误)
|
|
157
|
+
*/
|
|
158
|
+
extractErrorLocations(result) {
|
|
159
|
+
if (result.passed || !result.error) {
|
|
160
|
+
return [];
|
|
161
|
+
}
|
|
162
|
+
const locations = [];
|
|
163
|
+
const errorPattern = /([^(:]+)\((\d+),\d+\): (error TS\d+: .+)/g;
|
|
164
|
+
let match;
|
|
165
|
+
while ((match = errorPattern.exec(result.error)) !== null) {
|
|
166
|
+
locations.push({
|
|
167
|
+
file: match[1],
|
|
168
|
+
line: parseInt(match[2], 10),
|
|
169
|
+
message: match[3]
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
return locations;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* 更新配置
|
|
176
|
+
*/
|
|
177
|
+
updateConfig(config) {
|
|
178
|
+
this.config = { ...this.config, ...config };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.PostCheckVerifier = PostCheckVerifier;
|
|
182
|
+
//# sourceMappingURL=PostCheckVerifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostCheckVerifier.js","sourceRoot":"","sources":["../../../src/core/kernel/PostCheckVerifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* X-Resolver: Cross-File Symbol Dependency Resolver
|
|
3
|
+
*
|
|
4
|
+
* 跨文件符号依赖解析器 - yuangs 的全域感知核心
|
|
5
|
+
*
|
|
6
|
+
* 核心功能:
|
|
7
|
+
* 1. 探测目标文件的所有导出符号(函数、类、接口、类型)
|
|
8
|
+
* 2. 搜索项目中所有引用这些符号的文件
|
|
9
|
+
* 3. 提取相关的代码片段和 JSDoc 文档
|
|
10
|
+
* 4. 为 Agent 提供跨文件上下文感知
|
|
11
|
+
*/
|
|
12
|
+
import { EnhancedASTParser, SymbolMetadata } from './ASTParser';
|
|
13
|
+
import { FastScanner } from './FastScanner';
|
|
14
|
+
/**
|
|
15
|
+
* 符号影响分析结果
|
|
16
|
+
*/
|
|
17
|
+
export interface SymbolImpact {
|
|
18
|
+
/** 消费者文件路径 */
|
|
19
|
+
filePath: string;
|
|
20
|
+
/** 使用的导出符号列表 */
|
|
21
|
+
symbols: string[];
|
|
22
|
+
/** 相关代码片段(经过智能切片) */
|
|
23
|
+
snippet: string;
|
|
24
|
+
/** 符号的 JSDoc 文档 */
|
|
25
|
+
jsDoc?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* X-Resolver 解析结果
|
|
29
|
+
*/
|
|
30
|
+
export interface XResolverResult {
|
|
31
|
+
/** 目标文件路径 */
|
|
32
|
+
targetFile: string;
|
|
33
|
+
/** 导出的符号列表 */
|
|
34
|
+
exportedSymbols: SymbolMetadata[];
|
|
35
|
+
/** 受影响的使用者列表 */
|
|
36
|
+
impacts: SymbolImpact[];
|
|
37
|
+
/** 扫描耗时(毫秒) */
|
|
38
|
+
duration: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 跨文件符号解析器
|
|
42
|
+
*
|
|
43
|
+
* 为 yuangs Agent 提供跨文件依赖感知能力
|
|
44
|
+
*/
|
|
45
|
+
export declare class XResolver {
|
|
46
|
+
private astParser;
|
|
47
|
+
private scanner;
|
|
48
|
+
constructor(astParser?: EnhancedASTParser, scanner?: FastScanner);
|
|
49
|
+
/**
|
|
50
|
+
* 分析目标文件的跨文件影响域
|
|
51
|
+
*
|
|
52
|
+
* @param targetFilePath - 要分析的目标文件路径
|
|
53
|
+
* @returns 跨文件影响分析结果
|
|
54
|
+
*/
|
|
55
|
+
getImpactAnalysis(targetFilePath: string): Promise<XResolverResult>;
|
|
56
|
+
/**
|
|
57
|
+
* 从消费者文件中提取相关上下文
|
|
58
|
+
*/
|
|
59
|
+
private extractImpactContext;
|
|
60
|
+
/**
|
|
61
|
+
* 提取相关代码片段(智能切片)
|
|
62
|
+
*/
|
|
63
|
+
private extractRelevantSnippet;
|
|
64
|
+
/**
|
|
65
|
+
* 聚合符号的 JSDoc
|
|
66
|
+
*/
|
|
67
|
+
private getAggregatedJSDoc;
|
|
68
|
+
/**
|
|
69
|
+
* 渲染为 AI 友好的上下文格式
|
|
70
|
+
*/
|
|
71
|
+
renderAsAIContext(result: XResolverResult): string;
|
|
72
|
+
/**
|
|
73
|
+
* 快捷方法:仅获取导出符号
|
|
74
|
+
*/
|
|
75
|
+
getExportedSymbols(filePath: string): Promise<SymbolMetadata[]>;
|
|
76
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* X-Resolver: Cross-File Symbol Dependency Resolver
|
|
4
|
+
*
|
|
5
|
+
* 跨文件符号依赖解析器 - yuangs 的全域感知核心
|
|
6
|
+
*
|
|
7
|
+
* 核心功能:
|
|
8
|
+
* 1. 探测目标文件的所有导出符号(函数、类、接口、类型)
|
|
9
|
+
* 2. 搜索项目中所有引用这些符号的文件
|
|
10
|
+
* 3. 提取相关的代码片段和 JSDoc 文档
|
|
11
|
+
* 4. 为 Agent 提供跨文件上下文感知
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.XResolver = void 0;
|
|
48
|
+
const fs = __importStar(require("fs/promises"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const ASTParser_1 = require("./ASTParser");
|
|
51
|
+
const FastScanner_1 = require("./FastScanner");
|
|
52
|
+
const ts = __importStar(require("typescript"));
|
|
53
|
+
/**
|
|
54
|
+
* 跨文件符号解析器
|
|
55
|
+
*
|
|
56
|
+
* 为 yuangs Agent 提供跨文件依赖感知能力
|
|
57
|
+
*/
|
|
58
|
+
class XResolver {
|
|
59
|
+
astParser;
|
|
60
|
+
scanner;
|
|
61
|
+
constructor(astParser, scanner) {
|
|
62
|
+
this.astParser = astParser || new ASTParser_1.EnhancedASTParser();
|
|
63
|
+
this.scanner = scanner || new FastScanner_1.FastScanner();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 分析目标文件的跨文件影响域
|
|
67
|
+
*
|
|
68
|
+
* @param targetFilePath - 要分析的目标文件路径
|
|
69
|
+
* @returns 跨文件影响分析结果
|
|
70
|
+
*/
|
|
71
|
+
async getImpactAnalysis(targetFilePath) {
|
|
72
|
+
const startTime = Date.now();
|
|
73
|
+
const parseResult = await this.astParser.parseFile(targetFilePath);
|
|
74
|
+
if (!parseResult.success) {
|
|
75
|
+
return {
|
|
76
|
+
targetFile: targetFilePath,
|
|
77
|
+
exportedSymbols: [],
|
|
78
|
+
impacts: [],
|
|
79
|
+
duration: Date.now() - startTime
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const exportedSymbols = parseResult.symbols.filter(s => s.isExported);
|
|
83
|
+
if (exportedSymbols.length === 0) {
|
|
84
|
+
return {
|
|
85
|
+
targetFile: targetFilePath,
|
|
86
|
+
exportedSymbols: [],
|
|
87
|
+
impacts: [],
|
|
88
|
+
duration: Date.now() - startTime
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const baseName = path.basename(targetFilePath, path.extname(targetFilePath));
|
|
92
|
+
const scanResult = await this.scanner.findConsumerFiles(baseName, path.dirname(targetFilePath));
|
|
93
|
+
const impacts = [];
|
|
94
|
+
for (const consumerFile of scanResult.consumerFiles) {
|
|
95
|
+
const impact = await this.extractImpactContext(consumerFile, exportedSymbols);
|
|
96
|
+
if (impact) {
|
|
97
|
+
impacts.push(impact);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
targetFile: targetFilePath,
|
|
102
|
+
exportedSymbols,
|
|
103
|
+
impacts,
|
|
104
|
+
duration: Date.now() - startTime
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 从消费者文件中提取相关上下文
|
|
109
|
+
*/
|
|
110
|
+
async extractImpactContext(consumerFile, exportedSymbols) {
|
|
111
|
+
try {
|
|
112
|
+
const content = await fs.readFile(consumerFile, 'utf-8');
|
|
113
|
+
const sourceFile = ts.createSourceFile(consumerFile, content, ts.ScriptTarget.Latest, true);
|
|
114
|
+
const usedSymbols = exportedSymbols.filter(sym => content.includes(sym.name));
|
|
115
|
+
if (usedSymbols.length === 0) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
const snippet = this.extractRelevantSnippet(content, sourceFile, usedSymbols);
|
|
119
|
+
const jsDoc = this.getAggregatedJSDoc(usedSymbols);
|
|
120
|
+
return {
|
|
121
|
+
filePath: consumerFile,
|
|
122
|
+
symbols: usedSymbols.map(s => s.name),
|
|
123
|
+
snippet,
|
|
124
|
+
jsDoc
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.warn(`[X-Resolver] Failed to analyze ${consumerFile}: ${error}`);
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* 提取相关代码片段(智能切片)
|
|
134
|
+
*/
|
|
135
|
+
extractRelevantSnippet(content, sourceFile, usedSymbols) {
|
|
136
|
+
const lines = content.split('\n');
|
|
137
|
+
const matchedLines = new Set();
|
|
138
|
+
lines.forEach((line, idx) => {
|
|
139
|
+
if (usedSymbols.some(sym => line.includes(sym.name))) {
|
|
140
|
+
for (let i = Math.max(0, idx - 3); i <= Math.min(lines.length - 1, idx + 5); i++) {
|
|
141
|
+
matchedLines.add(i);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
const sortedLines = Array.from(matchedLines).sort((a, b) => a - b);
|
|
146
|
+
let snippet = '';
|
|
147
|
+
for (let i = 0; i < sortedLines.length; i++) {
|
|
148
|
+
const lineNum = sortedLines[i];
|
|
149
|
+
const prevLine = i > 0 ? sortedLines[i - 1] : -1;
|
|
150
|
+
if (lineNum > prevLine + 1) {
|
|
151
|
+
snippet += '\n// ...\n';
|
|
152
|
+
}
|
|
153
|
+
snippet += `${lineNum + 1}: ${lines[lineNum]}\n`;
|
|
154
|
+
}
|
|
155
|
+
return snippet.trim();
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 聚合符号的 JSDoc
|
|
159
|
+
*/
|
|
160
|
+
getAggregatedJSDoc(symbols) {
|
|
161
|
+
const docs = symbols.filter(s => s.jsDoc).map(s => {
|
|
162
|
+
return `=== ${s.name} (${s.kind}) ===\n${s.jsDoc}`;
|
|
163
|
+
});
|
|
164
|
+
return docs.length > 0 ? docs.join('\n\n') : '';
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* 渲染为 AI 友好的上下文格式
|
|
168
|
+
*/
|
|
169
|
+
renderAsAIContext(result) {
|
|
170
|
+
let context = `\n${'='.repeat(60)}\n`;
|
|
171
|
+
context += `X-RESOLVER: CROSS-FILE DEPENDENCY CONTEXT\n`;
|
|
172
|
+
context += `Target: ${result.targetFile}\n`;
|
|
173
|
+
context += `Exported Symbols: ${result.exportedSymbols.length}\n`;
|
|
174
|
+
context += `Affected Files: ${result.impacts.length}\n`;
|
|
175
|
+
context += `Analysis Time: ${result.duration}ms\n`;
|
|
176
|
+
context += `${'='.repeat(60)}\n\n`;
|
|
177
|
+
if (result.exportedSymbols.length > 0) {
|
|
178
|
+
context += `[EXPORTED SYMBOLS]\n`;
|
|
179
|
+
for (const symbol of result.exportedSymbols) {
|
|
180
|
+
context += `- ${symbol.name} (${symbol.kind}) at line ${symbol.startLine}\n`;
|
|
181
|
+
if (symbol.jsDoc) {
|
|
182
|
+
const shortDoc = symbol.jsDoc.split('\n')[0];
|
|
183
|
+
if (shortDoc) {
|
|
184
|
+
context += ` Doc: ${shortDoc}\n`;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
context += '\n';
|
|
189
|
+
}
|
|
190
|
+
if (result.impacts.length > 0) {
|
|
191
|
+
context += `[AFFECTED FILES]\n\n`;
|
|
192
|
+
for (const impact of result.impacts) {
|
|
193
|
+
context += `<<< EXTERNAL DEPENDENCY REFERENCE >>>\n`;
|
|
194
|
+
context += `File: ${impact.filePath}\n`;
|
|
195
|
+
context += `Role: READ-ONLY (This file consumes symbols from target file)\n`;
|
|
196
|
+
context += `Symbols Used: ${impact.symbols.join(', ')}\n`;
|
|
197
|
+
if (impact.jsDoc) {
|
|
198
|
+
context += `\n--- SYMBOL CONTRACT (JSDoc) ---\n`;
|
|
199
|
+
context += `${impact.jsDoc}\n`;
|
|
200
|
+
}
|
|
201
|
+
context += `\n--- USAGE SNIPPET ---\n`;
|
|
202
|
+
context += `${impact.snippet}\n`;
|
|
203
|
+
context += `<<< END OF REFERENCE >>>\n\n`;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return context;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* 快捷方法:仅获取导出符号
|
|
210
|
+
*/
|
|
211
|
+
async getExportedSymbols(filePath) {
|
|
212
|
+
const result = await this.astParser.parseFile(filePath);
|
|
213
|
+
return result.success ? result.symbols.filter(s => s.isExported) : [];
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
exports.XResolver = XResolver;
|
|
217
|
+
//# sourceMappingURL=XResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XResolver.js","sourceRoot":"","sources":["../../../src/core/kernel/XResolver.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/renderer.d.ts
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import { Ora } from 'ora';
|
|
2
|
+
export interface RendererOptions {
|
|
3
|
+
autoFinish?: boolean;
|
|
4
|
+
onChunkCallback?: (chunk: string) => void;
|
|
5
|
+
quietMode?: boolean;
|
|
6
|
+
}
|
|
2
7
|
export declare class StreamMarkdownRenderer {
|
|
3
8
|
private fullResponse;
|
|
4
9
|
private prefix;
|
|
5
10
|
private isFirstOutput;
|
|
6
11
|
private spinner;
|
|
7
12
|
private startTime;
|
|
8
|
-
|
|
13
|
+
private quietMode;
|
|
14
|
+
private autoFinish;
|
|
15
|
+
private onChunkCallback;
|
|
16
|
+
constructor(prefix?: string, spinner?: Ora, options?: RendererOptions | boolean);
|
|
9
17
|
/**
|
|
10
18
|
* 处理流式数据块
|
|
11
19
|
*/
|
|
@@ -18,4 +26,13 @@ export declare class StreamMarkdownRenderer {
|
|
|
18
26
|
* 计算文本在终端的可视行数
|
|
19
27
|
*/
|
|
20
28
|
private getVisualLineCount;
|
|
29
|
+
/**
|
|
30
|
+
* Start chunking mode for Agent Runtime
|
|
31
|
+
* Returns a callback function that Agent can use to send chunks
|
|
32
|
+
*/
|
|
33
|
+
startChunking(): (chunk: string) => void;
|
|
34
|
+
/**
|
|
35
|
+
* Check if response appears complete (heuristic)
|
|
36
|
+
*/
|
|
37
|
+
private isComplete;
|
|
21
38
|
}
|