feihong-code 0.2.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +392 -0
- package/CODE_OF_CONDUCT.md +56 -56
- package/CONTRIBUTING.md +68 -68
- package/LICENSE +22 -22
- package/README.md +586 -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 +74 -18
- 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 +319 -84
- package/dist/agent/experience.js.map +1 -1
- package/dist/agent/orchestrator.js +233 -71
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/planner.js +30 -7
- package/dist/agent/planner.js.map +1 -1
- package/dist/agent/prompts.js +9 -0
- package/dist/agent/prompts.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 +80 -60
- 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 +600 -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 +145 -23
- 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 +100 -27
- package/dist/models/model-router.js.map +1 -1
- package/dist/models/model.dto.js +25 -3
- package/dist/models/model.dto.js.map +1 -1
- package/dist/models/providers/ollama.provider.js +12 -0
- package/dist/models/providers/ollama.provider.js.map +1 -1
- package/dist/models/providers/openai-compatible.provider.js +14 -1
- package/dist/models/providers/openai-compatible.provider.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/self-evolve/hook.ts +80 -0
- package/dist/self-evolve/manager.d.ts +8 -0
- package/dist/self-evolve/manager.js +401 -0
- package/dist/shared/config.js +35 -3
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/errors.js +6 -2
- package/dist/shared/errors.js.map +1 -1
- package/dist/shared/i18n.js +535 -0
- package/dist/shared/i18n.js.map +1 -0
- package/dist/shared/secure-store.js +117 -0
- package/dist/shared/secure-store.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 +194 -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 +72 -3
- package/dist/tools/shell/exec.js.map +1 -1
- package/dist/tools/shell/run-shell.tool.js +37 -7
- 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 +69 -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 +178 -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/css/style.css +1546 -0
- package/dist/web/public/index.html +804 -37
- package/dist/web/public/js/api.js +309 -0
- package/dist/web/public/js/app.js +1472 -0
- package/dist/web/public/js/ui.js +832 -0
- package/dist/web/public/js/utils.js +170 -0
- package/dist/web/server.js +937 -11
- package/dist/web/server.js.map +1 -1
- package/dist/web/task-queue.js +470 -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/App/344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +299 -0
- package/docs/App/346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +554 -0
- package/docs/Deployment_Guide_EN.md +288 -0
- package/docs/SELF-EVOLVE-GUIDE.md +313 -0
- package/docs/Technical_Manual_EN.md +216 -0
- package/docs/User_Manual_EN.md +314 -0
- package/docs/error-codes.md +198 -0
- package/docs/screenshots/cli-demo.png +0 -0
- package/docs/screenshots/feature-comparison.png +0 -0
- package/docs/screenshots/web-console.png +0 -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/docs//351/241/265/351/235/242/345/212/237/350/203/275/345/244/215/347/233/230/344/270/216/345/206/222/347/203/237/346/265/213/350/257/225/346/212/245/345/221/212.html +117 -0
- package/package.json +108 -109
- package/tool-schema.json +117 -46
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
# 飞虹 Code - 自我迭代升级系统
|
|
2
|
+
|
|
3
|
+
> 让 AI 编程助手能够自我学习、持续进化
|
|
4
|
+
|
|
5
|
+
## 🎯 系统概述
|
|
6
|
+
|
|
7
|
+
Self-Evolve 是飞虹 Code 的**元技能系统**,让它能够:
|
|
8
|
+
|
|
9
|
+
1. **自动记录失败** - 每次任务失败都会被记录并分析
|
|
10
|
+
2. **提取错误模式** - 识别重复出现的错误类型
|
|
11
|
+
3. **创建解决技能** - 当遇到无解问题时,自动生成新技能
|
|
12
|
+
4. **定期复盘优化** - 每日/每周回顾,持续改进
|
|
13
|
+
|
|
14
|
+
## 📦 包含内容
|
|
15
|
+
|
|
16
|
+
### 核心系统
|
|
17
|
+
- `skills/self-evolve/SKILL.md` - Self-Evolve 技能定义
|
|
18
|
+
- `src/self-evolve/manager.js` - 核心管理器
|
|
19
|
+
- `src/self-evolve/hook.ts` - 集成钩子
|
|
20
|
+
- `src/cli/self-evolve-cli.js` - 命令行接口
|
|
21
|
+
|
|
22
|
+
### 文档
|
|
23
|
+
- `docs/self-evolve.md` - 用户文档
|
|
24
|
+
- `docs/self-evolve-implementation.md` - 实现指南
|
|
25
|
+
|
|
26
|
+
### 测试
|
|
27
|
+
- `tests/unit/self-evolve.test.js` - 单元测试
|
|
28
|
+
- `tests/demo/self-evolve-demo.js` - 演示脚本
|
|
29
|
+
|
|
30
|
+
### 脚本
|
|
31
|
+
- `scripts/self-evolve-setup.sh` - 初始化脚本
|
|
32
|
+
- `scripts/quick-start.js` - 快速开始脚本
|
|
33
|
+
|
|
34
|
+
## 🚀 快速开始
|
|
35
|
+
|
|
36
|
+
### 1. 初始化系统
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# 运行安装脚本
|
|
40
|
+
bash scripts/self-evolve-setup.sh
|
|
41
|
+
|
|
42
|
+
# 或使用 Node.js 快速开始
|
|
43
|
+
node scripts/quick-start.js
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 2. 查看系统状态
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# 设置别名(可选)
|
|
50
|
+
alias fe='fhcode self-evolve'
|
|
51
|
+
|
|
52
|
+
# 查看统计
|
|
53
|
+
fe status
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 3. 开始使用
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# 列出失败记录
|
|
60
|
+
fe failures list
|
|
61
|
+
|
|
62
|
+
# 查看技能库
|
|
63
|
+
fe skills list
|
|
64
|
+
|
|
65
|
+
# 每日复盘
|
|
66
|
+
fe review --daily
|
|
67
|
+
|
|
68
|
+
# 分析错误模式
|
|
69
|
+
fe analyze
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## 📊 核心功能
|
|
73
|
+
|
|
74
|
+
### 失败记录
|
|
75
|
+
自动记录所有失败的执行,包括:
|
|
76
|
+
- 错误类型(编译、运行时、路径、权限、API等)
|
|
77
|
+
- 完整的错误信息
|
|
78
|
+
- 尝试的解决方案
|
|
79
|
+
- 根本原因分析
|
|
80
|
+
|
|
81
|
+
### 错误模式识别
|
|
82
|
+
- 按类型统计失败频率
|
|
83
|
+
- 识别重复出现的错误
|
|
84
|
+
- 建议创建针对性技能
|
|
85
|
+
|
|
86
|
+
### 技能自动生成
|
|
87
|
+
当遇到无法解决的新问题时:
|
|
88
|
+
```bash
|
|
89
|
+
# 系统会提示创建技能
|
|
90
|
+
fe create-skill \
|
|
91
|
+
--name my-error-handler \
|
|
92
|
+
--description "处理我的特定错误" \
|
|
93
|
+
--pattern error-type \
|
|
94
|
+
--solution "具体解决步骤" \
|
|
95
|
+
--triggers "触发关键词"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 定期复盘
|
|
99
|
+
```bash
|
|
100
|
+
# 每日复盘
|
|
101
|
+
fe review --daily
|
|
102
|
+
|
|
103
|
+
# 查看周统计
|
|
104
|
+
fe status --week
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## 🔄 工作流程
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
任务执行
|
|
111
|
+
↓
|
|
112
|
+
成功? → 记录成功
|
|
113
|
+
↓ 失败
|
|
114
|
+
自动记录失败
|
|
115
|
+
↓
|
|
116
|
+
搜索已知解决方案
|
|
117
|
+
↓ 找到 → 应用方案
|
|
118
|
+
↓ 未找到
|
|
119
|
+
分析根因
|
|
120
|
+
↓
|
|
121
|
+
创建新技能? → 是 → 保存到 ~/.feihong-code/skills/
|
|
122
|
+
↓ 否
|
|
123
|
+
标记待人工处理
|
|
124
|
+
↓
|
|
125
|
+
每日复盘 → 优化系统
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## 📁 数据结构
|
|
129
|
+
|
|
130
|
+
所有数据存储在 `~/.feihong-code/self-evolve/`:
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
~/.feihong-code/
|
|
134
|
+
├── self-evolve/
|
|
135
|
+
│ ├── config.json # 配置
|
|
136
|
+
│ ├── failures.json # 失败记录
|
|
137
|
+
│ ├── skills-index.json # 技能索引
|
|
138
|
+
│ ├── history.json # 操作历史
|
|
139
|
+
│ └── report-YYYY-MM-DD.json # 每日报告
|
|
140
|
+
├── skills/
|
|
141
|
+
│ └── <skill-name>/
|
|
142
|
+
│ └── SKILL.md
|
|
143
|
+
└── ...
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## 🔧 集成开发
|
|
147
|
+
|
|
148
|
+
### 在工具中记录失败
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
import { selfEvolveHook } from './self-evolve/hook.ts';
|
|
152
|
+
|
|
153
|
+
try {
|
|
154
|
+
await someToolCall(input);
|
|
155
|
+
} catch (error) {
|
|
156
|
+
selfEvolveHook.onToolFailure({
|
|
157
|
+
tool: 'tool-name',
|
|
158
|
+
input: input,
|
|
159
|
+
error: error.message,
|
|
160
|
+
attemptedSolutions: []
|
|
161
|
+
});
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### 定期复盘
|
|
167
|
+
|
|
168
|
+
```javascript
|
|
169
|
+
// 每天运行
|
|
170
|
+
const report = await selfEvolveHook.dailyReview();
|
|
171
|
+
console.log(`今日失败: ${report.total_failures}`);
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## 📚 与现有系统集成
|
|
175
|
+
|
|
176
|
+
Self-Evolve 可以与以下技能配合:
|
|
177
|
+
|
|
178
|
+
| 技能 | 集成点 | 作用 |
|
|
179
|
+
|------|--------|------|
|
|
180
|
+
| `/self-heal` | 自动创建修复技能 | 解决技术错误 |
|
|
181
|
+
| `/plan` | 计划时参考历史 | 避免重复失败 |
|
|
182
|
+
| `/goal` | 目标设定参考 | 追踪迭代进度 |
|
|
183
|
+
|
|
184
|
+
## 🎯 使用示例
|
|
185
|
+
|
|
186
|
+
### 示例1:处理编译错误
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
# 分析最近7天的编译错误
|
|
190
|
+
fe analyze --days 7 --type compile-error
|
|
191
|
+
|
|
192
|
+
# 创建通用编译错误处理技能
|
|
193
|
+
fe create-skill \
|
|
194
|
+
--name compile-error-handler \
|
|
195
|
+
--description "处理TypeScript编译错误" \
|
|
196
|
+
--pattern compile-error \
|
|
197
|
+
--solution "1. 检查导入路径\n2. 验证类型定义\n3. 安装缺失依赖" \
|
|
198
|
+
--triggers "error TS, syntax error, cannot find module"
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### 示例2:处理路径穿越
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
# 创建路径安全技能
|
|
205
|
+
fe create-skill \
|
|
206
|
+
--name path-security-handler \
|
|
207
|
+
--description "处理路径穿越安全问题" \
|
|
208
|
+
--pattern path-error \
|
|
209
|
+
--solution "1. 验证路径在workspace内\n2. 使用相对路径\n3. 规范化路径" \
|
|
210
|
+
--triggers "path traversal, outside workspace, EACCES"
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### 示例3:查看每日复盘
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
fe review --daily
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
输出:
|
|
220
|
+
```
|
|
221
|
+
📅 每日复盘报告
|
|
222
|
+
========================================
|
|
223
|
+
日期: 2026-08-16
|
|
224
|
+
失败任务: 5
|
|
225
|
+
已解决: 3
|
|
226
|
+
待处理: 2
|
|
227
|
+
新技能: 1
|
|
228
|
+
|
|
229
|
+
今日失败详情:
|
|
230
|
+
✅ [a1b2c3d4] compile-error: error TS2307...
|
|
231
|
+
⏳ [e5f6g7h8] path-error: Path traversal...
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## 🛡️ 纪律与原则
|
|
235
|
+
|
|
236
|
+
1. **诚实记录** - 失败就是失败,不伪造成功
|
|
237
|
+
2. **及时复盘** - 每日至少一次复盘分析
|
|
238
|
+
3. **渐进改进** - 每次迭代只优化一个方面
|
|
239
|
+
4. **验证优先** - 新技能必须经过测试验证
|
|
240
|
+
5. **可追溯** - 所有变更记录保存历史版本
|
|
241
|
+
|
|
242
|
+
## 📈 版本历史
|
|
243
|
+
|
|
244
|
+
- **v1.0.0** (2026-08-16) - 初始版本
|
|
245
|
+
- 基础失败记录功能
|
|
246
|
+
- 技能自动生成
|
|
247
|
+
- 每日复盘
|
|
248
|
+
- CLI 接口
|
|
249
|
+
|
|
250
|
+
## 🔮 未来规划
|
|
251
|
+
|
|
252
|
+
- [ ] 自动检测技能冲突
|
|
253
|
+
- [ ] 技能效果追踪
|
|
254
|
+
- [ ] 团队共享技能库
|
|
255
|
+
- [ ] AI 辅助技能创建
|
|
256
|
+
- [ ] 失败预测模型
|
|
257
|
+
|
|
258
|
+
## 🤝 贡献指南
|
|
259
|
+
|
|
260
|
+
欢迎贡献!请遵循以下步骤:
|
|
261
|
+
|
|
262
|
+
1. Fork 本仓库
|
|
263
|
+
2. 创建特性分支 (`git checkout -b feature/amazing-feature`)
|
|
264
|
+
3. 提交更改 (`git commit -m 'Add amazing feature'`)
|
|
265
|
+
4. 推送到分支 (`git push origin feature/amazing-feature`)
|
|
266
|
+
5. 创建 Pull Request
|
|
267
|
+
|
|
268
|
+
## 📄 许可证
|
|
269
|
+
|
|
270
|
+
MIT License
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
**让飞虹 Code 越来越聪明!** 🚀
|
|
@@ -57,6 +57,8 @@ function reviewCode(filePath, content, rules = DEFAULT_RULES) {
|
|
|
57
57
|
for (let i = 0; i < lines.length; i++) {
|
|
58
58
|
const line = lines[i];
|
|
59
59
|
for (const rule of rules) {
|
|
60
|
+
// 关键:规则正则带 g 标志时 RegExp.test 会残留 lastIndex,必须每次重置,否则跨行误判
|
|
61
|
+
rule.pattern.lastIndex = 0;
|
|
60
62
|
if (rule.pattern.test(line)) {
|
|
61
63
|
issues.push({
|
|
62
64
|
ruleId: rule.id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-review.js","sourceRoot":"","sources":["../../src/agent/code-review.ts"],"names":[],"mappings":";;AAwEA,
|
|
1
|
+
{"version":3,"file":"code-review.js","sourceRoot":"","sources":["../../src/agent/code-review.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,10 +7,12 @@ exports.createCodeWriter = createCodeWriter;
|
|
|
7
7
|
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
8
8
|
*
|
|
9
9
|
* 自主代码编写器(M8):
|
|
10
|
-
* - 任务规划 → 代码编写 → 测试生成 → 审查反馈 → 迭代优化
|
|
10
|
+
* - 任务规划 → 代码编写 → 测试生成 → 审查反馈 → 自愈修复 → 迭代优化
|
|
11
11
|
* - 内置代码生成模板(API 路由、Model、工具骨架)
|
|
12
12
|
* - 自动测试生成(Jest/Vitest)
|
|
13
13
|
* - 质量门禁集成(审查规则 + 分析结果)
|
|
14
|
+
* - 安全修复:仅对已知安全模式做针对性修复,杜绝「通配正则整体覆盖文件」的破坏性修复
|
|
15
|
+
* - 自愈闭环:审查 → 修复 → 复审查,多轮收敛至无高优先级问题
|
|
14
16
|
*/
|
|
15
17
|
const fs_1 = require("fs");
|
|
16
18
|
const path_1 = require("path");
|
|
@@ -69,7 +71,8 @@ class CodeWriter {
|
|
|
69
71
|
}
|
|
70
72
|
code = result.content;
|
|
71
73
|
if (template === 'api-route') {
|
|
72
|
-
|
|
74
|
+
// Windows 文件名不含 ':',将路径段中非法字符替换为 '-'
|
|
75
|
+
filename = params.path.replace(/^\//, '').replace(/[^a-zA-Z0-9-]/g, '-').replace(/-+/g, '-').replace(/-$/, '') + '.ts';
|
|
73
76
|
}
|
|
74
77
|
else if (template === 'model') {
|
|
75
78
|
filename = params.name + '.ts';
|
|
@@ -99,7 +102,7 @@ class CodeWriter {
|
|
|
99
102
|
return { type: 'review', content: `跳过审查:文件不存在 ${filePath}` };
|
|
100
103
|
}
|
|
101
104
|
const content = (0, fs_1.readFileSync)(absPath, 'utf8');
|
|
102
|
-
const result = (0, code_review_1.reviewCode)(filePath, content, this.rules);
|
|
105
|
+
const result = (0, code_review_1.reviewCode)(filePath, content, this.rules.length ? this.rules : undefined);
|
|
103
106
|
this.issuesFound += result.issues.length;
|
|
104
107
|
const step = {
|
|
105
108
|
type: 'review',
|
|
@@ -110,31 +113,75 @@ class CodeWriter {
|
|
|
110
113
|
console.log(`[M8 Review] ${step.content}`);
|
|
111
114
|
return step;
|
|
112
115
|
}
|
|
113
|
-
/**
|
|
116
|
+
/**
|
|
117
|
+
* 阶段 5:安全修复高优先级问题
|
|
118
|
+
* 关键安全约束:仅对「硬编码密钥 / SQL 拼接」等已知安全模式做针对性替换(替换首个匹配),
|
|
119
|
+
* 任何无明确安全方案的问题一律跳过并提示人工处理,绝不使用通配正则把整个文件覆盖为建议文本。
|
|
120
|
+
*/
|
|
114
121
|
fix(filePath, maxFixes = 3) {
|
|
115
122
|
const absPath = (0, path_1.join)(this.cwd, filePath);
|
|
116
123
|
if (!(0, fs_1.existsSync)(absPath)) {
|
|
117
124
|
return { type: 'fix', content: `文件不存在 ${filePath}` };
|
|
118
125
|
}
|
|
119
126
|
const content = (0, fs_1.readFileSync)(absPath, 'utf8');
|
|
120
|
-
const result = (0, code_review_1.reviewCode)(filePath, content, this.rules);
|
|
127
|
+
const result = (0, code_review_1.reviewCode)(filePath, content, this.rules.length ? this.rules : undefined);
|
|
121
128
|
const highIssues = result.issues.filter((i) => i.severity === 'high').slice(0, maxFixes);
|
|
122
129
|
if (highIssues.length === 0) {
|
|
123
130
|
return { type: 'fix', content: '无高优先级问题需要修复' };
|
|
124
131
|
}
|
|
125
132
|
let newContent = content;
|
|
133
|
+
const applied = [];
|
|
126
134
|
for (const issue of highIssues) {
|
|
127
|
-
const
|
|
128
|
-
|
|
135
|
+
const safeFix = this.issueToSafeFix(issue);
|
|
136
|
+
if (!safeFix)
|
|
137
|
+
continue; // 仅做安全修复
|
|
138
|
+
const next = newContent.replace(safeFix.pattern, safeFix.replacement);
|
|
139
|
+
if (next !== newContent) {
|
|
140
|
+
newContent = next;
|
|
141
|
+
applied.push(issue.message);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (applied.length === 0) {
|
|
145
|
+
return {
|
|
146
|
+
type: 'fix',
|
|
147
|
+
content: `高优先级问题无安全自动修复,建议人工处理: ${highIssues.map((i) => i.message).join(', ')}`,
|
|
148
|
+
file: filePath,
|
|
149
|
+
};
|
|
129
150
|
}
|
|
130
151
|
(0, fs_1.writeFileSync)(absPath, newContent, 'utf8');
|
|
131
|
-
this.issuesFixed +=
|
|
152
|
+
this.issuesFixed += applied.length;
|
|
132
153
|
return {
|
|
133
154
|
type: 'fix',
|
|
134
|
-
content:
|
|
155
|
+
content: `已安全修复 ${applied.length} 个高优先级问题: ${applied.join(', ')}`,
|
|
135
156
|
file: filePath,
|
|
136
157
|
};
|
|
137
158
|
}
|
|
159
|
+
/**
|
|
160
|
+
* 阶段 5b:自愈闭环
|
|
161
|
+
* 审查 → 修复 → 复审查,最多 maxRounds 轮,直到无高优先级问题或达上限。
|
|
162
|
+
* 修复动作复用安全修复(不会破坏文件),输出每轮收敛情况。
|
|
163
|
+
*/
|
|
164
|
+
selfHealFix(filePath, maxRounds = 3) {
|
|
165
|
+
const steps = [];
|
|
166
|
+
for (let round = 0; round < maxRounds; round++) {
|
|
167
|
+
this.review(filePath); // 推入审查步骤
|
|
168
|
+
const fixStep = this.fix(filePath);
|
|
169
|
+
steps.push(fixStep);
|
|
170
|
+
// 静默复审查(不重复推步骤),判定是否收敛
|
|
171
|
+
const absPath = (0, path_1.join)(this.cwd, filePath);
|
|
172
|
+
if (!(0, fs_1.existsSync)(absPath))
|
|
173
|
+
break;
|
|
174
|
+
const content = (0, fs_1.readFileSync)(absPath, 'utf8');
|
|
175
|
+
const re = (0, code_review_1.reviewCode)(filePath, content, this.rules);
|
|
176
|
+
const high = re.issues.filter((i) => i.severity === 'high').length;
|
|
177
|
+
if (high === 0) {
|
|
178
|
+
steps.push({ type: 'fix', content: `自愈收敛:第 ${round + 1} 轮后无高优先级问题` });
|
|
179
|
+
return steps;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
steps.push({ type: 'fix', content: `已达自愈上限(${maxRounds}轮),剩余高优先级问题建议人工复核` });
|
|
183
|
+
return steps;
|
|
184
|
+
}
|
|
138
185
|
/** 阶段 6:分析代码质量 */
|
|
139
186
|
analyze(filePath) {
|
|
140
187
|
const absPath = (0, path_1.join)(this.cwd, filePath);
|
|
@@ -158,14 +205,14 @@ class CodeWriter {
|
|
|
158
205
|
this.steps.push(step);
|
|
159
206
|
return step;
|
|
160
207
|
}
|
|
161
|
-
/** 完整流程:规划 → 编写 → 测试 → 审查 →
|
|
208
|
+
/** 完整流程:规划 → 编写 → 测试 → 审查 → 自愈修复 → 总结 */
|
|
162
209
|
async run(goal, code, filePath) {
|
|
163
210
|
this.plan(goal);
|
|
164
211
|
this.write(code, filePath);
|
|
165
212
|
this.test(filePath);
|
|
166
213
|
this.review(filePath);
|
|
167
214
|
this.analyze(filePath);
|
|
168
|
-
this.
|
|
215
|
+
this.selfHealFix(filePath, 3);
|
|
169
216
|
this.summary();
|
|
170
217
|
return this.getResult();
|
|
171
218
|
}
|
|
@@ -206,17 +253,26 @@ class CodeWriter {
|
|
|
206
253
|
const match = content.match(/export\s+(?:async\s+)?function\s+(\w+)/);
|
|
207
254
|
return match?.[1] || 'main';
|
|
208
255
|
}
|
|
209
|
-
|
|
210
|
-
|
|
256
|
+
/**
|
|
257
|
+
* 将审查问题映射到「安全修复」。
|
|
258
|
+
* 仅对硬编码密钥、SQL 拼接两类有明确安全方案的问题生成针对性正则;其余一律返回 null。
|
|
259
|
+
*/
|
|
260
|
+
issueToSafeFix(issue) {
|
|
261
|
+
if (/硬编码|密码|密钥|secret|token|api[_-]?key/i.test(issue.message)) {
|
|
262
|
+
// 匹配变量名含敏感关键词(password/secret/token/apiKey)且赋值为字符串字面量的模式
|
|
263
|
+
// 例如:const dbPassword = "password-abc-123"; 或 const apiKey = 'sk-123';
|
|
211
264
|
return {
|
|
212
|
-
pattern: /[
|
|
213
|
-
replacement:
|
|
265
|
+
pattern: /(\w*[Pp]assword\w*|\w*[Ss]ecret\w*|\w*[Tt]oken\w*|\w*[Aa][Pp][Ii]?\w*[Kk]ey\w*)\s*=\s*(['"`])([^'"`]+)\2/gi,
|
|
266
|
+
replacement: '$1 = process.env.FH_SECRET',
|
|
214
267
|
};
|
|
215
268
|
}
|
|
216
|
-
if (issue.message
|
|
217
|
-
return {
|
|
269
|
+
if (/sql/i.test(issue.message)) {
|
|
270
|
+
return {
|
|
271
|
+
pattern: /(['"`])[\s\S]*?select[\s\S]*?\1/gi,
|
|
272
|
+
replacement: '/* 使用参数化查询,避免 SQL 拼接 */',
|
|
273
|
+
};
|
|
218
274
|
}
|
|
219
|
-
return
|
|
275
|
+
return null;
|
|
220
276
|
}
|
|
221
277
|
}
|
|
222
278
|
exports.CodeWriter = CodeWriter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-writer.js","sourceRoot":"","sources":["../../src/agent/code-writer.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"code-writer.js","sourceRoot":"","sources":["../../src/agent/code-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -65,10 +65,16 @@ function compactContext(messages, preservedCount = 10) {
|
|
|
65
65
|
// 始终保留首条 system 指令(messages[0]),避免压缩后丢失系统级提示导致行为退化
|
|
66
66
|
const systemMsg = messages[0]?.role === 'system' ? messages[0] : null;
|
|
67
67
|
const body = systemMsg ? messages.slice(1) : messages;
|
|
68
|
+
// P0 修复:始终保留首条 user 消息(即原始目标),否则压缩后消息数组不再含 user 角色,
|
|
69
|
+
// 部分模型网关(如 agnes-ai.cn)会拒绝并返回 "No user query found in messages"。
|
|
70
|
+
// 先把首条 user 从 body 中摘除,压缩后再放回,避免在 recent 中重复。
|
|
71
|
+
const firstUserIdx = body.findIndex((m) => m.role === 'user');
|
|
72
|
+
const firstUser = firstUserIdx >= 0 ? body[firstUserIdx] : undefined;
|
|
73
|
+
const bodySansUser = firstUser ? [...body.slice(0, firstUserIdx), ...body.slice(firstUserIdx + 1)] : body;
|
|
68
74
|
const totalRounds = Math.floor(body.length / 2); // 假设每轮 2 条消息(assistant + tool)
|
|
69
|
-
const preservedMessages = Math.min(preservedCount * 2,
|
|
70
|
-
const earlyMessages =
|
|
71
|
-
const recentMessages =
|
|
75
|
+
const preservedMessages = Math.min(preservedCount * 2, bodySansUser.length);
|
|
76
|
+
const earlyMessages = bodySansUser.slice(0, bodySansUser.length - preservedMessages);
|
|
77
|
+
const recentMessages = bodySansUser.slice(bodySansUser.length - preservedMessages);
|
|
72
78
|
if (earlyMessages.length === 0) {
|
|
73
79
|
return { messages, stats: { originalLength: messages.length, compressedLength: messages.length, preservedMessages, compressedRounds: 0, timestamp: new Date().toISOString() } };
|
|
74
80
|
}
|
|
@@ -81,7 +87,10 @@ function compactContext(messages, preservedCount = 10) {
|
|
|
81
87
|
content: compactionPrompt,
|
|
82
88
|
};
|
|
83
89
|
const prefix = systemMsg ? [systemMsg, systemHint] : [systemHint];
|
|
84
|
-
|
|
90
|
+
// 首条 user 目标始终置于 system 之后、recent 之前,保证下游模型请求必含 user 角色
|
|
91
|
+
const compacted = firstUser
|
|
92
|
+
? [...prefix, firstUser, ...recentMessages]
|
|
93
|
+
: [...prefix, ...recentMessages];
|
|
85
94
|
const stats = {
|
|
86
95
|
originalLength: messages.length,
|
|
87
96
|
compressedLength: compacted.length,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-compactor.js","sourceRoot":"","sources":["../../src/agent/context-compactor.ts"],"names":[],"mappings":";;AA8FA,
|
|
1
|
+
{"version":3,"file":"context-compactor.js","sourceRoot":"","sources":["../../src/agent/context-compactor.ts"],"names":[],"mappings":";;AA8FA,wCAuDC;AAGD,sCAEC;AAGD,wDAEC;AApJD,6CAA0C;AAU1C,oBAAoB;AACpB,SAAS,cAAc,CAAC,QAAuB;IAK7C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,SAAS;QACT,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAC9C,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC/B,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBACxD,MAAM,IAAI,GAAI,EAAE,CAAC,SAA+B,EAAE,IAAI,CAAC;oBACvD,IAAI,IAAI;wBAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACpC,CAAC;gBACD,IAAI,EAAE,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBAC5B,MAAM,GAAG,GAAI,EAAE,CAAC,SAAkC,EAAE,OAAO,IAAI,EAAE,CAAC;oBAClE,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;wBAC9D,cAAc,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,SAAS;QACT,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YAC5B,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/E,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,cAAc,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACxD,aAAa,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC9C,WAAW,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,2BAA2B;AAC3B,SAAS,wBAAwB,CAAC,OAIjC,EAAE,cAAsB,EAAE,WAAmB;IAC5C,MAAM,KAAK,GAAa,CAAC,kBAAkB,CAAC,CAAC;IAE7C,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,aAAa,CAAC,MAAM,SAAS,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnI,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,oBAAoB,WAAW,GAAG,cAAc,eAAe,cAAc,QAAQ,CAAC,CAAC;IAElG,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;GAKG;AACH,SAAgB,cAAc,CAC5B,QAAuB,EACvB,iBAAyB,EAAE;IAE3B,mDAAmD;IACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtE,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEtD,oDAAoD;IACpD,iEAAiE;IACjE,8CAA8C;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE1G,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,+BAA+B;IAChF,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5E,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC;IACrF,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC;IAEnF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,cAAc,EAAE,QAAQ,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,CAAC,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;IAClL,CAAC;IAED,OAAO;IACP,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,OAAO,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAC;IAE3F,kDAAkD;IAClD,MAAM,UAAU,GAAgB;QAC9B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,gBAAgB;KAC1B,CAAC;IACF,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAElE,wDAAwD;IACxD,MAAM,SAAS,GAAkB,SAAS;QACxC,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC;QAC3C,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC;IACnC,MAAM,KAAK,GAAoB;QAC7B,cAAc,EAAE,QAAQ,CAAC,MAAM;QAC/B,gBAAgB,EAAE,SAAS,CAAC,MAAM;QAClC,iBAAiB;QACjB,gBAAgB,EAAE,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC;QACjE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,eAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;QACxC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;KACzC,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACxC,CAAC;AAED,iBAAiB;AACjB,SAAgB,aAAa,CAAC,QAAuB,EAAE,SAAiB;IACtE,OAAO,QAAQ,CAAC,MAAM,IAAI,SAAS,CAAC;AACtC,CAAC;AAED,gCAAgC;AAChC,SAAgB,sBAAsB,CAAC,SAAoC,EAAE;IAC3E,OAAO,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;AACnC,CAAC"}
|