cad5b14382
mcp-py 的 run_code/secure_sandbox 此前全是桩。落地两层防御:
1) 静态守卫 sandbox.SecureSandbox.static_guard(纯 AST,执行前第一道)
- 拦危险导入(os/sys/subprocess/socket/ctypes/pickle/requests…)、危险调用
(eval/exec/compile/__import__/open…)、逃逸属性(__subclasses__/__globals__…)、语法错误。
- 返回 (放行, 原因)。
2) 隔离执行 interpreter.CodeInterpreter.execute(Docker,真隔离)
- network_disabled 禁网;user=65534 非 root + cap_drop=ALL + no-new-privileges;
read_only 根 + /tmp tmpfs;mem/memswap(禁swap)/nano_cpus/pids_limit 限资源;
python -I 隔离模式;wait 超时即 kill;容器一次性 remove。
- 无 Docker SDK/daemon 时 available()=False 优雅降级,不阻断服务。
gateway:run_code(标准档 256m/0.5cpu/10s) 与 secure_sandbox(紧档 128m/5s) 均走
守卫→隔离,结果整理为 stdout/stderr/exit 可读文本。pyproject 启用 docker 依赖。
验证:
- 守卫 6 单测(放行安全码 / 拦危险导入·调用·逃逸属性 / 语法错误)全过。
- 隔离 4 项实跑(真 Docker):sum(range(10))→45 exit0;非root uid=65534;
禁网 urlopen 失败(DNS解析错);while True 超时 3s 被 kill。
- 无 Docker 降级测过。
生产加固:可把执行运行时换 gVisor(runsc)/Kata(已在注释/PROGRESS 标注)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
109 lines
6.3 KiB
Markdown
109 lines
6.3 KiB
Markdown
# sundynix-agentix · 进度清单
|
||
|
||
对照 [architecture.md](architecture.md)(5 层 + NATS 总线)与功能规划的完成度。**活文档:完成一项就把 `[ ]` 勾成 `[x]`。**
|
||
|
||
图例:`[x]` 已完成 · `[ ]` 未做 · 🟡 部分/桩(旁注说明)。最近更新:2026-06-17(至提交 `79f9912`)。
|
||
|
||
---
|
||
|
||
## 第 1 层 · CLIENT(sundynix-desktop)
|
||
|
||
- [x] React 19 + TypeScript + Tailwind 工业级 UI(🟡 自建 UI primitives,未用 shadcn —— 与架构图有偏差)
|
||
- [x] React Flow 编排画布 + JSON DSL 导出(含 branch 真/假边手柄)
|
||
- [x] Wails 本地 Go 运行时 + TS/Go 强绑定 + 本地文件 I/O(另存为 / 系统打开 / 系统通知)
|
||
- [x] 浏览器模式优雅降级(无 Wails 运行时也能跑)
|
||
- [x] ⌘K 命令面板
|
||
- [x] 运行·观测:节点级实时执行轨迹(SSE)
|
||
- [x] 顶栏依赖健康五盏灯
|
||
- [x] 知识库:入库可视化(解析→切块→向量化→抽取时间线)
|
||
- [x] 知识库:批量文件 / 文件夹入库 + 列表状态
|
||
- [x] 知识库:Obsidian 式文库(Markdown 阅读 + `[[双链]]` + 反链 + 笔记关系图)
|
||
- [x] 知识库:检索调试台 + 知识图谱(react-force-graph 力导向)
|
||
- [x] 报告:Markdown 实时预览 + 导出 Word / PDF / Markdown
|
||
- [ ] 🟡 PDF 导出走 webview 打印 —— **Wails 真机未验证**(浏览器预览 OK)
|
||
|
||
## 第 2 层 · BUSINESS GATEWAY(sundynix-gateway · Gin)
|
||
|
||
- [x] Gin 统一接入层 + CORS + 限流中间件
|
||
- [x] MainDB(PgSQL):user / task / model / kb / doc / doc_link / agent
|
||
- [x] CacheDB(Redis):会话 / 限流
|
||
- [x] Task DSL Parser & Assembly
|
||
- [x] 模型配置控制面(按 kind 经 NATS 下发给 dispatcher / mcp-go)
|
||
- [x] 独立运维控制台 sundynix-admin(模型 / 数据源页)
|
||
- [x] SSE 回流:Token 流 / 执行轨迹 / 入库进度
|
||
- [x] Harness **输入**护栏(拦提示词注入 + 超大体,纯逻辑 `internal/guardrail` + 单测 + 实跑验证)
|
||
- [ ] 🟡 Harness **输出**护栏(应在 dispatcher token 发射层做,网关侧会破坏 SSE 流式 —— 见路线图)
|
||
- [ ] 🟡 商业化与计费模块(占位,仅统计任务数)
|
||
|
||
## 第 3 层 · MESSAGE BUS(NATS 零拷贝骨干网)
|
||
|
||
- [x] 任务队列(JetStream,`sundynix.tasks.*`)
|
||
- [x] Token 流(core NATS,`sundynix.streams.<id>`)
|
||
- [x] 执行轨迹流(`sundynix.exec.<id>`)+ 入库进度流
|
||
- [x] 工具 request-reply(`sundynix.tools.go/py.*`)
|
||
- [x] 配置控制面(按 kind 请求模型配置 + 热更新广播)
|
||
|
||
## 第 4 层 · AI AGENT DISPATCHER(sundynix-dispatcher · Eino)
|
||
|
||
- [x] 按图执行引擎:拓扑 + 连线 + 分支剪枝(弃用线性拍平)
|
||
- [x] branch 真/假边标签精确选路(无标签退回边序,向后兼容)
|
||
- [x] map 真并行 fan-out(有界并发)+ aggregate 汇聚
|
||
- [x] render 节点(成稿 → docx)
|
||
- [x] LLM Pool:OpenAI 兼容流式(🟡 接 DeepSeek/百炼在线 API,非架构图的 vLLM/Ollama 集群)
|
||
- [x] 记忆召回(画像 + 历史注入)
|
||
- [x] 报告专用编排(规划 → 分章并行 → 汇聚 → 存源)
|
||
- [x] 会话历史写回
|
||
- [x] Harness 熔断降级中心(真三态状态机 Closed/Open/HalfOpen + 单测含 -race;熔断时回流提示并收尾流,不静默丢弃)
|
||
- [x] Harness LLM 自动化评测(规则检查 + LLM-as-judge,异步 off 热路径评分记录 + 单测)
|
||
- [ ] 长期偏好记忆抽取(LLM 抽取 → 去重 → memory_upsert,TODO)
|
||
|
||
## 第 5 层 · MCP TOOLS
|
||
|
||
### sundynix-mcp-go(I/O 型)
|
||
|
||
- [x] MCP 协议网关(队列组通配订阅)
|
||
- [x] 混合检索:Bleve + Milvus + Neo4j(RRF 融合 + rerank)
|
||
- [x] kb_ingest / kb_search / kb_graph
|
||
- [x] memory_get / memory_upsert · history_get / history_append
|
||
- [x] report_render / report_store / report_export
|
||
- [x] Word 渲染(🟡 自建零依赖 OOXML,非 UniOffice —— 偏差,UniOffice 商业授权)
|
||
- [ ] external_api(外部 API 工具)
|
||
|
||
### sundynix-mcp-py(算法型)
|
||
|
||
- [ ] 🟡 parse_document(docx/pdf/xlsx 解析器在;MinerU / PaddleOCR 多模态为骨架)
|
||
- [x] 代码解释器(Docker 隔离真执行:禁网/非root(65534)/丢能力/只读根+tmpfs/限内存CPU进程/超时kill/一次性;无 Docker 优雅降级)
|
||
- [x] 安全沙箱 AST 静态守卫(拦危险导入/调用/逃逸属性,6 单测)+ 4 项隔离实跑验证(正常/非root/禁网/超时);gVisor/Kata 作生产加固标注
|
||
|
||
## 跨层 / 工程
|
||
|
||
- [x] 存储扩展:文库列表/正文分离 + 双链 ID 索引 + 大文件正文存 MinIO
|
||
- [x] DB 规约全库统一:雪花字符串 id + created/updated + 软删(gateway 各表 + mcp-go Profile)
|
||
- [x] 文件主表,文档间关联用雪花 ID(弃用按名关联)
|
||
- [x] 后端首批单测(19 纯逻辑用例:引擎/DSL/docx/报告)+ mcp-go 集成测试(Profile 迁移)
|
||
- [x] **真实鉴权(JWT)闭环**:后端注册/登录/校验 + RequireAuth 保护路由 + owner=已验证 uid(去掉 header 兜底);前端登录/注册门 + 存 token + Bearer + 401 自动登出 + 顶栏用户/登出。实跑验证(含 CORS Authorization 修复)
|
||
- [ ] 集成/前端测试(`runGraph` / `handleReport` 需 mock pool/tools/sink;前端无测试)
|
||
|
||
---
|
||
|
||
## 未实现的大块(路线图)
|
||
|
||
- [x] **真实登录 / 鉴权(JWT)** —— 后端 + 前端闭环已完成 ✅
|
||
- [x] **代码解释器 + 安全沙箱**(AST 守卫 + Docker 隔离已落地 ✅;生产可换 gVisor/Kata)
|
||
- [ ] **Harness 余下**:输出护栏(dispatcher token 发射层)(熔断降级 ✅、输入护栏 ✅、LLM 自动化评测 ✅ 已完成)
|
||
- [ ] **长期记忆抽取** + external_api 工具
|
||
- [ ] **计费 / 商业化**真实实现
|
||
- [ ] 微服务化拆分(Morph B)—— 现为 Monolith First,**按设计如此,非缺陷**
|
||
|
||
## 收尾小债
|
||
|
||
- [ ] 6 个提交待 push(`5d76652` → `79f9912`,需在普通终端 `git push origin main`)
|
||
- [ ] PDF 导出 Wails 真机验证(不行则回退后端内嵌 CJK 字体出 PDF)
|
||
- [ ] 报告生成并发健壮性(writeSections 降并发 / 加单次超时,治偶发卡顿)
|
||
- [ ] MinIO 大文档改名/删除的孤儿对象 GC
|
||
- [ ] `make test` 目标(一键跑全后端测试)
|
||
|
||
---
|
||
|
||
> 本地起服务顺序坑见 memory `local-run-gotchas`:**mcp-go 必须在 Milvus 之后起**,否则阻塞在 rag 初始化、不订阅工具,所有 mcp-go 工具 `no responders`。
|