feihong-code 0.2.3 → 0.6.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 (180) hide show
  1. package/.github/FUNDING.yml +4 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +37 -37
  3. package/.github/ISSUE_TEMPLATE/config.yml +14 -14
  4. package/.github/ISSUE_TEMPLATE/feature_request.md +28 -28
  5. package/.github/PULL_REQUEST_TEMPLATE.md +46 -46
  6. package/.github/SECURITY.md +67 -67
  7. package/.github/dependabot.yml +16 -0
  8. package/.github/workflows/ci.yml +1 -1
  9. package/AGENT-GUIDE.md +382 -237
  10. package/CHANGELOG.md +392 -0
  11. package/CODE_OF_CONDUCT.md +56 -56
  12. package/CONTRIBUTING.md +68 -68
  13. package/LICENSE +22 -22
  14. package/README.md +586 -522
  15. package/README.self-evolve.md +274 -0
  16. package/dist/agent/code-review.js +2 -0
  17. package/dist/agent/code-review.js.map +1 -1
  18. package/dist/agent/code-writer.js +74 -18
  19. package/dist/agent/code-writer.js.map +1 -1
  20. package/dist/agent/context-compactor.js +13 -4
  21. package/dist/agent/context-compactor.js.map +1 -1
  22. package/dist/agent/experience.js +319 -84
  23. package/dist/agent/experience.js.map +1 -1
  24. package/dist/agent/orchestrator.js +233 -71
  25. package/dist/agent/orchestrator.js.map +1 -1
  26. package/dist/agent/planner.js +30 -7
  27. package/dist/agent/planner.js.map +1 -1
  28. package/dist/agent/prompts.js +9 -0
  29. package/dist/agent/prompts.js.map +1 -1
  30. package/dist/agent/quality-gate.js +10 -4
  31. package/dist/agent/quality-gate.js.map +1 -1
  32. package/dist/agent/repo-context.js +181 -0
  33. package/dist/agent/repo-context.js.map +1 -0
  34. package/dist/agent/repo-reader.js +92 -99
  35. package/dist/agent/repo-reader.js.map +1 -1
  36. package/dist/agent/self-heal.js +80 -60
  37. package/dist/agent/self-heal.js.map +1 -1
  38. package/dist/agent/self-improver.js +65 -61
  39. package/dist/agent/self-improver.js.map +1 -1
  40. package/dist/agent/subagent-summary.js +31 -0
  41. package/dist/agent/subagent-summary.js.map +1 -0
  42. package/dist/agent/subagent.js +52 -2
  43. package/dist/agent/subagent.js.map +1 -1
  44. package/dist/agent/symbol-index.js +160 -0
  45. package/dist/agent/symbol-index.js.map +1 -0
  46. package/dist/agent/team.js +193 -0
  47. package/dist/agent/team.js.map +1 -0
  48. package/dist/cli/commands.js +124 -143
  49. package/dist/cli/commands.js.map +1 -1
  50. package/dist/cli/index.js +113 -106
  51. package/dist/cli/index.js.map +1 -1
  52. package/dist/cli/repl.js +82 -7
  53. package/dist/cli/repl.js.map +1 -1
  54. package/dist/cli/run.js +600 -95
  55. package/dist/cli/run.js.map +1 -1
  56. package/dist/cli/tui.js +145 -0
  57. package/dist/cli/tui.js.map +1 -0
  58. package/dist/cli/version.js +1 -1
  59. package/dist/enterprise/audit.js +145 -23
  60. package/dist/enterprise/audit.js.map +1 -1
  61. package/dist/enterprise/index.js +14 -11
  62. package/dist/enterprise/index.js.map +1 -1
  63. package/dist/enterprise/policy.js +22 -10
  64. package/dist/enterprise/policy.js.map +1 -1
  65. package/dist/harness/executor.js +127 -0
  66. package/dist/harness/executor.js.map +1 -0
  67. package/dist/harness/harness.js +87 -0
  68. package/dist/harness/harness.js.map +1 -0
  69. package/dist/harness/index.js +31 -0
  70. package/dist/harness/index.js.map +1 -0
  71. package/dist/harness/loader.js +138 -0
  72. package/dist/harness/loader.js.map +1 -0
  73. package/dist/harness/reporter.js +34 -0
  74. package/dist/harness/reporter.js.map +1 -0
  75. package/dist/harness/types.js +10 -0
  76. package/dist/harness/types.js.map +1 -0
  77. package/dist/harness/verifier.js +48 -0
  78. package/dist/harness/verifier.js.map +1 -0
  79. package/dist/hello.js +14 -0
  80. package/dist/hello.js.map +1 -0
  81. package/dist/memory/auto-summarize.js +208 -0
  82. package/dist/memory/auto-summarize.js.map +1 -0
  83. package/dist/memory/index.js +228 -0
  84. package/dist/memory/index.js.map +1 -0
  85. package/dist/models/model-router.js +100 -27
  86. package/dist/models/model-router.js.map +1 -1
  87. package/dist/models/model.dto.js +25 -3
  88. package/dist/models/model.dto.js.map +1 -1
  89. package/dist/models/providers/ollama.provider.js +12 -0
  90. package/dist/models/providers/ollama.provider.js.map +1 -1
  91. package/dist/models/providers/openai-compatible.provider.js +14 -1
  92. package/dist/models/providers/openai-compatible.provider.js.map +1 -1
  93. package/dist/plugins/plugin-loader.js +179 -0
  94. package/dist/plugins/plugin-loader.js.map +1 -0
  95. package/dist/runtime/event-log.js.map +1 -1
  96. package/dist/runtime/hooks.js +80 -0
  97. package/dist/runtime/hooks.js.map +1 -0
  98. package/dist/self-evolve/hook.js +60 -0
  99. package/dist/self-evolve/hook.js.map +1 -0
  100. package/dist/self-evolve/hook.ts +80 -0
  101. package/dist/self-evolve/manager.d.ts +8 -0
  102. package/dist/self-evolve/manager.js +401 -0
  103. package/dist/shared/config.js +35 -3
  104. package/dist/shared/config.js.map +1 -1
  105. package/dist/shared/errors.js +6 -2
  106. package/dist/shared/errors.js.map +1 -1
  107. package/dist/shared/i18n.js +535 -0
  108. package/dist/shared/i18n.js.map +1 -0
  109. package/dist/shared/secure-store.js +117 -0
  110. package/dist/shared/secure-store.js.map +1 -0
  111. package/dist/skills/grill.js +2 -1
  112. package/dist/skills/grill.js.map +1 -1
  113. package/dist/skills/self-heal.js +73 -0
  114. package/dist/skills/self-heal.js.map +1 -0
  115. package/dist/skills/skill-loader.js +131 -0
  116. package/dist/skills/skill-loader.js.map +1 -0
  117. package/dist/skills/skill-market.js +195 -0
  118. package/dist/skills/skill-market.js.map +1 -0
  119. package/dist/tools/analysis/code-analyzer.js +45 -18
  120. package/dist/tools/analysis/code-analyzer.js.map +1 -1
  121. package/dist/tools/index.js +5 -0
  122. package/dist/tools/index.js.map +1 -1
  123. package/dist/tools/mcp/index.js +84 -0
  124. package/dist/tools/mcp/index.js.map +1 -0
  125. package/dist/tools/mcp/mcp-client.js +194 -0
  126. package/dist/tools/mcp/mcp-client.js.map +1 -0
  127. package/dist/tools/sandbox.js +126 -0
  128. package/dist/tools/sandbox.js.map +1 -0
  129. package/dist/tools/shell/exec.js +72 -3
  130. package/dist/tools/shell/exec.js.map +1 -1
  131. package/dist/tools/shell/run-shell.tool.js +37 -7
  132. package/dist/tools/shell/run-shell.tool.js.map +1 -1
  133. package/dist/tools/skills/load-skill.tool.js +36 -0
  134. package/dist/tools/skills/load-skill.tool.js.map +1 -0
  135. package/dist/tools/tool.interface.js.map +1 -1
  136. package/dist/tools/tool.registry.js +69 -1
  137. package/dist/tools/tool.registry.js.map +1 -1
  138. package/dist/tools/web/web.tool.js +139 -0
  139. package/dist/tools/web/web.tool.js.map +1 -0
  140. package/dist/web/auth.js +178 -3
  141. package/dist/web/auth.js.map +1 -1
  142. package/dist/web/channels.js +171 -0
  143. package/dist/web/channels.js.map +1 -0
  144. package/dist/web/public/css/style.css +1546 -0
  145. package/dist/web/public/index.html +804 -37
  146. package/dist/web/public/js/api.js +309 -0
  147. package/dist/web/public/js/app.js +1472 -0
  148. package/dist/web/public/js/ui.js +832 -0
  149. package/dist/web/public/js/utils.js +170 -0
  150. package/dist/web/server.js +937 -11
  151. package/dist/web/server.js.map +1 -1
  152. package/dist/web/task-queue.js +470 -0
  153. package/dist/web/task-queue.js.map +1 -0
  154. package/dist/web/web-config.js +143 -0
  155. package/dist/web/web-config.js.map +1 -0
  156. package/docs/App/344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +299 -0
  157. package/docs/App/346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +554 -0
  158. package/docs/Deployment_Guide_EN.md +288 -0
  159. package/docs/SELF-EVOLVE-GUIDE.md +313 -0
  160. package/docs/Technical_Manual_EN.md +216 -0
  161. package/docs/User_Manual_EN.md +314 -0
  162. package/docs/error-codes.md +198 -0
  163. package/docs/screenshots/cli-demo.png +0 -0
  164. package/docs/screenshots/feature-comparison.png +0 -0
  165. package/docs/screenshots/web-console.png +0 -0
  166. package/docs/self-evolve-implementation.md +165 -0
  167. package/docs/self-evolve.md +166 -0
  168. package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -614
  169. package/docs//344/274/201/344/270/232/351/203/250/347/275/262/344/270/216/345/220/210/350/247/204.md +267 -267
  170. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +318 -358
  171. package/docs//345/270/270/350/247/201/351/227/256/351/242/230/344/270/216/346/225/205/351/232/234/346/216/222/346/237/245.md +130 -130
  172. package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +216 -303
  173. package/docs//346/236/266/346/236/204/344/270/216API.md +238 -238
  174. package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -196
  175. package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -165
  176. package/docs//351/203/250/347/275/262/350/257/264/346/230/216/344/271/246.md +288 -0
  177. package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -127
  178. package/docs//351/241/265/351/235/242/345/212/237/350/203/275/345/244/215/347/233/230/344/270/216/345/206/222/347/203/237/346/265/213/350/257/225/346/212/245/345/221/212.html +117 -0
  179. package/package.json +108 -109
  180. package/tool-schema.json +117 -46
