Skip to content

fix: AI引擎选择/安全加固/前端事件修复 - #2

Open
123caiji wants to merge 8 commits into
mainfrom
fix/ai-engine-and-security-patches
Open

fix: AI引擎选择/安全加固/前端事件修复#2
123caiji wants to merge 8 commits into
mainfrom
fix/ai-engine-and-security-patches

Conversation

@123caiji

@123caiji 123caiji commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

综合问题清单与修复方案 (AI引擎/安全/前端/配置)

概述

在对 Vero 项目进行实战测试和代码审查后, 发现 11 个问题, 涉及 AI 引擎决策、安全认证、前端事件处理、配置管理、错误处理等方面。本 Issue 作为统一追踪入口, 所有修复集中在 PR #2


问题列表

🔴 Critical (严重)

P1: AI 未参与处理 — 旧 DeepSeekKey 未迁移到 providers 系统

现象: 配置了 DEEPSEEK_API_KEY 环境变量后启动战役, AI 始终未参与决策, 引擎自动回退到脚本模式。

根因: config.Load() 将环境变量 key 读取到旧字段 cfg.DeepSeekKey, 但没有迁移到 providers[deepseek].api_key。引擎选择逻辑优先检查 prov.APIKey, 该值为空, 导致回退。

修复:

  • config.go: Load() 中自动迁移旧 key 到 providers 系统, 自动切换 active_provider
  • campaign.go: 分离 hasProviderKey/hasOldDeepSeek/hasOldAnthropic 判断, 添加诊断日志

