feihong-code 0.2.3 → 0.5.1
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/.github/FUNDING.yml +4 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +37 -37
- package/.github/ISSUE_TEMPLATE/config.yml +14 -14
- package/.github/ISSUE_TEMPLATE/feature_request.md +28 -28
- package/.github/PULL_REQUEST_TEMPLATE.md +46 -46
- package/.github/SECURITY.md +67 -67
- package/.github/dependabot.yml +16 -0
- package/.github/workflows/ci.yml +1 -1
- package/AGENT-GUIDE.md +382 -237
- package/CHANGELOG.md +405 -73
- package/CODE_OF_CONDUCT.md +56 -56
- package/CONTRIBUTING.md +68 -68
- package/LICENSE +22 -22
- package/README.md +527 -522
- package/README.self-evolve.md +274 -0
- package/dist/agent/code-review.js +2 -0
- package/dist/agent/code-review.js.map +1 -1
- package/dist/agent/code-writer.js +70 -17
- package/dist/agent/code-writer.js.map +1 -1
- package/dist/agent/context-compactor.js +13 -4
- package/dist/agent/context-compactor.js.map +1 -1
- package/dist/agent/experience.js +262 -62
- package/dist/agent/experience.js.map +1 -1
- package/dist/agent/orchestrator.js +148 -68
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/quality-gate.js +10 -4
- package/dist/agent/quality-gate.js.map +1 -1
- package/dist/agent/repo-context.js +181 -0
- package/dist/agent/repo-context.js.map +1 -0
- package/dist/agent/repo-reader.js +92 -99
- package/dist/agent/repo-reader.js.map +1 -1
- package/dist/agent/self-heal.js +38 -48
- package/dist/agent/self-heal.js.map +1 -1
- package/dist/agent/self-improver.js +65 -61
- package/dist/agent/self-improver.js.map +1 -1
- package/dist/agent/subagent-summary.js +31 -0
- package/dist/agent/subagent-summary.js.map +1 -0
- package/dist/agent/subagent.js +52 -2
- package/dist/agent/subagent.js.map +1 -1
- package/dist/agent/symbol-index.js +160 -0
- package/dist/agent/symbol-index.js.map +1 -0
- package/dist/agent/team.js +193 -0
- package/dist/agent/team.js.map +1 -0
- package/dist/cli/commands.js +124 -143
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/index.js +113 -106
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/repl.js +82 -7
- package/dist/cli/repl.js.map +1 -1
- package/dist/cli/run.js +601 -95
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/tui.js +145 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/cli/version.js +1 -1
- package/dist/enterprise/audit.js +75 -12
- package/dist/enterprise/audit.js.map +1 -1
- package/dist/enterprise/index.js +14 -11
- package/dist/enterprise/index.js.map +1 -1
- package/dist/enterprise/policy.js +22 -10
- package/dist/enterprise/policy.js.map +1 -1
- package/dist/harness/executor.js +127 -0
- package/dist/harness/executor.js.map +1 -0
- package/dist/harness/harness.js +87 -0
- package/dist/harness/harness.js.map +1 -0
- package/dist/harness/index.js +31 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/loader.js +138 -0
- package/dist/harness/loader.js.map +1 -0
- package/dist/harness/reporter.js +34 -0
- package/dist/harness/reporter.js.map +1 -0
- package/dist/harness/types.js +10 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/harness/verifier.js +48 -0
- package/dist/harness/verifier.js.map +1 -0
- package/dist/hello.js +14 -0
- package/dist/hello.js.map +1 -0
- package/dist/memory/auto-summarize.js +208 -0
- package/dist/memory/auto-summarize.js.map +1 -0
- package/dist/memory/index.js +228 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/models/model-router.js +23 -10
- package/dist/models/model-router.js.map +1 -1
- package/dist/plugins/plugin-loader.js +179 -0
- package/dist/plugins/plugin-loader.js.map +1 -0
- package/dist/runtime/event-log.js.map +1 -1
- package/dist/runtime/hooks.js +80 -0
- package/dist/runtime/hooks.js.map +1 -0
- package/dist/self-evolve/hook.js +60 -0
- package/dist/self-evolve/hook.js.map +1 -0
- package/dist/shared/config.js +35 -3
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/i18n.js +535 -0
- package/dist/shared/i18n.js.map +1 -0
- package/dist/skills/grill.js +2 -1
- package/dist/skills/grill.js.map +1 -1
- package/dist/skills/self-heal.js +73 -0
- package/dist/skills/self-heal.js.map +1 -0
- package/dist/skills/skill-loader.js +131 -0
- package/dist/skills/skill-loader.js.map +1 -0
- package/dist/skills/skill-market.js +195 -0
- package/dist/skills/skill-market.js.map +1 -0
- package/dist/tools/analysis/code-analyzer.js +45 -18
- package/dist/tools/analysis/code-analyzer.js.map +1 -1
- package/dist/tools/index.js +5 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/mcp/index.js +84 -0
- package/dist/tools/mcp/index.js.map +1 -0
- package/dist/tools/mcp/mcp-client.js +172 -0
- package/dist/tools/mcp/mcp-client.js.map +1 -0
- package/dist/tools/sandbox.js +126 -0
- package/dist/tools/sandbox.js.map +1 -0
- package/dist/tools/shell/exec.js +25 -0
- package/dist/tools/shell/exec.js.map +1 -1
- package/dist/tools/shell/run-shell.tool.js +4 -1
- package/dist/tools/shell/run-shell.tool.js.map +1 -1
- package/dist/tools/skills/load-skill.tool.js +36 -0
- package/dist/tools/skills/load-skill.tool.js.map +1 -0
- package/dist/tools/tool.interface.js.map +1 -1
- package/dist/tools/tool.registry.js +37 -1
- package/dist/tools/tool.registry.js.map +1 -1
- package/dist/tools/web/web.tool.js +139 -0
- package/dist/tools/web/web.tool.js.map +1 -0
- package/dist/web/auth.js +42 -3
- package/dist/web/auth.js.map +1 -1
- package/dist/web/channels.js +171 -0
- package/dist/web/channels.js.map +1 -0
- package/dist/web/public/index.html +3253 -39
- package/dist/web/public/index.html.tmp +3117 -0
- package/dist/web/public/index_new.html +3196 -0
- package/dist/web/server.js +790 -11
- package/dist/web/server.js.map +1 -1
- package/dist/web/task-queue.js +352 -0
- package/dist/web/task-queue.js.map +1 -0
- package/dist/web/web-config.js +143 -0
- package/dist/web/web-config.js.map +1 -0
- package/docs/Deployment_Guide_EN.md +288 -0
- package/docs/Technical_Manual_EN.md +216 -0
- package/docs/User_Manual_EN.md +314 -0
- package/docs/self-evolve-implementation.md +165 -0
- package/docs/self-evolve.md +166 -0
- package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -614
- 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
- package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +318 -358
- 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
- package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +216 -303
- package/docs//346/236/266/346/236/204/344/270/216API.md +238 -238
- package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -196
- package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -165
- package/docs//351/203/250/347/275/262/350/257/264/346/230/216/344/271/246.md +288 -0
- package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -127
- package/package.json +114 -109
- package/tool-schema.json +127 -127
package/dist/agent/experience.js
CHANGED
|
@@ -1,29 +1,105 @@
|
|
|
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
|
-
*
|
|
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
|
+
/** 稳定短哈希(用于经验去重 id) */
|
|
30
|
+
function shortHash(s) {
|
|
31
|
+
let h = 5381;
|
|
32
|
+
for (let i = 0; i < s.length; i++)
|
|
33
|
+
h = ((h << 5) + h + s.charCodeAt(i)) | 0;
|
|
34
|
+
return (h >>> 0).toString(36);
|
|
35
|
+
}
|
|
36
|
+
/** 由类型 + 归一化键生成稳定 id(跨 run 一致,支撑去重与 usage 追踪) */
|
|
37
|
+
function normalizeExperienceId(type, key) {
|
|
38
|
+
return `exp-${shortHash(`${type}:${key}`)}`;
|
|
39
|
+
}
|
|
40
|
+
const EXTRACTORS = [
|
|
41
|
+
{
|
|
42
|
+
// 经验 1: 高效工具调用模式(成功序列)
|
|
43
|
+
key: 'tool-efficiency',
|
|
44
|
+
extract: ({ toolCalls, mkMeta }) => {
|
|
45
|
+
if (toolCalls.length < 3)
|
|
46
|
+
return null;
|
|
47
|
+
const successfulCalls = toolCalls.filter((tc) => tc.success);
|
|
48
|
+
if (successfulCalls.length < 2)
|
|
49
|
+
return null;
|
|
50
|
+
const pattern = successfulCalls.map((tc) => tc.name).join(' → ');
|
|
51
|
+
return {
|
|
52
|
+
id: normalizeExperienceId('tool-efficiency', pattern),
|
|
53
|
+
type: 'tool-efficiency',
|
|
54
|
+
title: `成功工具序列: ${pattern}`,
|
|
55
|
+
content: `在本次任务中,以下工具调用序列成功完成目标:\n${pattern}\n\n建议未来类似任务优先复用此序列,可减少试错轮次。`,
|
|
56
|
+
metadata: mkMeta(successfulCalls.length / toolCalls.length, successfulCalls.map((tc) => tc.name)),
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
// 经验 2: 错误模式与规避(用 classifyError 精确归类)
|
|
62
|
+
key: 'error-pattern',
|
|
63
|
+
extract: ({ errors, mkMeta }) => {
|
|
64
|
+
if (errors.length === 0)
|
|
65
|
+
return null;
|
|
66
|
+
const categories = new Set();
|
|
67
|
+
for (const e of errors) {
|
|
68
|
+
const analysis = (0, self_heal_1.classifyError)(e.content || '', e.content || '');
|
|
69
|
+
categories.add(analysis?.category ?? 'unknown');
|
|
70
|
+
}
|
|
71
|
+
const uniqueErrors = [...categories];
|
|
72
|
+
return {
|
|
73
|
+
id: normalizeExperienceId('error-pattern', uniqueErrors.join(',')),
|
|
74
|
+
type: 'error-pattern',
|
|
75
|
+
title: `常见错误模式: ${uniqueErrors.join(', ')}`,
|
|
76
|
+
content: `本次任务遇到以下错误类型:\n${uniqueErrors.map((e) => `- ${e}`).join('\n')}\n\n规避建议: 提前校验前置条件(路径/权限/依赖),增加超时重试与最小改动原则,避免同类错误重复发生。`,
|
|
77
|
+
metadata: mkMeta(0, uniqueErrors),
|
|
78
|
+
};
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
// 经验 3: 干净成功模式(无错误且工具调用高效)
|
|
83
|
+
key: 'clean-success',
|
|
84
|
+
extract: ({ toolCalls, errors, mkMeta }) => {
|
|
85
|
+
if (errors.length > 0)
|
|
86
|
+
return null;
|
|
87
|
+
if (toolCalls.filter((tc) => tc.success).length < 2)
|
|
88
|
+
return null;
|
|
89
|
+
return {
|
|
90
|
+
id: normalizeExperienceId('success-pattern', 'clean-run'),
|
|
91
|
+
type: 'success-pattern',
|
|
92
|
+
title: '干净高效执行(无错误通过)',
|
|
93
|
+
content: '本次任务在较少轮次内一次性通过,说明目标拆解与工具使用策略有效。未来可优先沿用「先勘察→小步编辑→就地验证」的节奏。',
|
|
94
|
+
metadata: mkMeta(1.0, ['clean-run', 'efficiency']),
|
|
95
|
+
};
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
];
|
|
23
99
|
function extractExperience(messages, runId) {
|
|
24
100
|
const experiences = [];
|
|
25
101
|
const toolCalls = [];
|
|
26
|
-
//
|
|
102
|
+
// 提取工具调用序列及成败
|
|
27
103
|
for (const msg of messages) {
|
|
28
104
|
if (msg.role === 'assistant' && msg.toolCalls) {
|
|
29
105
|
for (const tc of msg.toolCalls) {
|
|
@@ -37,64 +113,96 @@ function extractExperience(messages, runId) {
|
|
|
37
113
|
}
|
|
38
114
|
}
|
|
39
115
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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: 错误模式与规避
|
|
116
|
+
const now = new Date().toISOString();
|
|
117
|
+
const mkMeta = (successRate, tags) => ({
|
|
118
|
+
sessionCount: 1,
|
|
119
|
+
successRate,
|
|
120
|
+
tags,
|
|
121
|
+
createdAt: now,
|
|
122
|
+
lastUsedAt: now,
|
|
123
|
+
});
|
|
61
124
|
const errors = messages.filter((m) => m.role === 'tool' && (m.content || '').startsWith('错误:'));
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
});
|
|
125
|
+
const ctx = { toolCalls, errors, mkMeta, now };
|
|
126
|
+
// 表驱动:依次运行提取器,命中的经验入列(行为与原三段 if 完全一致)
|
|
127
|
+
for (const ex of EXTRACTORS) {
|
|
128
|
+
const exp = ex.extract(ctx);
|
|
129
|
+
if (exp)
|
|
130
|
+
experiences.push(exp);
|
|
87
131
|
}
|
|
132
|
+
// runId 仅用于审计留痕,不影响稳定 id
|
|
133
|
+
void runId;
|
|
88
134
|
return experiences;
|
|
89
135
|
}
|
|
90
|
-
/**
|
|
136
|
+
/** 追加保存一条经验(新建场景) */
|
|
91
137
|
async function saveExperience(experienceDir, experience) {
|
|
92
138
|
await (0, promises_1.mkdir)(experienceDir, { recursive: true });
|
|
93
139
|
const file = (0, path_1.join)(experienceDir, 'experiences.jsonl');
|
|
94
140
|
await (0, promises_1.appendFile)(file, JSON.stringify(experience) + '\n', 'utf8');
|
|
95
141
|
logger_1.logger.info('experience saved', { id: experience.id, type: experience.type });
|
|
96
142
|
}
|
|
97
|
-
/**
|
|
143
|
+
/**
|
|
144
|
+
* upsertExperience:强化学习式合并写入。
|
|
145
|
+
* - 若同 id 经验已存在:sessionCount+1、成功率按次数加权平均、标签合并、刷新 lastUsedAt
|
|
146
|
+
* - 否则新增
|
|
147
|
+
* 这样同一模式被多次验证会「越用越可信」,且不会无限膨胀出重复记录。
|
|
148
|
+
*/
|
|
149
|
+
async function upsertExperience(experienceDir, experience) {
|
|
150
|
+
const file = (0, path_1.join)(experienceDir, 'experiences.jsonl');
|
|
151
|
+
if (!(0, fs_1.existsSync)(file)) {
|
|
152
|
+
await saveExperience(experienceDir, experience);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
const content = await (0, promises_1.readFile)(file, 'utf8');
|
|
157
|
+
const lines = content.split('\n').filter(Boolean);
|
|
158
|
+
let merged = false;
|
|
159
|
+
const out = [];
|
|
160
|
+
for (const line of lines) {
|
|
161
|
+
try {
|
|
162
|
+
const e = JSON.parse(line);
|
|
163
|
+
if (e.id === experience.id) {
|
|
164
|
+
const prev = e.metadata.sessionCount;
|
|
165
|
+
const mergedExp = {
|
|
166
|
+
...e,
|
|
167
|
+
content: experience.content.length >= e.content.length ? experience.content : e.content,
|
|
168
|
+
metadata: {
|
|
169
|
+
sessionCount: prev + 1,
|
|
170
|
+
successRate: (e.metadata.successRate * prev + experience.metadata.successRate) / (prev + 1),
|
|
171
|
+
tags: [...new Set([...e.metadata.tags, ...experience.metadata.tags])],
|
|
172
|
+
createdAt: e.metadata.createdAt,
|
|
173
|
+
lastUsedAt: new Date().toISOString(),
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
out.push(JSON.stringify(mergedExp));
|
|
177
|
+
merged = true;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
out.push(line);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
out.push(line);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (!merged)
|
|
188
|
+
out.push(JSON.stringify(experience));
|
|
189
|
+
await (0, promises_1.writeFile)(file, out.join('\n') + '\n', 'utf8');
|
|
190
|
+
logger_1.logger.info('experience upserted', { id: experience.id, merged, type: experience.type });
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
await saveExperience(experienceDir, experience);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/** 关键词分词的轻量实现(用于检索打分) */
|
|
197
|
+
function tokenize(s) {
|
|
198
|
+
return s
|
|
199
|
+
.toLowerCase()
|
|
200
|
+
.replace(/[^\p{L}\p{N}\s]/gu, ' ')
|
|
201
|
+
.split(/\s+/)
|
|
202
|
+
.filter((w) => w.length >= 3)
|
|
203
|
+
.map((w) => w.replace(/[es]$/, ''));
|
|
204
|
+
}
|
|
205
|
+
/** 加载相关经验(基于任务关键词,兼容旧路径) */
|
|
98
206
|
async function loadExperiences(experienceDir, keywords) {
|
|
99
207
|
const file = (0, path_1.join)(experienceDir, 'experiences.jsonl');
|
|
100
208
|
if (!(0, fs_1.existsSync)(file))
|
|
@@ -106,13 +214,11 @@ async function loadExperiences(experienceDir, keywords) {
|
|
|
106
214
|
for (const line of lines) {
|
|
107
215
|
try {
|
|
108
216
|
const exp = JSON.parse(line);
|
|
109
|
-
// 匹配关键词
|
|
110
217
|
const matched = keywords.some((kw) => exp.title.includes(kw) ||
|
|
111
218
|
exp.content.includes(kw) ||
|
|
112
219
|
exp.metadata.tags.some((tag) => tag.includes(kw)));
|
|
113
|
-
if (matched)
|
|
220
|
+
if (matched)
|
|
114
221
|
experiences.push(exp);
|
|
115
|
-
}
|
|
116
222
|
}
|
|
117
223
|
catch {
|
|
118
224
|
// 跳过损坏的经验记录
|
|
@@ -127,7 +233,51 @@ async function loadExperiences(experienceDir, keywords) {
|
|
|
127
233
|
return [];
|
|
128
234
|
}
|
|
129
235
|
}
|
|
130
|
-
|
|
236
|
+
async function retrieveRelevantExperiences(experienceDir, goal, opts = {}) {
|
|
237
|
+
const limit = opts.limit ?? 5;
|
|
238
|
+
const file = (0, path_1.join)(experienceDir, 'experiences.jsonl');
|
|
239
|
+
if (!(0, fs_1.existsSync)(file))
|
|
240
|
+
return [];
|
|
241
|
+
const tokens = tokenize(goal);
|
|
242
|
+
const goalLower = goal.toLowerCase();
|
|
243
|
+
try {
|
|
244
|
+
const content = await (0, promises_1.readFile)(file, 'utf8');
|
|
245
|
+
const lines = content.trim().split('\n').filter(Boolean);
|
|
246
|
+
const scored = [];
|
|
247
|
+
for (const line of lines) {
|
|
248
|
+
try {
|
|
249
|
+
const exp = JSON.parse(line);
|
|
250
|
+
let score = exp.metadata.successRate * 2; // 基础权重
|
|
251
|
+
// 标签重叠
|
|
252
|
+
const tagOverlap = exp.metadata.tags.filter((t) => tokens.includes(t.toLowerCase())).length;
|
|
253
|
+
score += tagOverlap * 3;
|
|
254
|
+
// 标题/内容子串命中
|
|
255
|
+
if (goalLower &&
|
|
256
|
+
(exp.title.toLowerCase().includes(goalLower) || exp.content.toLowerCase().includes(goalLower))) {
|
|
257
|
+
score += 2;
|
|
258
|
+
}
|
|
259
|
+
// token 命中
|
|
260
|
+
for (const tk of tokens) {
|
|
261
|
+
if (exp.content.toLowerCase().includes(tk) || exp.title.toLowerCase().includes(tk))
|
|
262
|
+
score += 0.5;
|
|
263
|
+
}
|
|
264
|
+
// 新鲜度衰减(约 20 天线性衰减到 0)
|
|
265
|
+
const ageDays = (Date.now() - new Date(exp.metadata.lastUsedAt).getTime()) / 86_400_000;
|
|
266
|
+
score += Math.max(0, 1.5 - ageDays / 20);
|
|
267
|
+
scored.push({ exp, score });
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
// 跳过损坏记录
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
scored.sort((a, b) => b.score - a.score);
|
|
274
|
+
return scored.slice(0, limit).map((s) => s.exp);
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
return [];
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/** 更新经验使用统计(bump 被加载/使用的经验,强化其权重) */
|
|
131
281
|
async function updateExperienceUsage(experienceDir, experienceId) {
|
|
132
282
|
const file = (0, path_1.join)(experienceDir, 'experiences.jsonl');
|
|
133
283
|
if (!(0, fs_1.existsSync)(file))
|
|
@@ -160,13 +310,63 @@ async function updateExperienceUsage(experienceDir, experienceId) {
|
|
|
160
310
|
// 静默失败
|
|
161
311
|
}
|
|
162
312
|
}
|
|
163
|
-
/**
|
|
313
|
+
/**
|
|
314
|
+
* extractFixPattern:从「自愈成功」的会话中提取可复用修复经验。
|
|
315
|
+
* 触发条件:会话中出现「错误:」工具消息,且后续助手消息表明已修复/通过验证。
|
|
316
|
+
* 仅产出一条高价值经验,避免噪声;orchestrator 在 selfHealed 时调用。
|
|
317
|
+
*/
|
|
318
|
+
function extractFixPattern(messages) {
|
|
319
|
+
let errorMsg = null;
|
|
320
|
+
let resolved = false;
|
|
321
|
+
for (const m of messages) {
|
|
322
|
+
if (m.role === 'tool' && (m.content || '').startsWith('错误:')) {
|
|
323
|
+
if (!errorMsg)
|
|
324
|
+
errorMsg = m.content;
|
|
325
|
+
}
|
|
326
|
+
if (m.role === 'assistant' &&
|
|
327
|
+
/修复|已修复|解决|resolved|fixed|通过验证|验证通过|成功/i.test(m.content || '')) {
|
|
328
|
+
resolved = true;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
if (!errorMsg || !resolved)
|
|
332
|
+
return null;
|
|
333
|
+
const analysis = (0, self_heal_1.classifyError)(errorMsg, errorMsg);
|
|
334
|
+
const category = analysis?.category ?? 'unknown';
|
|
335
|
+
const key = `fix-pattern:${category}`;
|
|
336
|
+
const now = new Date().toISOString();
|
|
337
|
+
return {
|
|
338
|
+
id: normalizeExperienceId('success-pattern', key),
|
|
339
|
+
type: 'success-pattern',
|
|
340
|
+
title: `自愈修复经验: ${category}`,
|
|
341
|
+
content: `历史上遇到过「${category}」类错误,通过多轮自我修复(读错误→定位根因→就地修复→重跑验证)最终解决。` +
|
|
342
|
+
`未来遇到同类错误应直接采用该闭环,避免重复试错。`,
|
|
343
|
+
metadata: {
|
|
344
|
+
sessionCount: 1,
|
|
345
|
+
successRate: 1.0,
|
|
346
|
+
tags: [category, 'self-heal', 'fix'],
|
|
347
|
+
createdAt: now,
|
|
348
|
+
lastUsedAt: now,
|
|
349
|
+
},
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
/** 生成经验注入的系统提示(分组:成功模式优先、失败模式警示) */
|
|
164
353
|
function generateExperiencePrompt(experiences) {
|
|
165
354
|
if (experiences.length === 0)
|
|
166
355
|
return '';
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
|
|
356
|
+
const success = experiences.filter((e) => e.type === 'success-pattern' || e.type === 'tool-efficiency');
|
|
357
|
+
const errors = experiences.filter((e) => e.type === 'error-pattern');
|
|
358
|
+
const parts = [
|
|
359
|
+
'📚 历史经验参考(系统已从既往任务中强化学习,请优先参考成功经验、主动规避失败模式)',
|
|
360
|
+
];
|
|
361
|
+
if (success.length) {
|
|
362
|
+
parts.push('\n## ✅ 可复用成功模式');
|
|
363
|
+
for (const exp of success)
|
|
364
|
+
parts.push(`- **${exp.title}**: ${exp.content.slice(0, 200)}`);
|
|
365
|
+
}
|
|
366
|
+
if (errors.length) {
|
|
367
|
+
parts.push('\n## ⚠️ 应避免的失败模式');
|
|
368
|
+
for (const exp of errors)
|
|
369
|
+
parts.push(`- **${exp.title}**: ${exp.content.slice(0, 200)}`);
|
|
170
370
|
}
|
|
171
371
|
return parts.join('\n');
|
|
172
372
|
}
|
|
@@ -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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"}
|