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

@ -206,15 +206,11 @@ export async function listAgents(status?: string) {
export interface SendMailOpts {
cc?: string;
reply_to?: string;
/** 仅在用 .new 新建会话时生效:给新会话命名,之后可用 name@path.<别名> 续谈 */
session_alias?: string;
/** 先用 uploadAttachment 上传取得的 id 列表 */
attachment_ids?: string[];
/**
* 本任务的往返预算(0/省略 = 不限)。仅在新建会话时生效;
* 续谈已有会话请用 updateSessionBudget(对话页里可随时改)。
*/
max_rounds?: number;
/** 权限档位(仅新建会话时生效):plan / workspace / full */
permission_mode?: string;
}
export async function sendMail(
@ -239,7 +235,8 @@ export async function sendMail(
session_alias: opts.session_alias ?? '',
attachment_ids: opts.attachment_ids ?? [],
// null 而非 0:0 是「不限」的合法取值,省略才表示「不设置」
max_rounds: opts.max_rounds ?? null
max_rounds: opts.max_rounds ?? null,
permission_mode: opts.permission_mode ?? '',
});
}
@ -524,6 +521,15 @@ export async function updateSessionBudget(
return request<SessionBudget>('PUT', `/sessions/${id}/budget`, patch);
}
export async function updateSessionPermission(
id: string,
permission_mode: string
) {
return request<{ permission_mode: string; permission_enforcement: string }>(
'PUT', `/sessions/${id}/permission`, { permission_mode }
);
}
/** 驳回当前提议。记下来,提示条不再反复弹同一个建议。 */
export async function dismissRenameProposal(id: string) {
return request<{ status: string; dismissed?: string }>(