@@ -1,100 +1,241 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeExperienceId = normalizeExperienceId;
3
4
  exports.extractExperience = extractExperience;
4
5
  exports.saveExperience = saveExperience;
6
+ exports.upsertExperience = upsertExperience;
5
7
  exports.loadExperiences = loadExperiences;
8
+ exports.retrieveRelevantExperiences = retrieveRelevantExperiences;
6
9
  exports.updateExperienceUsage = updateExperienceUsage;
10
+ exports.extractFixPattern = extractFixPattern;
7
11
  exports.generateExperiencePrompt = generateExperiencePrompt;
8
12
  exports.listExperiences = listExperiences;
9
13
  /**
10
14
  * 飞虹 Code (Muse Code 参照复刻)
11
15
  * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
12
16
  *
13
- * 经验学习(Experience Learning):
14
- * - 会话完成后自动提取经验(成功模式、失败教训、高效工具调用序列)
15
- * - 存储到 FH_HOME/experiences/*.jsonl
16
- * - 下次任务开始时加载相关经验注入 system prompt
17
+ * 经验学习(Experience Learning)— 强化学习式经验系统:
18
+ * - 会话完成后自动提取经验(成功模式、失败教训、高效工具调用序列、自愈修复经验)
19
+ * - 存储到 FH_HOME/experiences/*.jsonl,并以「稳定 id + upsert 合并」实现强化学习
20
+ * (同一模式被多次验证会累积 sessionCount 与成功率权重,而非无限追加重复记录)
21
+ * - 下次任务开始时用 retrieveRelevantExperiences 做加权检索(标签重叠 + 新鲜度 + 成功率)
22
+ * 注入 system prompt,形成「执行 → 反思 → 回流 → 更强执行」的闭环
17
23
  */
