feihong-code 0.2.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 (154) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  2. package/.github/ISSUE_TEMPLATE/config.yml +14 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +28 -0
  4. package/.github/PULL_REQUEST_TEMPLATE.md +46 -0
  5. package/.github/SECURITY.md +67 -0
  6. package/.github/workflows/ci.yml +140 -0
  7. package/AGENT-GUIDE.md +237 -0
  8. package/CHANGELOG.md +73 -0
  9. package/CODE_OF_CONDUCT.md +56 -0
  10. package/CONTRIBUTING.md +68 -0
  11. package/LICENSE +22 -0
  12. package/README.md +500 -0
  13. package/dist/agent/code-review.js +115 -0
  14. package/dist/agent/code-review.js.map +1 -0
  15. package/dist/agent/code-writer.js +227 -0
  16. package/dist/agent/code-writer.js.map +1 -0
  17. package/dist/agent/context-compactor.js +108 -0
  18. package/dist/agent/context-compactor.js.map +1 -0
  19. package/dist/agent/experience.js +190 -0
  20. package/dist/agent/experience.js.map +1 -0
  21. package/dist/agent/orchestrator.js +212 -0
  22. package/dist/agent/orchestrator.js.map +1 -0
  23. package/dist/agent/parallel-orchestrator.js +94 -0
  24. package/dist/agent/parallel-orchestrator.js.map +1 -0
  25. package/dist/agent/planner.js +53 -0
  26. package/dist/agent/planner.js.map +1 -0
  27. package/dist/agent/prompts.js +26 -0
  28. package/dist/agent/prompts.js.map +1 -0
  29. package/dist/agent/quality-gate.js +143 -0
  30. package/dist/agent/quality-gate.js.map +1 -0
  31. package/dist/agent/repo-reader.js +384 -0
  32. package/dist/agent/repo-reader.js.map +1 -0
  33. package/dist/agent/repo-underwriter.js +132 -0
  34. package/dist/agent/repo-underwriter.js.map +1 -0
  35. package/dist/agent/self-heal.js +134 -0
  36. package/dist/agent/self-heal.js.map +1 -0
  37. package/dist/agent/self-improver.js +148 -0
  38. package/dist/agent/self-improver.js.map +1 -0
  39. package/dist/agent/subagent.js +75 -0
  40. package/dist/agent/subagent.js.map +1 -0
  41. package/dist/agent/swe-agent.js +162 -0
  42. package/dist/agent/swe-agent.js.map +1 -0
  43. package/dist/agent/swe-planner.js +155 -0
  44. package/dist/agent/swe-planner.js.map +1 -0
  45. package/dist/agent/swe-verifier.js +113 -0
  46. package/dist/agent/swe-verifier.js.map +1 -0
  47. package/dist/cli/commands.js +167 -0
  48. package/dist/cli/commands.js.map +1 -0
  49. package/dist/cli/index.js +179 -0
  50. package/dist/cli/index.js.map +1 -0
  51. package/dist/cli/repl.js +67 -0
  52. package/dist/cli/repl.js.map +1 -0
  53. package/dist/cli/run.js +762 -0
  54. package/dist/cli/run.js.map +1 -0
  55. package/dist/cli/version.js +14 -0
  56. package/dist/cli/version.js.map +1 -0
  57. package/dist/enterprise/audit.js +294 -0
  58. package/dist/enterprise/audit.js.map +1 -0
  59. package/dist/enterprise/guard.js +58 -0
  60. package/dist/enterprise/guard.js.map +1 -0
  61. package/dist/enterprise/index.js +99 -0
  62. package/dist/enterprise/index.js.map +1 -0
  63. package/dist/enterprise/policy.js +242 -0
  64. package/dist/enterprise/policy.js.map +1 -0
  65. package/dist/enterprise/quota.js +58 -0
  66. package/dist/enterprise/quota.js.map +1 -0
  67. package/dist/enterprise/tenant.js +143 -0
  68. package/dist/enterprise/tenant.js.map +1 -0
  69. package/dist/models/cost.js +13 -0
  70. package/dist/models/cost.js.map +1 -0
  71. package/dist/models/model-router.js +170 -0
  72. package/dist/models/model-router.js.map +1 -0
  73. package/dist/models/model.dto.js +61 -0
  74. package/dist/models/model.dto.js.map +1 -0
  75. package/dist/models/model.interface.js +3 -0
  76. package/dist/models/model.interface.js.map +1 -0
  77. package/dist/models/providers/mock.provider.js +35 -0
  78. package/dist/models/providers/mock.provider.js.map +1 -0
  79. package/dist/models/providers/ollama.provider.js +88 -0
  80. package/dist/models/providers/ollama.provider.js.map +1 -0
  81. package/dist/models/providers/openai-compatible.provider.js +106 -0
  82. package/dist/models/providers/openai-compatible.provider.js.map +1 -0
  83. package/dist/runtime/event-log.js +42 -0
  84. package/dist/runtime/event-log.js.map +1 -0
  85. package/dist/runtime/git.js +106 -0
  86. package/dist/runtime/git.js.map +1 -0
  87. package/dist/runtime/session-persist.js +60 -0
  88. package/dist/runtime/session-persist.js.map +1 -0
  89. package/dist/runtime/session-store.js +34 -0
  90. package/dist/runtime/session-store.js.map +1 -0
  91. package/dist/runtime/worktree.js +117 -0
  92. package/dist/runtime/worktree.js.map +1 -0
  93. package/dist/shared/config.js +184 -0
  94. package/dist/shared/config.js.map +1 -0
  95. package/dist/shared/errors.js +66 -0
  96. package/dist/shared/errors.js.map +1 -0
  97. package/dist/shared/logger.js +51 -0
  98. package/dist/shared/logger.js.map +1 -0
  99. package/dist/shared/types.js +9 -0
  100. package/dist/shared/types.js.map +1 -0
  101. package/dist/skills/goal.js +60 -0
  102. package/dist/skills/goal.js.map +1 -0
  103. package/dist/skills/grill.js +129 -0
  104. package/dist/skills/grill.js.map +1 -0
  105. package/dist/skills/plan.js +40 -0
  106. package/dist/skills/plan.js.map +1 -0
  107. package/dist/tools/analysis/code-analyzer.js +136 -0
  108. package/dist/tools/analysis/code-analyzer.js.map +1 -0
  109. package/dist/tools/file/edit.tool.js +43 -0
  110. package/dist/tools/file/edit.tool.js.map +1 -0
  111. package/dist/tools/file/list.tool.js +36 -0
  112. package/dist/tools/file/list.tool.js.map +1 -0
  113. package/dist/tools/file/read.tool.js +34 -0
  114. package/dist/tools/file/read.tool.js.map +1 -0
  115. package/dist/tools/file/write.tool.js +39 -0
  116. package/dist/tools/file/write.tool.js.map +1 -0
  117. package/dist/tools/generator/code-generator.js +119 -0
  118. package/dist/tools/generator/code-generator.js.map +1 -0
  119. package/dist/tools/generator/test-generator.js +65 -0
  120. package/dist/tools/generator/test-generator.js.map +1 -0
  121. package/dist/tools/index.js +53 -0
  122. package/dist/tools/index.js.map +1 -0
  123. package/dist/tools/safe-path.js +36 -0
  124. package/dist/tools/safe-path.js.map +1 -0
  125. package/dist/tools/search/grep.tool.js +81 -0
  126. package/dist/tools/search/grep.tool.js.map +1 -0
  127. package/dist/tools/shell/exec.js +50 -0
  128. package/dist/tools/shell/exec.js.map +1 -0
  129. package/dist/tools/shell/run-shell.tool.js +49 -0
  130. package/dist/tools/shell/run-shell.tool.js.map +1 -0
  131. package/dist/tools/tool.interface.js +8 -0
  132. package/dist/tools/tool.interface.js.map +1 -0
  133. package/dist/tools/tool.registry.js +75 -0
  134. package/dist/tools/tool.registry.js.map +1 -0
  135. package/dist/tools/verify/build-check.tool.js +37 -0
  136. package/dist/tools/verify/build-check.tool.js.map +1 -0
  137. package/dist/tools/verify/test-run.tool.js +37 -0
  138. package/dist/tools/verify/test-run.tool.js.map +1 -0
  139. package/dist/web/auth.js +25 -0
  140. package/dist/web/auth.js.map +1 -0
  141. package/dist/web/public/index.html +39 -0
  142. package/dist/web/server.js +60 -0
  143. package/dist/web/server.js.map +1 -0
  144. package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -0
  145. 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 -0
  146. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +358 -0
  147. 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 -0
  148. package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +303 -0
  149. package/docs//346/236/266/346/236/204/344/270/216API.md +238 -0
  150. package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -0
  151. package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -0
  152. package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -0
  153. package/package.json +83 -0
  154. package/tool-schema.json +127 -0
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.analyzeRepo = analyzeRepo;
4
+ exports.generateArchitectureSummary = generateArchitectureSummary;
5
+ exports.analyzeModuleDependencies = analyzeModuleDependencies;
6
+ /**
7
+ * 飞虹 Code (Muse Code 参照复刻)
8
+ * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
9
+ *
10
+ * 仓库理解器(M7):
11
+ * - 目录结构分析
12
+ * - 模块依赖关系
13
+ * - 架构文档自动生成
14
+ */
15
+ const fs_1 = require("fs");
16
+ const path_1 = require("path");
17
+ /** 分析仓库结构 */
18
+ function analyzeRepo(rootDir, maxDepth = 3) {
19
+ const structure = {
20
+ root: rootDir,
21
+ directories: [],
22
+ files: [],
23
+ };
24
+ const collect = (dir, depth) => {
25
+ if (depth > maxDepth)
26
+ return;
27
+ try {
28
+ const entries = (0, fs_1.readdirSync)(dir);
29
+ for (const entry of entries) {
30
+ const fullPath = (0, path_1.join)(dir, entry);
31
+ const stat = (0, fs_1.statSync)(fullPath);
32
+ if (stat.isDirectory()) {
33
+ const child = {
34
+ name: entry,
35
+ path: fullPath,
36
+ children: [],
37
+ fileCount: 0,
38
+ };
39
+ collect(fullPath, depth + 1);
40
+ structure.directories.push(child);
41
+ }
42
+ else if (entry.endsWith('.ts') || entry.endsWith('.json')) {
43
+ const fileNode = {
44
+ name: entry,
45
+ path: fullPath,
46
+ size: stat.size,
47
+ modifiedAt: stat.mtime.toISOString(),
48
+ };
49
+ structure.files.push(fileNode);
50
+ }
51
+ }
52
+ }
53
+ catch {
54
+ // 跳过无法访问的目录
55
+ }
56
+ };
57
+ collect(rootDir, 0);
58
+ // 加载 package.json
59
+ const pkgPath = (0, path_1.join)(rootDir, 'package.json');
60
+ if ((0, fs_1.existsSync)(pkgPath)) {
61
+ try {
62
+ const pkg = JSON.parse((0, fs_1.readFileSync)(pkgPath, 'utf8'));
63
+ structure.packageJson = {
64
+ name: pkg.name || 'unknown',
65
+ version: pkg.version || '0.0.0',
66
+ dependencies: pkg.dependencies || {},
67
+ };
68
+ }
69
+ catch { /* ignore */ }
70
+ }
71
+ return structure;
72
+ }
73
+ /** 生成架构文档摘要 */
74
+ function generateArchitectureSummary(structure) {
75
+ const lines = [
76
+ `# 仓库架构摘要`,
77
+ ``,
78
+ `**根目录**: ${structure.root}`,
79
+ `**目录数**: ${structure.directories.length}`,
80
+ `**文件数**: ${structure.files.length}`,
81
+ ``,
82
+ ];
83
+ if (structure.packageJson) {
84
+ lines.push(`## 项目信息`);
85
+ lines.push(`- 名称: ${structure.packageJson.name}`);
86
+ lines.push(`- 版本: ${structure.packageJson.version}`);
87
+ lines.push(`- 依赖数: ${Object.keys(structure.packageJson.dependencies).length}`);
88
+ lines.push('');
89
+ }
90
+ lines.push(`## 目录结构`);
91
+ lines.push('```');
92
+ for (const dir of structure.directories.slice(0, 20)) {
93
+ lines.push(`📁 ${dir.name}/ (${dir.fileCount} 文件)`);
94
+ }
95
+ lines.push('```');
96
+ lines.push('');
97
+ lines.push(`## 文件统计`);
98
+ const tsFiles = structure.files.filter(f => f.name.endsWith('.ts')).length;
99
+ const jsonFiles = structure.files.filter(f => f.name.endsWith('.json')).length;
100
+ lines.push(`- TypeScript: ${tsFiles} 文件`);
101
+ lines.push(`- JSON: ${jsonFiles} 文件`);
102
+ lines.push('');
103
+ return lines.join('\n');
104
+ }
105
+ /** 分析模块依赖(基于 import 语句) */
106
+ function analyzeModuleDependencies(dirPath) {
107
+ const deps = {};
108
+ const { readdirSync, statSync, readFileSync } = require('fs');
109
+ const { join } = require('path');
110
+ const scan = (dir) => {
111
+ try {
112
+ const entries = readdirSync(dir);
113
+ for (const entry of entries) {
114
+ const fullPath = join(dir, entry);
115
+ const stat = statSync(fullPath);
116
+ if (stat.isDirectory()) {
117
+ scan(fullPath);
118
+ }
119
+ else if (entry.endsWith('.ts') && !entry.endsWith('.d.ts')) {
120
+ const content = readFileSync(fullPath, 'utf8');
121
+ const imports = content.match(/from\s+['"][^'"]+['"]/g) || [];
122
+ const modulePath = fullPath.replace(dirPath + '/', '');
123
+ deps[modulePath] = imports.map((i) => i.replace(/from\s+['"]/g, '').replace(/['"]/g, ''));
124
+ }
125
+ }
126
+ }
127
+ catch { /* skip */ }
128
+ };
129
+ scan(dirPath);
130
+ return deps;
131
+ }
132
+ //# sourceMappingURL=repo-underwriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-underwriter.js","sourceRoot":"","sources":["../../src/agent/repo-underwriter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.classifyError = classifyError;
4
+ exports.generateReflectPrompt = generateReflectPrompt;
5
+ exports.injectReflection = injectReflection;
6
+ exports.countConsecutiveErrors = countConsecutiveErrors;
7
+ exports.buildReflectContext = buildReflectContext;
8
+ exports.logRecoveryAttempt = logRecoveryAttempt;
9
+ const logger_1 = require("../shared/logger");
10
+ /** 错误分类器:根据工具返回结果判断错误类型 */
11
+ function classifyError(output, error) {
12
+ const text = (error || output).toLowerCase();
13
+ // 编译错误
14
+ if (text.includes('error ts') || text.includes('typescript error') || text.includes('cannot find module') || text.includes('syntax error')) {
15
+ return {
16
+ category: 'compile-error',
17
+ message: error || output,
18
+ fixHint: '检查 TypeScript 类型错误、缺失依赖或路径拼写错误。尝试运行 npm run build 查看完整错误信息。',
19
+ };
20
+ }
21
+ // 运行时错误
22
+ if (text.includes('undefined is not') || text.includes('cannot read property') || text.includes('referenceerror') || text.includes('typeerror')) {
23
+ return {
24
+ category: 'runtime-error',
25
+ message: error || output,
26
+ fixHint: '检查变量是否已定义、函数调用是否正确、空值处理是否完善。',
27
+ };
28
+ }
29
+ // 路径穿越
30
+ if (text.includes('path traversal') || text.includes('outside workspace') || text.includes('safe-path') || text.includes('forbidden')) {
31
+ return {
32
+ category: 'path-traversal',
33
+ message: error || output,
34
+ fixHint: '文件路径包含非法字符或试图访问工作区外部。使用相对路径,避免 ../ 穿越。',
35
+ };
36
+ }
37
+ // 超时
38
+ if (text.includes('timeout') || text.includes('timed out') || text.includes('ETIMEDOUT')) {
39
+ return {
40
+ category: 'timeout',
41
+ message: error || output,
42
+ fixHint: '命令执行超时。检查是否存在死循环或需要长时间运行的进程。',
43
+ };
44
+ }
45
+ // 权限拒绝
46
+ if (text.includes('permission denied') || text.includes('eacces') || text.includes('epERM')) {
47
+ return {
48
+ category: 'permission-denied',
49
+ message: error || output,
50
+ fixHint: '文件权限不足或路径不存在。检查文件权限和目录结构。',
51
+ };
52
+ }
53
+ // 模型错误
54
+ if (text.includes('api error') || text.includes('rate limit') || text.includes('429') || text.includes('500')) {
55
+ return {
56
+ category: 'model-error',
57
+ message: error || output,
58
+ fixHint: '模型 API 错误。检查 API 密钥、速率限制或网络连通性。',
59
+ };
60
+ }
61
+ return null;
62
+ }
63
+ /** 生成反思提示词,指导模型基于错误进行修复 */
64
+ function generateReflectPrompt(errorAnalysis, _goal) {
65
+ return `⚠️ 上一轮任务执行失败,请反思并修复:
66
+
67
+ **错误类型**: ${errorAnalysis.category}
68
+ **错误详情**: ${errorAnalysis.message}
69
+ **修复建议**: ${errorAnalysis.fixHint}
70
+
71
+ 请基于以上错误信息,重新制定执行方案,注意:
72
+ 1. 避免重复之前的错误
73
+ 2. 如有必要,先勘察代码库理解上下文
74
+ 3. 采用更稳健的实现方式
75
+ 4. 完成后再次验证
76
+ `;
77
+ }
78
+ /** 将反思消息注入对话上下文 */
79
+ function injectReflection(messages, errorAnalysis, goal) {
80
+ const reflectMsg = {
81
+ role: 'user',
82
+ content: generateReflectPrompt(errorAnalysis, goal),
83
+ };
84
+ return [...messages, reflectMsg];
85
+ }
86
+ /** 统计连续失败次数 */
87
+ function countConsecutiveErrors(messages, maxRetries) {
88
+ let errors = 0;
89
+ for (let i = messages.length - 1; i >= 0; i--) {
90
+ const msg = messages[i];
91
+ if (msg.role === 'tool' && msg.content.includes('错误:')) {
92
+ errors++;
93
+ }
94
+ else if (msg.role === 'tool' && !msg.content.includes('错误:')) {
95
+ // 工具成功执行,重置计数
96
+ break;
97
+ }
98
+ else if (msg.role === 'assistant' && errors > 0) {
99
+ // 助手在连续错误后仍无工具调用,说明已尝试修复但失败
100
+ break;
101
+ }
102
+ }
103
+ return {
104
+ failed: errors >= maxRetries,
105
+ errors,
106
+ };
107
+ }
108
+ /** 构建反思上下文(包含历史错误) */
109
+ function buildReflectContext(messages, errors) {
110
+ // 保留最近 5 轮完整对话
111
+ const recentMessages = messages.slice(-10);
112
+ // 将错误历史作为系统提示注入
113
+ const errorHistory = errors.map((e, i) => `[第 ${i + 1} 次失败] 类型: ${e.category}, 详情: ${e.message.slice(0, 200)}`).join('\n');
114
+ const systemHint = {
115
+ role: 'system',
116
+ content: `⚠️ 连续失败记录(自动学习模式)\n\n${errorHistory}\n\n请从错误中学习,调整策略,避免重复失败。`,
117
+ };
118
+ return {
119
+ messages: [systemHint, ...recentMessages],
120
+ contextLength: messages.length,
121
+ };
122
+ }
123
+ /** 记录修复事件到日志 */
124
+ async function logRecoveryAttempt(eventLog, iteration, errorAnalysis, success) {
125
+ await eventLog.append('self-heal.attempt', {
126
+ iteration,
127
+ category: errorAnalysis.category,
128
+ message: errorAnalysis.message.slice(0, 500),
129
+ success,
130
+ timestamp: new Date().toISOString(),
131
+ });
132
+ logger_1.logger.info('self-heal recovery attempt', { iteration, category: errorAnalysis.category, success });
133
+ }
134
+ //# sourceMappingURL=self-heal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-heal.js","sourceRoot":"","sources":["../../src/agent/self-heal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SelfImprover = void 0;
4
+ exports.createSelfImprover = createSelfImprover;
5
+ /**
6
+ * 飞虹 Code (Muse Code 参照复刻)
7
+ * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
8
+ *
9
+ * 自我改进(M8):
10
+ * - 任务后反思:提取成功/失败模式
11
+ * - 策略优化:基于历史表现调整行为
12
+ * - 经验融合:将反思结果注入经验库
13
+ */
14
+ const fs_1 = require("fs");
15
+ const path_1 = require("path");
16
+ const experience_1 = require("./experience");
17
+ const DEFAULT_CONFIG = {
18
+ reflectionEnabled: true,
19
+ maxPatternsPerTask: 5,
20
+ experienceDir: (0, path_1.join)(require('os').homedir(), '.feihong-code', 'improvements'),
21
+ };
22
+ class SelfImprover {
23
+ config;
24
+ improvements = [];
25
+ constructor(config = {}) {
26
+ this.config = { ...DEFAULT_CONFIG, ...config };
27
+ }
28
+ /** 任务后反思 */
29
+ reflect(messages, success, durationMs) {
30
+ const patterns = this.extractPatterns(messages, success);
31
+ const improvements = this.generateImprovements(messages, success, patterns);
32
+ const strategyChanges = this.deriveStrategyChanges(patterns, improvements);
33
+ const result = {
34
+ success,
35
+ patterns: patterns.slice(0, this.config.maxPatternsPerTask),
36
+ improvements,
37
+ strategyChanges,
38
+ };
39
+ // 保存反思记录
40
+ this.improvements.push({
41
+ timestamp: new Date().toISOString(),
42
+ success,
43
+ durationMs,
44
+ patterns: result.patterns,
45
+ improvements: result.improvements,
46
+ });
47
+ // 写入经验库
48
+ if (this.config.reflectionEnabled) {
49
+ const exp = {
50
+ id: `improvement-${Date.now()}`,
51
+ type: success ? 'success-pattern' : 'error-pattern',
52
+ title: success ? '成功模式提取' : '失败模式分析',
53
+ content: result.improvements.join('\n'),
54
+ metadata: {
55
+ successRate: success ? 1.0 : 0.0,
56
+ sessionCount: 1,
57
+ tags: result.patterns.slice(0, 3),
58
+ createdAt: new Date().toISOString(),
59
+ lastUsedAt: new Date().toISOString(),
60
+ },
61
+ };
62
+ (0, fs_1.mkdirSync)(this.config.experienceDir, { recursive: true });
63
+ (0, experience_1.saveExperience)(this.config.experienceDir, exp).catch(() => { });
64
+ }
65
+ return result;
66
+ }
67
+ /** 加载历史改进记录 */
68
+ loadImprovements() {
69
+ const file = (0, path_1.join)(this.config.experienceDir, 'improvements.json');
70
+ if (!(0, fs_1.existsSync)(file))
71
+ return [];
72
+ try {
73
+ return JSON.parse((0, fs_1.readFileSync)(file, 'utf8'));
74
+ }
75
+ catch {
76
+ return [];
77
+ }
78
+ }
79
+ /** 保存改进记录 */
80
+ saveImprovements(records) {
81
+ (0, fs_1.mkdirSync)(this.config.experienceDir, { recursive: true });
82
+ (0, fs_1.writeFileSync)((0, path_1.join)(this.config.experienceDir, 'improvements.json'), JSON.stringify(records, null, 2), 'utf8');
83
+ }
84
+ /** 获取改进统计 */
85
+ getStats() {
86
+ if (this.improvements.length === 0) {
87
+ return { totalReflections: 0, successRate: 0, avgDurationMs: 0 };
88
+ }
89
+ const total = this.improvements.length;
90
+ const successful = this.improvements.filter((i) => i.success).length;
91
+ const avgDuration = this.improvements.reduce((sum, i) => sum + i.durationMs, 0) / total;
92
+ return {
93
+ totalReflections: total,
94
+ successRate: successful / total,
95
+ avgDurationMs: avgDuration,
96
+ };
97
+ }
98
+ extractPatterns(_messages, success) {
99
+ const patterns = [];
100
+ // 成功/失败模式
101
+ if (success) {
102
+ patterns.push('任务成功完成,策略有效');
103
+ }
104
+ else {
105
+ patterns.push('任务未完成,需要调整策略');
106
+ }
107
+ return patterns;
108
+ }
109
+ generateImprovements(_messages, success, patterns) {
110
+ const improvements = [];
111
+ if (!success) {
112
+ improvements.push('失败任务:检查错误分类并重试');
113
+ improvements.push('失败任务:考虑简化目标或分解子任务');
114
+ }
115
+ // 基于模式生成改进建议
116
+ for (const pattern of patterns) {
117
+ if (pattern.includes('工具') && pattern.includes('高频')) {
118
+ improvements.push('高频工具调用:考虑批量操作优化');
119
+ }
120
+ if (pattern.includes('错误')) {
121
+ improvements.push('错误模式:增加前置校验减少运行时错误');
122
+ }
123
+ }
124
+ if (improvements.length === 0) {
125
+ improvements.push('持续监控工具调用效率');
126
+ }
127
+ return improvements;
128
+ }
129
+ deriveStrategyChanges(patterns, improvements) {
130
+ const changes = [];
131
+ if (patterns.some((p) => p.includes('错误模式'))) {
132
+ changes.push('增强错误检测机制');
133
+ }
134
+ if (improvements.some((i) => i.includes('批量操作'))) {
135
+ changes.push('优化工具调用批次');
136
+ }
137
+ if (changes.length === 0) {
138
+ changes.push('保持当前策略');
139
+ }
140
+ return changes;
141
+ }
142
+ }
143
+ exports.SelfImprover = SelfImprover;
144
+ /** 便捷函数 */
145
+ function createSelfImprover(config) {
146
+ return new SelfImprover(config);
147
+ }
148
+ //# sourceMappingURL=self-improver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-improver.js","sourceRoot":"","sources":["../../src/agent/self-improver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runSubAgent = runSubAgent;
4
+ /**
5
+ * 飞虹 Code (Muse Code 参照复刻)
6
+ * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
7
+ *
8
+ * 子代理:单个隔离工作区内的执行单元(M2 多子代理并行)。
9
+ * 复用 Orchestrator,但绑定自己的 worktree 目录(cwd)与单一子目标,
10
+ * 因此天然与其他子代理物理隔离(工具沙箱基于 cwd)。
11
+ */
12
+ const crypto_1 = require("crypto");
13
+ const path_1 = require("path");
14
+ const logger_1 = require("../shared/logger");
15
+ const model_router_1 = require("../models/model-router");
16
+ const mock_provider_1 = require("../models/providers/mock.provider");
17
+ const tools_1 = require("../tools");
18
+ const event_log_1 = require("../runtime/event-log");
19
+ const session_store_1 = require("../runtime/session-store");
20
+ const orchestrator_1 = require("./orchestrator");
21
+ async function runSubAgent(deps) {
22
+ const { worktree, goal, router, offline, security, approve, mockSteps } = deps;
23
+ const runId = (0, crypto_1.randomUUID)();
24
+ (0, logger_1.setRunId)(runId);
25
+ const effectiveRouter = offline
26
+ ? new model_router_1.ModelRouter([new mock_provider_1.ScriptedMockProvider(mockSteps ?? defaultSubMock(goal))], 'cost', 0)
27
+ : router;
28
+ const sec = security ?? {
29
+ shellAllowlist: [],
30
+ requireApproval: true,
31
+ };
32
+ const tools = (0, tools_1.createDefaultRegistry)();
33
+ const eventLog = new event_log_1.EventLog(runId, (0, path_1.join)(worktree.path, '.fhcode-logs'));
34
+ const session = new session_store_1.SessionStore(runId, worktree.path);
35
+ const orch = new orchestrator_1.Orchestrator({
36
+ router: effectiveRouter,
37
+ tools,
38
+ eventLog,
39
+ session,
40
+ cwd: worktree.path,
41
+ security: sec,
42
+ approve,
43
+ });
44
+ logger_1.logger.info('subagent start', { runId, worktree: worktree.path, goal });
45
+ const result = await orch.run(goal);
46
+ return { ...result, worktree, subGoal: goal };
47
+ }
48
+ /** 离线兜底脚本:在 worktree 内写一份以子目标命名的产物文件 */
49
+ function defaultSubMock(goal) {
50
+ const fname = `${slug(goal)}.txt`;
51
+ return [
52
+ {
53
+ message: {
54
+ role: 'assistant',
55
+ content: '',
56
+ toolCalls: [
57
+ {
58
+ id: 'c1',
59
+ name: 'write_file',
60
+ arguments: { path: fname, content: `子任务完成:${goal}\n` },
61
+ },
62
+ ],
63
+ },
64
+ },
65
+ { message: { role: 'assistant', content: `已在 ${fname} 完成子任务:${goal}` } },
66
+ ];
67
+ }
68
+ function slug(s) {
69
+ return (s
70
+ .toLowerCase()
71
+ .replace(/[^a-z0-9一-龥]+/g, '-')
72
+ .replace(/^-+|-+$/g, '')
73
+ .slice(0, 20) || 'task');
74
+ }
75
+ //# sourceMappingURL=subagent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/agent/subagent.ts"],"names":[],"mappings":";;AAoCA,kCA8BC;AAlED;;;;;;;GAOG;AACH,mCAAoC;AACpC,+BAA4B;AAC5B,6CAAoD;AACpD,yDAAqD;AACrD,qEAAwF;AACxF,oCAAiD;AACjD,oDAAgD;AAChD,4DAAwD;AACxD,iDAAyF;AAoBlF,KAAK,UAAU,WAAW,CAAC,IAAkB;IAClD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC/E,MAAM,KAAK,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC3B,IAAA,iBAAQ,EAAC,KAAK,CAAC,CAAC;IAEhB,MAAM,eAAe,GAAG,OAAO;QAC7B,CAAC,CAAC,IAAI,0BAAW,CAAC,CAAC,IAAI,oCAAoB,CAAC,SAAS,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3F,CAAC,CAAC,MAAM,CAAC;IAEX,MAAM,GAAG,GAAyB,QAAQ,IAAI;QAC5C,cAAc,EAAE,EAAE;QAClB,eAAe,EAAE,IAAI;KACtB,CAAC;IACF,MAAM,KAAK,GAAG,IAAA,6BAAqB,GAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,oBAAQ,CAAC,KAAK,EAAE,IAAA,WAAI,EAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,IAAI,4BAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEvD,MAAM,IAAI,GAAG,IAAI,2BAAY,CAAC;QAC5B,MAAM,EAAE,eAAe;QACvB,KAAK;QACL,QAAQ;QACR,OAAO;QACP,GAAG,EAAE,QAAQ,CAAC,IAAI;QAClB,QAAQ,EAAE,GAAG;QACb,OAAO;KACR,CAAC,CAAC;IAEH,eAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAChD,CAAC;AAED,wCAAwC;AACxC,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAClC,OAAO;QACL;YACE,OAAO,EAAE;gBACP,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,EAAE;gBACX,SAAS,EAAE;oBACT;wBACE,EAAE,EAAE,IAAI;wBACR,IAAI,EAAE,YAAY;wBAClB,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI,EAAE;qBACvD;iBACF;aACF;SACF;QACD,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE,EAAE,EAAE;KACzE,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,CAAS;IACrB,OAAO,CACL,CAAC;SACE,WAAW,EAAE;SACb,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAC1B,CAAC;AACJ,CAAC"}