Appearance
功能规格说明:BTW 命令
创建日期:2026-04-15 更新日期:2026-08-18
本规格同时覆盖 CLI(packages/code)与 Webview 三端(VS Code / JetBrains / Desktop)。 CLI 端交互(overlay、↑/↓ 滚动、Space/Enter/Esc 关闭)见下方用户故事一、二; Webview 端交互(BTW 面板、斜杠命令弹窗插入、点击/Esc 关闭、加载状态展示)见用户故事『Webview 端附带提问』。
用户场景与测试 (必填)
用户故事:提出附带问题(优先级:P1)
作为 CLI 用户,我希望输入 /btw <question> 来快速提出一个附带问题,以便我可以在不触发工具执行或打断主对话的情况下获得答案。
验收场景:
- 假设用户处于主对话模式,当用户输入
/btw <question>并按下 Enter 时,则 附带问题绕过主消息队列并立即处理,BtwDisplay出现并显示问题。 - 假设 btw 请求发出,则 请求复用主对话的 system prompt、工具列表与记忆注入(fork 请求前缀与主对话字节级一致),以命中模型 prompt 缓存(支持缓存标记的模型),并继承主对话的模型与 thinking 参数。
- 假设 btw 请求发出,则 请求仅执行一轮(maxTurns: 1),模型不能调用任何工具;若模型仍返回工具调用,
BtwDisplay显示 "(The model tried to call X...)" 提示,不执行工具。 - 假设 btw 请求的上下文包含主对话消息,则 请求只携带最近一次 compact 边界之后的完整消息,并剔除进行中(尚未结束)的 assistant 消息,保证请求前缀与主对话已完成的请求一致。
- 假设 AI 已响应附带问题,则
BtwDisplay显示 Markdown 答案。 - 假设附带问题不会被添加到主聊天历史或用户输入历史中。
用户故事:BTW 期间的视觉反馈与交互操作(优先级:P2)
作为 CLI 用户,我希望在附带问题激活时有清晰的视觉指示器,并能够通过键盘快速关闭,以便我可以将其与主对话区分开来并流畅操作。
验收场景:
- 假设附带问题正在加载,则
BtwDisplay显示静态 loading 指示(✻)与 "Answering" 文本,并在其后显示当前流式文本的最后 30 个字符(推理与普通文本共用同一尾部通道),直到回答完成(详见"BTW 加载状态"用户故事)。 - 假设附带问题正在加载或已回答,则
BtwDisplay显示/btw黄色加粗前缀与 dim 色问题文本。 - 假设回答或错误已显示,则
BtwDisplay底部显示 "Escape to dismiss" 提示。 - 假设附带问题处于活动状态,则 任务列表(TaskList)隐藏,避免与旁路问题展示争抢空间(对齐 Claude Code:local-jsx 命令显示期间抑制展开的任务列表)。
- 假设附带问题处于活动状态,当用户按下 ESC 时,则
BtwDisplay关闭,用户返回主对话模式(输入框恢复,任务列表恢复显示)。 - 假设附带问题正在加载,当用户按下 ESC 时,则 请求被中止(abort),
BtwDisplay关闭。 - 假设附带问题处于活动状态,当用户按下 Enter/Space/Ctrl+C/Ctrl+D 或其他键时,则 按键被忽略(overlay 期间仅 ESC 有效,Ctrl+C 不会退出应用)。
- 假设裸
/btw(不带问题)触发 usage 消息显示,则 输入行一并隐藏(与问题 overlay 一致),提示 "Escape to dismiss";当用户按下 ESC 时,则 usage 消息关闭,输入行恢复。其他按键(含 Enter/Space/Ctrl+C/Ctrl+D)在 usage 显示期间被忽略。
用户故事:BTW 加载状态(优先级:P2)
作为 CLI 用户,我希望附带问题加载期间在 "✻ Answering" 后看到当前流式传输文本的最后 30 个字符,以便我知道请求正在进行且能看到输出进度,而不被不完整的流式中间文本干扰。
验收场景:
- 假设附带问题正在加载且尚无任何流式输出,则
BtwDisplay显示问题行与静态 loading 指示(✻)+ "Answering" 文本,不显示流式尾部。 - 假设附带问题正在加载且模型已输出文本(普通文本或推理内容,推理流经同一尾部通道),则
BtwDisplay在 "✻ Answering" 后显示该文本的最后 30 个字符;文本不超过 30 字符时原样显示,超过 30 字符时以…前缀截断(换行折叠为\n,与主对话流式尾部样式一致)。 - 假设回答已完成,则
BtwDisplay将完整答案以 Markdown 渲染显示,"✻ Answering" 加载文本与流式尾部消失。 - 假设答案仍在加载,当用户按下 ESC 时,则 请求被中止(abort),
BtwDisplay关闭。
用户故事:Webview 端附带提问(优先级:P1)
作为 Webview 用户(VS Code / JetBrains / Desktop),我希望输入 /btw <question> 快速提出旁路问题,以便在不打断主对话、不触发工具执行的情况下获得答案,且附带问题不污染聊天历史。
验收场景:
- 假设用户处于主对话模式,当用户在输入框输入
/btw <question>并按下 Enter 时,则 附带问题绕过主消息队列,输入区上方显示 BTW 面板(问题标题 + 加载指示),主对话与输入框不受影响。 - 假设用户在斜杠命令弹窗中选择
/btw,则 输入框插入/btw前缀并将光标置于其后等待输入问题,不立即执行。 - 假设用户输入不带问题的
/btw并按下 Enter,则 不发起请求,BTW 面板标题区域仍显示/btw标题占位(关闭按钮不漂移到左侧),内容区显示中文 usage 文案"用法:/btw <你的问题>"(与 Webview 的"正在回答"加载文案一致;CLI 端保持与 Claude Code 一致的英文"Usage: /btw <your question>")。 - 假设 btw 请求发出,则 请求复用主对话的 system prompt、工具列表与记忆注入(fork 请求前缀与主对话字节级一致),并继承主对话的模型与 thinking 参数,仅执行一轮且不执行任何工具(与 CLI 共用同一
agent.askBtwfork 路径)。 - 假设 btw 请求已发出,则 BTW 面板显示闪烁光标与"正在回答"中文文案作为加载指示(与主对话消息列表的流式光标一致,不使用 emoji),直到回答完成。
- 假设 btw 请求已发出且模型已输出流式文本,则 BTW 面板在加载指示(闪烁光标 + "正在回答")后显示该文本的最后 30 个字符(换行折叠为
\n、超过 30 字符以…前缀截断,与主对话/CLI 流式尾部样式一致);模型尚无输出时仅显示加载指示,不显示完整流式中间文本。 - 假设回答完成,则 BTW 面板以 Markdown 渲染完整答案,加载指示消失,回答区域可滚动。
- 假设附带问题正在加载或已回答,当用户点击关闭按钮或按下 Esc 时,则 BTW 面板关闭,输入框恢复主对话模式。
- 假设附带问题正在加载且主对话同时在流式输出,当用户按下 Esc 时,则 仅关闭 BTW 面板,不终止正在进行的 agent loop(主对话继续流式输出)。
- 假设附带问题正在加载(含流式输出中)时被关闭,则 面板立即消失,迟到的流式增量与最终回答均被丢弃,不显示于界面。
- 假设 btw 请求失败(如 API 错误),则 BTW 面板显示 "(API error: ...)" 错误信息,不中断主对话。
- 假设附带问题不会被添加到主聊天历史或用户输入历史中。
- 假设主对话恰好在响应中(assistant 消息未结束)时提出
/btw,则 btw 请求剔除该进行中的消息,从上一轮完成的请求前缀继续。 - 假设 BTW 面板打开(加载中或已回答),当用户切换到另一对话(会话)时,则 BTW 面板自动关闭,新对话不显示旧对话的附带问题;若切换发生在加载中,旧请求的迟到回复同样被丢弃,不显示于界面。
边界情况
- 用户输入不带问题的
/btw怎么办? 命令不进入 BTW 状态:CLI 显示英文"Usage: /btw <your question>"(与 Claude Code 一致),Webview 显示中文"用法:/btw <你的问题>";输入行随 usage 消息隐藏,仅按 ESC 关闭,其他按键被忽略。 - 用户提出通常会触发工具的
/btw问题怎么办? btw 请求携带与主对话相同的工具列表(缓存键一致),但仅执行一轮且不反馈工具结果;模型若尝试调用工具,显示 "(The model tried to call X...)" 提示。 - 请求失败(如 API 错误)怎么办?
BtwDisplay显示 "(API error: ...)" 错误信息,不中断主对话。 - 模型只输出 thinking 而无最终答案怎么办?
BtwDisplay显示 thinking 内容(而非 "No response received"),避免思考阶段输出被丢弃。 - 主对话恰好在响应中(assistant 消息未结束)时提出
/btw怎么办? btw 请求剔除该进行中的消息,从上一轮完成的请求前缀继续。 - 附带问题不会被添加到主聊天历史或用户输入历史中。
- Webview 中回答较长如何滚动? BTW 面板回答区域内部滚动(鼠标/触控板),无需 CLI 的 ↑/↓ 键。
- Webview 中按 Esc 会终止主对话吗? 不会。BTW 面板打开期间 Esc 在事件捕获阶段被面板拦截(stopPropagation),仅关闭面板;主对话 agent loop(即使正在流式输出)不受影响。
- 模型 thinking 结束后还显示 thinking 内容吗? 不显示。加载期间只显示流式尾部(当前流式文本的最后 30 个字符),不显示完整中间文本;回答完成后只以 Markdown 渲染最终答案。
- 切换对话时 BTW 面板会残留吗? 不会。BTW 面板是对话级别的:切换到另一对话(会话)时面板自动关闭(含加载中切换,旧请求的迟到回复一并丢弃),新对话始终以干净状态开始。
- 桌面端多 pane 并排时切换焦点会关闭 BTW 面板吗? 不会。BTW 面板是对话级别的,不是焦点级别的:焦点从 pane 1 切到 pane 2 时,pane 1 上已打开的 BTW 面板保持显示;host 仅下发
desktopPanes(focusedPaneId 变化)而不推送新会话,各 pane 自己的 currentSession 不变。只有某 pane 绑定的会话真正切换(新的 session id)时才关闭该 pane 的面板。