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 && (