aps-agent/Pi-Agent接入详细计划.md

217 lines
13 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.

# Pi Agent 接入 · 详细实施计划
> 版本 v1.0 · 2026-09-02 · 配套摘要文档:`Pi-Agent接入计划.md`
> 依据:`plan.md` §2.1/§2.2、`PROJECT_OPERATING_RULES.md`、`docs/architecture/harness.md`、`docs/architecture/skills.md`
> 现状代码基线:`server/agent_core/`(harness `_POWER_MAP` 62 项登记、tool_runtime 只读白名单 19 项、mcp_bus、skills、audit)、`server/auth/`(JMS provider + 许可证 token + 租户)、`server/gateway/app.py`
>
> **对象界定**:Pi Agent = badlogic 开源 Pi(pi-coding-agent CLI + pi-agent-core + npm 技能包生态)。方向 A:外向接入,Pi 作为外部客户端智能体经 Gateway 调用 APS 能力,不开第二个执行通道。
---
## 0. 总览
| 阶段 | 名称 | 工期(人日) | 出口标准(Go/No-Go 门禁) |
|------|------|------------|--------------------------|
| P0 | 验证性 PoC | 2-3 | 终端内完成真实查询往返;Pi 扩展 API 三个未知数全部有答案 |
| P1 | 只读接入 | 5 | 只读意图 19 项全部可经 agent 端点调用;token 越权测试 fail-closed |
| P2 | 写操作过门禁 | 5-10 | P1/P2 意图经确认卡执行;CLI 侧确认/拒绝/超时三态可演示 |
| P3 | MCP 总线治理化 | 5-10 | Pi 插件入总线清单;契约三方同步门禁通过;管理台可见 |
| P4 | 验收与发布门禁 | 5 | 全量黄金测试绿;文档同轮完成;安全评审签字 |
| **合计** | | **22-33 人日(约 5-7 周/1 人)** | |
**串行前提**:与 Tauri 迁移不并行(都动 Gateway/sidecar 周边);FF-01 基线已提交(8b7063f)。
---
## P0 · 验证性 PoC(2-3 人日)
### 目标
用最小成本验证"Pi 技能包 ↔ 现有 FastAPI Gateway"匹配度,产出 go/no-go。
### 任务分解
| # | 任务 | 产出 | 工时 |
|---|------|------|------|
| P0-1 | 安装 Pi(`npm i -g` pi-coding-agent),跑通官方 hello 技能包,确认扩展 API 形态(工具注册签名、权限钩子、配置落点 `~/.pi/`) | 笔记 + 截图 | 0.5d |
| P0-2 | 起本地 APS server(`.venv` 固定 CPython,`python -m uvicorn server.main:app --port 8000`),确认 `/api/health` 返回 `interfaceVersion=1.0` | 环境就绪 | 0.5d |
| P0-3 | 写最小技能包 `pi-aps`(单文件):注册 2 个工具 `aps_health` / `aps_summary`,调 `/api/health` 与 `/api/world/summary`,结果原样透传 | PoC 技能包 | 1d |
| P0-4 | 验证 SSE:终端订阅 `/api/chat` 会话流或等价端点,确认流式事件在 CLI 可读(决定 P2 确认卡用轮询还是 SSE) | 技术结论 | 0.5d |
| P0-5 | go/no-go 报告:三个未知数(扩展 API 形态 / 认证链路 / SSE 呈现)+ P1 估算修正 | 报告 | 0.5d |
### PoC 技术约束(防止 PoC 污染产品路径)
- PoC 技能包只读、不进仓库 `apps/` 或 `server/`;放 `poc/pi-aps/`;
- 认证用开发态临时方案(环境变量 token),**不写** token 签发产品代码——那是 P1 的事;
- 遵守规范:工具失败显式报错,不包装成泛化成功回复。
### 出口标准(全部满足才进 P1)
1. 在 Pi 终端输入自然语言/命令 → 返回真实 APS 数据(非 mock);
2. Pi 权限钩子能在工具调用前拦截(P2 确认卡的技术前提);
3. 无明显阻塞性限制(如技能包无法持久化配置、无法发 HTTPS 到自签证书内网服务器等)。
---
## P1 · 只读接入(5 人日)
### 目标
Pi 用户可完成全部只读场景:查订单池、KPI、分桶计划、冲突、知识库。
### API 设计(新增 `/api/agent/` 适配层)
设计原则:**薄适配,零业务逻辑**(Gateway 职责边界:不含排产算法/LLM 决策)。复用 `handle_intent`,不复制逻辑。
```
POST /api/agent/invoke
请求:{ "intent": "order.pool", "params": {...}, "requestId": "uuid" }
响应:{ "ok": true, "intent": "...", "power": "P0", "data": {...},
"evidenceRefs": [...], "interfaceVersion": "1.0" }
错误:{ "ok": false, "error": { "code": "INTENT_NOT_REGISTERED" |
"POWER_DENIED" | "CONFIRM_REQUIRED" | "UPSTREAM_FAILED", ... } }
GET /api/agent/intents # 列出该 token scope 可调用的意图目录(从白名单/_POWER_MAP 派生)
GET /api/agent/intents/{name} # 单意图参数 schema(供 Pi 动态生成工具签名)
```
行为规则:
- 只读意图(tool_runtime 白名单 19 项 + `_POWER_MAP` 中 P0 项)→ 直通执行;
- P1/P2/P3 → P1 阶段一律返回 `CONFIRM_REQUIRED`/`POWER_DENIED`(P2 阶段才接通);
- **未登记意图 → 拒绝 + 审计**(与 tool_runtime 同语义,fail closed)。
### 任务分解
| # | 任务 | 涉及文件 | 工时 |
|---|------|---------|------|
| P1-1 | `/api/agent/*` 三个端点:参数校验(Pydantic)、intent 登记检查、委托 handle_intent、统一错误码 | `server/gateway/app.py`(新增路由段,<150 行) | 1d |
| P1-2 | Agent Token:基于 `server/auth/` 既有体系签发长期 token(type="agent",scope=["read"]),绑定租户 + device;签发/吊销登记 P2 意图 `agent.token.issue` / `agent.token.revoke` 入 `_POWER_MAP` | `server/auth/`(新增 `agent_tokens.py`)、`harness.py` 登记 2 项 | 1.5d |
| P1-3 | 审计:`actor="pi-agent:<deviceId前8位>"`,全部调用落 TOOL/AGENT 审计事件,可按 actor 过滤 | `server/agent_core/audit.py`(复用,仅扩展 actor 约定) | 0.5d |
| P1-4 | `pi-aps` v0.1:从 `/api/agent/intents` 动态生成工具集;配置项(server URL、token、超时)落 `~/.pi/aps.json`;错误码 → 人类可读终端输出 | `poc/pi-aps/` → 转正为独立 npm 包 | 1.5d |
| P1-5 | 黄金测试:端点契约、未登记意图拒绝、token 无效/越权/吊销 fail-closed、审计落链断言 | `tests/golden/test_agent_gateway.py`(新增) | 0.5d |
### 出口标准
- 只读意图 100% 可调;非只读一律显式拒绝;
- token 六种异常(缺失/伪造/过期/吊销/scope 越界/跨租户)全部 fail-closed 且有审计;
- `pytest tests/golden/test_agent_gateway.py` 全绿;`test_contract_sync.py` 不受影响。
---
## P2 · 写操作过门禁(5-10 人日)
### 目标
Pi 可发起 P1/P2 意图(试排、登记 skill 等),确认卡在终端完成人机确认。
### 确认卡交互设计(CLI 三态)
```
Pi 发起 flex.schedule(P1 草稿类)→ 直通执行,返回 evidenceRefs(含 schedule-version)
Pi 发起 schedule.publish(P2)→ /api/agent/invoke 返回 CONFIRM_REQUIRED + cardId
→ Pi 权限钩子向用户呈现确认卡摘要(动作/影响/evidenceRefs 指纹)
→ 用户批准:POST /api/actions/confirm { cardId, approved: true }(既有唯一执行通道 ✅)
→ 用户拒绝/超时(默认 5min):fail closed,审计留痕
```
### 任务分解
| # | 任务 | 工时 |
|---|------|------|
| P2-1 | invoke 端点接通 P1 意图(沙盒/草稿语义直通,返回 evidenceRefs) | 1d |
| P2-2 | invoke 端点接通 P2:生成确认卡(复用 harness 出卡逻辑,冻结 evidenceRefs/beforeSnapshot),返回 cardId + 摘要 payload | 1.5d |
| P2-3 | token scope 升级:`read` → `read+write`(签发改 P2 确认卡;scope 与意图权力交叉校验:P2 意图必须 write scope) | 1d |
| P2-4 | pi-aps v0.2:确认卡终端 UI(摘要渲染 + y/n + 超时倒计时);批准后轮询/SSE 拿执行结果;失败显式呈现 | 1.5-3d |
| P2-5 | 证据链黄金测试:Pi 发起的 P2 写,审计含 beforeSnapshot + evidenceRefs + `verify_pending_evidence` 缺项拒绝 | 1d |
| P2-6 | 超时/并发边界:一 token 同时仅一张 pending 卡;卡过期自动拒绝 | 1d(含测试) |
### 出口标准
- 演示脚本全绿:试排→发布→回滚三链路在 Pi 终端闭环;
- 安全测试:无卡直调 confirm、伪造 cardId、过期卡、跨 token 用卡——全部拒绝 + 审计;
- 变数说明:P2-4 的 CLI 交互若 Pi 权限钩子能力受限(P0-4 结论),可能退化为"Web 确认 + CLI 只读结果",工期取下限。
---
## P3 · MCP 总线治理化(5-10 人日)
### 目标
Pi 接入面成为 `mcp_bus` 正式插件,享受统一治理(契约、权限、健康、启停、审计、管理台)。
### 插件 manifest(落 `server/data/mcp_plugins/plugins.json`)
```json
{
"plugin_id": "pi-agent-gateway",
"name": "Pi Agent 接入面",
"version": "1.0.0",
"min_bus_version": "1.0",
"endpoint": "self:///api/agent",
"tools": [
{"name": "order.pool", "power": "P0", "input_schema_ref": "shared/schemas/..."},
{"name": "flex.schedule", "power": "P1", "input_schema_ref": "shared/schemas/..."},
{"name": "schedule.publish", "power": "P2", "input_schema_ref": "shared/schemas/..."}
],
"ragScopes": []
}
```
### 任务分解
| # | 任务 | 工时 |
|---|------|------|
| P3-1 | 把 `/api/agent/intents` 目录生成为 MCP manifest(自动生成 + 版本化),注册进 mcp_bus | 1.5d |
| P3-2 | tool 级 allow/deny 配置面:按现场可裁剪 Pi 可用意图(deny 优先,fail closed) | 1d |
| P3-3 | 三方契约同步:`shared/schemas/agent_invoke.schema.json` ↔ `server/contracts.py` ↔ pi-aps 类型定义;入 `test_contract_sync.py` 门禁 | 1.5d |
| P3-4 | 管理台:SkillConsole 复用双面板模式呈现 Pi 插件(概览/健康/审计/日志页签) | 2d |
| P3-5 | 健康探测:agent 端点纳入总线探测历史(最近 20 次) | 0.5d |
| P3-6 | 文档同轮:harness.md 端点备案、skills.md 增补、CHANGELOG | 0.5d |
### 出口标准
- 总线清单可见、可启停(P2 确认卡)、审计可按插件过滤;
- 契约漂移测试阻断生效(故意改一端 → CI 红)。
---
## P4 · 验收与发布门禁(5 人日)
| # | 任务 | 工时 |
|---|------|------|
| P4-1 | 全量黄金测试(基线 1071 项 + 新增 agent 专项)固定 CPython 运行时全绿 | 1d |
| P4-2 | 安全评审:token 存储(`~/.pi/aps.json` 权限 600)、传输(内网 HTTP → 建议 HTTPS 或 SSH 隧道指引)、桌面态 nonce 与 agent token 并存策略 | 1.5d |
| P4-3 | 真实场景验收:康尼数据集上跑"查询→试排→确认发布"全链路 5 轮 | 1d |
| P4-4 | 发布物料:pi-aps npm 包版本化 + 安装文档 + 现场部署 runbook | 1d |
| P4-5 | 回顾:估算偏差分析,更新本计划为 v1.1 | 0.5d |
---
## 6. 横切约束(每阶段都必须遵守,来自 PROJECT_OPERATING_RULES)
1. **无后门**:任何写路径不得绕过 `tool_runtime`/`/api/actions/confirm`;P1 起加黄金测试断言"agent 端点代码无直接 store 写调用"(import 扫描级)。
2. **失败显式**:工具失败/为空/中止 → 结构化错误码透传到终端,禁止泛化确认。
3. **状态诚实**:DRAFT/未批准/失败状态在 agent 响应中显式标注 `status` 字段,不得当完成事实。
4. **证据链**:P2/P3 写全部携带 `beforeSnapshot` + `evidenceRefs`;审计 append-only。
5. **契约三方同步**:改契约必须三端同改 + `test_contract_sync.py`。
6. **文档同轮**:每阶段收尾同步 harness.md / CHANGELOG;`docs/README.md` 铁律。
7. **运行时**:所有验证用 `.venv` 固定 CPython,禁用 PATH 上的 Anaconda python(WinError 127 前科)。
8. **提交纪律**:未经用户授权不提交/不推送;每阶段一个独立 commit,conventional 中文提交信息。
## 7. 风险登记册
| # | 风险 | 概率 | 影响 | 触发阶段 | 对策 |
|---|------|------|------|---------|------|
| R1 | Pi 权限钩子不支持异步确认交互 | 中 | P2 降级为"CLI 发起 + Web 确认" | P0-4 暴露 | PoC 即验证;降级方案可接受 |
| R2 | token 长期持有泄漏 | 低 | 数据外泄 | P1 后 | scope 最小化 + 吊销通道 + 审计告警(audit_alerts 既有) |
| R3 | Pi 上游 API breaking change | 中 | 技能包失效 | 长期 | 技能包锁版本范围;manifest `min_bus_version` 同款声明 |
| R4 | 与现场交付(康尼/徐工)抢人力 | 高 | 双方延期 | 全程 | P0/P1 先行(可演示价值),P2+ 按交付间隙排 |
| R5 | 内网无 npm registry,技能包分发难 | 中 | 现场装不上 | P4 | 离线 tarball 分发 + runbook 写明 |
| R6 | 与 Tauri 迁移冲突 | 低 | 返工 | — | 已约定串行 |
## 8. 关键依赖与前置
- ✅ FF-01 基线已提交(8b7063f)
- ⬜ P0 需要:本机可装 Pi(npm 网络)、APS server 本地可起
- ⬜ P1 需要:确认 agent token 在桌面态(sidecar nonce 门禁)与 Web 态(JMS 登录)两种部署下的统一策略——**建议 P0 期间出结论**
- ⬜ P4 需要:康尼数据集可用
## 9. 里程碑视图
```
W1 W2 W3-4 W5-6 W7
[P0 PoC]→[P1 只读]→[P2 写门禁]→[P3 治理化]→[P4 验收]
↑go/no-go ↑可演示 ↑安全评审预备 ↑发布门禁
```