feihong-code 7.0.0 → 7.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/.github/workflows/ci.yml +180 -140
  2. package/.github/workflows/release.yml +200 -0
  3. package/CHANGELOG.md +94 -65
  4. package/README.md +609 -586
  5. package/dist/agent/browser-agent.js +354 -0
  6. package/dist/agent/browser-agent.js.map +1 -0
  7. package/dist/agent/change-manager.js +433 -0
  8. package/dist/agent/change-manager.js.map +1 -0
  9. package/dist/agent/code-rag.js +293 -0
  10. package/dist/agent/code-rag.js.map +1 -0
  11. package/dist/agent/code-writer.js +13 -1
  12. package/dist/agent/code-writer.js.map +1 -1
  13. package/dist/agent/completion-engine.js +553 -0
  14. package/dist/agent/completion-engine.js.map +1 -0
  15. package/dist/agent/completion-postprocess.js +109 -0
  16. package/dist/agent/completion-postprocess.js.map +1 -0
  17. package/dist/agent/context-budget.js +121 -0
  18. package/dist/agent/context-budget.js.map +1 -0
  19. package/dist/agent/context-compactor.js +235 -10
  20. package/dist/agent/context-compactor.js.map +1 -1
  21. package/dist/agent/custom-agent.js +368 -0
  22. package/dist/agent/custom-agent.js.map +1 -0
  23. package/dist/agent/design-to-code.js +218 -0
  24. package/dist/agent/design-to-code.js.map +1 -0
  25. package/dist/agent/event-driven-agent.js +359 -0
  26. package/dist/agent/event-driven-agent.js.map +1 -0
  27. package/dist/agent/git-integration.js +324 -0
  28. package/dist/agent/git-integration.js.map +1 -0
  29. package/dist/agent/layered-memory.js +329 -0
  30. package/dist/agent/layered-memory.js.map +1 -0
  31. package/dist/agent/lint.js +121 -0
  32. package/dist/agent/lint.js.map +1 -0
  33. package/dist/agent/multi-agent.js +359 -0
  34. package/dist/agent/multi-agent.js.map +1 -0
  35. package/dist/agent/orchestrator.js +136 -25
  36. package/dist/agent/orchestrator.js.map +1 -1
  37. package/dist/agent/prompts.js +54 -54
  38. package/dist/agent/quality-gate.js +139 -0
  39. package/dist/agent/quality-gate.js.map +1 -1
  40. package/dist/agent/self-correction.js +274 -0
  41. package/dist/agent/self-correction.js.map +1 -0
  42. package/dist/agent/self-heal.js +47 -17
  43. package/dist/agent/self-heal.js.map +1 -1
  44. package/dist/agent/solo-agent.js +321 -0
  45. package/dist/agent/solo-agent.js.map +1 -0
  46. package/dist/agent/symbol-index.js +258 -28
  47. package/dist/agent/symbol-index.js.map +1 -1
  48. package/dist/agent/team-collaboration.js +252 -0
  49. package/dist/agent/team-collaboration.js.map +1 -0
  50. package/dist/agent/type-checker.js +229 -0
  51. package/dist/agent/type-checker.js.map +1 -0
  52. package/dist/cli/commands.js +9 -0
  53. package/dist/cli/commands.js.map +1 -1
  54. package/dist/cli/index.js +9 -0
  55. package/dist/cli/index.js.map +1 -1
  56. package/dist/cli/multi-pane-tui.js +217 -0
  57. package/dist/cli/multi-pane-tui.js.map +1 -0
  58. package/dist/cli/run.js +130 -40
  59. package/dist/cli/run.js.map +1 -1
  60. package/dist/cli/tui-run.js +79 -0
  61. package/dist/cli/tui-run.js.map +1 -0
  62. package/dist/cli/tui.js.map +1 -1
  63. package/dist/cli/version.js +1 -1
  64. package/dist/integrations/collaboration.js +219 -0
  65. package/dist/integrations/collaboration.js.map +1 -0
  66. package/dist/integrations/figma.js +307 -0
  67. package/dist/integrations/figma.js.map +1 -0
  68. package/dist/integrations/sso.js +327 -0
  69. package/dist/integrations/sso.js.map +1 -0
  70. package/dist/knowledge/library.js +301 -0
  71. package/dist/knowledge/library.js.map +1 -0
  72. package/dist/lsp/lsp-client.js +183 -0
  73. package/dist/lsp/lsp-client.js.map +1 -0
  74. package/dist/lsp/lsp-service.js +159 -0
  75. package/dist/lsp/lsp-service.js.map +1 -0
  76. package/dist/plugins/manager.js +380 -0
  77. package/dist/plugins/manager.js.map +1 -0
  78. package/dist/runtime/event-log.js.map +1 -1
  79. package/dist/shared/i18n.js +108 -100
  80. package/dist/shared/i18n.js.map +1 -1
  81. package/dist/tools/browser/browser.tool.js +217 -0
  82. package/dist/tools/browser/browser.tool.js.map +1 -0
  83. package/dist/tools/generator/code-generator.js +40 -40
  84. package/dist/tools/generator/test-generator.js +9 -9
  85. package/dist/tools/index.js +2 -0
  86. package/dist/tools/index.js.map +1 -1
  87. package/dist/tools/shell/exec.js +73 -11
  88. package/dist/tools/shell/exec.js.map +1 -1
  89. package/dist/tools/shell/run-shell.tool.js +8 -2
  90. package/dist/tools/shell/run-shell.tool.js.map +1 -1
  91. package/dist/training/completion-evaluator.js +213 -0
  92. package/dist/training/completion-evaluator.js.map +1 -0
  93. package/dist/training/fim-data.js +248 -0
  94. package/dist/training/fim-data.js.map +1 -0
  95. package/dist/voice/voice-programming.js +223 -0
  96. package/dist/voice/voice-programming.js.map +1 -0
  97. package/dist/web/extra-apis.js +440 -0
  98. package/dist/web/extra-apis.js.map +1 -0
  99. package/dist/web/public/css/style.css +1729 -1671
  100. package/dist/web/public/index.html +1242 -990
  101. package/dist/web/public/js/api.js +555 -382
  102. package/dist/web/public/js/app.js +2210 -2210
  103. package/dist/web/public/js/mock-api.js +234 -0
  104. package/dist/web/public/js/monaco-editor.js +363 -0
  105. package/dist/web/public/js/ui.js +2251 -1059
  106. package/dist/web/public/js/utils.js +214 -214
  107. package/dist/web/public/manifest.json +59 -0
  108. package/dist/web/public/service-worker.js +173 -0
  109. package/dist/web/server.js +1116 -45
  110. package/dist/web/server.js.map +1 -1
  111. package/dist/web/task-queue.js +22 -2
  112. package/dist/web/task-queue.js.map +1 -1
  113. package/docs/BENCHMARK_REPORT_en.md +386 -329
  114. package/docs/BENCHMARK_REPORT_zh.md +386 -329
  115. package/docs/DPA.md +63 -0
  116. package/docs/DPA/346/225/260/346/215/256/345/244/204/347/220/206/345/215/217/350/256/256/346/250/241/346/235/277_v1.0.md +67 -0
  117. package/docs/SECURITY_WHITEPAPER.md +74 -0
  118. package/docs/SWE_BENCH_REPORT.md +55 -0
  119. package/docs/TECHNICAL_SPEC_en.md +292 -292
  120. package/docs/TECHNICAL_SPEC_zh.md +292 -292
  121. package/docs/UPDATE_NOTES_en.md +159 -159
  122. package/docs/UPDATE_NOTES_zh.md +159 -159
  123. package/docs/UPGRADE_7.2.0.md +309 -0
  124. package/docs/UPGRADE_GUIDE_7_5.md +86 -0
  125. package/docs/geo-feihong-code.html +391 -0
  126. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_50/350/275/256/346/267/261/345/272/246/345/256/241/350/256/241_v7.2.0.md +208 -0
  127. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_6/351/241/271/351/207/215/347/202/271/346/240/270/346/237/245_v7.2.0.md +152 -0
  128. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_/350/277/220/350/241/214/346/227/266/345/256/236/346/265/213/347/211/210_v7.2.0.md +271 -0
  129. package/docs//345/220/210/350/247/204/350/256/244/350/257/201/345/207/206/345/244/207/346/270/205/345/215/225_v7.2.0.md +59 -0
  130. package/docs//345/256/211/345/205/250/347/231/275/347/232/256/344/271/246_v7.2.0.md +82 -0
  131. package/electron/main.js +404 -404
  132. package/package.json +175 -167
  133. package/templates/skills/api-design/SKILL.md +27 -0
  134. package/templates/skills/code-review/SKILL.md +35 -0
  135. package/templates/skills/dependency-upgrade/SKILL.md +29 -0
  136. package/templates/skills/doc-gen/SKILL.md +29 -0
  137. package/templates/skills/git-flow/SKILL.md +26 -0
  138. package/templates/skills/onboarding/SKILL.md +27 -0
  139. package/templates/skills/performance/SKILL.md +29 -0
  140. package/templates/skills/refactor/SKILL.md +28 -0
  141. package/templates/skills/security-audit/SKILL.md +28 -0
  142. package/templates/skills/test-gen/SKILL.md +30 -0
  143. package/tool-schema.json +197 -197
  144. package/dist/hello.js +0 -14
  145. package/dist/hello.js.map +0 -1
  146. package/dist/self-evolve/hook.ts +0 -80
  147. package/dist/self-evolve/manager.d.ts +0 -8
  148. package/dist/web/web-config.js +0 -143
  149. package/dist/web/web-config.js.map +0 -1
