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

@ -0,0 +1,53 @@
package main
// permission_mode.go — 权限档位的本地翻译advisory仅提示词告知模型
//
// homeagent 没有任何工具调用拦截点(没有 tool_call hook、没有沙箱
// 档位在这里是 advisory —— 只能在提示词里告诉模型「请遵守」。
// 假装是强制的更危险:模型会以为越界会被拦,于是不必自己小心,
// 那比做不到本身更危险。
const (
ModePlan = "plan"
ModeWorkspace = "workspace"
ModeFull = "full"
)
var validModes = map[string]bool{
ModePlan: true, ModeWorkspace: true, ModeFull: true,
}
// NormalizeMode 把外部输入收敛成合法档位。
// 非法值回落到默认档workspace不是 full。
func NormalizeMode(m string) string {
if validModes[m] {
return m
}
return ModeWorkspace
}
// ModeBriefing 生成给模型看的档位说明,放进提示词。
//
// homeagent 永远是 advisory无法强制所以措辞必须如实说
// 「这个平台无法强制这一档」—— 假装强制会让模型以为越界会被拦,
// 于是不必自己小心,那比做不到本身更危险。
func ModeBriefing(mode, enforcement string) string {
m := NormalizeMode(mode)
if m == ModeFull {
return "本任务权限档位full全权。工具调用不需要额外授权。"
}
if m == ModePlan {
return "本任务权限档位plan只读。" +
"**这个平台无法强制这一档**,所以约束靠你自己遵守:" +
"请不要写文件、改文件或执行命令。" +
"请把结论、方案、需要人工执行的步骤写在回信里。" +
"需要动手请让发件人把档位改成 workspace。"
}
// workspace
return "本任务权限档位workspace。请把改动限制在本任务的工作目录内。" +
"**这个平台无法强制这一档**,所以边界靠你自己遵守:" +
"需要改该目录之外的东西时,不要直接动手,先在回信里说明。"
}