From 7e9327a78b82a098ff1bb4c54acf56353a0e8047 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Sun, 6 Sep 2026 22:00:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E4=BB=B6=E9=A1=B5=E6=A1=A3=E4=BD=8D?= =?UTF-8?q?=E6=AF=8F=E6=AC=A1=E5=8F=91=E4=BF=A1=E9=83=BD=E8=83=BD=E6=94=B9?= =?UTF-8?q?=EF=BC=88=E5=90=AB=E7=BB=AD=E8=B0=88=E5=B7=B2=E6=9C=89=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - me.go: SendMail 续谈时若显式传 permission_mode,也更新该会话档位 (人是权限的源头,可以任改三档,不受继承约束) - ComposePage: 权限档位按钮始终可用(去 disabled/opacity),不再只限 .new - hint 文案:新建→'Agent 在这类任务里被允许动手的程度', 续谈→'改了即刻生效(该会话的档位会更新)' - 默认 workspace(不再从空字符串开始) - sendMail 始终传 permission_mode(不再只限 isNewSession) --- gateway/internal/handler/me.go | 12 +++++++ web/src/components/ComposePage.tsx | 52 ++++++++++++++---------------- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/gateway/internal/handler/me.go b/gateway/internal/handler/me.go index 06c5de1..ad740c3 100644 --- a/gateway/internal/handler/me.go +++ b/gateway/internal/handler/me.go @@ -153,6 +153,18 @@ func MeSendMail(w http.ResponseWriter, r *http.Request) { repo.AgentModeEnforcement(r.Context(), to.Name)) } + // 续谈已有会话时,人也可以显式改档位。人是权限的源头, + // 可以任改三档——与 Agent 不同,人没有「只能同档或更严」的约束。 + if !created && req.PermissionMode != "" { + mode := models.NormalizePermissionMode(req.PermissionMode) + if _, err := repo.SetSessionPermissionMode(r.Context(), sessionID, mode); err != nil { + Error(w, http.StatusInternalServerError, "Failed to update permission mode") + return + } + _ = repo.SetSessionEnforcement(r.Context(), sessionID, + repo.AgentModeEnforcement(r.Context(), to.Name)) + } + // 人类侧不产生改名提议(人直接有改名按钮,用不着向自己提议), // 但仍然剥掉标记:粘贴进正文时它会被渲染成一行可见的转义文本。 _, body := extractRenameProposal(req.Body) diff --git a/web/src/components/ComposePage.tsx b/web/src/components/ComposePage.tsx index baf927b..0dc7295 100644 --- a/web/src/components/ComposePage.tsx +++ b/web/src/components/ComposePage.tsx @@ -30,7 +30,7 @@ export default function ComposePage() { // 而不是事后到管理员页面去调某个 Agent 的全局配额。 const [maxRounds, setMaxRounds] = useState(''); // 权限档位(仅新建会话时生效):plan / workspace / full。 - const [permissionMode, setPermissionMode] = useState(''); + const [permissionMode, setPermissionMode] = useState('workspace'); // 收件 Agent 的默认预算;null = 还没查到(未注册的收件人也是 null) const [agentDefault, setAgentDefault] = useState(null); const [attachments, setAttachments] = useState([]); @@ -111,7 +111,7 @@ export default function ComposePage() { ...(isNewSession && maxRounds.trim() !== '' ? { max_rounds: Number(maxRounds.trim()) } : {}), - ...(isNewSession && permissionMode ? { permission_mode: permissionMode } : {}), + ...(permissionMode ? { permission_mode: permissionMode } : {}), }); const where = res.session_alias ? `会话别名 ${res.session_alias}` @@ -191,31 +191,29 @@ export default function ComposePage() { )} - {isNewSession && ( - -
- {[ - { value: 'plan', label: '只读', desc: '不许写/改/执行' }, - { value: 'workspace', label: '目录内', desc: '越界问人' }, - { value: 'full', label: '全权', desc: '自动放行' }, - ].map(o => ( - - ))} -
-
- )} + +
+ {[ + { value: 'plan', label: '只读', desc: '不许写/改/执行' }, + { value: 'workspace', label: '目录内', desc: '越界问人' }, + { value: 'full', label: '全权', desc: '自动放行' }, + ].map(o => ( + + ))} +
+
{isNewSession && (