142 lines
9.3 KiB
Markdown
142 lines
9.3 KiB
Markdown
# Codebase Concerns
|
||
|
||
**Analysis Date:** 2026-04-07
|
||
|
||
## 简短结论
|
||
|
||
当前代码库后端能力完整、测试数量较多,但在“生产安全基线”和“运行时一致性”上存在高优先级缺口:API 鉴权缺失、回滚语义未闭环、流式事件链路缺少可恢复能力。前端主要问题是关键模块体量偏大与测试覆盖不均衡,短期会拖慢迭代速度,中期会放大回归风险。
|
||
|
||
## 优先级建议(面向规划)
|
||
|
||
- P0(立即):补齐网关鉴权与访问控制;补全 rollback 真回滚语义。
|
||
- P1(近期):修复消息角色归一化错误;完善 SSE 可恢复性与丢事件观测。
|
||
- P2(排期):拆分超大前端组件、收敛 demo 静态资源体积、减少“声明支持但未实现”的 API 选项。
|
||
|
||
## Tech Debt
|
||
|
||
**运行时回滚语义未实现(高优先级):**
|
||
- Issue: 取消 run 时支持 `action=rollback`,但实际未执行 checkpoint 回滚,仅记录日志并 `pass`。
|
||
- Files: `backend/packages/harness/deerflow/runtime/runs/worker.py`
|
||
- Impact: 前端/调用方会认为“已回滚”,但线程状态可能仍保留部分中间写入,导致状态一致性问题。
|
||
- Fix approach: 在 `rollback` 分支接入 checkpointer 的真实回退 API(按 `pre_run_checkpoint_id` 恢复),并补充回滚前后状态断言测试(成功、失败、并发取消三类)。
|
||
|
||
**后端代码布局存在“空 src + 实际实现在 packages”认知负债(中优先级):**
|
||
- Issue: 业务实现集中在 `backend/packages/harness/deerflow/`,而 `backend/src/` 仅有缓存产物目录结构,容易误导新贡献者。
|
||
- Files: `backend/packages/harness/deerflow/`, `backend/src/`
|
||
- Impact: 新代码落点不稳定、审查成本上升、重构时容易出现重复实现。
|
||
- Fix approach: 在贡献文档和目录说明中明确“单一真实源码根”;清理或显式标注 `backend/src/` 的用途,避免“影子目录”持续存在。
|
||
|
||
**前端关键组件体量过大(中优先级):**
|
||
- Issue: 交互核心组件单文件体量偏大,状态/视图/副作用耦合。
|
||
- Files: `frontend/src/components/ai-elements/prompt-input.tsx`, `frontend/src/components/workspace/input-box.tsx`, `frontend/src/components/workspace/artifacts/artifact-file-detail.tsx`
|
||
- Impact: 修改单一功能易触发连带回归,评审与测试成本高。
|
||
- Fix approach: 以“状态管理、上传/附件、动作菜单、发送流程”拆分子模块;每次拆分同步补充组件级测试。
|
||
|
||
## Known Bugs
|
||
|
||
**消息角色被错误归一化为 HumanMessage(高优先级):**
|
||
- Symptoms: 非 `user/human` 的消息(如 system/ai/tool)在输入归一化中被降级为 `HumanMessage`。
|
||
- Files: `backend/app/gateway/services.py`
|
||
- Trigger: `normalize_input()` 处理 `messages` 列表时遇到非用户角色。
|
||
- Workaround: 调用端仅传用户消息;系统消息改走其他配置通道。
|
||
|
||
**artifact 文本判定后仍可能触发 UTF-8 解码异常(中优先级):**
|
||
- Symptoms: 文件被判定为“文本”后直接 `read_text(encoding="utf-8")`,遇到非 UTF-8 内容可能返回 500。
|
||
- Files: `backend/app/gateway/routers/artifacts.py`
|
||
- Trigger: `is_text_file_by_content()` 返回 true,但实际编码非 UTF-8。
|
||
- Workaround: 使用 `download=true` 强制下载,避免 inline 文本解码路径。
|
||
|
||
**API 声明支持 `enqueue` 但运行时不支持(中优先级):**
|
||
- Symptoms: 请求模型允许 `multitask_strategy="enqueue"`,但运行时抛 `UnsupportedStrategyError`(501)。
|
||
- Files: `backend/app/gateway/routers/thread_runs.py`, `backend/packages/harness/deerflow/runtime/runs/manager.py`
|
||
- Trigger: 客户端按 schema 传入 `enqueue`。
|
||
- Workaround: 客户端仅使用 `reject|interrupt|rollback`。
|
||
|
||
## Security Considerations
|
||
|
||
**网关缺少统一鉴权/鉴别层(高优先级):**
|
||
- Risk: 线程、上传、技能、memory、run 控制等接口可被未授权调用(取决于外围网络暴露)。
|
||
- Files: `backend/app/gateway/app.py`, `backend/app/gateway/routers/*.py`
|
||
- Current mitigation: 注释说明依赖外层 nginx;代码内无显式 `Depends` 鉴权依赖。
|
||
- Recommendations: 在网关层增加统一认证中间件(JWT/API Key/Session 任一),并对高风险写操作路由做细粒度授权。
|
||
|
||
**本地 host bash 仅“尽力防护”,非强隔离(中高优先级):**
|
||
- Risk: 启用 `allow_host_bash` 后,命令路径校验强调 best-effort,且对 bash 写入限制不等同于读写工具限制。
|
||
- Files: `backend/packages/harness/deerflow/sandbox/tools.py`
|
||
- Current mitigation: 绝对路径校验、路径遍历检查、file:// 阻断、虚拟路径替换。
|
||
- Recommendations: 将 host bash 默认硬禁用;在生产配置强制容器沙箱;增加审计日志与策略开关(按工具/命令白名单)。
|
||
|
||
## Performance Bottlenecks
|
||
|
||
**流式桥接队列容量有限且存在丢事件(中优先级):**
|
||
- Problem: 单 run 队列默认上限 256;发布超时会丢事件,且仅日志告警。
|
||
- Files: `backend/packages/harness/deerflow/runtime/stream_bridge/memory.py`
|
||
- Cause: 内存队列 + 固定容量 + 没有持久化重放。
|
||
- Improvement path: 引入可重放后端(Redis/持久队列)或增大可配置容量;将 dropped_count 暴露为指标并设置告警阈值。
|
||
|
||
**前端仓库包含较大 demo 资产,影响构建/分发体积(中优先级):**
|
||
- Problem: `frontend/public/demo/` 包含较多图片/视频与线程快照。
|
||
- Files: `frontend/public/demo/threads/**`
|
||
- Cause: demo 内容直接入仓并随静态资源参与交付。
|
||
- Improvement path: 将大型 demo 资产迁移到对象存储/CDN 或按环境开关构建;保留最小样例集。
|
||
|
||
## Fragile Areas
|
||
|
||
**Run 生命周期与 SSE 消费链路耦合(中高优先级):**
|
||
- Files: `backend/app/gateway/services.py`, `backend/app/gateway/routers/thread_runs.py`, `backend/packages/harness/deerflow/runtime/runs/manager.py`, `backend/packages/harness/deerflow/runtime/stream_bridge/memory.py`
|
||
- Why fragile: 断线策略、取消语义、状态迁移、队列清理分散在多处,边界行为(断线+取消+重连)容易退化。
|
||
- Safe modification: 先补“状态机契约测试”再改逻辑;对 `cancel/rollback/interrupt` 统一建表驱动测试。
|
||
- Test coverage: 后端测试较多,但“断线重连 + 事件重放 + 回滚一致性”端到端场景仍有缺口。
|
||
|
||
**前端输入与工件详情模块变更风险高(中优先级):**
|
||
- Files: `frontend/src/components/workspace/input-box.tsx`, `frontend/src/components/ai-elements/prompt-input.tsx`, `frontend/src/components/workspace/artifacts/artifact-file-detail.tsx`
|
||
- Why fragile: 单文件承担过多职责,状态路径复杂。
|
||
- Safe modification: 采用“先抽 hooks/子组件,后迁移调用点”的两阶段改造;每步保留行为快照测试。
|
||
- Test coverage: `frontend/src/` 下单元测试文件较少(仅少量),复杂交互主要依赖 E2E。
|
||
|
||
## Scaling Limits
|
||
|
||
**Run/Stream 元数据以内存为中心,重启后状态不连续(中高优先级):**
|
||
- Current capacity: 单进程内存字典 + 队列;run 记录会延迟清理,stream 事件不支持回放。
|
||
- Limit: 进程重启或横向扩容后,`Last-Event-ID` 无法恢复历史事件;跨实例一致性弱。
|
||
- Files: `backend/packages/harness/deerflow/runtime/runs/manager.py`, `backend/packages/harness/deerflow/runtime/stream_bridge/memory.py`
|
||
- Scaling path: 引入跨实例共享存储(持久 run registry + 可回放事件流),并将 `last_event_id` 变为可用恢复机制。
|
||
|
||
## Dependencies at Risk
|
||
|
||
**前端依赖面较宽,升级波动风险上升(中优先级):**
|
||
- Risk: UI/渲染/动画/编辑器与 AI SDK 依赖较多,任一主版本变化可能触发连锁适配。
|
||
- Impact: 构建稳定性与行为一致性风险上升。
|
||
- Files: `frontend/package.json`
|
||
- Migration plan: 建立“核心依赖分层升级策略”(渲染内核、AI SDK、UI 库分批升级)与最小回归清单。
|
||
|
||
## Missing Critical Features
|
||
|
||
**后端 API 层缺少内建访问控制能力(高优先级):**
|
||
- Problem: 关键写操作接口缺少统一认证与授权依赖。
|
||
- Blocks: 无法安全对公网或多租户环境直接暴露网关。
|
||
- Files: `backend/app/gateway/app.py`, `backend/app/gateway/routers/*.py`
|
||
|
||
**SSE 可恢复协议未形成闭环(中高优先级):**
|
||
- Problem: 桥接层注明接受 `last_event_id` 但忽略重放。
|
||
- Blocks: 客户端断线恢复体验与长任务稳定性。
|
||
- Files: `backend/packages/harness/deerflow/runtime/stream_bridge/memory.py`
|
||
|
||
## Test Coverage Gaps
|
||
|
||
**前端复杂交互缺少充分单元/组件测试(中优先级):**
|
||
- What's not tested: 输入框状态机、附件生命周期、artifact 详情多分支渲染的细粒度行为。
|
||
- Files: `frontend/src/components/workspace/input-box.tsx`, `frontend/src/components/ai-elements/prompt-input.tsx`, `frontend/src/components/workspace/artifacts/artifact-file-detail.tsx`
|
||
- Risk: 小改动引发 UI 行为回归且难快速定位。
|
||
- Priority: High
|
||
|
||
**安全基线测试缺少“未认证访问”负向用例(高优先级):**
|
||
- What's not tested: 未携带认证凭据访问关键 API 的拒绝路径(当前实现层面未内建)。
|
||
- Files: `backend/app/gateway/routers/*.py`, `backend/tests/`
|
||
- Risk: 安全能力依赖部署外部组件,环境漂移即暴露风险。
|
||
- Priority: High
|
||
|
||
---
|
||
|
||
*Concerns audit: 2026-04-07*
|