2.7 KiB
2.7 KiB
修复 Goal 模式标记与自动标题
问题
设置型 /goal <目标> 已经以普通用户气泡持久化和展示,但气泡与普通消息完全一致,用户无法识别这是 Goal。与此同时,/goal 由服务端 Slash/RPC 旁路处理,不会先创建模型回合,因此模型没有机会主动调用 ccweb_set_title,默认标题会一直保留为 New Chat 或 Untitled。
需求
- 仅对
role: user且ccwebGoalCommand.action === 'set'的消息增加 Goal 专用 class,并在正文上方显示固定标签“目标模式”。 - 实时
session_message与刷新后的历史消息必须走同一渲染入口;普通用户消息、控制型/goal命令和其他 display-only 消息不得出现该标签。 - 标签保持紧凑、可读,不把用户气泡重新变成大系统面板;提供基础样式和
wasteland暗金荒野主题适配,并保证长正文和窄屏不溢出。 - 设置型
/goal持久化展示消息时,仅在当前标题仍为New Chat/Untitled且titleSource不是manual时,从 objective 派生标题。 - 派生标题压平连续空白、截取最多 60 个字符,写入
session.title与titleSource: 'derived';不得伪造只接受source: 'llm'的标题历史事件。 - 标题改变后立即保存,并向查看该会话的客户端发送
session_renamed,再广播最新session_list;手动标题和任何非默认标题必须保持不变。 - 保持 Goal RPC、稳定请求 ID 去重、display-only 持久化、失败草稿语义和控制型
/goal行为不变。 - 修改
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 重试任务的文件和区块。