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