feat: 权限档位体系(三档 plan/workspace/full + 四桥 from_session_id)

L2 核心改动:sessions 表补 permission_mode / permission_enforcement 两列
(sqlite + pg 同步),三桥 lib/permission-mode.js 翻译档位到平台原生配置,
homeagent advisory 模式提示词告知模型实际强制力。四桥全部携带 from_session_id
供 relay 去重与会话回溯。

FromHuman / ToHuman 判据已加入心跳 payload 与 notify/mail.go。
This commit is contained in:
2026-09-06 15:16:49 +08:00
parent 13fcb00acc
commit a44fd6949b
32 changed files with 3462 additions and 177 deletions

View File

@ -25,6 +25,14 @@ type Agent struct {
UsedRounds int `json:"used_rounds"`
LastSeen *time.Time `json:"last_seen"`
CreatedAt time.Time `json:"created_at"`
// ModeEnforcement 是该平台插件自报的权限档位强制能力(native / advisory),
// 随心跳上报(与模型目录同一条通道,见 I-1:平台自己说的才算)。
//
// 为什么要存:发件人在派活前得知道 plan 档在对方那儿到底算不算。
// homeagent 的核心没有工具调用拦截点,档位只能写进提示词 ——
// 把这个事实藏起来比做不到本身更危险。
ModeEnforcement string `json:"mode_enforcement"`
}
// Workspace 是 Agent 管理的项目工作区
@ -60,6 +68,14 @@ type Session struct {
// 所以在写信时给、在对话页里随时调。
MaxRounds int `json:"max_rounds"`
UsedRounds int `json:"used_rounds"`
// PermissionMode 声明本任务允许 Agent 动手到什么程度:
// plan / workspace / full。空值按 DefaultPermissionMode 处理。
PermissionMode string `json:"permission_mode"`
// PermissionEnforcement 记录接收平台是否真正强制了权限档位:
// native / advisory。它描述执行事实,不与 PermissionMode 混为一谈。
PermissionEnforcement string `json:"permission_enforcement"`
}
// User 是人类用户(多用户账号体系)
@ -173,6 +189,25 @@ type Mail struct {
// `GET /mail/inbox` 补投 —— 那条路径上没有这个字段的话,补投的邮件会被
// 保守当成 Agent 来信,于是人发的那封失去自动回信。
FromHuman bool `json:"from_human"`
// ToHuman 表示收件方是人类用户而不是 Agent(判据与 FromHuman 同源:
// to_name 是否存在于 users 表)。
//
// 前端拼地址时靠它决定「要不要带 path 与会话位」:人只写名字,
// Agent 才拼 `name@path.session`。此前靠 `to_workspace` 是否为空的启发式 ——
// 但对 Agent 而言 to_workspace 存的是 Agent 名而不是路径(历史遗留),
// 那条启发式在「Agent 名恰好为空」时会猜错。显式布尔胜过猜。
ToHuman bool `json:"to_human"`
// PermissionMode / PermissionEnforcement 是所属会话的权限档位与实际强制力。
//
// **补拉路径必须有它们**(与 FromHuman 同一个理由):SSE 事件里叫
// `permission_mode` / `permission_enforcement`,而插件重启后走
// `GET /mail/inbox` 补投 —— 那条路径上没有这两个字段的话,补投的邮件
// 会拿不到档位,插件只能回落默认档 —— 于是一条 plan 档的任务在重启后
// 惄惄变成了 workspace 档。
PermissionMode string `json:"permission_mode"`
PermissionEnforcement string `json:"permission_enforcement"`
}
// PermissionRequest 是 Agent 向人类发起的权限请求