Files
cc-web/.trellis/tasks/08-18-goal-mode-title/prd.md

2.7 KiB
Raw Blame History

修复 Goal 模式标记与自动标题

问题

设置型 /goal <目标> 已经以普通用户气泡持久化和展示,但气泡与普通消息完全一致,用户无法识别这是 Goal。与此同时,/goal 由服务端 Slash/RPC 旁路处理,不会先创建模型回合,因此模型没有机会主动调用 ccweb_set_title,默认标题会一直保留为 New Chat 或 Untitled。

需求

  1. 仅对 role: user 且 ccwebGoalCommand.action === 'set' 的消息增加 Goal 专用 class,并在正文上方显示固定标签“目标模式”。
  2. 实时 session_message 与刷新后的历史消息必须走同一渲染入口;普通用户消息、控制型 /goal 命令和其他 display-only 消息不得出现该标签。
  3. 标签保持紧凑、可读,不把用户气泡重新变成大系统面板;提供基础样式和 wasteland 暗金荒野主题适配,并保证长正文和窄屏不溢出。
  4. 设置型 /goal 持久化展示消息时,仅在当前标题仍为 New Chat/Untitled 且 titleSource 不是 manual 时,从 objective 派生标题。
  5. 派生标题压平连续空白、截取最多 60 个字符,写入 session.title 与 titleSource: 'derived';不得伪造只接受 source: 'llm' 的标题历史事件。
  6. 标题改变后立即保存,并向查看该会话的客户端发送 session_renamed,再广播最新 session_list;手动标题和任何非默认标题必须保持不变。
  7. 保持 Goal RPC、稳定请求 ID 去重、display-only 持久化、失败草稿语义和控制型 /goal 行为不变。
  8. 修改 style.css 后推进样式 cache-busting 版本,并同步相关回归断言。

验收标准

  • 回归证明 Goal 消息生成专用 class 与“目标模式”标签,普通用户消息不会误命中。
  • 回归证明默认标题会从多行 Goal objective 派生、持久化为 derived,并实时发出 session_renamed/session_list。
  • 回归证明手动标题和已有非默认标题不会被 Goal 覆盖。
  • 重复同一 Goal 命令仍只产生一条展示消息、一次 Goal RPC,且不会重复改标题。
  • node --check、相关前端契约测试、timeout 60s npm run regression 与 git diff --check 通过。
  • 在可用的真实浏览器中检查桌面、窄屏和 wasteland 主题;若本机仍无浏览器能力,必须如实记录限制,不得以自动化替代视觉结论。

非目标

  • 不让 /goal 额外启动普通模型 turn,也不为了改标题调用内部 HTTP/MCP 回路。
  • 不覆盖用户手动标题,不把 Goal 自动标题记作 LLM 标题历史。
  • 不重做普通用户气泡、系统消息、其他主题或 welcome 页面。
  • 不修改当前工作树中 Codex App 重试任务的文件和区块。