@@ -0,0 +1,553 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CompletionEngine = void 0;
4
+ exports.createCompletionEngine = createCompletionEngine;
5
+ const logger_1 = require("../shared/logger");
6
+ const symbol_index_1 = require("./symbol-index");
7
+ const completion_postprocess_1 = require("./completion-postprocess");
8
+ const DEFAULT_CONFIG = {
9
+ quickMaxTokens: 30,
10
+ fullMaxTokens: 200,
11
+ maxPrefixChars: 2000,
12
+ maxSuffixChars: 500,
13
+ cacheTtlMs: 10000,
14
+ minPrefixLength: 3,
15
+ enableSyntaxCheck: true,
16
+ temperatureQuick: 0,
17
+ temperatureFull: 0.3,
18
+ };
19
+ /**
20
+ * 代码补全引擎
21
+ */
22
+ class CompletionEngine {
23
+ router;
24
+ config;
25
+ cache = new Map();
26
+ /** 快速路径命中统计 */
27
+ fastPathHits = 0;
28
+ /** 代码图谱(用于跨文件上下文注入) */
29
+ codeGraph;
30
+ /** 补全 Pro:最近接受的补全记录,用于连续推荐 */
31
+ recentAcceptances = [];
32
+ constructor(router, config = {}, codeGraph) {
33
+ this.router = router;
34
+ this.config = { ...DEFAULT_CONFIG, ...config };
35
+ this.codeGraph = codeGraph;
36
+ }
37
+ /** 设置代码图谱(运行时更新) */
38
+ setCodeGraph(graph) {
39
+ this.codeGraph = graph;
40
+ }
41
+ /**
42
+ * 阶段一-1:检索跨文件相关符号定义
43
+ * 根据当前文件的 import 依赖和光标上下文,检索相关符号的完整定义
44
+ */
45
+ retrieveCrossFileContext(filePath, prefix, _language) {
46
+ if (!this.codeGraph)
47
+ return '';
48
+ const relatedSymbols = [];
49
+ const seen = new Set();
50
+ // 1. 从当前文件的 import 中提取依赖的符号名
51
+ const importMatches = prefix.match(/import\s+(?:type\s+)?(?:\{([^}]+)\}|(\w+))\s+from\s+['"]([^'"]+)['"]/g);
52
+ if (importMatches) {
53
+ for (const match of importMatches) {
54
+ const symbolMatch = match.match(/\{([^}]+)\}/);
55
+ if (symbolMatch) {
56
+ const names = symbolMatch[1].split(',').map((s) => s.trim().split(/\s+as\s+/)[0].trim());
57
+ for (const name of names) {
58
+ if (name && !seen.has(name)) {
59
+ const results = (0, symbol_index_1.searchSymbols)(this.codeGraph, name, 3);
60
+ for (const sym of results) {
61
+ if (sym.exported && !seen.has(`${sym.file}:${sym.name}`)) {
62
+ seen.add(`${sym.file}:${sym.name}`);
63
+ relatedSymbols.push(sym);
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ // 2. 检索当前文件直接依赖的文件中的导出符号
72
+ const deps = (0, symbol_index_1.getDependencies)(this.codeGraph, filePath);
73
+ for (const depPath of deps) {
74
+ const depSymbols = (0, symbol_index_1.symbolsForFile)(this.codeGraph, depPath);
75
+ for (const sym of depSymbols) {
76
+ if (sym.exported && !seen.has(`${sym.file}:${sym.name}`) && relatedSymbols.length < 20) {
77
+ seen.add(`${sym.file}:${sym.name}`);
78
+ relatedSymbols.push(sym);
79
+ }
80
+ }
81
+ }
82
+ // 3. 从光标前的代码中提取正在使用的符号名(函数调用、变量引用)
83
+ const usageMatches = prefix.match(/\b([A-Za-z_$][\w$]*)\s*\(/g);
84
+ if (usageMatches) {
85
+ for (const match of usageMatches.slice(-10)) {
86
+ const name = match.replace('(', '').trim();
87
+ if (name.length > 2 && !seen.has(name)) {
88
+ const results = (0, symbol_index_1.searchSymbols)(this.codeGraph, name, 2);
89
+ for (const sym of results) {
90
+ if (sym.exported && !seen.has(`${sym.file}:${sym.name}`) && relatedSymbols.length < 25) {
91
+ seen.add(`${sym.file}:${sym.name}`);
92
+ relatedSymbols.push(sym);
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ if (relatedSymbols.length === 0)
99
+ return '';
100
+ // 4. 格式化相关符号定义为上下文
101
+ const lines = ['\n【跨文件相关符号定义】'];
102
+ for (const sym of relatedSymbols.slice(0, 15)) {
103
+ const typeLabel = sym.kind === 'function' ? '函数' : sym.kind === 'class' ? '类' : sym.kind === 'interface' ? '接口' : sym.kind;
104
+ if (sym.signature) {
105
+ lines.push(`// ${typeLabel}: ${sym.name} (${sym.file})`);
106
+ lines.push(sym.signature);
107
+ }
108
+ else {
109
+ lines.push(`// ${typeLabel}: ${sym.name} (${sym.file})`);
110
+ }
111
+ }
112
+ lines.push('【结束】\n');
113
+ return lines.join('\n');
114
+ }
115
+ /**
116
+ * 请求代码补全
117
+ */
118
+ async complete(req) {
119
+ const startTime = Date.now();
120
+ const mode = req.mode || 'quick';
121
+ const maxTokens = mode === 'full' ? this.config.fullMaxTokens : this.config.quickMaxTokens;
122
+ // 1. 构造上下文
123
+ const { prefix, suffix } = this.extractContext(req);
124
+ // 2. 检查最小触发长度
125
+ if (prefix.trim().length < this.config.minPrefixLength) {
126
+ return this.emptyResult(startTime, '');
127
+ }
128
+ // 3. 检查精确缓存
129
+ const cacheKey = this.buildCacheKey(req, prefix, suffix, mode);
130
+ const cached = this.cache.get(cacheKey);
131
+ if (cached && Date.now() - cached.timestamp < this.config.cacheTtlMs) {
132
+ logger_1.logger.debug('completion cache hit', { filePath: req.filePath, mode });
133
+ return { ...cached.result, cached: true, latencyMs: Date.now() - startTime };
134
+ }
135
+ // 3.5 P0-2: 快速路径(本地规则引擎,延迟 < 10ms,不调用 LLM)
136
+ const fastResult = this.tryFastPath(prefix, suffix, req.language || 'typescript', startTime);
137
+ if (fastResult) {
138
+ this.fastPathHits++;
139
+ logger_1.logger.debug('completion fast path hit', { filePath: req.filePath, mode });
140
+ return fastResult;
141
+ }
142
+ // 3.6 P0-2: 前缀匹配缓存(新 prefix 是缓存条目的扩展,且 suffix 相同)
143
+ const prefixCached = this.tryPrefixCache(prefix, suffix, req.filePath, mode, startTime);
144
+ if (prefixCached) {
145
+ logger_1.logger.debug('completion prefix cache hit', { filePath: req.filePath, mode });
146
+ return prefixCached;
147
+ }
148
+ // 4. 构造 FIM prompt 并调用模型
149
+ const messages = this.buildFimMessages(prefix, suffix, req.filePath, req.language || 'typescript', req.crossFileContext);
150
+ try {
151
+ const resp = await this.router.chat({
152
+ messages,
153
+ // P5-4: temperature 分层——quick 用低温(确定性),full 用中温(多候选多样性)
154
+ temperature: mode === 'full' ? this.config.temperatureFull : this.config.temperatureQuick,
155
+ maxTokens,
156
+ timeoutMs: mode === 'full' ? 5000 : 3000,
157
+ }, ['code-gen']);
158
+ // 5. 解析和校验补全结果
159
+ const rawText = resp.message.content || '';
160
+ const { suffix } = this.extractContext(req);
161
+ const suggestions = this.parseAndValidate(rawText, req.language || 'typescript', suffix);
162
+ const result = {
163
+ suggestions,
164
+ latencyMs: Date.now() - startTime,
165
+ model: resp.model,
166
+ cached: false,
167
+ };
168
+ // 6. 写入缓存(保存 prefix 用于前缀匹配)
169
+ this.cache.set(cacheKey, { result, timestamp: Date.now(), prefix });
170
+ this.cleanupCache();
171
+ return result;
172
+ }
173
+ catch (e) {
174
+ logger_1.logger.warn('completion failed', {
175
+ error: e instanceof Error ? e.message : String(e),
176
+ filePath: req.filePath,
177
+ mode,
178
+ });
179
+ return this.emptyResult(startTime, '');
180
+ }
181
+ }
182
+ /** 提取光标前后文 */
183
+ extractContext(req) {
184
+ const { fileContent, cursorOffset } = req;
185
+ const offset = Math.max(0, Math.min(cursorOffset, fileContent.length));
186
+ // prefix:光标前的内容,取最后 maxPrefixChars
187
+ const prefixStart = Math.max(0, offset - this.config.maxPrefixChars);
188
+ const prefix = fileContent.slice(prefixStart, offset);
189
+ // suffix:光标后的内容,取前 maxSuffixChars
190
+ const suffixEnd = Math.min(fileContent.length, offset + this.config.maxSuffixChars);
191
+ const suffix = fileContent.slice(offset, suffixEnd);
192
+ return { prefix, suffix };
193
+ }
194
+ /** 构造 FIM 消息(将 FIM 转换为 chat 格式) */
195
+ buildFimMessages(prefix, suffix, filePath, language, extraCrossFileContext) {
196
+ // 阶段一-1:检索跨文件相关符号定义(服务端磁盘检索)
197
+ const diskContext = this.retrieveCrossFileContext(filePath, prefix, language);
198
+ // P5-1: 合并扩展端收集的工作区实时上下文(import 关联/已打开文档),优先贴近磁盘上下文之后注入
199
+ const crossFileContext = [diskContext, extraCrossFileContext?.trim()].filter(Boolean).join('\n\n');
200
+ const systemPrompt = `你是一个 ${language} 代码补全引擎。根据光标前后的代码上下文,生成最可能的补全内容。
201
+
202
+ 规则:
203
+ 1. 只输出补全的代码文本,不要有任何解释、注释或 Markdown 代码块
204
+ 2. 补全内容从光标位置开始,不要重复 prefix 中已有的内容
205
+ 3. 保持代码风格和缩进一致
206
+ 4. 如果上下文不足以确定补全,输出最可能的单个补全
207
+ 5. 不要输出光标后的 suffix 内容
208
+ 6. 优先使用【跨文件相关符号定义】中提供的函数/类/接口签名,确保类型匹配
209
+ 7. 若【工作区相关文件】提供与当前文件同项目模块的导出与签名,应优先据此补全,保证跨文件一致性`;
210
+ const userPrompt = `文件: ${filePath}
211
+ 语言: ${language}
212
+ ${crossFileContext}
213
+ 光标前的代码(prefix):
214
+ \`\`\`${language}
215
+ ${prefix}
216
+ \`\`\`
217
+
218
+ 光标后的代码(suffix):
219
+ \`\`\`${language}
220
+ ${suffix}
221
+ \`\`\`
222
+
223
+ 请直接输出从光标位置开始的补全代码(纯文本,不要代码块标记):`;
224
+ return [
225
+ { role: 'system', content: systemPrompt },
226
+ { role: 'user', content: userPrompt },
227
+ ];
228
+ }
229
+ /** 解析并校验补全结果 */
230
+ parseAndValidate(rawText, language, suffix) {
231
+ if (!rawText || !rawText.trim())
232
+ return [];
233
+ // P4-4: 多候选拆分(模型输出含多个代码块时各作为候选),主建议保持原逻辑不变
234
+ const candidates = this.splitCandidates(rawText);
235
+ const results = [];
236
+ for (const cand of candidates) {
237
+ // O2: 后处理(去围栏、去后缀重复、裁半截行、质量打分)
238
+ const processed = (0, completion_postprocess_1.postProcessCompletion)(cand.trim(), { suffix });
239
+ if (!processed)
240
+ continue;
241
+ // 语法校验(近似:检查括号平衡、引号平衡)
242
+ if (this.config.enableSyntaxCheck && !this.passesSyntaxCheck(processed, language)) {
243
+ logger_1.logger.debug('completion failed syntax check', { text: processed.slice(0, 50) });
244
+ continue;
245
+ }
246
+ // 判断补全类型
247
+ const kind = this.inferKind(processed);
248
+ // 生成预览
249
+ const preview = processed.replace(/\n/g, ' ').slice(0, 80);
250
+ const confidence = Math.round((0, completion_postprocess_1.scoreCompletion)(processed) * 100) / 100;
251
+ results.push({
252
+ text: processed,
253
+ kind,
254
+ confidence,
255
+ preview,
256
+ });
257
+ }
258
+ // 按置信度降序,最多返回 3 个候选
259
+ return results.sort((a, b) => b.confidence - a.confidence).slice(0, 3);
260
+ }
261
+ /** P4-4: 从模型响应拆分多候选——多个代码块时各自成候选,否则单候选 */
262
+ splitCandidates(rawText) {
263
+ const fences = [];
264
+ const re = /```[a-zA-Z0-9]*\s*\n([\s\S]*?)\n```/g;
265
+ let m;
266
+ while ((m = re.exec(rawText)) !== null) {
267
+ const body = m[1].trim();
268
+ if (body)
269
+ fences.push(body);
270
+ }
271
+ if (fences.length >= 2)
272
+ return fences;
273
+ return [rawText];
274
+ }
275
+ /** 近似语法校验:检查括号和引号平衡 */
276
+ passesSyntaxCheck(text, _language) {
277
+ // 检查括号平衡
278
+ const pairs = [['(', ')'], ['{', '}'], ['[', ']']];
279
+ for (const [open, close] of pairs) {
280
+ const openCount = (text.match(new RegExp(`\\${open}`, 'g')) || []).length;
281
+ const closeCount = (text.match(new RegExp(`\\${close}`, 'g')) || []).length;
282
+ // 允许未闭合的括号(补全可能是不完整的),但不允许 close 比 open 多
283
+ if (closeCount > openCount)
284
+ return false;
285
+ }
286
+ // 检查引号平衡(简单计数)
287
+ const singleQuotes = (text.match(/'/g) || []).length;
288
+ const doubleQuotes = (text.match(/"/g) || []).length;
289
+ const backticks = (text.match(/`/g) || []).length;
290
+ if (singleQuotes % 2 !== 0)
291
+ return false;
292
+ if (doubleQuotes % 2 !== 0)
293
+ return false;
294
+ if (backticks % 2 !== 0)
295
+ return false;
296
+ return true;
297
+ }
298
+ /** 推断补全类型 */
299
+ inferKind(text) {
300
+ if (/^import\s/.test(text))
301
+ return 'import';
302
+ if (/\bfunction\s+\w+/.test(text) || /=>\s*\{/.test(text))
303
+ return 'function';
304
+ if (text.includes('\n') && (text.includes('{') || text.includes('}')))
305
+ return 'block';
306
+ return 'line';
307
+ }
308
+ /* ========== P0-2: 快速路径(本地规则引擎,不调用 LLM) ========== */
309
+ /**
310
+ * 快速路径:根据本地规则生成补全,延迟 < 10ms
311
+ * 覆盖场景:闭合括号/引号、补全分号、常见代码片段
312
+ */
313
+ tryFastPath(prefix, suffix, language, startTime) {
314
+ // 只在 quick 模式下使用快速路径(full 模式需要更复杂的补全)
315
+ const lastChar = prefix.slice(-1);
316
+ const lastLine = prefix.split('\n').pop() || '';
317
+ // 规则1:闭合括号(光标前有未闭合的开括号,且 suffix 不以对应闭括号开头)
318
+ const bracketPairs = [['(', ')'], ['{', '}'], ['[', ']']];
319
+ for (const [open, close] of bracketPairs) {
320
+ if (lastChar === open && !suffix.startsWith(close)) {
321
+ // 检查是否真的未闭合(简单计数)
322
+ const openCount = (prefix.match(new RegExp(`\\${open}`, 'g')) || []).length;
323
+ const closeCount = (prefix.match(new RegExp(`\\${close}`, 'g')) || []).length;
324
+ if (openCount > closeCount) {
325
+ return this.makeFastResult(close, 'line', 0.95, startTime, 'fast-path:bracket');
326
+ }
327
+ }
328
+ }
329
+ // 规则2:闭合引号(光标前有未闭合的引号)
330
+ const quoteChars = ["'", '"', '`'];
331
+ for (const q of quoteChars) {
332
+ if (lastChar === q && !suffix.startsWith(q)) {
333
+ // 检查引号是否未闭合(简单计数,忽略转义)
334
+ const quoteCount = (prefix.match(new RegExp(`(?<!\\\\)\\${q}`, 'g')) || []).length;
335
+ if (quoteCount % 2 === 1) {
336
+ return this.makeFastResult(q, 'line', 0.95, startTime, 'fast-path:quote');
337
+ }
338
+ }
339
+ }
340
+ // 规则3:补全分号(C-like 语言,行尾是赋值/调用/import,且没有分号)
341
+ if (['typescript', 'javascript', 'java', 'c', 'cpp', 'csharp', 'go'].includes(language)) {
342
+ const trimmedLine = lastLine.trim();
343
+ if (trimmedLine.length > 3 &&
344
+ !trimmedLine.endsWith(';') &&
345
+ !trimmedLine.endsWith('{') &&
346
+ !trimmedLine.endsWith('}') &&
347
+ !trimmedLine.endsWith(':') &&
348
+ !trimmedLine.startsWith('//') &&
349
+ !trimmedLine.startsWith('/*') &&
350
+ (/=\s*[^=;]+$/.test(trimmedLine) || // 赋值
351
+ /\)\s*$/.test(trimmedLine) || // 函数调用
352
+ /^import\s/.test(trimmedLine) || // import
353
+ /^export\s/.test(trimmedLine) || // export
354
+ /^return\s/.test(trimmedLine) || // return
355
+ /^(const|let|var)\s/.test(trimmedLine) // 变量声明
356
+ )) {
357
+ return this.makeFastResult(';', 'line', 0.85, startTime, 'fast-path:semicolon');
358
+ }
359
+ }
360
+ // 规则4:常见代码片段补全(基于前缀匹配)
361
+ const snippets = [
362
+ [/console\.lo$/, 'g(', 'line', 0.9],
363
+ [/console\.er$/, 'ror(', 'line', 0.9],
364
+ [/console\.wa$/, 'rn(', 'line', 0.9],
365
+ [/retur$/, 'n ', 'line', 0.95],
366
+ [/functio$/, 'n ', 'function', 0.9],
367
+ [/impor$/, 't ', 'import', 0.95],
368
+ [/expor$/, 't ', 'import', 0.9],
369
+ [/const$/, ' ', 'line', 0.8],
370
+ [/let$/, ' ', 'line', 0.8],
371
+ [/if$/, ' (', 'block', 0.85],
372
+ [/for$/, ' (', 'block', 0.85],
373
+ [/whil$/, 'e (', 'block', 0.85],
374
+ [/els$/, 'e {', 'block', 0.85],
375
+ [/tr$/, 'y {', 'block', 0.85],
376
+ [/switc$/, 'h (', 'block', 0.85],
377
+ [/def$/, ' ', 'function', 0.8], // Python
378
+ [/clas$/, 's ', 'function', 0.9],
379
+ [/async$/, ' ', 'line', 0.85],
380
+ [/awai$/, 't ', 'line', 0.9],
381
+ ];
382
+ for (const [pattern, insert, kind, confidence] of snippets) {
383
+ if (pattern.test(lastLine)) {
384
+ // 确保 suffix 不是已经包含了补全内容的开头
385
+ if (!suffix.startsWith(insert.trim())) {
386
+ return this.makeFastResult(insert, kind, confidence, startTime, 'fast-path:snippet');
387
+ }
388
+ }
389
+ }
390
+ return null;
391
+ }
392
+ /** 构造快速路径结果 */
393
+ makeFastResult(text, kind, confidence, startTime, model) {
394
+ return {
395
+ suggestions: [{
396
+ text,
397
+ kind,
398
+ confidence,
399
+ preview: text.replace(/\n/g, ' ').slice(0, 80),
400
+ }],
401
+ latencyMs: Date.now() - startTime,
402
+ model,
403
+ cached: false,
404
+ };
405
+ }
406
+ /* ========== P0-2: 前缀匹配缓存 ========== */
407
+ /**
408
+ * 前缀匹配缓存:如果新请求的 prefix 是某个缓存条目的 prefix 的扩展,
409
+ * 且 suffix 相同,可以复用缓存结果(补全内容通常不变)
410
+ */
411
+ tryPrefixCache(prefix, _suffix, _filePath, _mode, startTime) {
412
+ const now = Date.now();
413
+ for (const [, entry] of this.cache) {
414
+ if (now - entry.timestamp > this.config.cacheTtlMs)
415
+ continue;
416
+ // 新 prefix 是缓存 prefix 的扩展(用户继续输入了几个字符)
417
+ if (prefix.startsWith(entry.prefix) && prefix.length > entry.prefix.length) {
418
+ // 简化:如果缓存条目的补全文本以新输入的字符开头,可以复用
419
+ const newChars = prefix.slice(entry.prefix.length);
420
+ const firstSuggestion = entry.result.suggestions[0];
421
+ if (firstSuggestion && firstSuggestion.text.startsWith(newChars)) {
422
+ // 复用补全,但去掉已经输入的部分
423
+ const remainingText = firstSuggestion.text.slice(newChars.length);
424
+ if (remainingText) {
425
+ return {
426
+ suggestions: [{
427
+ text: remainingText,
428
+ kind: firstSuggestion.kind,
429
+ confidence: firstSuggestion.confidence * 0.9, // 略降置信度
430
+ preview: remainingText.replace(/\n/g, ' ').slice(0, 80),
431
+ }],
432
+ latencyMs: Date.now() - startTime,
433
+ model: entry.result.model,
434
+ cached: true,
435
+ };
436
+ }
437
+ }
438
+ }
439
+ }
440
+ return null;
441
+ }
442
+ /** 构建缓存 key */
443
+ buildCacheKey(req, prefix, suffix, mode) {
444
+ // 只取 prefix 最后 200 字符和 suffix 前 100 字符作为缓存 key
445
+ const prefixKey = prefix.slice(-200);
446
+ const suffixKey = suffix.slice(0, 100);
447
+ return `${req.filePath}::${mode}::${prefixKey}::${suffixKey}`;
448
+ }
449
+ /** 清理过期缓存 */
450
+ cleanupCache() {
451
+ const now = Date.now();
452
+ for (const [key, entry] of this.cache) {
453
+ if (now - entry.timestamp > this.config.cacheTtlMs) {
454
+ this.cache.delete(key);
455
+ }
456
+ }
457
+ // 缓存上限 100 条
458
+ if (this.cache.size > 100) {
459
+ const keys = Array.from(this.cache.keys());
460
+ for (let i = 0; i < keys.length - 100; i++) {
461
+ this.cache.delete(keys[i]);
462
+ }
463
+ }
464
+ }
465
+ /** 空结果 */
466
+ emptyResult(startTime, model) {
467
+ return {
468
+ suggestions: [],
469
+ latencyMs: Date.now() - startTime,
470
+ model,
471
+ cached: false,
472
+ };
473
+ }
474
+ /** 清空缓存 */
475
+ clearCache() {
476
+ this.cache.clear();
477
+ }
478
+ /** 获取缓存统计 */
479
+ getCacheStats() {
480
+ return { size: this.cache.size, ttlMs: this.config.cacheTtlMs, fastPathHits: this.fastPathHits };
481
+ }
482
+ /**
483
+ * 阶段一-2:补全 Pro - 记录用户接受的补全
484
+ */
485
+ recordAcceptance(filePath, cursorOffset, text) {
486
+ this.recentAcceptances.push({ filePath, cursorOffset, text, timestamp: Date.now() });
487
+ if (this.recentAcceptances.length > 20)
488
+ this.recentAcceptances.shift();
489
+ logger_1.logger.debug('completion acceptance recorded', { filePath, cursorOffset, textLength: text.length });
490
+ }
491
+ /**
492
+ * 阶段一-2:补全 Pro - 推荐下一个改动点
493
+ */
494
+ suggestNext(filePath, currentContent, currentOffset) {
495
+ const fileAcceptances = this.recentAcceptances
496
+ .filter((a) => a.filePath === filePath)
497
+ .sort((a, b) => b.timestamp - a.timestamp);
498
+ if (fileAcceptances.length === 0)
499
+ return { suggested: false };
500
+ const last = fileAcceptances[0];
501
+ const lastEndOffset = last.cursorOffset + last.text.length;
502
+ // 策略 1:刚定义函数,推荐添加导出或调用
503
+ if (/function\s+\w+|const\s+\w+\s*=\s*(async\s*)?\(/.test(last.text)) {
504
+ const nextOffset = this.findNextLogicalPosition(currentContent, lastEndOffset);
505
+ if (nextOffset > 0) {
506
+ return { suggested: true, offset: nextOffset, reason: '刚定义了函数,推荐添加导出或调用', hint: 'export { ... } 或 添加调用示例' };
507
+ }
508
+ }
509
+ // 策略 2:刚导入符号,推荐使用
510
+ if (/^import\s/.test(last.text.trim())) {
511
+ const importMatch = last.text.match(/import\s+(?:type\s+)?(?:\{([^}]+)\}|(\w+))/);
512
+ if (importMatch) {
513
+ const imported = importMatch[1] || importMatch[2];
514
+ const symbolName = imported?.split(',').map((s) => s.trim().split(/\s+as\s+/)[0])[0] || '';
515
+ if (symbolName) {
516
+ return { suggested: true, offset: currentOffset, reason: `刚导入了 ${symbolName},推荐使用`, hint: `${symbolName}(...)` };
517
+ }
518
+ }
519
+ }
520
+ // 策略 3:连续编辑模式
521
+ if (fileAcceptances.length >= 3) {
522
+ const recent3 = fileAcceptances.slice(0, 3);
523
+ const avgOffset = recent3.reduce((sum, a) => sum + a.cursorOffset, 0) / 3;
524
+ const maxOffsetDiff = Math.max(...recent3.map((a) => Math.abs(a.cursorOffset - avgOffset)));
525
+ if (maxOffsetDiff < 500) {
526
+ const nextOffset = this.findNextLogicalPosition(currentContent, lastEndOffset);
527
+ if (nextOffset > 0 && nextOffset - lastEndOffset < 1000) {
528
+ return { suggested: true, offset: nextOffset, reason: '检测到连续编辑模式,推荐继续修改', hint: '继续完善当前代码块' };
529
+ }
530
+ }
531
+ }
532
+ return { suggested: false };
533
+ }
534
+ /** 找到下一个逻辑位置(空行、函数结束等) */
535
+ findNextLogicalPosition(content, fromOffset) {
536
+ const after = content.slice(fromOffset);
537
+ const emptyLineMatch = after.match(/\n\s*\n/);
538
+ if (emptyLineMatch && emptyLineMatch.index !== undefined) {
539
+ return fromOffset + emptyLineMatch.index + emptyLineMatch[0].length;
540
+ }
541
+ const newlineMatch = after.match(/\n/);
542
+ if (newlineMatch && newlineMatch.index !== undefined) {
543
+ return fromOffset + newlineMatch.index + 1;
544
+ }
545
+ return -1;
546
+ }
547
+ }
548
+ exports.CompletionEngine = CompletionEngine;
549
+ /** 便捷函数:创建补全引擎 */
550
+ function createCompletionEngine(router, config, codeGraph) {
551
+ return new CompletionEngine(router, config, codeGraph);
552
+ }
553
+ //# sourceMappingURL=completion-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-engine.js","sourceRoot":"","sources":["../../src/agent/completion-engine.ts"],"names":[],"mappings":"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"}