发件页档位每次发信都能改(含续谈已有会话)

- me.go: SendMail 续谈时若显式传 permission_mode,也更新该会话档位
  (人是权限的源头,可以任改三档,不受继承约束)
- ComposePage: 权限档位按钮始终可用(去 disabled/opacity),不再只限 .new
- hint 文案:新建→'Agent 在这类任务里被允许动手的程度',
  续谈→'改了即刻生效(该会话的档位会更新)'
- 默认 workspace(不再从空字符串开始)
- sendMail 始终传 permission_mode(不再只限 isNewSession)
This commit is contained in:
2026-09-06 22:00:33 +08:00
parent 1759666d38
commit 7e9327a78b
2 changed files with 37 additions and 27 deletions

View File

@ -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<number | null>(null);
const [attachments, setAttachments] = useState<PendingAttachment[]>([]);
@ -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() {
</Field>
)}
{isNewSession && (
<Field label="权限档位" hint="Agent 在这类任务里被允许动手的程度;只在新建会话时生效">
<div className="flex items-center gap-2">
{[
{ value: 'plan', label: '只读', desc: '不许写/改/执行' },
{ value: 'workspace', label: '目录内', desc: '越界问人' },
{ value: 'full', label: '全权', desc: '自动放行' },
].map(o => (
<button
key={o.value}
type="button"
onClick={() => setPermissionMode(o.value)}
title={o.desc}
className={`px-2.5 py-1.5 rounded-md border text-xs font-medium transition-colors ${
permissionMode === o.value
? 'border-blue-500 bg-blue-50 text-blue-700'
: 'border-gray-300 bg-white text-gray-600 hover:bg-gray-50'
}`}
>
{o.label}
</button>
))}
</div>
</Field>
)}
<Field label="权限档位" hint={isNewSession ? "Agent 在这类任务里被允许动手的程度" : "改了即刻生效(该会话的档位会更新)"}>
<div className="flex items-center gap-2">
{[
{ value: 'plan', label: '只读', desc: '不许写/改/执行' },
{ value: 'workspace', label: '目录内', desc: '越界问人' },
{ value: 'full', label: '全权', desc: '自动放行' },
].map(o => (
<button
key={o.value}
type="button"
onClick={() => setPermissionMode(o.value)}
title={o.desc}
className={`px-2.5 py-1.5 rounded-md border text-xs font-medium transition-colors ${
permissionMode === o.value
? 'border-blue-500 bg-blue-50 text-blue-700'
: 'border-gray-300 bg-white text-gray-600 hover:bg-gray-50'
}`}
>
{o.label}
</button>
))}
</div>
</Field>
{isNewSession && (
<Field label="往返预算" hint="留空 = 用该 Agent 的默认值;之后可在对话页随时调整">