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

51 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 子代理标题与简介展示
## 背景
当前协作子代理卡片经常只显示“子代理”或线程 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。
- 不新增依赖,不改变后端协议,不重启服务。
- 不覆盖当前工作树中图片附件数量限制相关改动。