3.7 KiB
3.7 KiB
子代理标题与简介展示
背景
当前协作子代理卡片经常只显示“子代理”或线程 ID。真实 Codex App 事件在启动阶段通常只提供任务 prompt,agentsStates 为空;完成阶段的 name 也可能仍是线程 ID。前端虽然读取了标题和详情字段,但简介只存在于悬浮提示中。
目标
让每个子代理卡片在运行中和完成后都显示稳定、可扫描的任务标题与简介。
功能要求
- 标题优先使用非通用、非线程 ID 的
label/title/nickname/name。 - 没有可读标题时,从该子代理的任务提示词生成稳定标题;不得显示完整 UUID 作为标题。
- 简介优先保留该子代理的任务提示词摘要,限制为两行;完整简介通过
title属性可查看。 - 多次
spawn_agent/spawnAgent合并时,每个子代理必须保存自己的标题和简介,不能全部复用第一个 prompt。 - 运行结果继续作为悬浮详情提供,不覆盖任务简介。
- 保持现有状态标签、关闭按钮、点击复制线程 ID、折叠和聚合行为。
- 关闭更新即使只提供
child.threadId/status,且工具载荷缺少receiverThreadIds/agentsStates,也必须保留此前子代理卡片,将状态显示为“已关闭”。 - 空的
wait/close协作工具不得把已有子代理数量重置为 0;普通工具调用不得进入子代理状态合并路径。 - 当历史中找不到原
spawnToolId时,服务端应将 child 状态合并到最近的协作工具记录,保证刷新后仍可恢复关闭卡片;不得选择普通工具。 - 原生
subAgentActivity必须归一化进同一子代理卡片:agentThreadId作为线程 ID,agentPath作为角色/标题来源,活动kind映射为状态;随后空wait复用这些状态,原始活动工具条不重复显示。 - 若
subAgentActivity没有携带原始 prompt,应显示可读角色标题和明确标注的兜底任务说明;若同线程的其他事件提供 prompt,则继续按既有优先级保留真实简介。 - 产品要求所有子代理统一为“标题 + 简介”富卡片。无 prompt 时,从
agentPathbasename/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。 - 不新增依赖,不改变后端协议,不重启服务。
- 不覆盖当前工作树中图片附件数量限制相关改动。