状态: ✅ 已修复 (PR #2)


P2: API 无认证 — 任意来源可触发战役/审批

现象: Vero HTTP API 完全无认证保护, 任意网络来源可启动战役、审批 HITL 请求、访问配置。

根因: 缺少认证中间件。

修复:

  • server.go: 添加 authGuard 中间件, 通过 VERO_AUTH_TOKEN 环境变量配置
  • 回环地址 (127.0.0.1/localhost) 免认证, 不影响本地开发
  • /healthz 端点始终免认证

状态: ✅ 已修复 (PR #2)


🟠 High (高)

P3: 引擎回退误显示为"engine 失败"

现象: 未配置 API Key 时, 前端显示红色"engine 失败"错误, 但实际只是引擎回退通知。

根因: 后端用 tool 事件 (success: false) 广播引擎回退, 前端将其渲染为失败。

修复:

  • campaign.go: 改用 warning 事件, 附带友好提示消息
  • types.ts: 添加 warning 事件类型
  • store.ts: 添加 warning 事件文本渲染
  • ChatView.tsx + index.css: 添加琥珀色 .text-warning 样式

状态: ✅ 已修复 (PR #2)


P4: MockLLM 接口不完整

现象: 脚本模式决策器 (MockLLM) 缺少 Planner/ErrorReporter/Rejecter/Reflector 等接口实现, 导致 targetInjector 类型断言全部失败。

根因: MockLLM 仅实现了 Propose, 但 targetInjector 需要透传全部可选能力。

修复:

  • mock.go: 实现 ProposePlan/LastError/OnReject/OnFailure/Reflect/ShouldRetry/AdjustArgsForRetry 等全部接口
  • mock_test.go: 添加单元测试覆盖

状态: ✅ 已修复 (PR #2)


P5: DeepSeek 401/403 静默空转

现象: API Key 无效时, 后端重试 3 次后当作"没有动作"返回 nil, 不向前端暴露失败原因, 战役空转。

根因: 密钥类错误重试无意义, 但代码仍继续重试。

修复:

  • 401/403 直接放弃, 设置 lastErr 并广播
  • 5xx 服务端错误才退避重试

状态: ✅ 已修复 (PR #2)


🟡 Medium (中)

P6: Claude 模型名错误

现象: claude.go 中硬编码的模型名 claude-3-opus-20240229 已过时/错误, API 调用失败。

修复: 更新为 claude-sonnet-4-20250514

状态: ✅ 已修复 (PR #2)


P7: VERO_HOST 环境变量缺失

现象: 服务默认绑定 127.0.0.1, Docker/Kubernetes 环境中无法对外暴露。

修复:

  • cmd/vero/main.go: 读取 VERO_HOST 环境变量 (默认 127.0.0.1)
  • docker-compose.yml: 声明 VERO_HOST=0.0.0.0

状态: ✅ 已修复 (PR #2)


P8: UTF-8 截断导致乱码

现象: code_audit.go 使用字节截断 (string(buf[:n])), 截断位置恰好多字节字符中间时产生乱码。

修复: 使用 tools.Clip (按 rune 边界截断) 替代字节截断

状态: ✅ 已修复 (PR #2)


🟢 Low (低)

P9: Docker 配置环境变量未声明

现象: docker-compose.yml 缺少 VERO_HOSTDEEPSEEK_API_KEYVERO_AUTH_TOKEN 等环境变量声明。

修复: docker-compose.yml 补全环境变量

状态: ✅ 已修复 (PR #2)


P10: chatText 重试次数不一致

现象: chatText (Observe/Reflect/Chat 用) 重试 2 次, proposePlan 重试 3 次。

修复: 统一为 3 次, 同时修复循环外声明残留上次响应字段的问题

状态: ✅ 已修复 (PR #2)


💭 Enhancement (架构改进)

P11: 规则引擎 + AI 外壳而非真正的 AI Agent

现象: Vero 定位为"AI 自主渗透智能体", 但实际架构是硬编码攻击序列 + LLM 选工具, 证据驱动仅为字符串匹配, 无跨会话记忆。

建议方向:

  • 引入真正的 ReAct/Reflexion 循环让 LLM 自主规划
  • 持久化战役教训, 跨会话复用
  • 证据验证从字符串匹配升级到语义校验

状态: ⚠️ 架构问题, 需长期设计改进, 本 PR 不涉及


修复提交

PR #2: #2
分支: fix/ai-engine-and-security-patchesmain
修改文件: 14 个, +450/-45 行

测试

  • ✅ 全部单元测试通过 (go test ./internal/...)
  • ✅ 编译成功 (go build ./...)
  • ✅ 二进制构建 (vero.exe)
  • ✅ 服务启动正常 (http://127.0.0.1:8000)

1. AI未参与处理: 旧DeepSeekKey未迁移到providers系统, 引擎回退脚本模式
   - config.go: Load()自动迁移旧key到providers, 自动切换active_provider
   - campaign.go: 统一引擎选择逻辑, 添加诊断日志

2. 引擎回退误显示为失败: tool事件改为warning事件
   - campaign.go: emit warning替代tool(success:false)
   - types.ts/store.ts/ChatView.tsx/index.css: 前端warning事件支持

3. API无认证: 添加authGuard中间件
   - server.go: Bearer token认证(回环免认证)

4. Claude模型名错误: 修正为claude-sonnet-4-20250514

5. VERO_HOST环境变量: 支持网络绑定(0.0.0.0)

6. UTF-8截断: code_audit.go用tools.Clip替代字节截断

7. MockLLM接口不完整: 实现Planner/ErrorReporter等全部接口

8. Docker配置: 环境变量补全

9. DeepSeek错误处理: 401/403直接告警, 不再静默空转

10. chatText重试次数对齐: 3次与proposePlan一致
- fmt(route): services/activated 兜底为 []
- fmt(path): nodes 兜底为 []
- applyEvent(route/path): 数组字段全部 ?? [] 兜底
- sse.ts: ingest(e) 加 try/catch 防止异常崩溃订阅, es.onerror 日志
- docs/ISSUES.md: 完整问题清单 (P0-P3), 含P1-3白屏根因分析与SSE验证结果
- server.go: handleCancel 调用 cancel 后立即广播 campaign_stopped 事件
- types.ts: 新增 campaign_stopped 事件类型定义
- store.ts: applyEvent 处理 campaign_stopped (status→idle, 清空hitl)
- actions.ts: cancelCampaign 先乐观更新 store 状态再请求后端
- sse.ts: 增加 onopen 连接日志, 区分首连失败 vs 断线重连
- store.ts: done事件处理改为status='idle', stage='idle', 清空hitl
- store.ts: reset('')空目标时status='idle'(新建会话), 有目标时status='running'(启动战役)
- ChatView.tsx: 输入框初始为空, start成功后清空, status从running→idle时自动清空
- ISSUES.md: 新增P1-5问题记录
@123caiji
123caiji force-pushed the fix/ai-engine-and-security-patches branch from 7274627 to 9f5433d Compare August 6, 2026 13:17
- store.ts: reset('')检测到running状态时自动调用/cancel停止后端goroutine
- store.ts: create回调加入get参数, 支持在action中读取当前状态
- ISSUES.md: 修正P1-5根因说明
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant