homeagent: advisory 档位提示词 + 心跳报 advisory + permission_mode.go

- 新建 permission_mode.go:NormalizeMode / ModeBriefing(advisory 版本)
  homeagent 无工具拦截点,档位只能在提示词里告知模型,措辞如实说
  「这个平台无法强制这一档」—— 假装强制会让模型以为越界会被拦
- mailEvent 加 PermissionMode 字段(从 SSE new_mail payload 读入)
- handleNewMail 提示词追加 ModeBriefing(plan/workspace/full 三档说明)
- 心跳上报 mode_enforcement: 'advisory'
- go vet + 68 测试全过
This commit is contained in:
2026-09-06 19:23:42 +08:00
parent 0c98fab4d5
commit ed3703295c
2 changed files with 59 additions and 1 deletions

View File

@ -501,6 +501,7 @@ func (p *Plugin) register() error {
func (p *Plugin) heartbeat() error {
payload := map[string]interface{}{}
payload["mode_enforcement"] = "advisory" // homeagent 无沙箱,档位只在提示词里告知
// B-2.3:带上模型目录
if len(p.modelCatalog) > 0 {
@ -698,6 +699,9 @@ type mailEvent struct {
FromHuman bool `json:"from_human"`
// InReplyTo 非空 = 这封是对本方某封信的回复,不是新派的活。
InReplyTo string `json:"in_reply_to"`
// PermissionMode 是会话的权限档位plan / workspace / full
// homeagent 无法强制执行任何档位advisory只能在提示词里告知模型。
PermissionMode string `json:"permission_mode"`
// Decision / DecidedBy 只在 permission_decision 事件上有值。
Decision string `json:"decision"`
DecidedBy string `json:"decided_by"`
@ -970,10 +974,11 @@ func (p *Plugin) handleNewMail(evt mailEvent, resumed bool) {
"%s\n\n"+
"发件人:%s\n主题%s\n邮件 ID%s\n%s身份你是 %s\n%s\n"+
"请先调用 read_inbox 读取完整正文,然后处理其中的请求。\n\n"+
"%s",
"%s\n%s",
inboundHeadline(evt.InReplyTo, evt.FromHuman, false),
evt.FromName, evt.Subject, evt.MailID, replyLine, p.agentName, addrLine,
replyInstruction(evt.FromHuman, evt.ReplyAddr),
ModeBriefing(evt.PermissionMode, "advisory"),
)
// InjectInputSync 阻塞等待 agent 处理完毕,返回最终回复文本。