P5 前端:权限档位选择器 + 卡片徽标 + 对话页改档

前端完整实现:
- types: Session/HumanSession/Mail/Contact 加 permission_mode + permission_enforcement 字段
- api/client: sendMail 支持 permission_mode 参数;新增 updateSessionPermission API
- PermissionChip 组件:plan=蓝/只读, workspace=绿/目录内, full=橙/全权
  native 实心点=平台强制, advisory 空心点=仅提示;hover 显示 tooltip
- ComposePage: 新建会话时显示三档按钮(plan/workspace/full),传入 sendMail
- MailView: 会话头部加 PermissionEditor(点击徽标展开三档选择,点保存调 API 改档)
- WorkCard: 卡片底部与 BudgetChip 并排显示 PermissionChip(compact 模式)
- sessionStore: 新增 setPermissionMode action
- 177 前端测试全过,gateway 8 包全绿,已部署
This commit is contained in:
2026-09-06 21:24:41 +08:00
parent 36f1099c02
commit be61724314
7 changed files with 222 additions and 10 deletions

View File

@ -25,7 +25,10 @@ interface SessionState {
/** 本任务的往返预算;null = 尚未取到 */
budget: SessionBudget | null;
/** 改本会话预算(对话页里随时调)。reset 把已用次数归零。 */
/** 改本会话预算(对话页里随时调)。reset 把已用次数归零。 */
setBudget: (patch: { max_rounds?: number; reset?: boolean }) => Promise<void>;
/** 改本会话权限档位(对话页里随时调)。人是权限的源头,可以任改三档。 */
setPermissionMode: (mode: string) => Promise<void>;
/** 重新拉取预算(Agent 发信后剩余会变) */
refreshBudget: () => Promise<void>;
/** 归档后若正查看该会话则退出 */
@ -136,6 +139,21 @@ export const useSessionStore = create<SessionState>((set, get) => ({
}
},
setPermissionMode: async mode => {
const id = get().currentSession?.session_id;
if (!id) return;
try {
const res = await api.updateSessionPermission(id, mode);
const cur = get().currentSession;
if (cur && cur.session_id === id) {
set({ currentSession: { ...cur, permission_mode: res.permission_mode, permission_enforcement: res.permission_enforcement } });
}
await get().fetchSessions();
} catch (err) {
set({ error: err instanceof Error ? err.message : String(err) });
}
},
clearSession: () =>
set({ currentSession: null, currentSessionMails: [], renameProposal: null, budget: null }),