33 lines
2.7 KiB
Markdown
33 lines
2.7 KiB
Markdown
# 修复 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 重试任务的文件和区块。
|