Files
codex-agent-manager/docs/project.md

131 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Project Documentation
## Goal
构建一个本机 Codex 智能体管理台,用中文管理 agent 配置、项目运行状态、动态工作流和安全写回流程。
## Final Architecture
最终实现为Go 后端提供 localhost HTTP APIVue 3 + Vite 前端提供中文工作台界面。后端已提供健康检查、`.codex/agents/*.toml` 读取、项目配置只读读取、运行线程只读模型、动态工作流事件模型,以及单个智能体 TOML 的草稿校验和确认写回;前端已通过集中 API client 接入这些端点并显示加载中、连接失败、空数据、来源/置信度和写回状态。
## Configuration
- `CODEX_HOME`: 默认 `/Users/yoilun/.codex`
- 后端监听地址:默认 `127.0.0.1:18083`
- 前端开发地址:默认 `127.0.0.1:13083`
- `WorkspaceRoot`: 默认当前进程工作目录,用于读取 `task_plan.md` 等计划文件证据。
- Go module 目标:`go 1.22`
- SQLite 驱动:`modernc.org/sqlite v1.35.0`
## Runbook
启动后端:
```bash
go run ./cmd/codex-agent-manager
```
健康检查:
```bash
curl http://127.0.0.1:18083/api/health
```
读取智能体定义:
```bash
curl http://127.0.0.1:18083/api/agents
```
校验智能体草稿,不写文件:
```bash
curl -X POST http://127.0.0.1:18083/api/agents/backend/validate \
-H 'Content-Type: application/json' \
-d '{"content":"name = \"后端架构师\"\n"}'
```
创建备份并写回单个智能体文件:
```bash
curl -X POST http://127.0.0.1:18083/api/agents/backend/write \
-H 'Content-Type: application/json' \
-d '{"content":"name = \"后端架构师\"\n","expectedHash":"<validate 返回的 currentHash>"}'
```
读取项目配置:
```bash
curl http://127.0.0.1:18083/api/projects
```
读取运行线程:
```bash
curl http://127.0.0.1:18083/api/runtime/threads
```
读取动态工作流事件:
```bash
curl http://127.0.0.1:18083/api/workflow/events
```
安装并构建前端:
```bash
cd web
pnpm install
pnpm test
pnpm build
```
启动前端工作台:
```bash
cd web
pnpm dev
```
前端开发地址为 `http://127.0.0.1:13083/`。前端按视图调用 API项目视图读取 `/api/projects``/api/runtime/threads`,工作流视图读取 `/api/workflow/events`,智能体视图读取 `/api/agents`,并仅对当前选中的智能体调用 `/api/agents/{id}/validate``/api/agents/{id}/write`。静态示例数据仅在接口连接失败时作为 fallback 展示,并必须明确标注“示例/等待连接”;真实接口返回空列表时展示空状态和来源证据,不回退到示例数据。前端可保留 `local_sample``api_missing` 等内部 source kind但用户界面必须显示中文来源和 `高 / 中 / 低` 置信度。
## API Overview
- `GET /api/health`: 健康检查。
- `GET /api/agents`: 只读列出 `CODEX_HOME/agents/*.toml` 直属文件;坏 TOML 以单条 invalid 状态返回。
- `POST /api/agents/{id}/validate`: 校验单个智能体 TOML 草稿、生成 diff、返回字段变化、目标路径和当前 sha256 hash不写文件。
- `POST /api/agents/{id}/write`: 使用 `expectedHash` 写回单个已有智能体 TOML写回前重新校验、复读目标、创建备份并原子替换。
- `GET /api/projects`: 只读解析 `.codex/config.toml` 中的 `[projects."..."]`
- `GET /api/runtime/threads`: 只读读取 `state_5.sqlite``goals_1.sqlite`,返回 threads、spawn edges、goals、聚合来源和分数据源证据。
- `GET /api/workflow/events`: 从运行线程、spawn edges、goals 和计划文件证据生成事件流、交接边和阶段状态。
## Security Boundaries
- 不读取 `.codex/auth.json`
- 不写入 Codex SQLite。
- 不读取或写入 `.codex/config.toml` 以外的项目只读解析;写回目标仅限 `CODEX_HOME/agents/{id}.toml` 直属文件。
- SQLite 通过纯 Go `modernc.org/sqlite v1.35.0``mode=ro&immutable=1` 打开;缺失 SQLite 返回空列表和低置信度来源说明。
- 运行线程 API 返回聚合 `source` 和分数据源 `sources`;仅 `state_5.sqlite` 或仅 `goals_1.sqlite` 缺失时,聚合来源为 `sqlite_partial` / `medium`,缺失的一侧为 `sqlite_missing` / `low`
- 运行线程读取使用 `PRAGMA table_info` 适配 schema drift缺关键列时对应表返回空列表和 `sqlite_schema_drift` / `low` 证据可选列缺失、NULL 和数值字段按空字符串或文本值处理。
- `.codex/agents/*.toml` 写回必须先备份。
- `/api/agents` 只读列出 `.codex/agents` 直属 `.toml` 文件,读取前通过 Codex home 边界和 agent TOML 专用 resolver坏 TOML 以单条 `invalid` 状态返回,不导致服务崩溃。
- `POST /api/agents/{id}/validate` 只校验请求体中的 TOML 草稿、生成 diff、返回目标路径、当前 sha256 hash 和字段变更;该端点不写文件。
- `POST /api/agents/{id}/write` 会重新校验 TOML重新读取目标文件并比较 `expectedHash`,先创建 `*.bak-<timestamp>` 备份,备份成功后通过同目录临时文件和 rename 原子写回。
- 写回的目标读取、备份、临时文件和 rename 绑定到已打开的 `agents` dirfd关键步骤会复核 `agents` 目录路径身份、目标文件身份和目标 hash减少 TOCTOU 窗口。
- 写回 id 只允许安全 bare file stem字母、数字、下划线、连字符且不能包含路径分隔符、绝对路径、`.toml` 扩展名或子目录。`agents` 目录 symlink、目标叶子 symlink、非普通文件和路径穿越都会被拒绝。
- validate/write POST body 限制为 1 MiB拒绝 trailing JSON路径、系统错误和无效请求统一映射为中文安全响应。
- 无效 TOML、hash 冲突、备份失败或临时文件写入失败都不会替换原文件;临时文件会尽量清理。
- `/api/projects` 只读解析 `.codex/config.toml` 中的 `[projects."..."]`,展示路径、显示名、信任等级和目录存在性。
- `/api/workflow/events` 从运行线程、spawn edges、goals 和计划文件证据生成事件流/交接边/阶段状态,不写死固定流程。
- 前端仅在智能体视图提供单文件草稿入口,按钮为“校验 TOML”“查看差异”“创建备份并写回”只有校验成功且存在 currentHash 时才允许写回,写回前使用浏览器确认。
- 前端 normalizer 负责把 source kind、confidence、状态和 parseStatus 转成中文显示,并过滤工作流中非阶段表格行。
## Known Risks
- Codex 内部 SQLite schema 可能变化。
- 运行状态由多来源推断,必须显示置信度。
- 真实 SQLite 读取已覆盖临时测试库;如果真实 Codex schema 新增字段或缺少可选字段,应继续走 schema-aware 查询和来源证据,而不是让 API 500。
- Agent 列表接口不返回原始 TOML 文本;智能体编辑区展示的是接口返回的已解析字段,并在代码区说明“接口未返回原始 TOML”。
- 浏览器视觉验证需要可用浏览器工具或主智能体执行;文档记录不得伪造截图结果。
- 写回只覆盖单个已有 agent TOML不支持创建新 agent、批量写回或自动保存草稿。