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.
- package/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
- package/.github/ISSUE_TEMPLATE/config.yml +14 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +28 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +46 -0
- package/.github/SECURITY.md +67 -0
- package/.github/workflows/ci.yml +140 -0
- package/AGENT-GUIDE.md +237 -0
- package/CHANGELOG.md +73 -0
- package/CODE_OF_CONDUCT.md +56 -0
- package/CONTRIBUTING.md +68 -0
- package/LICENSE +22 -0
- package/README.md +500 -0
- package/dist/agent/code-review.js +115 -0
- package/dist/agent/code-review.js.map +1 -0
- package/dist/agent/code-writer.js +227 -0
- package/dist/agent/code-writer.js.map +1 -0
- package/dist/agent/context-compactor.js +108 -0
- package/dist/agent/context-compactor.js.map +1 -0
- package/dist/agent/experience.js +190 -0
- package/dist/agent/experience.js.map +1 -0
- package/dist/agent/orchestrator.js +212 -0
- package/dist/agent/orchestrator.js.map +1 -0
- package/dist/agent/parallel-orchestrator.js +94 -0
- package/dist/agent/parallel-orchestrator.js.map +1 -0
- package/dist/agent/planner.js +53 -0
- package/dist/agent/planner.js.map +1 -0
- package/dist/agent/prompts.js +26 -0
- package/dist/agent/prompts.js.map +1 -0
- package/dist/agent/quality-gate.js +143 -0
- package/dist/agent/quality-gate.js.map +1 -0
- package/dist/agent/repo-reader.js +384 -0
- package/dist/agent/repo-reader.js.map +1 -0
- package/dist/agent/repo-underwriter.js +132 -0
- package/dist/agent/repo-underwriter.js.map +1 -0
- package/dist/agent/self-heal.js +134 -0
- package/dist/agent/self-heal.js.map +1 -0
- package/dist/agent/self-improver.js +148 -0
- package/dist/agent/self-improver.js.map +1 -0
- package/dist/agent/subagent.js +75 -0
- package/dist/agent/subagent.js.map +1 -0
- package/dist/agent/swe-agent.js +162 -0
- package/dist/agent/swe-agent.js.map +1 -0
- package/dist/agent/swe-planner.js +155 -0
- package/dist/agent/swe-planner.js.map +1 -0
- package/dist/agent/swe-verifier.js +113 -0
- package/dist/agent/swe-verifier.js.map +1 -0
- package/dist/cli/commands.js +167 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.js +179 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/repl.js +67 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/run.js +762 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/version.js +14 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/enterprise/audit.js +294 -0
- package/dist/enterprise/audit.js.map +1 -0
- package/dist/enterprise/guard.js +58 -0
- package/dist/enterprise/guard.js.map +1 -0
- package/dist/enterprise/index.js +99 -0
- package/dist/enterprise/index.js.map +1 -0
- package/dist/enterprise/policy.js +242 -0
- package/dist/enterprise/policy.js.map +1 -0
- package/dist/enterprise/quota.js +58 -0
- package/dist/enterprise/quota.js.map +1 -0
- package/dist/enterprise/tenant.js +143 -0
- package/dist/enterprise/tenant.js.map +1 -0
- package/dist/models/cost.js +13 -0
- package/dist/models/cost.js.map +1 -0
- package/dist/models/model-router.js +170 -0
- package/dist/models/model-router.js.map +1 -0
- package/dist/models/model.dto.js +61 -0
- package/dist/models/model.dto.js.map +1 -0
- package/dist/models/model.interface.js +3 -0
- package/dist/models/model.interface.js.map +1 -0
- package/dist/models/providers/mock.provider.js +35 -0
- package/dist/models/providers/mock.provider.js.map +1 -0
- package/dist/models/providers/ollama.provider.js +88 -0
- package/dist/models/providers/ollama.provider.js.map +1 -0
- package/dist/models/providers/openai-compatible.provider.js +106 -0
- package/dist/models/providers/openai-compatible.provider.js.map +1 -0
- package/dist/runtime/event-log.js +42 -0
- package/dist/runtime/event-log.js.map +1 -0
- package/dist/runtime/git.js +106 -0
- package/dist/runtime/git.js.map +1 -0
- package/dist/runtime/session-persist.js +60 -0
- package/dist/runtime/session-persist.js.map +1 -0
- package/dist/runtime/session-store.js +34 -0
- package/dist/runtime/session-store.js.map +1 -0
- package/dist/runtime/worktree.js +117 -0
- package/dist/runtime/worktree.js.map +1 -0
- package/dist/shared/config.js +184 -0
- package/dist/shared/config.js.map +1 -0
- package/dist/shared/errors.js +66 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/logger.js +51 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/types.js +9 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/skills/goal.js +60 -0
- package/dist/skills/goal.js.map +1 -0
- package/dist/skills/grill.js +129 -0
- package/dist/skills/grill.js.map +1 -0
- package/dist/skills/plan.js +40 -0
- package/dist/skills/plan.js.map +1 -0
- package/dist/tools/analysis/code-analyzer.js +136 -0
- package/dist/tools/analysis/code-analyzer.js.map +1 -0
- package/dist/tools/file/edit.tool.js +43 -0
- package/dist/tools/file/edit.tool.js.map +1 -0
- package/dist/tools/file/list.tool.js +36 -0
- package/dist/tools/file/list.tool.js.map +1 -0
- package/dist/tools/file/read.tool.js +34 -0
- package/dist/tools/file/read.tool.js.map +1 -0
- package/dist/tools/file/write.tool.js +39 -0
- package/dist/tools/file/write.tool.js.map +1 -0
- package/dist/tools/generator/code-generator.js +119 -0
- package/dist/tools/generator/code-generator.js.map +1 -0
- package/dist/tools/generator/test-generator.js +65 -0
- package/dist/tools/generator/test-generator.js.map +1 -0
- package/dist/tools/index.js +53 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/safe-path.js +36 -0
- package/dist/tools/safe-path.js.map +1 -0
- package/dist/tools/search/grep.tool.js +81 -0
- package/dist/tools/search/grep.tool.js.map +1 -0
- package/dist/tools/shell/exec.js +50 -0
- package/dist/tools/shell/exec.js.map +1 -0
- package/dist/tools/shell/run-shell.tool.js +49 -0
- package/dist/tools/shell/run-shell.tool.js.map +1 -0
- package/dist/tools/tool.interface.js +8 -0
- package/dist/tools/tool.interface.js.map +1 -0
- package/dist/tools/tool.registry.js +75 -0
- package/dist/tools/tool.registry.js.map +1 -0
- package/dist/tools/verify/build-check.tool.js +37 -0
- package/dist/tools/verify/build-check.tool.js.map +1 -0
- package/dist/tools/verify/test-run.tool.js +37 -0
- package/dist/tools/verify/test-run.tool.js.map +1 -0
- package/dist/web/auth.js +25 -0
- package/dist/web/auth.js.map +1 -0
- package/dist/web/public/index.html +39 -0
- package/dist/web/server.js +60 -0
- package/dist/web/server.js.map +1 -0
- package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -0
- 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
- package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +358 -0
- 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
- package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +303 -0
- package/docs//346/236/266/346/236/204/344/270/216API.md +238 -0
- package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -0
- package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -0
- package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -0
- package/package.json +83 -0
- 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":";;AA4BA,sCA0DC;AAGD,sDAaC;AAGD,4CAMC;AAGD,wDAkBC;AAGD,kDAqBC;AAGD,gDAcC;AAnKD,6CAA0C;AAiB1C,2BAA2B;AAC3B,SAAgB,aAAa,CAAC,MAAc,EAAE,KAAc;IAC1D,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAE7C,OAAO;IACP,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC3I,OAAO;YACL,QAAQ,EAAE,eAAe;YACzB,OAAO,EAAE,KAAK,IAAI,MAAM;YACxB,OAAO,EAAE,6DAA6D;SACvE,CAAC;IACJ,CAAC;IAED,QAAQ;IACR,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAChJ,OAAO;YACL,QAAQ,EAAE,eAAe;YACzB,OAAO,EAAE,KAAK,IAAI,MAAM;YACxB,OAAO,EAAE,8BAA8B;SACxC,CAAC;IACJ,CAAC;IAED,OAAO;IACP,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACtI,OAAO;YACL,QAAQ,EAAE,gBAAgB;YAC1B,OAAO,EAAE,KAAK,IAAI,MAAM;YACxB,OAAO,EAAE,wCAAwC;SAClD,CAAC;IACJ,CAAC;IAED,KAAK;IACL,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACzF,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,KAAK,IAAI,MAAM;YACxB,OAAO,EAAE,8BAA8B;SACxC,CAAC;IACJ,CAAC;IAED,OAAO;IACP,IAAI,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5F,OAAO;YACL,QAAQ,EAAE,mBAAmB;YAC7B,OAAO,EAAE,KAAK,IAAI,MAAM;YACxB,OAAO,EAAE,2BAA2B;SACrC,CAAC;IACJ,CAAC;IAED,OAAO;IACP,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9G,OAAO;YACL,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,KAAK,IAAI,MAAM;YACxB,OAAO,EAAE,iCAAiC;SAC3C,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2BAA2B;AAC3B,SAAgB,qBAAqB,CAAC,aAA4B,EAAE,KAAc;IAChF,OAAO;;YAEG,aAAa,CAAC,QAAQ;YACtB,aAAa,CAAC,OAAO;YACrB,aAAa,CAAC,OAAO;;;;;;;CAOhC,CAAC;AACF,CAAC;AAED,mBAAmB;AACnB,SAAgB,gBAAgB,CAAC,QAAuB,EAAE,aAA4B,EAAE,IAAY;IAClG,MAAM,UAAU,GAAgB;QAC9B,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,qBAAqB,CAAC,aAAa,EAAE,IAAI,CAAC;KACpD,CAAC;IACF,OAAO,CAAC,GAAG,QAAQ,EAAE,UAAU,CAAC,CAAC;AACnC,CAAC;AAED,eAAe;AACf,SAAgB,sBAAsB,CAAC,QAAuB,EAAE,UAAkB;IAChF,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACvD,MAAM,EAAE,CAAC;QACX,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/D,cAAc;YACd,MAAM;QACR,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,4BAA4B;YAC5B,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO;QACL,MAAM,EAAE,MAAM,IAAI,UAAU;QAC5B,MAAM;KACP,CAAC;AACJ,CAAC;AAED,sBAAsB;AACtB,SAAgB,mBAAmB,CAAC,QAAuB,EAAE,MAAuB;IAIlF,eAAe;IACf,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAE3C,gBAAgB;IAChB,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACvC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,QAAQ,SAAS,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACrE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,UAAU,GAAgB;QAC9B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,wBAAwB,YAAY,0BAA0B;KACxE,CAAC;IAEF,OAAO;QACL,QAAQ,EAAE,CAAC,UAAU,EAAE,GAAG,cAAc,CAAC;QACzC,aAAa,EAAE,QAAQ,CAAC,MAAM;KAC/B,CAAC;AACJ,CAAC;AAED,gBAAgB;AACT,KAAK,UAAU,kBAAkB,CACtC,QAAuE,EACvE,SAAiB,EACjB,aAA4B,EAC5B,OAAgB;IAEhB,MAAM,QAAQ,CAAC,MAAM,CAAC,mBAAmB,EAAE;QACzC,SAAS;QACT,QAAQ,EAAE,aAAa,CAAC,QAAQ;QAChC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QAC5C,OAAO;QACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IACH,eAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AACtG,CAAC"}
|
|
@@ -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"}
|