Files
UHD_Media_Tool/apps/web/app/components/agent/slash-commands.ts
T
rootandClaude Opus 5.5 6fcf82afb0 feat(web): 智能体对话重做(AGUI-3)
- 会话流:用户消息 → 一行进度 → 结论正文 → 没做的事 → 一行实际结果。进度行把一段里的工具调用、思考和过程中的话
  聚成一行(1 次也折叠),按能力 verb/noun 人话计数(「查了站点、2 个下载任务和媒体库 · 1 项没做 · 3 秒」),
  展开每步一行;工具名、调用 ID、幂等键、输入输出进技术信息。去掉回合头、「模型说的」重复卡和系统核实大卡。
- agent.plan / agent.propose_options 不作为工具调用出现(旧事件回放同样跳过);被拒调用不出红卡,
  回合末尾一行「没做:检测站点,需要你批准 [批准并重试]」(非计划类能力建一次性持续授权后重试)。
- 方案卡:每个方案一个按钮,点一下就选定;推荐项第一位、主按钮;按钮写服务端给的动作要点;风险折叠;
  「都不要…」点开才出原因框;选完收成一行。审批卡只留摘要和批准 / 拒绝,计划 ID、hash、版本、到期进技术信息。
- 会话页去掉右侧栏和页头目标,步骤 / 子会话 / 模型 / 预算 / ID 进顶部概况条;输入区只有输入框和发送 / 停止,
  / 指令 /先给方案、/重跑(「先看方案再执行」开关原本只是新建时的本地状态,不需要迁移)。
- 抽屉去掉「当前 / 历史」Tab:头部「历史」弹层(最近 20 条)+「新对话」;上下文显示成名称标签,可去掉。
- 会话列表:搜索 + 全部 / 等你处理 / 失败;等你处理置顶,子会话收在父会话下,正常结束不加徽章。
- 入口页与空态给 3 个快捷目标。mock 加审查报告 3 个示例的演示数据;smoke 改测历史弹层。
- 组件测试:聚合、隐藏、拒绝一行、方案一键选定、历史置顶与子会话、指令。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 22:41:34 +08:00

31 lines
1.7 KiB
TypeScript

// 输入框里的 `/` 指令(AGUI-3)。只作用于这一次输入,不是开关:
// - /先给方案:新会话按「先看方案再执行」建(proposeFirst,服务端在选定方案前拒绝执行类能力);
// 在已有会话里发,转成一句"先给方案"的要求(模型按它做,服务端不强制)。
// - /重跑:用同一个目标新开一次会话(已有会话里才有)。
// 旧的「先看方案再执行」开关只是每次新建时的本地状态,没有存进设置;旧会话 scope.proposeFirst 照常生效。
export type AgentCommand = { name: "/先给方案" | "/重跑"; description: string };
export const PROPOSE_FIRST: AgentCommand = { name: "/先给方案", description: "这次先给方案,选定后再执行" };
export const RERUN: AgentCommand = { name: "/重跑", description: "用同一个目标重新开始" };
/** 新会话可用的指令 */
export const NEW_RUN_COMMANDS: AgentCommand[] = [PROPOSE_FIRST];
/** 会话里可用的指令 */
export const RUN_COMMANDS: AgentCommand[] = [PROPOSE_FIRST, RERUN];
/** 拆出开头的指令:「/先给方案 把沙丘收进来」→ { command: "/先给方案", rest: "把沙丘收进来" } */
export function parseCommand(
text: string,
commands: AgentCommand[] = RUN_COMMANDS,
): { command: AgentCommand["name"] | null; rest: string } {
const t = text.trim();
for (const c of commands)
if (t === c.name || t.startsWith(`${c.name} `) || t.startsWith(`${c.name}\n`))
return { command: c.name, rest: t.slice(c.name.length).trim() };
return { command: null, rest: t };
}
/** 已有会话里发 /先给方案:转成给模型的一句要求 */
export const PROPOSE_FIRST_MESSAGE = "先给出方案让我选,选定前不要执行有副作用的操作。";