diff --git a/docs/API.md b/docs/API.md index 2738788..b8fa0e3 100644 --- a/docs/API.md +++ b/docs/API.md @@ -87,7 +87,8 @@ POST /me/mail/{id}/forward 转发(引用原文 + 附件随行) "reply_to": "", "session_alias": "fix-leak", "attachment_ids": [""], - "max_rounds": 3 + "max_rounds": 3, + "permission_mode": "workspace" } ``` @@ -95,6 +96,9 @@ POST /me/mail/{id}/forward 转发(引用原文 + 附件随行) (即本次投递新建会话)时生效 —— 续谈已有会话时若也接受这两个字段, 每封新信都会悄悄改掉对方正在遵守的约定。 +`permission_mode` 则**两种情形都生效**:新建会话时声明初始档位; +续谈已有会话时显式改档(人是权限的源头,可任改三档)。详见「权限档位」节。 + ### 对话树 ``` @@ -142,8 +146,8 @@ GET /mail/{id}/thread?dir=down&offset=40&limit=40 继续往下 ### 会话 ``` -GET /me/sessions 我参与的会话(含 max_rounds/used_rounds) -GET /sessions/{id} 会话详情 + 会话内邮件(含附件) +GET /me/sessions 我参与的会话(含 max_rounds/used_rounds/permission_mode/permission_enforcement) +GET /sessions/{id} 会话详情 + 会话内邮件(含附件 + 档位字段) GET /sessions/{id}/mails 会话内邮件(含附件) PUT /sessions/{id}/alias 改会话别名(冲突 409) @@ -152,8 +156,37 @@ POST /sessions/{id}/rename-proposal/dismiss 驳回建议 GET /sessions/{id}/budget 本任务的往返预算 PUT /sessions/{id}/budget 改预算 {max_rounds?, reset?} + +PUT /sessions/{id}/permission 改档位 {permission_mode}(读取走会话详情,无需独立 GET) ``` +会话对象带两个档位字段(`GET /sessions/{id}` / `GET /me/sessions` 均返回): + +| 字段 | 含义 | 取值 | +|---|---|---| +| `permission_mode` | 本任务允许 Agent 动手到什么程度 | `plan` / `workspace` / `full` | +| `permission_enforcement` | 该档位在收件平台**实际**被强制到什么程度 | `native`(真沙箱) / `advisory`(仅提示词告知) | + +### 权限档位 + +人在派活时声明「这条任务允许 Agent 动手到什么程度」,插件把它翻译成平台原生的 +沙箱/审批配置。三档: + +| 档位 | 语义 | 权限询问 | +|---|---|---| +| `plan` | 只读:查资料、读代码、出方案,一个字都不许写 | **不产生** —— 直接拒绝,模型把方案写在回信里 | +| `workspace` | 本目录内可动,越界要问人(**默认档**) | 越界时产生 | +| `full` | 自动放行 | **不产生** —— 已声明全权,再问是噪音 | + +- 新建会话时在发信请求体里带 `permission_mode` 声明初始档位(省略 = `workspace`) +- **续谈已有会话时带该字段也会生效**:人是权限的源头,可以任改三档(不受继承约束) +- Agent 侧派子任务不能自行抬档:`SendMail` 走继承,子会话档位 = `min(父档, 请求档)` + (plan 档派不出 full 档子任务,约束沿链条传递) +- 对话页里随时改:`PUT /sessions/{id}/permission`(前端对话页右上角档位编辑器) + +两次读路径(`ListInbox` / `GetMailByID` / `GetSessionMails` / `ListSentBy`)也返回 +`permission_mode` / `permission_enforcement` —— 列表页档位徽标靠它们。 + ### 往返预算 配额的语义是「这件事值得多少个来回」—— 那是**任务**的属性,不是 Agent 的属性。 @@ -463,7 +496,11 @@ GET /events/stream { "mail_id": "...", "session_id": "...", "from_name": "admin", "subject": "...", "mail_type": "normal", "role": "to", - "to_workspace": "/home/program/agentmail" + "to_workspace": "/home/program/agentmail", + "from_human": false, "to_human": false, + "in_reply_to": "...", "reply_address": "...", + "permission_mode": "workspace", + "permission_enforcement": "native" } ``` @@ -471,6 +508,9 @@ GET /events/stream 不是主收件人的)。插件应当用它作为会话的工作目录 —— 自己拼一个临时目录会让 平台按 cwd 分组时把所有邮件会话归进「未分组」。 +`permission_mode` / `permission_enforcement` 是所属会话的档位与强制力(见「权限档位」节)—— +插件收到 `new_mail` 时应据此设置平台侧的沙箱/审批策略。 + `permission_decision` 的 payload 含 `relay_key`(上游权限询问的 id)与 `session_id`:前者让插件对上平台侧那条待决询问,后者是插件重启丢了内存映射时 的兜底 —— 那种情况下决策会被当作一封普通通知投进会话。