Files
cc-web/.trellis/tasks/07-11-subagent-card-metadata/prd.md
2026-07-18 10:14:38 +08:00

3.7 KiB
Raw Blame History

子代理标题与简介展示

背景

当前协作子代理卡片经常只显示“子代理”或线程 ID。真实 Codex App 事件在启动阶段通常只提供任务 prompt,agentsStates 为空;完成阶段的 name 也可能仍是线程 ID。前端虽然读取了标题和详情字段,但简介只存在于悬浮提示中。

目标

让每个子代理卡片在运行中和完成后都显示稳定、可扫描的任务标题与简介。

功能要求

  1. 标题优先使用非通用、非线程 ID 的 label/title/nickname/name。
  2. 没有可读标题时,从该子代理的任务提示词生成稳定标题;不得显示完整 UUID 作为标题。
  3. 简介优先保留该子代理的任务提示词摘要,限制为两行;完整简介通过 title 属性可查看。
  4. 多次 spawn_agent/spawnAgent 合并时,每个子代理必须保存自己的标题和简介,不能全部复用第一个 prompt。
  5. 运行结果继续作为悬浮详情提供,不覆盖任务简介。
  6. 保持现有状态标签、关闭按钮、点击复制线程 ID、折叠和聚合行为。
  7. 关闭更新即使只提供 child.threadId/status,且工具载荷缺少 receiverThreadIds/agentsStates,也必须保留此前子代理卡片,将状态显示为“已关闭”。
  8. 空的 wait/close 协作工具不得把已有子代理数量重置为 0;普通工具调用不得进入子代理状态合并路径。
  9. 当历史中找不到原 spawnToolId 时,服务端应将 child 状态合并到最近的协作工具记录,保证刷新后仍可恢复关闭卡片;不得选择普通工具。
  10. 原生 subAgentActivity 必须归一化进同一子代理卡片:agentThreadId 作为线程 ID,agentPath 作为角色/标题来源,活动 kind 映射为状态;随后空 wait 复用这些状态,原始活动工具条不重复显示。
  11. 若 subAgentActivity 没有携带原始 prompt,应显示可读角色标题和明确标注的兜底任务说明;若同线程的其他事件提供 prompt,则继续按既有优先级保留真实简介。
  12. 产品要求所有子代理统一为“标题 + 简介”富卡片。无 prompt 时,从 agentPath basename/task name 生成可读标题,并显示兜底任务说明;不得继续展示裸 snake_case 名称或空白简介区域。

视觉要求

  • 延续现有深色、紧凑的工具调用样式。
  • 标题是卡片主信息;简介使用较低对比度与较小字号,最多两行。
  • 角色信息仍为辅助信息,不增加新的装饰性图标、渐变或动画。
  • 窄屏下标题、状态和关闭按钮不得造成横向溢出。

验收标准

  • 有可读协议标题时原样显示。
  • 标题等于线程 ID、子代理 或 子代理 N 时,能从对应 prompt 得到可读标题。
  • 两个不同 prompt 的子代理合并后展示不同标题和简介。
  • 简介 DOM 可见且应用两行截断样式。
  • 无 prompt 时仍能回退到短线程 ID,不报错。
  • 关闭空载荷场景保留原标题、简介、线程 ID,并显示关闭状态与非零数量。
  • 页面刷新和历史重渲染后仍满足上述关闭卡片要求。
  • 仅包含 subAgentActivity + 空 wait 的历史消息显示非零子代理富卡片,标题来自 agentPath,且不再同时显示 subAgentActivity 原始工具条或 ID call_...。
  • 无 prompt 的历史子代理也显示可读标题与一行兜底简介,布局层级与有 prompt 的富卡片一致。
  • JavaScript 语法检查及项目回归测试通过。

范围

  • 允许修改:public/app.js、public/style.css、server.js 子代理持久化函数、相关回归测试与 mock。
  • 不新增依赖,不改变后端协议,不重启服务。
  • 不覆盖当前工作树中图片附件数量限制相关改动。