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.
Files changed (152) 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 +405 -73
  11. package/CODE_OF_CONDUCT.md +56 -56
  12. package/CONTRIBUTING.md +68 -68
  13. package/LICENSE +22 -22
  14. package/README.md +527 -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 +70 -17
  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 +262 -62
  23. package/dist/agent/experience.js.map +1 -1
  24. package/dist/agent/orchestrator.js +148 -68
  25. package/dist/agent/orchestrator.js.map +1 -1
  26. package/dist/agent/quality-gate.js +10 -4
  27. package/dist/agent/quality-gate.js.map +1 -1
  28. package/dist/agent/repo-context.js +181 -0
  29. package/dist/agent/repo-context.js.map +1 -0
  30. package/dist/agent/repo-reader.js +92 -99
  31. package/dist/agent/repo-reader.js.map +1 -1
  32. package/dist/agent/self-heal.js +38 -48
  33. package/dist/agent/self-heal.js.map +1 -1
  34. package/dist/agent/self-improver.js +65 -61
  35. package/dist/agent/self-improver.js.map +1 -1
  36. package/dist/agent/subagent-summary.js +31 -0
  37. package/dist/agent/subagent-summary.js.map +1 -0
  38. package/dist/agent/subagent.js +52 -2
  39. package/dist/agent/subagent.js.map +1 -1
  40. package/dist/agent/symbol-index.js +160 -0
  41. package/dist/agent/symbol-index.js.map +1 -0
  42. package/dist/agent/team.js +193 -0
  43. package/dist/agent/team.js.map +1 -0
  44. package/dist/cli/commands.js +124 -143
  45. package/dist/cli/commands.js.map +1 -1
  46. package/dist/cli/index.js +113 -106
  47. package/dist/cli/index.js.map +1 -1
  48. package/dist/cli/repl.js +82 -7
  49. package/dist/cli/repl.js.map +1 -1
  50. package/dist/cli/run.js +601 -95
  51. package/dist/cli/run.js.map +1 -1
  52. package/dist/cli/tui.js +145 -0
  53. package/dist/cli/tui.js.map +1 -0
  54. package/dist/cli/version.js +1 -1
  55. package/dist/enterprise/audit.js +75 -12
  56. package/dist/enterprise/audit.js.map +1 -1
  57. package/dist/enterprise/index.js +14 -11
  58. package/dist/enterprise/index.js.map +1 -1
  59. package/dist/enterprise/policy.js +22 -10
  60. package/dist/enterprise/policy.js.map +1 -1
  61. package/dist/harness/executor.js +127 -0
  62. package/dist/harness/executor.js.map +1 -0
  63. package/dist/harness/harness.js +87 -0
  64. package/dist/harness/harness.js.map +1 -0
  65. package/dist/harness/index.js +31 -0
  66. package/dist/harness/index.js.map +1 -0
  67. package/dist/harness/loader.js +138 -0
  68. package/dist/harness/loader.js.map +1 -0
  69. package/dist/harness/reporter.js +34 -0
  70. package/dist/harness/reporter.js.map +1 -0
  71. package/dist/harness/types.js +10 -0
  72. package/dist/harness/types.js.map +1 -0
  73. package/dist/harness/verifier.js +48 -0
  74. package/dist/harness/verifier.js.map +1 -0
  75. package/dist/hello.js +14 -0
  76. package/dist/hello.js.map +1 -0
  77. package/dist/memory/auto-summarize.js +208 -0
  78. package/dist/memory/auto-summarize.js.map +1 -0
  79. package/dist/memory/index.js +228 -0
  80. package/dist/memory/index.js.map +1 -0
  81. package/dist/models/model-router.js +23 -10
  82. package/dist/models/model-router.js.map +1 -1
  83. package/dist/plugins/plugin-loader.js +179 -0
  84. package/dist/plugins/plugin-loader.js.map +1 -0
  85. package/dist/runtime/event-log.js.map +1 -1
  86. package/dist/runtime/hooks.js +80 -0
  87. package/dist/runtime/hooks.js.map +1 -0
  88. package/dist/self-evolve/hook.js +60 -0
  89. package/dist/self-evolve/hook.js.map +1 -0
  90. package/dist/shared/config.js +35 -3
  91. package/dist/shared/config.js.map +1 -1
  92. package/dist/shared/i18n.js +535 -0
  93. package/dist/shared/i18n.js.map +1 -0
  94. package/dist/skills/grill.js +2 -1
  95. package/dist/skills/grill.js.map +1 -1
  96. package/dist/skills/self-heal.js +73 -0
  97. package/dist/skills/self-heal.js.map +1 -0
  98. package/dist/skills/skill-loader.js +131 -0
  99. package/dist/skills/skill-loader.js.map +1 -0
  100. package/dist/skills/skill-market.js +195 -0
  101. package/dist/skills/skill-market.js.map +1 -0
  102. package/dist/tools/analysis/code-analyzer.js +45 -18
  103. package/dist/tools/analysis/code-analyzer.js.map +1 -1
  104. package/dist/tools/index.js +5 -0
  105. package/dist/tools/index.js.map +1 -1
  106. package/dist/tools/mcp/index.js +84 -0
  107. package/dist/tools/mcp/index.js.map +1 -0
  108. package/dist/tools/mcp/mcp-client.js +172 -0
  109. package/dist/tools/mcp/mcp-client.js.map +1 -0
  110. package/dist/tools/sandbox.js +126 -0
  111. package/dist/tools/sandbox.js.map +1 -0
  112. package/dist/tools/shell/exec.js +25 -0
  113. package/dist/tools/shell/exec.js.map +1 -1
  114. package/dist/tools/shell/run-shell.tool.js +4 -1
  115. package/dist/tools/shell/run-shell.tool.js.map +1 -1
  116. package/dist/tools/skills/load-skill.tool.js +36 -0
  117. package/dist/tools/skills/load-skill.tool.js.map +1 -0
  118. package/dist/tools/tool.interface.js.map +1 -1
  119. package/dist/tools/tool.registry.js +37 -1
  120. package/dist/tools/tool.registry.js.map +1 -1
  121. package/dist/tools/web/web.tool.js +139 -0
  122. package/dist/tools/web/web.tool.js.map +1 -0
  123. package/dist/web/auth.js +42 -3
  124. package/dist/web/auth.js.map +1 -1
  125. package/dist/web/channels.js +171 -0
  126. package/dist/web/channels.js.map +1 -0
  127. package/dist/web/public/index.html +3253 -39
  128. package/dist/web/public/index.html.tmp +3117 -0
  129. package/dist/web/public/index_new.html +3196 -0
  130. package/dist/web/server.js +790 -11
  131. package/dist/web/server.js.map +1 -1
  132. package/dist/web/task-queue.js +352 -0
  133. package/dist/web/task-queue.js.map +1 -0
  134. package/dist/web/web-config.js +143 -0
  135. package/dist/web/web-config.js.map +1 -0
  136. package/docs/Deployment_Guide_EN.md +288 -0
  137. package/docs/Technical_Manual_EN.md +216 -0
  138. package/docs/User_Manual_EN.md +314 -0
  139. package/docs/self-evolve-implementation.md +165 -0
  140. package/docs/self-evolve.md +166 -0
  141. package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -614
  142. 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
  143. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +318 -358
  144. 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
  145. package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +216 -303
  146. package/docs//346/236/266/346/236/204/344/270/216API.md +238 -238
  147. package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -196
  148. package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -165
  149. package/docs//351/203/250/347/275/262/350/257/264/346/230/216/344/271/246.md +288 -0
  150. package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -127
  151. package/package.json +114 -109
  152. package/tool-schema.json +127 -127
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ /**
3
+ * 飞虹 Code - 自动记忆总结
4
+ * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
5
+ *
6
+ * 功能:
7
+ * - 每天 00:00 自动触发记忆总结
8
+ * - 读取当天短期记忆,调用 AI 模型生成总结
9
+ * - 更新长期记忆文件
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.getSummaryHistory = getSummaryHistory;
13
+ exports.summarizeMemory = summarizeMemory;
14
+ exports.scheduleDailySummary = scheduleDailySummary;
15
+ exports.runImmediateSummary = runImmediateSummary;
16
+ const child_process_1 = require("child_process");
17
+ const fs_1 = require("fs");
18
+ const path_1 = require("path");
19
+ const index_1 = require("./index");
20
+ const SUMMARY_HISTORY_FILE = 'summarize-history.json';
21
+ /**
22
+ * 保存总结历史
23
+ */
24
+ function saveSummaryHistory(config, history) {
25
+ const historyFile = (0, path_1.join)(config.shortTermDir, SUMMARY_HISTORY_FILE);
26
+ let historyList = [];
27
+ if ((0, fs_1.existsSync)(historyFile)) {
28
+ try {
29
+ historyList = JSON.parse((0, fs_1.readFileSync)(historyFile, 'utf-8'));
30
+ }
31
+ catch {
32
+ historyList = [];
33
+ }
34
+ }
35
+ historyList.unshift(history);
36
+ // 只保留最近 90 天
37
+ const cutoff = new Date();
38
+ cutoff.setDate(cutoff.getDate() - 90);
39
+ historyList = historyList.filter(h => new Date(h.timestamp) > cutoff);
40
+ (0, fs_1.writeFileSync)(historyFile, JSON.stringify(historyList, null, 2), 'utf-8');
41
+ }
42
+ /**
43
+ * 获取总结历史
44
+ */
45
+ function getSummaryHistory(config, _limit = 30) {
46
+ const historyFile = (0, path_1.join)(config.shortTermDir, SUMMARY_HISTORY_FILE);
47
+ if (!(0, fs_1.existsSync)(historyFile))
48
+ return [];
49
+ try {
50
+ return JSON.parse((0, fs_1.readFileSync)(historyFile, 'utf-8'));
51
+ }
52
+ catch {
53
+ return [];
54
+ }
55
+ }
56
+ /**
57
+ * 调用本地 AI 模型进行总结
58
+ * 使用 fhcode CLI 直接调用
59
+ */
60
+ async function summarizeWithAI(prompt) {
61
+ // 使用默认的 agnes-2.5-pro 模型
62
+ const modelCmd = `echo '${prompt.replace(/'/g, "'\"'\"'")}' | node dist/cli/index.js --model agnes-2.5-pro`;
63
+ try {
64
+ const result = (0, child_process_1.execSync)(modelCmd, {
65
+ encoding: 'utf-8',
66
+ timeout: 60000,
67
+ cwd: (0, path_1.join)(process.cwd(), '..'),
68
+ });
69
+ return result.trim();
70
+ }
71
+ catch (e) {
72
+ // 如果 CLI 失败,返回原始内容标记为需要手动处理
73
+ return `[AI调用失败] ${e.message}\n\n请手动总结以下内容:\n${prompt}`;
74
+ }
75
+ }
76
+ /**
77
+ * 解析 AI 输出为结构化摘要
78
+ */
79
+ function parseSummaryOutput(output) {
80
+ const addedNotes = (output.match(/### 新增条目/g) || []).length;
81
+ const updatedNotes = (output.match(/### 更新条目/g) || []).length;
82
+ // 简单解析:按 ### 分割
83
+ const sections = output.split(/###\s+/).filter(s => s.trim());
84
+ const newEntries = [];
85
+ for (const section of sections) {
86
+ const lines = section.trim().split('\n').filter(l => l.trim());
87
+ if (lines.length > 0) {
88
+ const category = lines[0].replace(/^[\*\-#]+\s*/, '').trim();
89
+ const content = lines.slice(1).join('\n').trim();
90
+ if (content.length > 10) {
91
+ newEntries.push({ category, content });
92
+ }
93
+ }
94
+ }
95
+ return { addedNotes, updatedNotes, newEntries };
96
+ }
97
+ /**
98
+ * 执行记忆总结
99
+ */
100
+ async function summarizeMemory(config, forceDate) {
101
+ const cfg = (0, index_1.getMemoryConfig)(config);
102
+ const date = forceDate || new Date().toISOString().split('T')[0];
103
+ try {
104
+ // 读取当天短期记忆
105
+ const shortTerm = (0, index_1.readShortTerm)(cfg, new Date(date));
106
+ if (!shortTerm || shortTerm.trim().length === 0) {
107
+ return {
108
+ success: true,
109
+ date,
110
+ addedNotes: 0,
111
+ updatedNotes: 0,
112
+ summary: '今日无记录',
113
+ };
114
+ }
115
+ // 生成总结提示词
116
+ const prompt = (0, index_1.generateSummaryPrompt)(cfg, date);
117
+ // 调用 AI 模型总结(这里使用占位实现,实际需要接入 LLM API)
118
+ // 由于 Web 环境限制,我们先使用规则总结
119
+ const aiOutput = await summarizeWithAI(prompt);
120
+ parseSummaryOutput(aiOutput);
121
+ // 提取关键信息(简化版:直接提取带 **的条目)
122
+ const lines = shortTerm.split('\n').filter(l => l.trim().startsWith('- **'));
123
+ let added = 0;
124
+ let updated = 0;
125
+ for (const line of lines) {
126
+ const match = line.match(/- \*\*(.+?)\*\*:\s*(.+)/);
127
+ if (match) {
128
+ const category = match[1].trim();
129
+ const content = match[2].trim();
130
+ if (content.length > 5) {
131
+ (0, index_1.appendLongTerm)(cfg, {
132
+ title: category,
133
+ summarizedFrom: date,
134
+ category: '技术修复',
135
+ content,
136
+ });
137
+ added++;
138
+ }
139
+ }
140
+ }
141
+ // 保存总结历史
142
+ saveSummaryHistory(cfg, {
143
+ date,
144
+ timestamp: new Date().toISOString(),
145
+ addedNotes: added,
146
+ updatedNotes: updated,
147
+ success: true,
148
+ });
149
+ return {
150
+ success: true,
151
+ date,
152
+ addedNotes: added,
153
+ updatedNotes: updated,
154
+ summary: `成功总结 ${added} 条记录`,
155
+ };
156
+ }
157
+ catch (e) {
158
+ // 保存失败记录
159
+ saveSummaryHistory(cfg, {
160
+ date,
161
+ timestamp: new Date().toISOString(),
162
+ addedNotes: 0,
163
+ updatedNotes: 0,
164
+ success: false,
165
+ error: e.message,
166
+ });
167
+ return {
168
+ success: false,
169
+ date,
170
+ addedNotes: 0,
171
+ updatedNotes: 0,
172
+ error: e.message,
173
+ };
174
+ }
175
+ }
176
+ /**
177
+ * 注册定时任务(每天 00:00 执行)
178
+ */
179
+ function scheduleDailySummary(config) {
180
+ const cfg = (0, index_1.getMemoryConfig)(config);
181
+ // 计算到明天 00:00 的毫秒数
182
+ const now = new Date();
183
+ const tomorrow = new Date(now);
184
+ tomorrow.setUTCDate(tomorrow.getUTCDate() + 1);
185
+ tomorrow.setUTCHours(0, 0, 0, 0);
186
+ const msUntilMidnight = tomorrow.getTime() - now.getTime();
187
+ // 设置定时器
188
+ setTimeout(async () => {
189
+ console.log('[记忆总结] 开始每日总结...');
190
+ const result = await summarizeMemory(cfg);
191
+ console.log(`[记忆总结] ${result.date}: ${result.summary || result.error}`);
192
+ // 每分钟检查一次,确保每天执行
193
+ setInterval(async () => {
194
+ const now = new Date();
195
+ if (now.getUTCHours() === 0 && now.getUTCMinutes() === 0) {
196
+ await summarizeMemory(cfg);
197
+ }
198
+ }, 60000); // 每分钟检查
199
+ }, msUntilMidnight);
200
+ console.log(`[记忆总结] 将在 ${msUntilMidnight / 1000 / 60} 分钟后执行首次总结`);
201
+ }
202
+ /**
203
+ * 立即执行一次总结(用于测试或手动触发)
204
+ */
205
+ async function runImmediateSummary(config) {
206
+ return summarizeMemory(config);
207
+ }
208
+ //# sourceMappingURL=auto-summarize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-summarize.js","sourceRoot":"","sources":["../../src/memory/auto-summarize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,228 @@
1
+ "use strict";
2
+ /**
3
+ * 飞虹 Code - 记忆管理系统
4
+ * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
5
+ *
6
+ * 记忆系统:
7
+ * - 短期记忆:每日工作日志,追加写入
8
+ * - 长期记忆:经过总结提炼的知识点,滚动更新
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.getMemoryConfig = getMemoryConfig;
12
+ exports.getShortTermPath = getShortTermPath;
13
+ exports.appendShortTerm = appendShortTerm;
14
+ exports.readShortTerm = readShortTerm;
15
+ exports.readAllShortTerm = readAllShortTerm;
16
+ exports.readLongTerm = readLongTerm;
17
+ exports.writeLongTerm = writeLongTerm;
18
+ exports.appendLongTerm = appendLongTerm;
19
+ exports.getMemoryStats = getMemoryStats;
20
+ exports.generateSummaryPrompt = generateSummaryPrompt;
21
+ exports.cleanupShortTerm = cleanupShortTerm;
22
+ const fs_1 = require("fs");
23
+ const path_1 = require("path");
24
+ const DEFAULT_CONFIG = {
25
+ shortTermDir: (0, path_1.join)(process.env.HOME || '', '.feihong-code', 'memory'),
26
+ longTermFile: (0, path_1.join)(process.env.HOME || '', '.feihong-code', 'memory', 'MEMORY.md'),
27
+ maxHistoryDays: 30,
28
+ summarizeThreshold: 5,
29
+ };
30
+ /**
31
+ * 获取或创建记忆配置
32
+ */
33
+ function getMemoryConfig(overrides) {
34
+ return { ...DEFAULT_CONFIG, ...overrides };
35
+ }
36
+ /**
37
+ * 获取当天短期记忆文件路径
38
+ */
39
+ function getShortTermPath(config, date) {
40
+ const d = date || new Date();
41
+ const dateStr = d.toISOString().split('T')[0]; // YYYY-MM-DD
42
+ return (0, path_1.join)(config.shortTermDir, `${dateStr}.md`);
43
+ }
44
+ /**
45
+ * 确保目录存在
46
+ */
47
+ function ensureDir(config) {
48
+ (0, fs_1.mkdirSync)(config.shortTermDir, { recursive: true });
49
+ if (!(0, fs_1.existsSync)(config.longTermFile)) {
50
+ (0, fs_1.writeFileSync)(config.longTermFile, '# 长期记忆\n\n## 项目概览\n\n暂无内容。\n', 'utf-8');
51
+ }
52
+ }
53
+ /**
54
+ * 追加短期记忆条目
55
+ */
56
+ function appendShortTerm(config, entry) {
57
+ ensureDir(config);
58
+ const path = getShortTermPath(config);
59
+ const timestamp = new Date().toISOString();
60
+ const content = `
61
+ ## ${entry.title} (${timestamp.split('T')[1]?.split('.')[0] || 'unknown'})
62
+
63
+ - **类型**: ${entry.type}
64
+ - **时间**: ${timestamp}
65
+
66
+ ${entry.content}
67
+ `;
68
+ (0, fs_1.appendFileSync)(path, content, 'utf-8');
69
+ return path;
70
+ }
71
+ /**
72
+ * 读取指定日期的短期记忆
73
+ */
74
+ function readShortTerm(config, date) {
75
+ const path = getShortTermPath(config, date);
76
+ if (!(0, fs_1.existsSync)(path))
77
+ return '';
78
+ return (0, fs_1.readFileSync)(path, 'utf-8');
79
+ }
80
+ /**
81
+ * 读取所有短期记忆(最近 N 天)
82
+ */
83
+ function readAllShortTerm(config) {
84
+ ensureDir(config);
85
+ const memories = new Map();
86
+ const now = new Date();
87
+ for (let i = 0; i < config.maxHistoryDays; i++) {
88
+ const d = new Date(now);
89
+ d.setDate(d.getDate() - i);
90
+ const dateStr = d.toISOString().split('T')[0];
91
+ const path = (0, path_1.join)(config.shortTermDir, `${dateStr}.md`);
92
+ if ((0, fs_1.existsSync)(path)) {
93
+ memories.set(dateStr, (0, fs_1.readFileSync)(path, 'utf-8'));
94
+ }
95
+ }
96
+ return memories;
97
+ }
98
+ /**
99
+ * 读取长期记忆
100
+ */
101
+ function readLongTerm(config) {
102
+ ensureDir(config);
103
+ if (!(0, fs_1.existsSync)(config.longTermFile))
104
+ return '';
105
+ return (0, fs_1.readFileSync)(config.longTermFile, 'utf-8');
106
+ }
107
+ /**
108
+ * 写入长期记忆
109
+ */
110
+ function writeLongTerm(config, content) {
111
+ ensureDir(config);
112
+ (0, fs_1.writeFileSync)(config.longTermFile, content, 'utf-8');
113
+ }
114
+ /**
115
+ * 追加长期记忆条目
116
+ */
117
+ function appendLongTerm(config, note) {
118
+ ensureDir(config);
119
+ const id = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
120
+ const created = new Date().toISOString();
121
+ const content = `
122
+ ## ${note.category}: ${note.title}
123
+
124
+ - **来源**: ${note.summarizedFrom}
125
+ - **创建时间**: ${created}
126
+ - **ID**: ${id}
127
+
128
+ ${note.content}
129
+ `;
130
+ (0, fs_1.appendFileSync)(config.longTermFile, content, 'utf-8');
131
+ return id;
132
+ }
133
+ /**
134
+ * 获取记忆统计
135
+ */
136
+ function getMemoryStats(config) {
137
+ ensureDir(config);
138
+ // 统计短期记忆文件数
139
+ let shortTermFiles = 0;
140
+ if ((0, fs_1.existsSync)(config.shortTermDir)) {
141
+ const files = require('fs').readdirSync(config.shortTermDir);
142
+ shortTermFiles = files.filter((f) => f.endsWith('.md')).length;
143
+ }
144
+ // 统计长期记忆条目数
145
+ let longTermNotes = 0;
146
+ const longContent = readLongTerm(config);
147
+ longTermNotes = (longContent.match(/## /g) || []).length;
148
+ // 查找最后总结时间
149
+ let lastSummarize = null;
150
+ const match = longContent.match(/创建时间\*: (\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})/);
151
+ if (match) {
152
+ lastSummarize = match[1];
153
+ }
154
+ return {
155
+ shortTermFiles,
156
+ longTermNotes,
157
+ lastSummarize,
158
+ };
159
+ }
160
+ /**
161
+ * 生成记忆摘要模板(供 AI 总结使用)
162
+ */
163
+ function generateSummaryPrompt(config, date) {
164
+ const content = readShortTerm(config, new Date(date));
165
+ const longTerm = readLongTerm(config);
166
+ return `你是一位专业的技术记录员。请分析以下工作日志,提取关键信息并总结到长期记忆中。
167
+
168
+ ## 短期记忆 (${date})
169
+
170
+ \`\`\`
171
+ ${content || '(无记录)'}
172
+ \`\`\`
173
+
174
+ ## 现有长期记忆
175
+
176
+ \`\`\`
177
+ ${longTerm || '(无)'}
178
+ \`\`\`
179
+
180
+ ## 要求
181
+
182
+ 1. 提取今天的关键技术问题和解决方案
183
+ 2. 归纳用户偏好和习惯
184
+ 3. 记录项目进展和重要决策
185
+ 4. 如果有重复内容,合并到现有长期记忆中
186
+ 5. 保持简洁,每条记录不超过 5 行
187
+ 6. 使用 Markdown 格式
188
+
189
+ ## 输出格式
190
+
191
+ 请按以下格式输出总结(仅输出内容,不要其他说明):
192
+
193
+ ### 新增条目
194
+ (如果有新内容)
195
+
196
+ ### 更新条目
197
+ (如果有需要更新的现有内容)
198
+
199
+ ### 无变化
200
+ (如果没有需要更新的内容)
201
+ `;
202
+ }
203
+ /**
204
+ * 清理过期的短期记忆
205
+ */
206
+ function cleanupShortTerm(config) {
207
+ if (!(0, fs_1.existsSync)(config.shortTermDir))
208
+ return 0;
209
+ const now = new Date();
210
+ let deleted = 0;
211
+ const fs = require('fs');
212
+ const files = fs.readdirSync(config.shortTermDir);
213
+ for (const file of files) {
214
+ if (!file.endsWith('.md'))
215
+ continue;
216
+ const dateMatch = file.match(/^(\d{4}-\d{2}-\d{2})\.md$/);
217
+ if (!dateMatch)
218
+ continue;
219
+ const fileDate = new Date(dateMatch[1]);
220
+ const ageDays = (now.getTime() - fileDate.getTime()) / (1000 * 60 * 60 * 24);
221
+ if (ageDays > config.maxHistoryDays) {
222
+ fs.unlinkSync((0, path_1.join)(config.shortTermDir, file));
223
+ deleted++;
224
+ }
225
+ }
226
+ return deleted;
227
+ }
228
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"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"}
@@ -27,17 +27,19 @@ class ModelRouter {
27
27
  strategy;
28
28
  budget;
29
29
  statsFile;
30
+ statsHomeDir;
30
31
  statsCache = null;
31
- constructor(providers, strategy, budget, statsFile = '') {
32
+ constructor(providers, strategy, budget, statsFile = '', statsHomeDir = '') {
32
33
  this.providers = providers;
33
34
  this.strategy = strategy;
34
35
  this.budget = budget;
35
36
  this.statsFile = statsFile || DEFAULT_STATS_FILE;
37
+ this.statsHomeDir = statsHomeDir;
36
38
  }
37
- /** 从 AppConfig 构建(默认路由,联调真实模型时使用) */
39
+ /** 从 AppConfig 构建(默认路由,联调真实模型时使用);homeDir 用于统计自动落盘 */
38
40
  static fromConfig(cfg, statsFile) {
39
41
  const providers = cfg.models.providers.map((p) => p.type === 'ollama' ? new ollama_provider_1.OllamaProvider(p) : new openai_compatible_provider_1.OpenAICompatibleProvider(p));
40
- return new ModelRouter(providers, cfg.models.defaultStrategy, cfg.models.budgetPerTaskUsd, statsFile);
42
+ return new ModelRouter(providers, cfg.models.defaultStrategy, cfg.models.budgetPerTaskUsd, statsFile, cfg.app.homeDir);
41
43
  }
42
44
  /** 加载性能统计缓存 */
43
45
  async loadStats(homeDir) {
@@ -73,7 +75,7 @@ class ModelRouter {
73
75
  const lines = this.statsCache.stats.map((s) => JSON.stringify(s)).join('\n') + '\n';
74
76
  await (0, promises_1.writeFile)(file, lines, 'utf8');
75
77
  }
76
- /** 更新模型调用统计 */
78
+ /** 更新模型调用统计(并在配置了 homeDir 时同步落盘,供 model-stats 命令读取) */
77
79
  async updateStat(providerId, model, success, costUsd, latencyMs) {
78
80
  if (!this.statsCache) {
79
81
  this.statsCache = { version: STATS_VERSION, stats: [], updatedAt: new Date().toISOString() };
@@ -104,6 +106,17 @@ class ModelRouter {
104
106
  });
105
107
  }
106
108
  this.statsCache.updatedAt = new Date().toISOString();
109
+ // M6 闭环修复:统计仅驻留内存则 model-stats 永远读不到数据,这里同步落盘
110
+ if (this.statsHomeDir) {
111
+ try {
112
+ await this.saveStats(this.statsHomeDir);
113
+ }
114
+ catch (e) {
115
+ logger_1.logger.warn('failed to persist model stats', {
116
+ error: e instanceof Error ? e.message : String(e),
117
+ });
118
+ }
119
+ }
107
120
  }
108
121
  /** 获取模型统计报告 */
109
122
  getStats() {
@@ -127,9 +140,9 @@ class ModelRouter {
127
140
  base = p.tags.includes('local') ? 1 : 0;
128
141
  else
129
142
  base = (p.tags.includes('reasoning') ? 2 : 0) + (p.tags.includes('code-gen') ? 1 : 0);
130
- // M6: 加权历史成功率(最多 0.3 分)
143
+ // M6: 加权历史成功率(最多 0.3 分);统计按 providerId+model 键控,查找需一致
131
144
  if (this.statsCache) {
132
- const stat = this.statsCache.stats.find((s) => s.providerId === p.id);
145
+ const stat = this.statsCache.stats.find((s) => s.providerId === p.id && s.model === p.model);
133
146
  if (stat && stat.totalCalls >= 3) {
134
147
  base += stat.successRate * 0.3;
135
148
  }
@@ -140,12 +153,12 @@ class ModelRouter {
140
153
  async chat(req, tags) {
141
154
  const order = this.rank(tags);
142
155
  let lastErr;
143
- const startTime = Date.now();
144
156
  for (const p of order) {
157
+ const startTime = Date.now();
145
158
  try {
146
159
  const resp = await p.chat(req);
147
160
  const latency = Date.now() - startTime;
148
- // M6: 更新性能统计
161
+ // M6: 更新性能统计(成功记录响应模型名)
149
162
  await this.updateStat(p.id, resp.model, true, resp.costUsd, latency);
150
163
  if (this.budget > 0 && resp.costUsd > this.budget) {
151
164
  logger_1.logger.warn('cost over budget', { provider: p.id, cost: resp.costUsd, budget: this.budget });
@@ -154,8 +167,8 @@ class ModelRouter {
154
167
  }
155
168
  catch (e) {
156
169
  const latency = Date.now() - startTime;
157
- // M6: 记录失败
158
- await this.updateStat(p.id, '', false, 0, latency);
170
+ // M6: 记录失败(用 provider 配置的模型名,避免统计出 model='' 的空条目)
171
+ await this.updateStat(p.id, p.model, false, 0, latency);
159
172
  logger_1.logger.warn('provider failed, try next', {
160
173
  provider: p.id,
161
174
  error: e instanceof Error ? e.message : String(e),
@@ -1 +1 @@
1
- {"version":3,"file":"model-router.js","sourceRoot":"","sources":["../../src/models/model-router.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;GAWG;AACH,0CAAyD;AACzD,2BAAgC;AAChC,+BAA4B;AAG5B,6CAA8C;AAC9C,6CAA0C;AAE1C,uFAAkF;AAClF,iEAA6D;AAoB7D,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AAE/C,MAAa,WAAW;IACL,SAAS,CAAkB;IAC3B,QAAQ,CAAgB;IACxB,MAAM,CAAS;IACf,SAAS,CAAS;IAC3B,UAAU,GAA2B,IAAI,CAAC;IAElD,YAAY,SAA0B,EAAE,QAAuB,EAAE,MAAc,EAAE,YAAoB,EAAE;QACrG,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,kBAAkB,CAAC;IACnD,CAAC;IAED,qCAAqC;IACrC,MAAM,CAAC,UAAU,CAAC,GAAc,EAAE,SAAkB;QAClD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/C,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,gCAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,qDAAwB,CAAC,CAAC,CAAC,CAC9E,CAAC;QACF,OAAO,IAAI,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IACxG,CAAC;IAED,eAAe;IACf,KAAK,CAAC,SAAS,CAAC,OAAe;QAC7B,MAAM,IAAI,GAAG,IAAA,WAAI,EAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,UAAU,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7F,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzD,MAAM,KAAK,GAAgB,EAAE,CAAC;YAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC,CAAC;gBAC5C,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;YACD,IAAI,CAAC,UAAU,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3F,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,UAAU,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QAC/F,CAAC;IACH,CAAC;IAED,aAAa;IACb,KAAK,CAAC,SAAS,CAAC,OAAe;QAC7B,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAC7B,MAAM,IAAI,GAAG,IAAA,WAAI,EAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,IAAA,gBAAK,EAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACpF,MAAM,IAAA,oBAAS,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,eAAe;IACf,KAAK,CAAC,UAAU,CAAC,UAAkB,EAAE,KAAa,EAAE,OAAgB,EAAE,OAAe,EAAE,SAAiB;QACtG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QAC/F,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QACrG,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,IAAI,OAAO;gBAAE,QAAQ,CAAC,eAAe,EAAE,CAAC;;gBACnC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC5B,QAAQ,CAAC,YAAY,IAAI,OAAO,CAAC;YACjC,QAAQ,CAAC,YAAY,GAAG,CAAC,QAAQ,CAAC,YAAY,GAAG,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC;YAC9G,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC/C,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,eAAe,GAAG,QAAQ,CAAC,UAAU,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;gBACzB,UAAU;gBACV,KAAK;gBACL,UAAU,EAAE,CAAC;gBACb,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5B,YAAY,EAAE,OAAO;gBACrB,YAAY,EAAE,SAAS;gBACvB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC7B,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvD,CAAC;IAED,eAAe;IACf,QAAQ;QACN,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC;IACtC,CAAC;IAED,8CAA8C;IAC9C,IAAI,CAAC,IAAsB;QACzB,IAAI,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,GAAG,QAAQ,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,CAAgB;QAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM;YAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;aACpD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;YACzE,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3F,wBAAwB;QACxB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACtE,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;gBACjC,IAAI,IAAI,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,KAAK,CAAC,IAAI,CAAC,GAAgB,EAAE,IAAsB;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,OAAgB,CAAC;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAEvC,aAAa;gBACb,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAErE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;oBAClD,eAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC/F,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACvC,WAAW;gBACX,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;gBACnD,eAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;oBACvC,QAAQ,EAAE,CAAC,CAAC,EAAE;oBACd,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;iBAClD,CAAC,CAAC;gBACH,OAAO,GAAG,CAAC,CAAC;YACd,CAAC;QACH,CAAC;QACD,MAAM,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,mBAAU,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IAC1F,CAAC;CACF;AApJD,kCAoJC"}
1
+ {"version":3,"file":"model-router.js","sourceRoot":"","sources":["../../src/models/model-router.ts"],"names":[],"mappings":"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"}