feat: improve goal mode and Codex App resilience

This commit is contained in:
shiyue
2026-08-18 21:27:58 +08:00
parent 389690af64
commit 8fe31e0a5e
27 changed files with 631 additions and 24 deletions

View File

@@ -6,7 +6,7 @@
## Current Phase
阶段 7:执行真实浏览器桌面与窄屏验收
阶段 11:实现目标模式气泡标记
## Phases
@@ -57,10 +57,10 @@
### 阶段 7:执行真实浏览器桌面与窄屏验收
- [ ] 在桌面视口验证长 Goal 为用户气泡
- [ ] 在窄屏验证换行、溢出和系统提示尺寸
- [ ] 确认暗金荒野主题未再生成大块 Goal 系统面板
- **Status:** in_progress
- [x] 用户在桌面真实界面确认长 Goal 已回到普通用户气泡
- [x] 基于真实反馈记录新缺陷:缺少“目标模式”标记、标题未变化
- [x] 将窄屏、主题和最终视觉验收转移至阶段 14
- **Status:** complete
### 阶段 8:审查差异并清理临时任务记录
@@ -68,11 +68,50 @@
- [ ] 完成计划记录并删除本任务 TODO CSV
- **Status:** pending
### 阶段 9:定位 Goal 标记与自动标题链路
- [x] 使用代码索引确认 Goal 消息渲染、标题派生、保存和广播入口
- [x] 用源码与当前差异交叉验证修改边界,避开其他任务改动
- [x] 确认 Goal thread 已注入 `mcp_servers.ccweb`,但 `thread/goal/set` 不会自动触发工具调用
- **Status:** complete
### 阶段 10:审查增量实施计划并修正缺口
- [x] 由独立计划审查员检查标记、自动标题与回归范围
- [x] 修正会导致实现偏差或阻塞的计划问题并完成复审
- **Status:** complete
### 阶段 11:实现目标模式气泡标记
- [ ] 复用 `ccwebGoalCommand` 元数据给 Goal 用户消息增加专用类名和标签
- [ ] 增加基础样式及暗金荒野主题适配,不改变普通用户气泡
- **Status:** in_progress
### 阶段 12:实现 Goal 新会话自动标题
- [ ] 仅在会话仍为默认标题时从 Goal objective 派生简短标题
- [ ] 持久化派生标题并向当前 viewers 发送 `session_renamed`,再广播会话列表,不覆盖手动标题
- **Status:** pending
### 阶段 13:补充标记与标题回归测试
- [ ] 覆盖 Goal 标签 DOM、普通消息隔离、默认标题派生和手动标题保护
- [ ] 同时覆盖标题磁盘持久化、`session_renamed` 与 `session_list` 实时更新契约
- **Status:** pending
### 阶段 14:运行语法、全量回归与视觉验收
- [ ] 执行语法检查、全量回归和差异格式检查
- [ ] 检查桌面、窄屏及暗金荒野主题下的 Goal 标记视觉
- [ ] 按验收清单记录真实浏览器能力与剩余限制
- **Status:** pending
## Key Questions
1. 设置型 `/goal` 气泡如何持久化而不进入普通模型对话链路?
2. 如何只改变 Goal 命令,不改变其他 Slash 命令的既有行为?
3. 长 Goal 在桌面与窄屏下是否仍保持普通用户气泡布局?
4. `/goal` 绕过模型时,如何可靠更新默认标题且不覆盖用户手动命名?
## Decisions Made
@@ -84,6 +123,10 @@
| Goal 气泡使用独立展示消息路径 | 写入 `session.messages` 并发出 `session_message`,但不调用普通消息运行时,兼顾刷新恢复与防止重复模型执行 |
| `clientMessageId/requestId` 是命令与消息去重键 | 传输重放时可识别同一次设置,避免重复气泡与重复 Goal RPC |
| 校验前失败恢复草稿;RPC 已启动后失败保留气泡且不恢复草稿 | 保持即时提交记录,同时避免用户重试产生两条相同气泡 |
| Goal 标签复用 `ccwebGoalCommand` 元数据 | 历史消息与实时消息共用同一渲染入口,无需迁移持久化数据 |
| `/goal` 自动标题由服务端旁路直接派生 | Goal RPC 不经过模型,不能依赖模型主动调用 `ccweb_set_title` MCP |
| 只更新默认标题且保留 `titleSource: derived` | 避免覆盖手动标题,并允许后续模型/MCP继续优化标题 |
| Goal 标题变化同时发送 `session_renamed` 和 `session_list` | 前者更新当前聊天顶部标题,后者更新侧栏;缺一都会产生局部陈旧 UI |
## Errors Encountered