Files
ycode/docs/WorkBuddy对话与输入交互统一对齐方案-2026-10-21.md
T

125 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# WorkBuddy 对话与输入交互统一对齐方案
## 一、目标与证据基线
统一覆盖十项:**会话加载、模型选择、权限保存与首发生效、模式输入栏、过程分组、运行状态、问答展示、完成收起/展开、工具授权、归档/删除确认**。
- 以 WorkBuddy 5.8.3 截图及已核验代码、样式为目标;历史源码明确版本范围,当前文件哈希相同的部分可以复用。
- 所有原版调查通过 REA。区分静态代码确认、运行行为验证和像素验收,不将编译通过视为完整对齐。
- 保留处理时间及其他任务已有修改,实施前重新审阅差异,增量补齐,不重做已有修复。
- 不更换内核、不重建数据管理页面,不伪造模型、费用、进度、审批原因或超时状态。
## 二、会话加载、模型与权限一致性
### 会话加载
- 接入现有 loading 状态,区分新任务首页、已有空会话、加载中和加载失败;不再因加载时消息为空而显示首页。
- 无缓存时恢复原版两组消息骨架:用户气泡、助手头像/名称和三行正文占位,使用主题 token、1.5 秒扫光及约 300ms 淡出。
- 目标会话有非空缓存时先显示其消息,不显示骨架;重复点击已就绪的当前会话不清空、不闪烁。
- 保留页面框架和输入区;标题未知时显示顶栏占位。保留草稿,但禁止向尚未就绪的会话发送。
- 保留 session/version 防串、活动回合快照和缓冲事件归并;失败撤除骨架并提供错误与重试,旧请求不得覆盖新会话。
- 使切换反馈先于异步结果呈现;另测大历史的解析和渲染阻塞,仅优化实测热点,不以骨架动画替代性能修复。
### 模型选择
- 输入栏与发送路径共用有效模型解析;没有模型时显示“配置自定义模型”,点击进入配置并阻止发送。
- 移除旧配置名称回退,不能因选择为空或失效而显示不存在的 `deepseek-chat`。
- 新增成功后自动选中新模型,同步全局默认和当前任务下一次请求;编辑已有模型不无故改变选择。
- 删除后清理会话、草稿中的失效引用:有剩余模型则使用有效默认选择,否则清空。
- 进行中的请求及历史消息保留真实模型快照,不因模型删除或新增而改写。
- 检查旧配置迁移,保留真实用户配置,不从程序内置默认值凭空创建模型。
### 权限保存与首发生效
- 补齐草稿权限 → 会话创建 → 持久化 → 请求参数 → 内核策略,修复创建会话遗漏 permissionMode 的路径。
- 已有会话以保存权限为准,全局偏好只作为新任务默认值;首发直接读取权威选择,不依赖 effect 尚未同步的副本。
- 请求更新权限后同步前端会话元数据;重启、重入、活动回合恢复后,标签、存储、请求和内核策略一致。
- 验证 craft 完全访问从首条请求生效,无需停止重选;保留明确安全例外及 plan/ask 限制。
- 复用另一任务已有的权限保存和策略更新,不新增第二套权限状态。
## 三、输入栏、过程、问答与完成态
### 模式输入栏
- 恢复 StatusChips/ModeChip:craft 不显示,plan 为剪贴板图标+“计划”,ask 为气泡图标+“仅问答”。
- 使用原版 SVG 和样式:32px 高、8px 水平内边距、4px 间距、16px 图标、13px/20px/500 文字,恢复主题及焦点规则。
- Chip 本体不打开下拉;hover/focus 显示清除按钮,点击回 craft;模式变更禁用时不显示清除按钮。
- 恢复加号 → 分支 → 权限 → 模式及其他状态的插槽,右侧保留模型、麦克风和发送。
- plan/ask 真正禁用权限控件,并关闭、卸载已打开的权限浮层,保留原因提示。
- plan 使用默认权限并保留进入前的值用于退出恢复;ask 保留此前权限显示但禁用修改。补核当前版本宿主差异,不覆盖用户保存的原始偏好。
- 加号菜单与 Chip 共用会话/草稿模式状态,切换失败回滚、保留草稿;不增加模式专属 placeholder。
### 过程与完成折叠
- 移除全局最新组过滤和全回合过程聚合;各段独立计算摘要、管理明细和展开状态。
- 连续至少两项可折叠过程形成候选段;后方出现非空正文或回合结束时才局部收起,当前尾段保留独立思考和工具项。
- 保留正文锚点、提问、widget 等特殊分类,新过程不覆盖旧组。
- 回合结束、允许折叠且存在正文锚点时,生成默认收起的完成/取消耗时块;展开后按原顺序显示。
- 外层完成折叠、局部摘要、思考和工具分别管理状态,不用一个布尔值控制全部层级。
- 完成操作区对齐顺序、间距、模型和时间规则;使用真实终态时间,不冒用创建时间,不将时间显隐绑定到折叠状态。
### 提问与已回答记录
- 对齐 QuestionFloating 的分页、选项、自定义补充、关闭、提交、键盘、焦点及提交中/失败状态,恢复原版 24px 圆角和排版。
- 已答记录恢复 QuestionView/ToolExpandable:问题与答案均为 14px、行高 1.75、不额外加粗;问题 tertiary,答案 primary。
- 恢复灰底、16px 圆角、`12px 16px` 内边距、条目间距和滚动限制。
- 统一 interaction 与工具 metadata 投影,按工具关联去重并放回提问位置,移除最终正文后的重复追加。
- 内联问答不参与普通工具摘要,但允许进入外层完成折叠;历史缺失节点保留兼容路径,不丢记录、不伪造顺序。
## 四、运行状态与授权交互
### 底部运行状态
- 增加共享运行进度类型和 ChatEvent 进度事件,由当前 Claude SDK、准备流程及交互代理提供真实阶段和工具信息。
- 贯通序列控制、事件归并和活动回合恢复,按 session/run 隔离,终态清理。
- 恢复文案顺序:有效准备阶段 → 云启动阶段 → agent phase → “思考中”;文案、工具 detail 和覆盖条件按 REA 恢复。
- 恢复 reasoning-only 显隐、网络恢复专用展示、真实收尾分支及准备/bootstrap 的 tips 控制。
- tips 保留原版延迟、轮换、悬停/焦点暂停和关闭回调;不补造云状态、credit、网络原因或静默超时提示。
### 工具授权卡
- 按真实请求类型选择原版对应组件。截图中的规则拦截使用 InterceptCard/SandboxInterceptCard 结构,不再统一套用高额度审批或居中权限模态。
- 恢复输入区宽卡、24px 圆角、16px/500/25px 标题、命令或目标说明、编号选项、选中背景及箭头;普通选项行采用原版 40px 高和12px 圆角。
- 补齐审批数据契约中的真实工具名、命令/目标、原因、规则信息及允许范围,避免把 toolCallId 当作工具名称,不把所有请求描述成“命中询问规则”。
- “查看拦截规则”放在右上 headerAction,展示实际命中信息;缺少规则身份或详情时使用明确的不可用说明,不捏造规则页面。
- 恢复允许一次、会话允许、拒绝及键盘、提交中、失败重试状态;只根据真实能力提供会话允许选项。
- 保留 run/id 绑定和重复提交保护,提交失败不能显示已授权,取消或终态不得执行滞后的审批响应。
### “本次会话内始终允许”生效链路
- 先建立真实 SDK 回归,检查整组 suggestions 是否正确返回、SDK 是否应用,以及后续请求是否匹配同一授权范围;不得仅凭按钮提交成功认定修复完成。
- 会话允许仅授予用户确认的建议规则,不改为完全访问,不按工具名做无条件放行,不自行扩大命令、路径或操作范围。
- 区分 YCode 对话、单次 run 和内核实例。会话授权以 YCode session 为隔离边界,不能因正常切换会话、跨回合或内核重建而无故丢失。
- 若 SDK 的会话规则不能随内核恢复,在主进程维护最小必要的、类型化的会话授权记录,并通过 SDK 支持的权限接口重放;不得用字符串模糊匹配绕过安全检查。
- 会话授权不写入用户级/项目级永久权限设置。客户端重启后的行为需通过原版 REA 证据补核;在证实前不承诺跨启动持久化。
- 显式拒绝、不可覆盖的安全规则和 plan/ask 限制继续有效;规则恢复失败时保留审批要求并报告失败,不能默默扩大权限。
## 五、任务确认、实施与验收
### 归档/删除确认
- 两种确认改为任务行右侧 240px Popconfirm,恢复箭头、排版、按钮、确认自动聚焦、Escape 和外部点击关闭。
- 共享 Popover 增加可选锚点、箭头、点击吞掉、宿主类及无障碍属性,默认不影响其他调用。
- 无遮暗模态遮罩,外部点击不误选底层任务;边缘避让,锚点失效时关闭并合理恢复焦点。
- 异步确认防重复,成功关闭,失败保留浮层和可见错误。
- 按此前选择恢复原版归档说明,记录其指向当前不存在入口的差异;保留全权限确认仍使用的模态样式。
### 实施与验证
- 主上下文先统一进度事件、审批数据与授权作用域、问答投影和输入栏/Popover 接口,再委派边界明确的子任务;主上下文负责集成、审查和最终验证。
- 加载测试覆盖无缓存、有缓存、重复点击、延迟 IPC、失败重试、A→B→C 乱序返回、活动回合恢复和大历史;等待期间侧栏仍可切换。
- 模型与权限测试覆盖删空后新增首发、失效草稿、重启、模型快照、新任务完全访问首发、会话保存及模式进出恢复,核对界面/存储/请求/内核一致。
- 授权测试覆盖允许一次后再次询问、会话允许后匹配请求不再询问、不匹配请求及另一会话仍询问、跨回合与内核重建、拒绝、取消、并发请求和应用失败。
- 用同一轨迹验收提问中、完成收起、完成展开;逐事件验证“正文 A→思考→工具→正文 B→新工具”,覆盖去重、长文本、多选、跳过、失败和历史兼容。
- 回归其他 Popover、全权限模态、归档与删除;运行相关对话、摘要、聊天、内核、审批、权限、模型、字体及持久化测试,以及 token 检查、typecheck 和 build。
- 在相同视口、DPR、缩放、主题和字体下检查实际窗口,交付加载、模式栏、对话三态及授权卡截图、测试结果、REA 版本/Evidence 和剩余差异。
- 分别报告结构、交互、授权语义、性能、样式及像素验收状态;未查明的原版授权生命周期明确保留,不以推测或界面成功替代验证。
## 六、方案来源与精简交接材料
- 本文前五节恢复自 Codex 对话“检查正在思考状态逻辑”(`01a158f8-0ddd-7710-8466-f5717cbd6cc8`)中用户要求“融合到方案里面”后的最新十项完整计划;此前仅存在于对话,并未保存到文件。本次仅保存和交接,不代表实施完成。
- 精简材料按该对话及授权卡取证子任务的引用筛选,保留原有相对路径,复制到交接项目的 `.tmp/`;清单为 `.tmp/workbuddy-interaction-handoff-manifest.json`,逐文件记录大小及 SHA-256。材料不提交 Git,需单独随项目交接。
- 主要入口:`.tmp/rea-runtime-scripts.json`(历史运行时脚本)、`.tmp/rea-css-recovered/manifest.json`(恢复 CSS 的来源清单)、`.tmp/rea-css-evidence/`(本方案引用的选定证据)、`.tmp/rea-context-source-candidates-20261017/src-0FGg1seX.js`、`.tmp/task-menu-runtime-source.js`、`.tmp/rea-visual-tool-expanded/` 及完成态、归档确认对照截图。
- JS Evidence `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb` 对应 WorkBuddy 5.8.2;CSS Evidence `ev_176b4a0369c4836f9498bd4a9c7c9dff10022defcbddaad6dd0080442de78ee9` 对应 5.8.3。不得将历史 JS 统一标注为 5.8.3,或把前端映射当成后台授权生命周期已验证。
- 不复制 `.tmp/rea-current-evidence.json` 整包(约 511 MiB)、无关资料库模块导出、REA 工具运行时及依赖、测试编译产物。本交接是选定材料集,不是完整 REA 会话备份;没有覆盖的记录及后台行为仍须经 REA 补取,不能推断为已验证。