18
24
  const promises_1 = require("fs/promises");
19
25
  const fs_1 = require("fs");
20
26
  const path_1 = require("path");
21
27
  const logger_1 = require("../shared/logger");
22
- /** 从会话历史中提取经验 */
28
+ const self_heal_1 = require("./self-heal");
29
+ /**
30
+ * 文件级 Promise 锁:防止两个 run 同时完成时 upsertExperience 互相覆盖。
31
+ * 同一 experiences.jsonl 路径的写入串行化,不同路径互不阻塞。
32
+ */
33
+ const fileLocks = new Map();
34
+ async function withFileLock(filePath, fn) {
35
+ const prev = fileLocks.get(filePath) ?? Promise.resolve();
36
+ let release;
37
+ const next = new Promise((resolve) => { release = resolve; });
38
+ fileLocks.set(filePath, prev.then(() => next, () => next));
39
+ try {
40
+ await prev;
41
+ return await fn();
42
+ }
43
+ finally {
44
+ release();
45
+ // 锁队列空时清理 Map 条目,避免内存泄漏
46
+ if (fileLocks.get(filePath) === next)
47
+ fileLocks.delete(filePath);
48
+ }
49
+ }
50
+ /** 稳定短哈希(用于经验去重 id) */
51
+ function shortHash(s) {
52
+ let h = 5381;
53
+ for (let i = 0; i < s.length; i++)
54
+ h = ((h << 5) + h + s.charCodeAt(i)) | 0;
55
+ return (h >>> 0).toString(36);
56
+ }
57
+ /** 由类型 + 归一化键生成稳定 id(跨 run 一致,支撑去重与 usage 追踪) */
58
+ function normalizeExperienceId(type, key) {
59
+ return `exp-${shortHash(`${type}:${key}`)}`;
60
+ }
61
+ const EXTRACTORS = [
62
+ {
63
+ // 经验 1: 高效工具调用模式(成功序列)
64
+ key: 'tool-efficiency',
65
+ extract: ({ toolCalls, mkMeta }) => {
66
+ if (toolCalls.length < 3)
67
+ return null;
68
+ const successfulCalls = toolCalls.filter((tc) => tc.success);
69
+ if (successfulCalls.length < 2)
70
+ return null;
71
+ const pattern = successfulCalls.map((tc) => tc.name).join(' → ');
72
+ return {
73
+ id: normalizeExperienceId('tool-efficiency', pattern),
74
+ type: 'tool-efficiency',
75
+ title: `成功工具序列: ${pattern}`,
76
+ content: `在本次任务中,以下工具调用序列成功完成目标:\n${pattern}\n\n建议未来类似任务优先复用此序列,可减少试错轮次。`,
77
+ metadata: mkMeta(successfulCalls.length / toolCalls.length, successfulCalls.map((tc) => tc.name)),
78
+ };
79
+ },
80
+ },
81
+ {
82
+ // 经验 2: 错误模式与规避(用 classifyError 精确归类)
83
+ key: 'error-pattern',
84
+ extract: ({ errors, mkMeta }) => {
85
+ if (errors.length === 0)
86
+ return null;
87
+ const categories = new Set();
88
+ for (const e of errors) {
89
+ const analysis = (0, self_heal_1.classifyError)(e.content || '', e.content || '');
90
+ categories.add(analysis?.category ?? 'unknown');
91
+ }
92
+ const uniqueErrors = [...categories];
93
+ return {
94
+ id: normalizeExperienceId('error-pattern', uniqueErrors.join(',')),
95
+ type: 'error-pattern',
96
+ title: `常见错误模式: ${uniqueErrors.join(', ')}`,
97
+ content: `本次任务遇到以下错误类型:\n${uniqueErrors.map((e) => `- ${e}`).join('\n')}\n\n规避建议: 提前校验前置条件(路径/权限/依赖),增加超时重试与最小改动原则,避免同类错误重复发生。`,
98
+ metadata: mkMeta(0, uniqueErrors),
99
+ };
100
+ },
101
+ },
102
+ {
103
+ // 经验 3: 干净成功模式(无错误且工具调用高效)
104
+ key: 'clean-success',
105
+ extract: ({ toolCalls, errors, mkMeta }) => {
106
+ if (errors.length > 0)
107
+ return null;
108
+ if (toolCalls.filter((tc) => tc.success).length < 2)
109
+ return null;
110
+ return {
111
+ id: normalizeExperienceId('success-pattern', 'clean-run'),
112
+ type: 'success-pattern',
113
+ title: '干净高效执行(无错误通过)',
114
+ content: '本次任务在较少轮次内一次性通过,说明目标拆解与工具使用策略有效。未来可优先沿用「先勘察→小步编辑→就地验证」的节奏。',
115
+ metadata: mkMeta(1.0, ['clean-run', 'efficiency']),
116
+ };
117
+ },
118
+ },
119
+ ];
23
120
  function extractExperience(messages, runId) {
24
121
  const experiences = [];
122
+ // 通过 toolCallId 精确关联工具调用与结果,替代脆弱的顺序匹配
123
+ const toolCallMap = new Map();
25
124
  const toolCalls = [];
26
- // 提取工具调用序列
27
125
  for (const msg of messages) {
28
126
  if (msg.role === 'assistant' && msg.toolCalls) {
29
127
  for (const tc of msg.toolCalls) {
30
- toolCalls.push({ name: tc.name, args: tc.arguments, success: true });
128
+ const entry = { name: tc.name, args: tc.arguments, success: true };
129
+ toolCalls.push(entry);
130
+ if (tc.id)
131
+ toolCallMap.set(tc.id, entry);
31
132
  }
32
133
  }
33
134
  if (msg.role === 'tool') {
34
- const lastCall = toolCalls[toolCalls.length - 1];
35
- if (lastCall && (msg.content || '').startsWith('错误:')) {
36
- lastCall.success = false;
135
+ // 优先通过 toolCallId 精确匹配;无 id 时回退到最后一个调用(兼容旧数据)
136
+ const matched = msg.toolCallId ? toolCallMap.get(msg.toolCallId) : toolCalls[toolCalls.length - 1];
137
+ if (matched) {
138
+ const content = msg.content || '';
139
+ // 工具失败标记:内容以"错误:"开头,或包含 exit code 非 0
140
+ if (content.startsWith('错误:') || /exit code [1-9]/.test(content)) {
141
+ matched.success = false;
142
+ }
37
143
  }
38
144
  }
39
145
  }
40
- // 经验 1: 高效工具调用模式
41
- if (toolCalls.length >= 3) {
42
- const successfulCalls = toolCalls.filter((tc) => tc.success);
43
- if (successfulCalls.length >= 2) {
44
- const pattern = successfulCalls.map((tc) => tc.name).join(' → ');
45
- experiences.push({
46
- id: `exp-${runId}-tools`,
47
- type: 'tool-efficiency',
48
- title: `成功工具序列: ${pattern}`,
49
- content: `在本次任务中,以下工具调用序列成功完成目标:\n${pattern}\n\n建议未来类似任务可参考此序列。`,
50
- metadata: {
51
- sessionCount: 1,
52
- successRate: successfulCalls.length / toolCalls.length,
53
- tags: successfulCalls.map((tc) => tc.name),
54
- createdAt: new Date().toISOString(),
55
- lastUsedAt: new Date().toISOString(),
56
- },
57
- });
58
- }
59
- }
60
- // 经验 2: 错误模式与规避
146
+ const now = new Date().toISOString();
147
+ const mkMeta = (successRate, tags) => ({
148
+ sessionCount: 1,
149
+ successRate,
150
+ tags,
151
+ createdAt: now,
152
+ lastUsedAt: now,
153
+ });
61
154
  const errors = messages.filter((m) => m.role === 'tool' && (m.content || '').startsWith('错误:'));
62
- if (errors.length > 0) {
63
- const errorTypes = errors.map((e) => {
64
- const content = e.content || '';
65
- if (content.includes('路径') || content.includes('path'))
66
- return 'path-error';
67
- if (content.includes('超时') || content.includes('timeout'))
68
- return 'timeout';
69
- if (content.includes('权限') || content.includes('permission'))
70
- return 'permission';
71
- return 'unknown';
72
- });
73
- const uniqueErrors = [...new Set(errorTypes)];
74
- experiences.push({
75
- id: `exp-${runId}-errors`,
76
- type: 'error-pattern',
77
- title: `常见错误模式: ${uniqueErrors.join(', ')}`,
78
- content: `本次任务遇到以下错误类型:\n${uniqueErrors.map((e) => `- ${e}`).join('\n')}\n\n规避建议: 检查文件路径、增加超时重试、确认权限设置。`,
79
- metadata: {
80
- sessionCount: 1,
81
- successRate: 0,
82
- tags: uniqueErrors,
83
- createdAt: new Date().toISOString(),
84
- lastUsedAt: new Date().toISOString(),
85
- },
86
- });
155
+ const ctx = { toolCalls, errors, mkMeta, now };
156
+ // 表驱动:依次运行提取器,命中的经验入列(行为与原三段 if 完全一致)
157
+ for (const ex of EXTRACTORS) {
158
+ const exp = ex.extract(ctx);
159
+ if (exp)
160
+ experiences.push(exp);
87
161
  }
162
+ // runId 仅用于审计留痕,不影响稳定 id
163
+ void runId;
88
164
  return experiences;
89
165
  }
90
- /** 保存经验到文件 */
166
+ /** 追加保存一条经验(新建场景) */
91
167
  async function saveExperience(experienceDir, experience) {
92
168
  await (0, promises_1.mkdir)(experienceDir, { recursive: true });
93
169
  const file = (0, path_1.join)(experienceDir, 'experiences.jsonl');
94
170
  await (0, promises_1.appendFile)(file, JSON.stringify(experience) + '\n', 'utf8');
95
171
  logger_1.logger.info('experience saved', { id: experience.id, type: experience.type });
96
172
  }
97
- /** 加载相关经验(基于任务关键词) */
173
+ /**
174
+ * upsertExperience:强化学习式合并写入。
175
+ * - 若同 id 经验已存在:sessionCount+1、成功率按次数加权平均、标签合并、刷新 lastUsedAt
176
+ * - 否则新增
177
+ * 这样同一模式被多次验证会「越用越可信」,且不会无限膨胀出重复记录。
178
+ */
179
+ async function upsertExperience(experienceDir, experience) {
180
+ const file = (0, path_1.join)(experienceDir, 'experiences.jsonl');
181
+ // 文件锁:防止并发 run 同时读写导致互相覆盖
182
+ await withFileLock(file, async () => {
183
+ if (!(0, fs_1.existsSync)(file)) {
184
+ await saveExperience(experienceDir, experience);
185
+ return;
186
+ }
187
+ try {
188
+ const content = await (0, promises_1.readFile)(file, 'utf8');
189
+ const lines = content.split('\n').filter(Boolean);
190
+ let merged = false;
191
+ const out = [];
192
+ for (const line of lines) {
193
+ try {
194
+ const e = JSON.parse(line);
195
+ if (e.id === experience.id) {
196
+ const prev = e.metadata.sessionCount;
197
+ const mergedExp = {
198
+ ...e,
199
+ content: experience.content.length >= e.content.length ? experience.content : e.content,
200
+ metadata: {
201
+ sessionCount: prev + 1,
202
+ successRate: (e.metadata.successRate * prev + experience.metadata.successRate) / (prev + 1),
203
+ tags: [...new Set([...e.metadata.tags, ...experience.metadata.tags])],
204
+ createdAt: e.metadata.createdAt,
205
+ lastUsedAt: new Date().toISOString(),
206
+ },
207
+ };
208
+ out.push(JSON.stringify(mergedExp));
209
+ merged = true;
210
+ }
211
+ else {
212
+ out.push(line);
213
+ }
214
+ }
215
+ catch {
216
+ out.push(line);
217
+ }
218
+ }
219
+ if (!merged)
220
+ out.push(JSON.stringify(experience));
221
+ await (0, promises_1.writeFile)(file, out.join('\n') + '\n', 'utf8');
222
+ logger_1.logger.info('experience upserted', { id: experience.id, merged, type: experience.type });
223
+ }
224
+ catch {
225
+ await saveExperience(experienceDir, experience);
226
+ }
227
+ });
228
+ }
229
+ /** 关键词分词的轻量实现(用于检索打分) */
230
+ function tokenize(s) {
231
+ return s
232
+ .toLowerCase()
233
+ .replace(/[^\p{L}\p{N}\s]/gu, ' ')
234
+ .split(/\s+/)
235
+ .filter((w) => w.length >= 3)
236
+ .map((w) => w.replace(/[es]$/, ''));
237
+ }
238
+ /** 加载相关经验(基于任务关键词,兼容旧路径) */
98
239
  async function loadExperiences(experienceDir, keywords) {
99
240
  const file = (0, path_1.join)(experienceDir, 'experiences.jsonl');
100
241
  if (!(0, fs_1.existsSync)(file))
@@ -106,13 +247,11 @@ async function loadExperiences(experienceDir, keywords) {
106
247
  for (const line of lines) {
107
248
  try {
108
249
  const exp = JSON.parse(line);
109
- // 匹配关键词
110
250
  const matched = keywords.some((kw) => exp.title.includes(kw) ||
111
251
  exp.content.includes(kw) ||
112
252
  exp.metadata.tags.some((tag) => tag.includes(kw)));
113
- if (matched) {
253
+ if (matched)
114
254
  experiences.push(exp);
115
- }
116
255
  }
117
256
  catch {
118
257
  // 跳过损坏的经验记录
@@ -127,46 +266,142 @@ async function loadExperiences(experienceDir, keywords) {
127
266
  return [];
128
267
  }
129
268
  }
130
- /** 更新经验使用统计 */
131
- async function updateExperienceUsage(experienceDir, experienceId) {
269
+ async function retrieveRelevantExperiences(experienceDir, goal, opts = {}) {
270
+ const limit = opts.limit ?? 5;
132
271
  const file = (0, path_1.join)(experienceDir, 'experiences.jsonl');
133
272
  if (!(0, fs_1.existsSync)(file))
134
- return;
273
+ return [];
274
+ const tokens = tokenize(goal);
275
+ const goalLower = goal.toLowerCase();
135
276
  try {
136
277
  const content = await (0, promises_1.readFile)(file, 'utf8');
137
- const lines = content.split('\n').filter(Boolean);
138
- const updatedLines = lines.map((line) => {
278
+ const lines = content.trim().split('\n').filter(Boolean);
279
+ const scored = [];
280
+ for (const line of lines) {
139
281
  try {
140
282
  const exp = JSON.parse(line);
141
- if (exp.id === experienceId) {
142
- return JSON.stringify({
143
- ...exp,
144
- metadata: {
145
- ...exp.metadata,
146
- sessionCount: exp.metadata.sessionCount + 1,
147
- lastUsedAt: new Date().toISOString(),
148
- },
149
- });
283
+ let score = exp.metadata.successRate * 2; // 基础权重
284
+ // 标签重叠
285
+ const tagOverlap = exp.metadata.tags.filter((t) => tokens.includes(t.toLowerCase())).length;
286
+ score += tagOverlap * 3;
287
+ // 标题/内容子串命中
288
+ if (goalLower &&
289
+ (exp.title.toLowerCase().includes(goalLower) || exp.content.toLowerCase().includes(goalLower))) {
290
+ score += 2;
291
+ }
292
+ // token 命中
293
+ for (const tk of tokens) {
294
+ if (exp.content.toLowerCase().includes(tk) || exp.title.toLowerCase().includes(tk))
295
+ score += 0.5;
150
296
  }
151
- return line;
297
+ // 新鲜度衰减(约 20 天线性衰减到 0)
298
+ const ageDays = (Date.now() - new Date(exp.metadata.lastUsedAt).getTime()) / 86_400_000;
299
+ score += Math.max(0, 1.5 - ageDays / 20);
300
+ scored.push({ exp, score });
152
301
  }
153
302
  catch {
154
- return line;
303
+ // 跳过损坏记录
155
304
  }
156
- });
157
- await (0, promises_1.writeFile)(file, updatedLines.join('\n') + '\n', 'utf8');
305
+ }
306
+ scored.sort((a, b) => b.score - a.score);
307
+ return scored.slice(0, limit).map((s) => s.exp);
158
308
  }
159
309
  catch {
160
- // 静默失败
310
+ return [];
311
+ }
312
+ }
313
+ /** 更新经验使用统计(bump 被加载/使用的经验,强化其权重) */
314
+ async function updateExperienceUsage(experienceDir, experienceId) {
315
+ const file = (0, path_1.join)(experienceDir, 'experiences.jsonl');
316
+ if (!(0, fs_1.existsSync)(file))
317
+ return;
318
+ await withFileLock(file, async () => {
319
+ try {
320
+ const content = await (0, promises_1.readFile)(file, 'utf8');
321
+ const lines = content.split('\n').filter(Boolean);
322
+ const updatedLines = lines.map((line) => {
323
+ try {
324
+ const exp = JSON.parse(line);
325
+ if (exp.id === experienceId) {
326
+ return JSON.stringify({
327
+ ...exp,
328
+ metadata: {
329
+ ...exp.metadata,
330
+ sessionCount: exp.metadata.sessionCount + 1,
331
+ lastUsedAt: new Date().toISOString(),
332
+ },
333
+ });
334
+ }
335
+ return line;
336
+ }
337
+ catch {
338
+ return line;
339
+ }
340
+ });
341
+ await (0, promises_1.writeFile)(file, updatedLines.join('\n') + '\n', 'utf8');
342
+ }
343
+ catch {
344
+ // 静默失败
345
+ }
346
+ });
347
+ }
348
+ /**
349
+ * extractFixPattern:从「自愈成功」的会话中提取可复用修复经验。
350
+ * 触发条件:会话中出现「错误:」工具消息,且后续助手消息表明已修复/通过验证。
351
+ * 仅产出一条高价值经验,避免噪声;orchestrator 在 selfHealed 时调用。
352
+ */
353
+ function extractFixPattern(messages) {
354
+ let errorMsg = null;
355
+ let resolved = false;
356
+ for (const m of messages) {
357
+ if (m.role === 'tool' && (m.content || '').startsWith('错误:')) {
358
+ if (!errorMsg)
359
+ errorMsg = m.content;
360
+ }
361
+ if (m.role === 'assistant' &&
362
+ /修复|已修复|解决|resolved|fixed|通过验证|验证通过|成功/i.test(m.content || '')) {
363
+ resolved = true;
364
+ }
161
365
  }
366
+ if (!errorMsg || !resolved)
367
+ return null;
368
+ const analysis = (0, self_heal_1.classifyError)(errorMsg, errorMsg);
369
+ const category = analysis?.category ?? 'unknown';
370
+ const key = `fix-pattern:${category}`;
371
+ const now = new Date().toISOString();
372
+ return {
373
+ id: normalizeExperienceId('success-pattern', key),
374
+ type: 'success-pattern',
375
+ title: `自愈修复经验: ${category}`,
376
+ content: `历史上遇到过「${category}」类错误,通过多轮自我修复(读错误→定位根因→就地修复→重跑验证)最终解决。` +
377
+ `未来遇到同类错误应直接采用该闭环,避免重复试错。`,
378
+ metadata: {
379
+ sessionCount: 1,
380
+ successRate: 1.0,
381
+ tags: [category, 'self-heal', 'fix'],
382
+ createdAt: now,
383
+ lastUsedAt: now,
384
+ },
385
+ };
162
386
  }
163
- /** 生成经验注入的系统提示 */
387
+ /** 生成经验注入的系统提示(分组:成功模式优先、失败模式警示) */
164
388
  function generateExperiencePrompt(experiences) {
165
389
  if (experiences.length === 0)
166
390
  return '';
167
- const parts = ['📚 历史经验参考'];
168
- for (const exp of experiences) {
169
- parts.push(`\n**${exp.title}** (${exp.type}):\n${exp.content.slice(0, 300)}`);
391
+ const success = experiences.filter((e) => e.type === 'success-pattern' || e.type === 'tool-efficiency');
392
+ const errors = experiences.filter((e) => e.type === 'error-pattern');
393
+ const parts = [
394
+ '📚 历史经验参考(系统已从既往任务中强化学习,请优先参考成功经验、主动规避失败模式)',
395
+ ];
396
+ if (success.length) {
397
+ parts.push('\n## ✅ 可复用成功模式');
398
+ for (const exp of success)
399
+ parts.push(`- **${exp.title}**: ${exp.content.slice(0, 200)}`);
400
+ }
401
+ if (errors.length) {
402
+ parts.push('\n## ⚠️ 应避免的失败模式');
403
+ for (const exp of errors)
404
+ parts.push(`- **${exp.title}**: ${exp.content.slice(0, 200)}`);
170
405
  }
171
406
  return parts.join('\n');
172
407
  }
@@ -1 +1 @@
1
- {"version":3,"file":"experience.js","sourceRoot":"","sources":["../../src/agent/experience.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"experience.js","sourceRoot":"","sources":["../../src/agent/experience.ts"],"names":[],"mappings":"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"}