- 统一 local-first MVP 后阶段架构口径,补充 process 执行总序和 Reasonix 协作记录 - 归档已完成的 design checklist,标注参考型 process,更新 AGENTS/REASONIX/架构文档 - 补充文件树/主编辑器下载与上下文菜单相关实现、bug 记录和 smoke 脚本 验证:git diff --check;codegraph sync .;cargo test -p mnote-web;node --check scripts/task476-filetree-editor-context-menu-download-smoke.js
3.6 KiB
3.6 KiB
7-31 ACP permission 决策闭环 checklist v1
状态:done
Owner:ACP incoming request / permission loop
参考:
reference-code/hermes-vscode-main/src/acpClient.ts、src/sessionManager.ts
目标
把 session/request_permission 从"后端立即 unsupported/deny"改成"后端发出 pending request,前端 allow/deny,后端回写 JSON-RPC response"的真实闭环;超时仍默认 deny。
允许修改范围
rust/crates/mnote-web/src/acp_client.rsrust/crates/mnote-web/src/acp_session_manager.rsrust/crates/mnote-web/src/acp_bridge.rsrust/crates/mnote-web/src/routes/hermes_client.rs- 只允许为接线 permission 按需小改
rust/crates/mnote-web/src/ssr/pages/layout.rs - 相关 Rust 测试
禁止事项
- 不把权限结果存为新的长期正文/附件真相。
- 不默认 allow;超时、缺失 run、缺失 pending request 都必须 deny 或返回清晰错误。
- 不大改 Page AI drawer 视觉结构。
Checklist
AcpClient支持注册 incoming request handler,并允许 handler 返回 JSON-RPC result/error。session/request_permission进入 pending map,生成稳定 permission id,向 SSE 发permission.requested。- 增加 HTTP endpoint 或现有 endpoint 扩展:前端可按 run id / permission id 提交 allow/deny。
- 提交 allow/deny 后,ACP JSON-RPC request 得到对应 response;前端收到
permission.allowed/permission.denied。 - 超时默认 deny,并向 UI 和 runtime event 写明 timeout。
- 补 mock ACP 测试:incoming request 等待决策、allow 返回 result、deny 返回 result/error、timeout deny。
- 更新本文件"执行记录"。
验收命令
cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web acp_client -- --test-threads=1
cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web acp_bridge -- --test-threads=1
cd /mnt/Data1T/mnote/rust && cargo test -p mnote-web page_ai_uses_backend_acp_session_runtime_store -- --test-threads=1
执行记录
- 2026-05-20:Reasonix 实施,Codex 复核并修正 JSON-RPC id 保真与 permission response 语义。
- 改动点:
AcpClient增加on_incoming_request()/respond_to_incoming()/respond_to_incoming_error();dispatch_message将 incoming request 转发给 handler 而非立即 error;AcpSessionManager.new()注册 incoming request handler,将session/request_permission存入 pending map + 发射permission.requested+ 启动 60s 超时自动 deny;AcpSessionManager增加resolve_permission()方法;acp_bridgeSSE 转换支持permission.requested;hermes_client.rs增加resolve_permissionHTTP endpoint;routes/mod.rs注册路由;layout.rs中pageAiResolvePermission调用后端。 - Codex 修正:incoming JSON-RPC request id 使用原始
serde_json::Value保存和回写,避免字符串 id 被改成 0;allow/deny 正常路径改为参考 Hermes VSCode 插件的{ outcome: "selected", optionId },并补permission_response_selects_allow_and_deny_options测试。 - 未完成:已有
acp_clientincoming request 基础测试和 option 选择 helper 测试,但还缺“mock ACP 发 permission -> HTTP resolve endpoint -> agent 收到 selected option”的端到端测试,故该 checklist 的 mock 闭环项保留未完成。 - 验收:
cargo test -p mnote-web acp_client -- --test-threads=1、cargo test -p mnote-web acp_bridge -- --test-threads=1、cargo test -p mnote-web page_ai_uses_backend_acp_session_runtime_store -- --test-threads=1、cargo test -p mnote-web acp -- --test-threads=1通过。