Files
Ncurator/doc/prd/workbench.md
T

136 KiB
Raw Blame History

Workbench PRD

1. 文档定位

  • 本文档是 workbench 用户可见功能的产品规格来源,描述目标、范围、术语、交互、状态、边界和验收标准。
  • workbench 的用户可见行为、流程、反馈或阻塞逻辑发生变化时,必须同步更新本文。
  • 后续实现、测试、评审和 AI 最终汇报都应引用本文中的需求编号与验收编号。

2. 产品目标

  • 用户通过对话让 AI 完成搜索、分析、回答、整理和文档处理等任务。
  • 用户可以把本地资料作为上下文,让 AI 优先据此完成检索、分析、回答和受支持文件处理。
  • 让 workbench 成为“发起任务、查看过程、处理中断、查看修改的文件并按需回退、继续执行”的主工作台。
  • workbench 应把任务推进到完成;无法完成时明确说明原因、限制或所需条件。

3. 产品原则

  • 本地资料是重要上下文,但不是唯一能力边界;未显式选择资料时,AI 仍可完成通用任务。
  • workbench 的发送前提是已有伙伴且输入非空。
  • 未显式插入 @ 时,知识库默认覆盖设置页全部已索引文件地址与全局网页资料;@ 只用于在此基础上再收窄。工作地址列表按设置页现表进入本轮对话上下文,不作为 Composer 选择器。
  • 当用户插入 @ 参考资料时,AI 应优先基于这些范围完成任务,而不是忽略用户给出的约束。
  • workbench 不只展示问答过程,还要交付可消费结果,或给出明确失败信息。
  • 用户可见能力边界必须明确可见,尤其是哪些资料可检索、哪些格式可直接写回并回退、哪些情况只能查看或分析。

4. 范围

  • 包含伙伴管理(创建、编辑、切换、删除、置顶、空态)。
  • 包含 composer 输入、发送与取消;Composer 只有智能模式。
  • 包含智能模式下 AI 推进偏好的选择与本机恢复。
  • 包含附件拖放和智能模式下执行权限的选择与伙伴级恢复。
  • 包含 @ 参考资料 token 的插入与维护。
  • 包含按天时间轴跳转,以及清空消息记录。
  • 包含 AI 运行中的审批与上下文压缩过程提示。
  • 包含右侧内容面板中的文档查看与修改的文件回退入口。
  • 包含基于本地资料和网页资料的上下文使用。
  • 包含定时任务的入口、独立主区视图、任务配置、启用开关与到点触发。
  • 包含 AI 写回或回退已打开的 WPS .docx / .pptx / .xlsx 时自动刷新(默认功能,无设置项)。
  • 不包含设置页中的资料配置逻辑。
  • 不包含视觉风格与基础控件样式定义。
  • 不包含 AI 工具协议、operation 矩阵、结果信封或 graph / prompt 细节(见 doc/ai-harness/** 与 doc/test-plan/ai-test.md)。

5. 当前能力边界

  • workbench 可使用设置页全部已索引文件地址与全局网页资料作为默认知识库范围;@ 再收窄本轮范围。
  • 当前本地知识库可索引文件类型为 .pdf、.doc、.docx、.md、.markdown、.txt、.xlsx、.xlsm、.xltx、.xltm。每个文件索引时都会前置一个「文件名锚点」内容块,保证按文件名可被知识库搜索命中;空文本文件不产生正文内容,但保留文件名锚点。Excel 只索引文件名、文档标题与工作表名等元数据,不索引任何单元格内容,单元格数据仍由 Excel 专用工具按绝对路径处理。.doc 只读,不支持直接编辑。
  • 未显式选择参考资料时,智能模式仍可处理通用任务。
  • 显式选择目录、文件或网页资料后,任务应优先使用这些资料。未显式 @ 时,默认使用全部已索引文件地址与全局网页;资料不足时,智能模式可用模型通用知识补充通用部分。
  • 当前可由 workbench 直接写回并支持回退的受支持文件类型包括 docx、pptx、xlsx、生成的 png、jpg、jpeg、webp 图片,以及 Markdown、TXT、配置文件和代码等 UTF-8 普通文本文件;普通文本支持创建、完整改写、唯一文本编辑和全部精确匹配替换。Excel 工具可读取 xlsx、xlsm、xltx、xltm,但只允许创建和编辑 xlsx,避免写回时丢失宏或模板信息。
  • 馆长启动后默认开启本机 WPS 同步服务(加载项由回环 HTTP 提供),无设置开关。已打开 WPS 文档的自动刷新见 WB-WPS-001。
  • 用户可在右侧面板对真实本地 Markdown(所见即所得)与普通 UTF-8 文本(纯文本)做应用内手动编辑并保存,见 WB-EDIT-001;应用内手动编辑不生成修改记录、不进入回退体系。
  • 当前通过 composer 附件进入对话上下文的文件不限扩展名,只要是可以选中的文件即可作为附件;+ 选择和拖放文件保留源文件绝对路径,粘贴文件保存副本到当前伙伴运行时目录。附件不自动预解析,只把名称与路径交给 AI 后续自行处理。AI 工具侧仍有各自格式边界(如 doc 只读、pptx 可交给 PPT 工具读取和编辑、Excel 工具只写 xlsx),无法处理的文件会在 AI 工具层报错。
  • 其他格式不保证直接写回和回退。AI 可以在审批边界内尝试处理,但不属于受支持文件能力范围。
  • 终端执行只允许当前平台安全指令集直接运行;一条 terminal 命令被拆分后的每段都命中安全指令集时可直接执行,任一段未命中则必须先经用户手动批准。安全指令集只决定是否可直接执行,不决定执行模式。默认工作目录是用户主目录。终端改文件不进入修改记录,也不能从馆长回退。
  • AI 可通过 web_search / kb_search 检索;web_search 不得自动展开右侧列表。设置页正在「更新索引」时,kb_search / kb_list_documents 失败并提示正在更新知识库;「检查更新」不拦截。
  • @ 参考资料不能替代「已创建并选中伙伴」这一发送前提。

6. 术语

  • 伙伴:一条一直聊下去的对话记录。侧栏只有伙伴列表。
  • 参考资料:通过 @ 插入的目录、文件或网页资料 token。
  • 工作地址:设置页添加的本地目录根路径(workspace_source.root_path)。
  • 智能模式:Composer 唯一发送路径;启动 AI 运行,允许产生阻塞、审批、文件直接写回与回退入口。
  • 受支持文件:当前已具备直接写回与回退能力的文件类型;当前包括 docx、pptx、xlsx、生成的 PNG、JPEG、WebP 图片(.png / .jpg / .jpeg / .webp)和 UTF-8 普通文本文件。
  • 目标文件:用户要求新建受支持文件时,AI 写工具直接创建的文件路径。
  • 直接写回:AI 写工具将最终 docx、pptx、xlsx、生成图片或普通文本结果原子写入源文件或创建目标文件的流程;工具成功即代表正式路径已可读取,run 收尾不再提交文件。
  • 修改记录:一次 AI run 中由受控文件工具直接写回产生的创建、更新、删除或重命名记录;提供打开文件、适用格式的审核模式与回退本次修改入口。终端造成的磁盘变化不记修改记录。
  • 回退本次修改:基于写回前 checkpoint 恢复文件;新建文件回退时删除目标文件,若文件在 AI 写回后又被修改,需提示用户确认会丢失后续修改。
  • 清空消息记录:删除该伙伴全部对话消息记录(及对应 ai_run),界面回到空对话;不删除伙伴本身,也不删除 ai_file_change 文件回退记录。
  • 内部引用链接:assistant 回答中使用标准 Markdown 语法 [显示名](绝对本地路径或 https URL) 引用的本地文件或网页链接;点击可在右侧工作台预览文件或打开内置浏览器。本地文件做可达性检查,不可访问时展示弱化状态并禁止点击;http(s) 网页链接不做可达性检查,默认可点。详细校验与交互见 WB-COMPOSER-003-AC8。
  • AI 推进偏好:智能模式下用户对资料使用边界的附加约束,界面选项包括“默认”“本地资料·宽松”“本地资料·严谨”。当前“本地资料”范围包含全部已索引文件地址、全局网页资料、工作地址内文件和显式参考资料。宽松模式优先使用这些资料,资料不足时允许补充模型知识或外部网页;严谨模式只能把这些资料作为事实依据,资料不足时必须明确说明,不得把模型知识、外部搜索或浏览器结果伪装成资料内事实。
  • 执行权限:智能模式下对本次运行是否等待工具审批的选择,独立于 AI 推进偏好。选项为“审核”和“完全访问”。

7. 需求规则

  • Workbench 基础需求编号使用 WB-<模块>-<三位序号>,验收编号使用 WB-<模块>-<三位序号>-AC<序号>。
  • 定时任务子需求编号使用 ST-<模块>-<三位序号>,验收编号使用 ST-<模块>-<三位序号>-AC<序号>。
  • 需求编号稳定后不因措辞微调而重排;只有功能被废弃时才标记为废弃。

8. 需求明细

8.1 核心能力与约束

WB-CORE-001 本地资料是可选上下文,不是唯一前提

  • 系统行为:workbench 发送前要求已有伙伴;在此基础上,即使用户未显式选择任何本地参考资料,AI 仍可执行不依赖本地文档的通用任务;当存在本地参考资料时,可将其作为任务上下文使用。未创建伙伴时 Composer 为空态,不能发送。
  • 验收:
    • WB-CORE-001-AC1 用户已创建并选中伙伴但未选择任何本地参考资料时,智能模式仍可正常发起不依赖本地文档的任务。
    • WB-CORE-001-AC2 系统不会把“没有显式本地参考资料”误表现为“workbench 不可用”;未创建伙伴时才表现为 Composer 空态。

WB-CORE-002 用户显式选择的参考资料或默认知识范围必须影响执行

  • 系统行为:当用户插入 @ 参考资料后,后续检索、分析和执行应优先基于这些显式范围收敛;当用户未显式选择参考资料时,知识库默认覆盖设置页全部已索引文件地址与全局网页资料。
  • 验收:
    • WB-CORE-002-AC2 智能模式下,系统不会忽略用户已经给出的 @ 参考资料或默认知识范围;已选资料作为优先缩圈候选,但不自动变成唯一可搜索范围。

WB-CORE-003 当前受支持文件的直接写回能力边界必须明确

  • 系统行为:workbench 明确区分“可直接写回并支持回退的受支持文件”和“可由 AI 自行尝试处理但不提供同等保证能力的其他任务”;当前受支持文件类型包括 docx、pptx、xlsx、生成的 png、jpg、jpeg、webp 图片和 UTF-8 普通文本文件。xlsm、xltx、xltm 只读,不属于可直接写回范围。
  • 验收:
    • WB-CORE-003-AC1 当前支持直接写回与回退的受支持文件类型列表明确可见,包括 docx、pptx、xlsx、PNG/JPEG/WebP 图片(.png / .jpg / .jpeg / .webp)的修改和新建,以及 Markdown、TXT、配置文件和代码等 UTF-8 普通文本文件。
    • WB-CORE-003-AC2 不在当前受支持文件类型列表中的资料不会被伪装成可进入同一直接写回与回退流程的编辑或创建目标。

WB-CORE-004 资料优先级受 AI 推进偏好约束

  • 系统行为:默认或宽松偏好下,当用户已插入参考资料或存在已索引文件地址 / 全局网页时,系统优先基于这些资料完成任务;未显式 @ 时,默认使用全部已索引文件地址与全局网页作为知识范围。资料不足时,默认或宽松偏好允许补充模型通用知识或外部网页信息,但不能忽略或违背用户已给定的资料。严谨偏好下,只允许把已索引文件地址、全局网页与显式参考资料作为事实依据;资料不足时应明确说明缺口,不得使用模型知识、web_search 或 browser_use 的外部内容补足事实。
  • 验收:
    • WB-CORE-004-AC1 用户已有默认知识范围或显式参考资料时,问答或受支持文件结果不会脱离这些资料另起一套无关内容。
    • WB-CORE-004-AC2 默认或宽松偏好下,资料不足以覆盖通用部分时,系统仍可补充模型通用知识或外部网页信息,并明确区分资料内事实与补充信息。
    • WB-CORE-004-AC3 严谨偏好下,资料不足时系统明确说明资料缺口,不使用默认知识范围和显式参考资料之外的信息补足事实。

WB-CORE-005 任务过程中的中间结果必须服务于后续结果

  • 系统行为:当任务执行过程中产生搜索结果、文件读取结果、执行结果或其他中间信息后,后续 assistant 回答、分析结论和文件产物应实际使用这些信息继续推进用户诉求;若当前中间结果不足以支撑继续完成,系统应明确说明限制,而不是伪造后续内容。
  • 验收:
    • WB-CORE-005-AC1 任务过程中产生的中间结果,会体现在后续用户可见回答、结论或文件产物中,而不是只表现为“执行过某些步骤”。
    • WB-CORE-005-AC2 当前中间结果不足或执行失败时,assistant 会明确说明为什么无法继续完成、缺少什么条件或当前能确认到什么范围,而不是编造结论或文档内容。
    • WB-CORE-005-AC3 用户可见输出优先围绕用户原始诉求组织;若引用中间结果,应使用用户能理解的表达,而不是暴露内部工具或过程标签。

WB-CORE-006 用户诉求应被推进到完成或明确失败

  • 系统行为:当用户已提供足够上下文且当前能力允许时,workbench 应以“最小可靠返回 × 最少连续决策轮次”持续推进用户诉求直到完成:只读取当前决策所需范围,避免全量或重复读取,独立调用尽量同轮发起,同类批量能力不拆轮。若当前无法完成,也应明确返回失败原因、限制信息或下一步所需条件,而不是停留在搜索结果、工具调用或过程提示等中间过程。
  • 验收:
    • WB-CORE-006-AC1 用户诉求可完成时,系统会把任务推进到可消费结果、明确产物或可确认的下一步动作,而不是停留在中间态。
    • WB-CORE-006-AC2 用户诉求当前无法完成时,系统会明确说明失败原因、限制信息或下一步所需条件,而不是无声中断或只留下过程信息。
    • WB-CORE-006-AC3 最终收口默认直接围绕用户显式提出的问题组织;若同时需要说明产物、依据或限制,也应使用用户可理解的语言表达,而不是依赖内部标识、tool 名或固定章节标题。
    • WB-CORE-006-AC4 简单任务不强制创建 plan;复杂或多依赖任务才维护 plan,不为汇报进度单独更新。目标满足且必要检查通过后可直接交付。

WB-CORE-007 网页信息可用于任务推进

  • 系统行为:默认或宽松偏好允许 AI 通过后台 web_search 搜索网页、读取指定网页正文,并在需要登录或人工操作时使用 browser_use 打开右侧内置浏览器继续任务;严谨偏好不得把外部网页作为资料内事实依据。web_search 是 Human 图后台工具,结果只回模型与过程层,不得自动展开右侧列表,也不得替代 browser_use 的可见浏览器交互。
  • 验收:
    • WB-CORE-007-AC1 用户要求查找公开网页信息时,AI 可搜索并读取搜索结果或用户给出的 URL,再用所得内容完成回答或产物。
    • WB-CORE-007-AC2 网页搜索、读取或浏览失败时,系统明确说明失败边界,不伪造网页内容。
    • WB-CORE-007-AC3 严谨偏好下,外部网页能力不会绕过资料范围限制。
    • WB-CORE-007-AC4 AI 调用 web_search 时,Workbench 不得因工具结果自动打开右侧搜索列表;过程层可展示“搜索网页 / 抓取网页”等状态,但右侧面板保持原状,除非用户手动打开资源或 AI 触发 browser_use。
    • WB-CORE-007-AC5 web_search 抓取时用户不得看到带窗框的独立浏览器窗口,也不得让网页内容遮挡主界面。
    • WB-CORE-007-AC6 web_search 读取网页应返回可读正文或明确失败,不得无限挂起。

WB-CORE-008 Workbench 窗口层与业务内容分层

  • 系统行为:Windows Workbench 的原生窗口控制层独立位于业务内容上方;无伙伴空态拖动区、侧栏入口和业务内容不互相遮挡。非 Windows 平台保留页面顶部拖动区。
  • 验收:
    • WB-CORE-008-AC1 无伙伴空态仍提供可命中的 44px 拖动区。
    • WB-CORE-008-AC2 Windows 原生控制层为独立 36px 区域,业务内容从其下方开始。
    • WB-CORE-008-AC3 Windows 侧栏切换按钮保持 no-drag 且与原生控制按钮对齐。

8.2 伙伴管理

侧栏只有伙伴列表与「创建伙伴」;伙伴创建弹窗提交即落库。

WB-SESSION-001 无伙伴时展示空态,创建即落库

  • 系统行为:页面初始化时拉取伙伴列表。列表为空或当前未选中伙伴时,主区展示空态文案,Composer 不出现可输入草稿;侧栏提供「创建伙伴」,列表区为空时不展示空态文案。创建弹窗填写名称,并选择 6 种外形 × 12 种颜色的头像(圆、圆角方、横向胶囊、圆角六边形、云、水滴;2D 圆润色块,眼睛可正视或上下左右张望,转身时眼睛绕到背面再从另一侧进入)。创建/编辑弹窗中的形象保持自然动画。提交成功后立即写入 partner 表并选中该伙伴,不存在 __draft__ 草稿会话。侧栏伙伴项展示头像、名称和相对时间(刚刚 / N小时 / N天);无任务运行时头像保持静止初始姿态,仅当该伙伴存在 running / waiting_approval 任务时才播放跳跃、转眼与张望。有用户消息时副文案为最新用户语句预览,没有则展示「做点啥呢?」。
  • 验收:
    • WB-SESSION-001-AC1 首次进入且没有伙伴时,侧栏列表区不展示空态文案,主区为空态并保留 44px 拖动区,而不是不可操作空白页;Composer 不出现可发送输入框。
    • WB-SESSION-001-AC4 创建弹窗提交成功后,新伙伴立即出现在侧栏并成为当前选中项;名称与头像外形 / 颜色按提交值保存。
    • WB-SESSION-001-AC5 伙伴列表项展示头像、名称与相对时间;无任务运行时头像静止,任务运行中才播放动画;发送用户消息后副文案更新为该语句预览,尚无用户消息时展示「做点啥呢?」。

WB-SESSION-002 切换伙伴时恢复目标伙伴状态并隔离上一伙伴运行态

  • 系统行为:切换伙伴后,主区原子加载目标伙伴的消息、运行 snapshot 和 partner_ui_state。加载完成前保留原画面并展示切换态,不先闪成空白。完成后恢复目标伙伴自己的输入草稿、@ 范围、附件、AI 推进偏好、执行权限、模型、右侧标签和面板展开状态。上一伙伴的运行态和 UI 状态不得泄漏到目标伙伴,但目标伙伴自身的 active run 与 pending approval 必须可继续操作。workbench_ui_state.active_view_key 等于当前 partner_id。
  • 验收:
    • WB-SESSION-002-AC1 点击其他伙伴后,消息区展示目标伙伴的历史消息。
    • WB-SESSION-002-AC2 切换加载完成后恢复目标伙伴自己的输入和右侧面板,不保留上一伙伴的修改面板或运行中阻塞提示;加载过程中主消息区不先闪成空白态。
    • WB-SESSION-002-AC3 目标伙伴存在正在运行或最近完成的 AI run 时,切换回来后能看到已持久化的过程流、当前 partial answer 或最终回答;若切走时仍处于 Brain 思考等待(「让俺想想」),切回后该提示仍在,不得因整表重建而消失。正在运行的 run 可继续停止。
    • WB-SESSION-002-AC4 目标伙伴存在等待审批的 AI run 时,切换回来后审批卡片仍可继续提交。
    • WB-SESSION-002-AC5 伙伴列表中存在 running 或 waiting_approval run 的伙伴显示“任务运行中”标记,且该伙伴头像播放跳跃、转眼与张望;运行完成、失败或取消后标记与头像动画一起消失,且不会错误显示到其他伙伴。

WB-SESSION-003 标题就是伙伴名称,不因消息改名

  • 系统行为:伙伴标题始终为创建时填写的 name。
  • 验收:
    • WB-SESSION-003-AC2 继续发送消息时,不会自动改写已有伙伴名称。
    • WB-SESSION-003-AC3 顶栏与侧栏展示的标题与伙伴 name 一致。

WB-SESSION-004 删除伙伴后保持可继续操作

  • 系统行为:删除伙伴后刷新列表;级联删除该伙伴的消息记录、AI run、partner_ui_state 与浏览器标签,并删除 userData/partners/{id}。若删除的是当前伙伴,则清空当前选中;列表为空时回到无伙伴空态。
  • 验收:
    • WB-SESSION-004-AC1 删除成功后,该伙伴不再出现在列表中。
    • WB-SESSION-004-AC2 删除当前伙伴后,页面仍保持可继续操作(有剩余伙伴则可选择,无伙伴则回到空态),而不是落到不可操作状态。
    • WB-SESSION-004-AC3 删除后该伙伴的浏览器标签关闭,userData/partners/{id} 不再保留。

WB-SESSION-005 同一伙伴里的续做保持任务主线

  • 系统行为:用户始终面对同一伙伴窗口。用户在同一伙伴内基于上一轮结果继续提出局部修改、补写或 refinement 请求时,系统继续沿用当前伙伴上下文、上一轮产物和有效文件/回退入口,不把续做误当成全新无关任务。同一伙伴的历史原文会一直带给主模型,直到 compaction 把它折进摘要。若用户要开始一个干净的新话题,使用「清空消息记录」或新建伙伴;界面不出现「新会话」或草稿会话控件,也不会自动丢掉历史原文。
  • 验收:
    • WB-SESSION-005-AC1 续做请求发出后,系统会复用上一轮相关产物或上下文,而不是丢失已有任务主线。
    • WB-SESSION-005-AC2 续做完成后的结果体现的是对上一轮结果的继续修改或补充,而不是简单重复旧输出或重新开题。
    • WB-SESSION-005-AC3 用户要换无关新话题时,可通过清空消息记录或新建伙伴得到干净上下文;不自动丢掉当前伙伴里还没压缩的历史原文。
    • WB-SESSION-005-AC4 用户侧无会话切换控件;换话题入口是已有的清空消息记录与新建伙伴。清空后该伙伴不再保留旧对话作为模型上下文(另见 WB-SESSION-011-AC3)。

WB-SESSION-006 用户消息复制与编辑

  • 系统行为:用户消息支持复制纯文本;没有任务运行时,最新一条用户消息支持编辑。点击编辑须先确认:确认框标题为「编辑这条消息?」,正文说明将撤回该消息之后的回答、原文回到输入框,且已编辑的文件不会被还原;主按钮为「确定」(危险态)。确认后才撤回该 runId 的消息、run 与全部 message log,并把原文字、参考资料和附件恢复到输入区,等待用户修改后重新发送。取消确认则不撤回。已编辑的真实文件和 ai_file_change 不回滚。
  • 验收:
    • WB-SESSION-006-AC1 复制操作写入消息的可读文本,并给出成功或失败反馈。
    • WB-SESSION-006-AC2 只有最新用户消息且当前没有运行中任务时显示编辑入口。
    • WB-SESSION-006-AC3 点击编辑先出现确认框;确认后目标消息、关联 run 与该 run 的全部日志从伙伴记录中撤回,原输入、参考资料和附件恢复为草稿;取消确认则消息与草稿不变。
    • WB-SESSION-006-AC4 撤回失败时恢复原消息和原草稿,不留下半完成状态。

WB-SESSION-007 同一伙伴内恢复被中断任务

  • 系统行为:智能模式任务因用户主动停止、网络错误、请求超时、应用进程中断、输出截断、达到运行上限或未知异常而没有正常完成时,历史消息日志保持不变。用户之后在同一伙伴发送消息时,系统从该伙伴现有消息日志投影:已经压进摘要的旧对话原文不再发给主模型;还没处理掉的原文照发。历史 User 用 log 里的 content(发给模型的原文);Compact User 用 checkpoint 的 summary,发给主模型时再合成。还没压进摘要的原文照发(Compact User 后可跟这段原文,可含多条 User),补齐悬空工具结果,再把新 User 追加一次继续推进。新 User 不抄 Compact User。若压缩后又产生了尚未折进摘要的过程,这些过程前面必须先放 Compact User,不能直接接在 System 后面。气泡仍是人打的字(ai_run.input);Compact User 不当新气泡。每条历史 human user 保留当轮参考资料和附件配置;新 user 只使用 Composer 当前配置。计划与已学习技能均从该伙伴剩余消息日志恢复。重启只标记中断,不自动重新调用模型。
  • 验收:
    • WB-SESSION-007-AC1 用户停止、模型请求失败(含网络/超时/鉴权/余额等定案后)、进程中断、输出截断、达到运行上限和未知异常后,下一条消息可只靠消息日志继续(含计划与已学习技能)。
    • WB-SESSION-007-AC2 恢复后的消息数组以日志投影为准:未压缩时为历史过程 + 尾部新 user;已压缩时为 Compact User + 还没压进摘要的原文(可空,可含多条 User)+ 尾部新 user。新语句不会改写历史任务或历史配置。
    • WB-SESSION-007-AC3 同一伙伴连续多次中断和恢复后仍保留完整任务主线,原始任务始终保留在记录首条 user,不把历史任务递归嵌套为新的原始任务。
    • WB-SESSION-007-AC4 切换伙伴或重启应用后,原伙伴日志仍可投影;其他伙伴不能读取该日志。
    • WB-SESSION-007-AC5 编辑并重新发送最后一条用户消息时,只删除该消息、关联 assistant、run 与该 run 的全部日志记录,其他历史不变;不回滚已写文件。
    • WB-SESSION-007-AC6 正常完成清空计划展示但不删除历史日志;删除伙伴级联删除其日志。
    • WB-SESSION-007-AC7 达到运行上限时显示“已达到运行上限,可继续对话推进”,并允许在同一伙伴继续恢复。
    • WB-SESSION-007-AC8 run 失败时气泡展示短标题(如「模型请求失败」);「查看详情」可展开原文(及可选 HTTP / provider code);toast 只用短标题,不刷长文。

WB-SESSION-008 伙伴界面状态独立持久化

  • 系统行为:每个伙伴都在 SQLite 的 partner_ui_state 保存独立的 Composer 和右侧资源工作台快照。workbench_ui_state 只保存 active_view_key(当前伙伴 id)。正常切换、离开页面和退出应用前强制保存,重启后恢复最后活动伙伴。异步 AI 和浏览器事件必须按 partnerId 更新所属伙伴,不能覆盖当前其他伙伴。
  • 验收:
    • WB-SESSION-008-AC1 A/B 伙伴可分别保存并恢复模式无关的 Composer 状态:AI 推进偏好、执行权限、主模型、输入文本、内容节点、引用、附件和附件桶,反复切换互不串联。旧快照缺少执行权限时按“审核”恢复。
    • WB-SESSION-008-AC2 A/B 伙伴可分别保存并恢复资源标签、活动标签和面板展开状态;后台返回只更新事件所属伙伴。
    • WB-SESSION-008-AC3 正常退出并使用同一用户目录重启后,恢复最后活动伙伴及其完整 UI 状态;异常崩溃最多丢失最后一个输入防抖窗口。
    • WB-SESSION-008-AC5 删除伙伴时同步删除其 UI 快照和浏览器标签;删除当前伙伴后按现有规则回落并更新最后活动伙伴。
    • WB-SESSION-008-AC6 模型、引用或附件失效时清理或回退到可用状态并保存修复后的快照;文件预览路径失效时保留标签并展示不可用状态。

WB-SESSION-009 伙伴置顶

  • 系统行为:侧边栏伙伴条目悬停时提供「置顶 / 取消置顶」、编辑与删除入口,三个图标使用同一套 hover 浅底。置顶状态持久化到 SQLite。已置顶伙伴排在列表最上方(按置顶时间新到旧),不再单独展示「已置顶」分组文案;置顶后图钉图标常驻显示。取消置顶后伙伴回到未置顶顺序。
  • 验收:
    • WB-SESSION-009-AC1 悬停伙伴条目时,标题与操作图标(置顶、编辑、删除)之间有明显间距,图标顺序为置顶、编辑、删除,且三个图标都有 hover 浅底。
    • WB-SESSION-009-AC2 置顶后该伙伴排到列表最上方,图钉常驻显示,且不出现「已置顶」分组文案。
    • WB-SESSION-009-AC3 取消置顶后图钉不再常驻,伙伴回到未置顶区域;列表仍不展示「已置顶」文案。
    • WB-SESSION-009-AC4 重启应用后置顶状态与列表顺序保持不变。

WB-SESSION-010 消息时间轴

  • 系统行为:
    • 当前伙伴存在消息时,消息区左侧展示固定竖线时间轴(自身不滚动)。
    • 当前可见节点以固定间距自底部向上堆叠(最新节点靠近输入框上方),不随可用高度拉开等距。
    • 轴线叠在主区上,水平位于侧栏右缘与 Composer 左缘之间的居中位置。
    • 轴线始终是一条实线:底端停在最新节点圆心(不向下突出),顶端与主区顶栏横线留出空隙;节点整体底边按白色输入框顶部量齐;近端(底部)对比清晰,越往上(更早)越透明。不使用虚线。
    • 仅有消息的日期才出现节点。默认:近 7 个本地日(含今天)有消息则显示日节点(今/昨/前或 M/D);更早同年按月聚合;往年按年聚合。日/月/年圆点造型区分。
    • 点日节点跳到当天最早一条消息。点月/年节点跳到该范围最早有消息日的第一条。
    • 月节点与年节点文案下方提供搜索图标,点击后打开 Ant Design DatePicker;仅可选择该月/该年内真正有消息的本地日,选天后左侧轴节点不变,右侧瞬时跳到该天最早一条消息;同一天可再次选中并再次跳转;关闭弹层时不得把点击穿透到月/年节点、从而再跳到该范围最早日。不再提供月/年展开收起、淡段标或「收起」入口。
    • 点击节点只滚动消息列表容器(.nc-document-scroll),并将该天最早一条消息瞬时贴顶(不使用平滑滚动);仅当已贴顶(偏差小于 2px)时不重复滚动,避免带动侧栏或 Composer。
    • 列表底部常驻刚够让最新有消息日最早一条贴顶的阅读留白(该日已撑满一屏则为 0),因此任意更早的日/月/年都能直接贴顶。
    • 滚到底部时视口顶是最新日、轴高亮该日;今天消息少时输入框上方允许留白。点轴只滚动,高亮仍跟视口顶部走。当前高亮节点的圆点与文案大于未选中节点。
    • 消息列表使用 scrollbar-gutter: stable,避免过程态显隐导致宽度抖动。右侧滚动时以视口顶部附近第一条消息的日期高亮左侧对应节点(日优先,否则高亮包含该日的月/年)。
    • 紧凑态按「完整态轴宽(含左偏移)是否会与 Composer / 审批卡左缘碰撞」判断,与是否展开右侧面板无关:会碰撞则只保留圆点与轴线,悬浮 Tooltip 显示节点时间文案;不会碰撞则保持完整文案与月/年搜索。宽栏下节点无 Tooltip。审批卡替换 Composer 时仍以审批卡为布局锚点,轴线底边对齐与紧凑态判定持续生效。
    • 向上滚动到顶部仍懒加载更早消息;目标天未加载时先加载再跳。
  • 验收:
    • WB-SESSION-010-AC1 有消息的伙伴主区可见时间轴;无消息的日/月/年不出现节点。
    • WB-SESSION-010-AC2 近 7 日外的同年消息收成月节点,往年收成年节点;点月/年跳到该范围最早有消息日的第一条,轴上节点集合不因点击而展开成子节点。
    • WB-SESSION-010-AC3 点击日节点后,消息区滚动到该天最早一条消息;近端日期第一次点击即稳定贴顶且高亮不闪回月/年节点。打开伙伴或滚到底部后,视口顶为最新有消息日的最早一条,轴高亮该日。
    • WB-SESSION-010-AC4 滚动到消息区顶部会加载更早消息,且不切换伙伴;时间轴自身不出现独立滚动。
    • WB-SESSION-010-AC5 月/年节点文案下有搜索图标;打开 DatePicker 后只能选择该范围内有消息的天;选天后轴节点不变,消息区瞬时跳到该天最早一条;同一天再次打开仍可点选并再次跳转;选天关闭弹层不得连带触发月/年节点的默认跳转。
    • WB-SESSION-010-AC6 点击时间轴节点只滚动消息列表,并将目标日最早消息瞬时贴顶(无平滑滚动);列表底部常驻刚够让最新日贴顶的阅读留白,已贴顶则不重复滚动,侧栏与 Composer 位置不变。
    • WB-SESSION-010-AC7 节点以固定间距自底部向上堆叠并靠近输入框;轴线底端对齐最新节点圆心、不向下突出,顶端不与顶栏横线相接。
    • WB-SESSION-010-AC8 完整态时间轴(含水平左偏移)会与 Composer / 审批卡左缘碰撞时进入紧凑态(仅圆点 + 悬浮 Tooltip);不会碰撞时保持完整态,不因右侧面板展开本身强制收起;审批替换 Composer 期间轴线与紧凑态仍按同一锚点生效。
    • WB-SESSION-010-AC9 当前高亮节点圆点与文案大于未选中节点。

WB-SESSION-011 清空消息记录

  • 系统行为:当前伙伴存在消息记录、且不在 running / waiting_approval 时,Composer 上方显示「清空消息记录」胶囊(与消息操作胶囊同壳,内含橡皮/擦除图标,不用火花或垃圾桶)。整颗主操作 hover 提示:清空「{伙伴名}」的全部消息记录,无法恢复。。点击后先弹出确认框(标题「清空消息记录?」,正文说明将删除该伙伴全部对话消息且无法恢复、伙伴本身保留;主按钮「清空」为危险态)。确认后物理删除该伙伴 chat_session_message_log 全部行及对应 ai_run;不删除 ai_file_change、伙伴本身、Composer 草稿、右侧标签与浏览器标签。清空后主区消息列表为空,胶囊随之消失。伙伴仍在运行或等待审批时不显示清空入口。
  • 验收:
    • WB-SESSION-011-AC1 确认清空后该伙伴消息列表为空,不再保留旧气泡。
    • WB-SESSION-011-AC2 清空后仍停留在同一伙伴;Composer 草稿与右侧标签保持不变。
    • WB-SESSION-011-AC3 清空后下一次发送不再把旧对话作为模型上下文。
    • WB-SESSION-011-AC4 当前伙伴存在 running / waiting_approval 时,清空入口不显示。
    • WB-SESSION-011-AC5 胶囊文案为「清空消息记录」;hover tooltip 含伙伴名且说明无法恢复。
    • WB-SESSION-011-AC6 点击胶囊先出现确认框;取消确认不删除任何消息。
    • WB-SESSION-011-AC7 清空不删除该伙伴的 ai_file_change 文件回退记录。
    • WB-SESSION-011-AC8 伙伴有消息且空闲时显示清空入口;切换伙伴或重启后,只要仍有消息且空闲仍应显示。

WB-SESSION-012 编辑伙伴

  • 系统行为:悬停伙伴条目时提供编辑入口;点击后打开与创建共用的弹窗,标题为「编辑伙伴」,主按钮为「保存」,并带入当前名称、外形和颜色。保存只更新这三项,不改变消息记录、置顶状态和当前选中。创建入口仍打开空白创建弹窗。
  • 验收:
    • WB-SESSION-012-AC1 编辑弹窗预填当前名称与形象,保存后侧栏立即显示新名称和形象;若主区顶栏可见,则同步显示新名称。
    • WB-SESSION-012-AC2 编辑不创建新伙伴,也不清空该伙伴的消息。

WB-SESSION-013 用户消息时间条

  • 系统行为:仅用户消息在气泡上方居中展示时间(微信式),assistant 不展示。出现条件:该伙伴当前列表中的第一条用户消息;或与上一条用户消息间隔 ≥ 30 分钟;或与上一条用户消息跨了本地日历日(即使间隔不足 30 分钟)。文案:当天 16:45;昨天 昨天 16:45;7 日内 星期三 16:45;更早 YYYY/M/D 16:45。hover 操作区不再附带时间。
  • 验收:
    • WB-SESSION-013-AC1 第一条用户消息上方居中展示时间条。
    • WB-SESSION-013-AC2 与上一条用户消息间隔不足 30 分钟且同日时不展示时间条。
    • WB-SESSION-013-AC3 与上一条用户消息间隔 ≥ 30 分钟时展示时间条。
    • WB-SESSION-013-AC4 跨本地日时即使间隔不足 30 分钟也展示时间条。
    • WB-SESSION-013-AC5 assistant 消息不展示时间条;hover 复制/编辑区不含时间。

8.3 Composer 输入与发送

WB-COMPOSER-001 发送前置条件

  • 系统行为:只有当前已选中伙伴、输入裁剪后非空且未处于发送中时,发送按钮才可执行;仍需满足已选主模型等现有条件。发送按钮因前置条件不满足而不可执行时,用户可通过 hover 查看具体原因提示。未创建伙伴时 Composer 为空态,不出现可发送按钮。空输入占位文案为「输入你想让{当前伙伴名}做的事情或者@文件」(名为空时回落「馆长」);Brain 系统提示自称同一伙伴名。
  • 验收:
    • WB-COMPOSER-001-AC1 纯空白输入不会触发发送。
    • WB-COMPOSER-001-AC2 未选中伙伴或发送中时,不会重复触发发送。
    • WB-COMPOSER-001-AC3 已选中伙伴但发送按钮因前置条件不可执行时,hover 可见具体禁用原因。未创建或未选中伙伴时 Composer 为空态、不出现可发送按钮(见 WB-CORE-001-AC2 / WB-SESSION-001-AC1),不适用本条 hover 文案。
    • WB-COMPOSER-001-AC4 Composer 空输入占位含当前伙伴名;审批指导输入占位为「告诉{当前伙伴名}该怎么做」;改名后占位与后续 Brain 自称同步新名(可导致 LLM 前缀缓存 miss,本地数据不丢)。

WB-COMPOSER-002 键盘行为

  • 系统行为:Enter 发送,Shift + Enter 插入换行;中文等输入法组词期间不应被输入区同步、光标恢复或候选刷新打断。
  • 验收:
    • WB-COMPOSER-002-AC1 按 Enter 后触发智能模式发送。
    • WB-COMPOSER-002-AC2 按 Shift + Enter 后,输入区保留内容并新增换行,不触发发送。
    • WB-COMPOSER-002-AC3 使用中文输入法快速输入时,输入区不会中断组词并遗留未确认的英文拼音字符。

WB-COMPOSER-003 智能模式发送路径

  • 系统行为:智能模式发送时,前端调用提交接口;主进程统一校验伙伴、输入、模型与 @ 范围,并在启动 AI 前创建用户消息、assistant 占位消息和 AI run 记录。AI 运行中的事件以伙伴消息记录为唯一真相源,逐步投影并广播给界面;界面恢复已完成或进行中的过程流投影,支持继续运行中或等待审批的交互状态,并结合实时事件展示 Thought(决策)、Activity(工具面板)、压缩层、重试层与最终 markdown 输出。Composer 不再展示模式切换。
  • 验收:
    • WB-COMPOSER-003-AC1 智能模式发送后,主区先可见用户消息与 assistant 占位消息。
    • WB-COMPOSER-003-AC2 AI 运行成功启动后,assistant 过程流通过事件逐步追加更新,而不是一次性静态替换。
    • WB-COMPOSER-003-AC3 assistant 在 Brain 思考阶段于过程流最下方展示“让俺想想”并带有微光流动视觉反馈。运行未结束且尚无最终回答时预留同高占位,避免文案显隐导致消息区上挤抖动。当思考请求发起时展示文案;当收到输出、思考结束、出现“正在重试”过程组、已有可见流式 Thought / 最终回答、或 run 已结束(完成 / 失败 / 取消)时,必须隐藏“让俺想想”。
    • WB-COMPOSER-003-AC4 assistant turn 中 brain 最终输出始终位于过程流下方,并按 markdown 渲染;最终回答在内容分片到达后直接流式渲染,不展示独立收尾等待层;内部文件链接打开右侧文件预览,网页链接打开右侧内置浏览器;若当前伙伴已有浏览器 Tab 正停留在同一 URL,则激活该 Tab,不新开。
    • WB-COMPOSER-003-AC5 决策层(Thought)只展示面向用户的短摘要,不得展示模型原始长篇推理;决策层出现时,当前“让俺想想”必须立即隐藏;已落地的 Thought 使用浅灰色(#787774)文本呈现思考状态;未超出单行时不展示折叠图标,超出单行时默认以单行省略号截断展示且不常驻图标,鼠标悬浮时显示展开图标,点击展开后常驻浅灰卡片背景并展示收起图标,展开内容受最大高度限制(超出纵向滚动),流式阶段平铺展开。
    • WB-COMPOSER-003-AC6 过程流使用用户可理解的文案,不直接暴露内部 tool 名或底层事件名;两次 Thought 之间的工具调用(含 learn_skill)合并为一个 Activity 面板,展开后按时间平铺自然语言说明;压缩与重试单独成行。Activity header 汇总规则见 WB-COMPOSER-009-AC5;等待审批时的 header 与审后工具行图标见 WB-BLOCKER-001-AC6 / WB-BLOCKER-001-AC7。
    • WB-COMPOSER-003-AC7 AI 输出中切到 Settings 或触发界面重新挂载后,回到 Workbench 能通过伙伴消息记录投影恢复过程流、partial answer、最终回答或等待审批状态。
    • WB-COMPOSER-003-AC8 brain 在最终交付 markdown 中使用标准 Markdown 链接引用资料(名称 + 绝对路径或 https URL);最终交付生成后、回传界面前,后台仅对本地文件链接地址并行去重检查并写入交付 linkAccess sidecar(不改写正文)。可访问的本地文件链接保留文件预览交互;不可访问或无法识别的本地文件链接不得删除,必须使用强调色降低透明度的灰色弱化文本,悬浮提示「链接无法访问」,且不可点击。http(s) 网页链接不做可达性检查、不写入可达性 sidecar,交付前后均默认可点并打开内置浏览器。界面不把裸 URL / www.… 自动识别为链接,也不对其套用 linkAccess 弱化态;流式阶段尚无 sidecar 时本地文件链接可先保持可点,交付落库后按 sidecar 更新。界面渲染和用户点击时均不再次检查可访问性。渲染侧匹配 sidecar 前须对 href 做 percent-decoding / 路径规范化,避免中文等非 ASCII 路径因编码差异误判不可达。
    • WB-COMPOSER-003-AC9 terminal 审批要求表示命令正在等待用户决定,不属于执行失败;用户未允许时命令状态为未执行且不得产生 terminal step。命令启动后自然退出时,无论退出码是否为零,都属于执行完成并保留真实退出码供 brain 判断;只有终端执行器、Shell 或会话在执行期间异常时才显示“执行终端指令失败”。用户主动停止单独记录为已取消;正常中断后终端回到 idle,强制终止进程树后终端进入 closed。

WB-COMPOSER-007 模型、AI 推进偏好与执行权限选择

  • 系统行为:输入区底部展示主模型。模型选择分为预设视图与自定义视图。
    • 推荐配置的默认/回退主模型只使用预设目录中的稳定调用名(preset.id),不得取 remote 模型列表的第一项。预设推荐目录来自官网 GET /api/v1/preset-models(无密钥),与用户本地 Key 按服务商 providerId 对齐后展示;本地仅保留服务商接入 registry。目录权威为远程接口,本地磁盘缓存为唯一兜底;无缓存且拉取失败时不展示硬编码推荐模型。刷新目录时把模型 iconUrl 图片落到 userData/llm-icons/,列表与 trigger 优先用本地缓存图;JSON 仍只存远程 URL。
    • 用户从自定义视图选中的任意 remote 精确 id(含推荐配置下的快照名)必须保留,不得被回退逻辑强行改回预设。
    • 预设模型是否可用,按该配置 remote /models 返回的 id 与预设调用名做精确全等匹配;列表非空且匹配失败时,该预设行禁用,悬浮侧栏说明「该模型不存在」并展示实际查找的模型名。remote 列表为空(拉取失败或确无模型)时不因空列表禁用预设。
    • 预设列表为统一滚动区(付费预设在上、免费模型在下,无「免费模型」分区标题);列表行展示接口下发的 iconUrl、展示名、竖向排列且不重叠的价格档位图标(较低 1 / 适中 2 / 较高 3,统一灰色;免费行尾部用灰色「免费」文字替代硬币)和选中勾;菜单宽度按内容自适应;列表区最大高度 300px,底部「自定义模型」入口固定在滚动区外。
    • 预设视图目录刷新叠在菜单右上角(不单独占一行):同时刷新付费预设与免费模型目录;按钮态为 idle / loading / success / error,成功或失败图标约 1.4s 后回到 idle。无缓存时先展示 loading,拉取失败且仍为空时展示错误态与刷新入口;有缓存时立即展示列表,过期后台刷新只驱动右上角刷新按钮 spinner。
    • 免费条目开箱即用、不依赖用户配置;不使用 providerId;调用依赖 providerKind + baseUrl + Key + modelName,图标依赖 iconUrl(绑模型)。
    • 鼠标悬浮或键盘聚焦可用或不可用的预设模型时,在列表右侧固定展示较窄的信息侧栏(与菜单约 1px 间距);右侧空间不足时整体左移菜单,保证侧栏仍贴在菜单右侧。可用时展示模型名、短介绍、价格档位文案、是否支持视觉理解(侧栏不展示档位图标);不可用时只说明该模型不存在。悬浮免费模型时侧栏展示展示名、描述、价格档位「免费」、是否视觉理解,并附加「不保证稳定和隐私性」。
    • 自定义模型视图不展示信息侧栏;自定义列表可含带日期快照等 remote 原始名;自定义行仍可用本地服务商 logo。
    • 伙伴快照存储 configId + modelName(modelName 为实际调用名;免费模型的 configId 为合成系统配置 id,modelName 为免费接口真实调用名)。
  • 验收:
    • WB-COMPOSER-007-AC1 模型选择展开后展示预设模型区与底部「自定义模型」入口;进入自定义模型视图后为原服务商分组面板效果,可按模型名称搜索候选。
    • WB-COMPOSER-007-AC2 预设模型平铺展示且不出现分组标题(含不出现「免费模型」标题);列表行含接口 iconUrl(刷新后优先本地缓存图)、展示名、竖向不重叠的价格档位图标(或免费文案)和选中勾;菜单宽度按内容自适应。
    • WB-COMPOSER-007-AC3 悬浮或键盘聚焦预设模型时在列表右侧固定显示信息侧栏(贴近菜单);可用预设展示短介绍、价格档位文案和是否视觉理解(侧栏无档位图标);匹配失败的预设禁用且侧栏说明该模型不存在;自定义视图不展示侧栏。
    • WB-COMPOSER-007-AC4 选中预设模型后输入框展示该模型 iconUrl 与展示名,选中自定义模型后展示模型名;伙伴快照存储 configId + modelName;推荐配置默认选中预设稳定调用名而非 remote 列表第一项;从自定义视图选中的 remote id 不会被强制改回预设。
    • WB-COMPOSER-007-AC5 用户切换 AI 推进偏好、执行权限或模型后,切回该伙伴或重启应用时恢复该伙伴自己的 SQLite 快照。
    • WB-COMPOSER-007-AC6 当伙伴快照中的模型已失效(含推荐配置上存了非预设 id、或预设 id 在非空 remote 列表中精确匹配失败)时,系统自动清理或回退到当前可用候选,并保存修复后的快照。
    • WB-COMPOSER-007-AC7 模型选择入口有可识别图标,而不是只展示纯文本。
    • WB-COMPOSER-007-AC14 有免费模型目录时预设列表在付费项之后展示免费模型行(图标来自接口 iconUrl、尾部「免费」文案);右上角提供统一目录刷新(含成功/失败反馈,不单独占顶栏行);侧栏价位为「免费」并含稳定性/隐私提示;无缓存 loading、失败空态与有缓存后台刷新行为对齐系统行为;选中后 trigger 展示图标与展示名;无用户配置时可将免费模型作为默认候选。
    • WB-COMPOSER-007-AC15 付费预设推荐模型来自官网目录;用户仅配置 DeepSeek Key 时可见 deepseek-flash(DeepSeek V4.1 Flash)等下发条目,换目录不必发桌面版。
    • WB-COMPOSER-007-AC9 可选择默认、本地资料宽松和本地资料严谨三种推进偏好;本地资料入口通过二级菜单选择宽松或严谨。
    • WB-COMPOSER-007-AC11 发送智能任务时,当前 AI 推进偏好会进入 Main 侧 AI run 上下文并影响资料使用边界。
    • WB-COMPOSER-007-AC12 新伙伴默认“审核”;发送时的执行权限写入本次 AI run,发送后改变 Composer 选择不得影响已启动的 run。
    • WB-COMPOSER-007-AC13 切换到“完全访问”权限时系统弹出高危风险二次确认弹窗(包含文件读写删除、终端命令和网络访问三项高危说明与注入风险警示),未在弹窗中确认前不改变当前权限;在弹窗中点击取消或关闭弹窗维持原权限;确认后正式切换为完全访问;从“完全访问”切回“审核”为安全降权,直接生效无需二次确认。

WB-COMPOSER-013 主模型图片输入

  • 系统行为:不单独配置视觉模型。AI 调用内置 read_image 后,图片直接加入当前主模型的下一次多模态请求;主模型不支持图片时展示 provider 原始错误。
  • 验收:
    • WB-COMPOSER-013-AC1 模型选择器不展示独立视觉模型入口;预设是否支持视觉理解只在统一模型信息侧栏中说明;列表行可用价格档位图标,不另加眼睛或视觉图标。
    • WB-COMPOSER-013-AC2 用户附件和 @ 图片只向 AI 提供路径,不在发送前自动识别。
    • WB-COMPOSER-013-AC3 图片路径和元数据可持久化,Base64 不得进入 SQLite 伙伴数据。
    • WB-COMPOSER-013-AC4 本地图片由 read_image 生成运行时缓存,HTTP(S) @ 图片保留原地址;运行时文件丢失后允许显示不可用占位。

WB-COMPOSER-014 流式回答、Thought 与计划进度

  • 系统行为:回答内容分片到达后立即在最终回答位置按 Markdown 渲染;一旦进入工具执行,同一草稿转为紧凑 Thought。自动重试前清空上一尝试草稿。正常结束且无工具调用时原位成为最终回答;有工具调用时按 Thought 切段聚合为 Activity 面板(默认折叠,可展开查看工具平铺详情),聊天区不直接展示工具原始结果。Composer 正中上方展示当前计划的环形进度,hover 显示 Todo 浮层,移开后隐藏,不支持点击固定。
  • 验收:
    • WB-COMPOSER-014-AC1 多段内容在任务完成前逐段 Markdown 渲染,切换伙伴再回来可恢复当前草稿。
    • WB-COMPOSER-014-AC2 有工具调用的内容成为 Thought;无工具且正常结束的内容成为最终回答。未确认结束前不会提前收尾。
    • WB-COMPOSER-014-AC3 自动重试不会重复拼接上一尝试;输出被截断时显示可继续错误,已确认的半截回答进入日志,网络中断草稿不进入后续对话上下文。
    • WB-COMPOSER-014-AC4 有计划时显示环形进度;Todo 浮层仅 hover 展示、移开隐藏,正常完成后短动画隐藏,中断后保留。
    • WB-COMPOSER-014-AC5 两次 Thought 之间的工具调用合并为 Activity 面板(布局、展开行与 header 规则见 WB-COMPOSER-009);聊天区不直接展示工具原始结果。

WB-COMPOSER-015 LLM 自动重试过程层

  • 系统行为:Brain / LLM 调用层可重试错误由 classifyLlmRetry 驱动 runLlmCallWithActivity,只认结构化信号:HTTP status、providerCode/type、以及连接类类型(APIConnectionError / APIConnectionTimeoutError / TimeoutError)。可重试含 408/429/5xx、限流/容量、断网连接错误、供应商连接超时、以及调用层 TIMEOUT。上限 AI_LLM_CALL_MAX_RETRY_ATTEMPTS 表示首次失败后再试最多 5 次。过程区以独立重试行展示,不并入 Activity。同一 run 只使用一个过程组 id(${runId}:llm-retry),次数在同一行就地更新(正在重试 1/5 → 2/5),不按 attempt 或后续 LLM 调用再叠多行。该行 running 时必须隐藏“让俺想想”。该次调用重试成功后该行消失,过程流继续(Thought / 工具 / 最终回答),不展示“已重试”。耗尽则收口为“重试失败 n/5”,失败码为 llm_request_failed。429 / rate_limit_exceeded / ResourceExhausted 使用 2s 起、上限 15s 的指数退避;连接错误与超时使用短退避。自动重试前清空上一尝试草稿仍见 WB-COMPOSER-014-AC3。
  • 验收:
    • WB-COMPOSER-015-AC1 第一次自动重试展示“正在重试 1/5”;同一调用后续 attempt 在同一行更新为 2/5 … 5/5,不新开一行。
    • WB-COMPOSER-015-AC2 同一 run 内后续 LLM 调用若再次进入自动重试,仍只保留这一行并就地更新,不得同时出现多条“正在重试 / 重试失败”。
    • WB-COMPOSER-015-AC3 重试行处于 running 时过程区不得同时展示“让俺想想”;重试行出现后思考等待立即隐藏。
    • WB-COMPOSER-015-AC4 429 / rate limit 使用 2s 起、上限 15s 的指数退避;退避结束后继续原调用,成功则该行消失并继续过程流,耗尽则收口为“重试失败 n/5”。

WB-COMPOSER-008 上下文用量提示

  • 系统行为:智能模式输入区展示当前伙伴上下文 token 用量圆圈,显示当前已估算 token、当前模型有效上下文窗口 token 与已用占比;hover 展示已用比例与 token 数,不展示剩余比例。有效窗口 = min(256000, floor(modelContext × 0.8)),其中 modelContext 来自免费/推荐目录的 contextWindowTokens,自定义或缺失字段按 256000。该用量在切换伙伴和 human run 完成后刷新。
  • 验收:
    • WB-COMPOSER-008-AC1 智能模式下输入区可见上下文用量圆圈,hover 或辅助文本可读到已用比例与已用 / 最大 token,不展示剩余比例。
    • WB-COMPOSER-008-AC2 human run 完成后,用量圆圈会基于最新伙伴消息记录刷新。

WB-COMPOSER-009 消息流布局

  • 系统行为:workbench 消息区不展示用户与 assistant 头像;assistant 回复以左对齐内容流展示,过程流没有独立标题或左侧竖线,且与最终 brain 输出共用消息 rail;最终 markdown 输出直接位于内容流中;用户消息使用右对齐紧凑气泡。无消息时输入区位于主工作区中部;存在消息后输入区固定在主区底部,只允许消息区独立滚动,右侧面板展开或折叠不得改变输入区定位。过程流按真实时间展示决策层与过程层:思考层“让俺想想”是 Brain 请求阶段的临时等待状态,位于过程区最下方展示,请求时出现、结束时隐藏;决策层(Thought)使用浅灰色文本,未超出单行时不显示折叠图标,超出单行时默认单行省略且鼠标 hover 显示展开图标,展开后常驻浅灰卡片背景并支持内部滚动;两次 Thought 之间的全部工具调用(含 learn_skill)合并为一个 Activity 面板(默认折叠,hover 显示展开箭头),header 与展开行规则见 WB-COMPOSER-009-AC5 / WB-COMPOSER-009-AC6;压缩层和决策层累计保留;重试行仅在进行中或失败时展示,成功后移除。压缩与重试单独成行、不并入 Activity。LLM 自动重试行规则见 WB-COMPOSER-015。
  • 验收:
    • WB-COMPOSER-009-AC1 用户与 assistant 消息不展示头像或头像占位。
    • WB-COMPOSER-009-AC2 assistant 过程流和最终输出左边缘与底部 composer 内容 rail 对齐。
    • WB-COMPOSER-009-AC3 assistant 最终 markdown 输出默认无独立背景卡片,保持在过程流下方。
    • WB-COMPOSER-009-AC4 用户消息以右对齐紧凑气泡展示。
    • WB-COMPOSER-009-AC5 Activity header 按工具 UI 类型归并后做短句汇总:短句来自各工具独立维护的 headerShortText(可独立成句的动词短语),不得靠展开行剥参得到半截连词;同类多次展示为「短句 N 次」(例如「搜索网页 3 次」);归并后类别为 1 时与短句(或带次数)一致;2~3 类时用顿号 、 连接且两侧无空格(例如「正在学习 Excel 编辑器、执行命令、搜索网页」),不再使用「并」「但」;归并后类别大于 3 时收敛为「已完成 n 项」(n 为总工具次数;进行中也使用该句式,不再在「正在执行 / 已完成」间切换;失败态使用对应失败句式)。header 不携带命令参数、文件路径、query 或 URL;展开行仍展示带对象的完整工具原句。header 从 Activity 出现起保持滑动,直到下一段 AI content(Thought 或最终回答)出现。header 文本单行显示,超出宽度时 CSS 省略号裁切。header 只展示一个图标;单一工具类型使用对应语义图标,混合工具使用流程图标。示例:browser_use observe/extract/act 的 header 分别为「查看页面 / 提取内容 / 操作页面」,不得出现「查看页面并」「从页面中」「在页面上」;docx_read_outline header 为「查看 Word 文档结构」。
    • WB-COMPOSER-009-AC6 展开后的工具句子使用“动作 + 对象”的完整自然语言,不重复运行状态,不使用冒号。示例:docx_read_outline 展示“查看 Word 文档 xx 的结构”;docx_read_nodes 展示“读取 Word 文档 xx 范围”;learn_skill 展示“正在学习 / 已学会 xx”;text_file_read 展示“读取文件 xx”;terminal_run 展示“执行命令 xxxx”;web_search search / fetch 分别展示“搜索网页 query”“抓取网页 url”;browser_use navigate / list_tabs / observe / extract / act / act_instruction / screenshot / scroll 分别补充“打开网页 / 列出浏览器标签 / 查看页面并 / 从页面中 / 在页面上执行 / 在页面上执行 / 截取页面 / 滚动页面”的动作语义(半截连词仅用于展开行接对象,不用于 header)。read_image 展开行文案为「读取图片」,其下按入参 paths 展示可点击缩略图(多图横排);点击后复用与 Composer 附件相同的 ImageLightbox 放大查看;展开行不展示完整路径文案。
    • WB-COMPOSER-009-AC7 文件名、query、命令、URL 和技能名不使用粗体或冒号强调,保持正常字重;可以通过文字颜色表达层级。
    • WB-COMPOSER-009-AC8 learn_skill 作为普通工具行展示,使用技能通用名称,例如 docx 阅读器、docx 编辑器、资料查阅器、命令执行器;运行中展示“正在学习 xx”,完成后展示“已学会 xx”,不再作为独立学习层。
    • WB-COMPOSER-009-AC9 Activity header、压缩层和重试层展示对应图标;浏览器各动作(打开网页使用地球图标、查看页面使用眼睛图标、操作页面使用指针图标、提取内容使用双眼图标、截取页面使用相机图标、滚动页面使用上下箭头图标、列出标签使用浏览器标签图标)、网页抓取使用蜘蛛图标、网页搜索使用放大镜图标、读取图片与生成图片使用照片相框图标(截取页面并读取图片的视觉成对动作统一使用照片图标,不退化为闪电)、知识库、文件、终端和学习使用独立语义图标;其他混合动作或混合工具时使用工作流闪电图标。展开后的每条工具句子不展示图标,也不渲染前置小圆点或“AI 思路”类图标。
    • WB-COMPOSER-009-AC10 决策层、Activity、压缩层、重试层按事件时间顺序累计展示;决策层采用浅灰色文本,未超出单行时不显示折叠图标,超出单行时单行截断省略,折叠状态展开图标在 hover 时显示且垂直居中于单行文本,展开时常驻浅灰卡片背景、折叠按钮居顶对齐第一行文本并在最大高度内纵向滚动,Activity 默认折叠;不存在独立学习层或最终收尾等待层;Brain 请求期间在消息流最下方展示“让俺想想”。成功的自动重试行不保留(见 WB-COMPOSER-015-AC4);失败重试行保留。重试行次数与互斥规则见 WB-COMPOSER-015。
    • WB-COMPOSER-009-AC11 无消息时输入区保持居中;存在消息后消息区为唯一纵向滚动容器,输入区固定在主区底部且不被消息内容向下推出窗口。
    • WB-COMPOSER-009-AC12 “正在 / 已检索知识库”只来自 AI 实际调用知识库工具;新建干净智能对话、仅切换伙伴时不得凭空出现该过程文案。

WB-COMPOSER-006 AI 运行取消

  • 系统行为:智能模式在当前任务仍在运行时,composer 不展示独立取消按钮;底部发送按钮切换为停止图标,点击后直接中止当前 run。停止后 UI 保持占用当前 run,直到 Main 发出 run_cancelled / 失败 / 完成;清理期间按钮为转圈态,悬浮提示「正在停止本次运行」,不得再发下一条消息。若当前 run 正在等待审批,停止也必须释放审批等待并结束本次 run。正在执行 browser_use(含页面加载与 Stagehand observe/act/extract)时,停止须立刻中断并结束 run,不得等页面或 Stagehand 自然完成后再结束。当前 run 仍在等待模型首个 token(流式尚未返回)时,停止也须立刻按 user_cancelled 结束,不得等待服务商拆掉连接或 stream 自然结束。
  • 验收:
    • WB-COMPOSER-006-AC1 运行中发送按钮切换为停止图标,页面不再显示独立“取消”按钮。
    • WB-COMPOSER-006-AC2 点击停止图标后,当前运行结束并给出已取消反馈。
    • WB-COMPOSER-006-AC3 当前运行卡在审批等待时,点击停止图标也会结束本次 run,而不是继续等待审批提交。
    • WB-COMPOSER-006-AC4 当前 run 正在执行 browser_use 导航或 Stagehand 操作时,点击停止图标后须立刻结束本次 run(user_cancelled),不得继续等待页面加载完成或 Stagehand 超时。
    • WB-COMPOSER-006-AC5 点击停止后、运行尚未终态前,发送按钮保持禁用并展示「正在停止本次运行」;清理完成前不能发送新消息。
    • WB-COMPOSER-006-AC6 当前 run 仍在等待模型首个 token 时点击停止,须立刻结束本次 run(user_cancelled),不得等待 stream 拆连接或底层 AbortError 被当成普通失败。

WB-COMPOSER-010 附件保存与传递规则

  • 系统行为:用户通过 + 或拖入中间聊天区添加本地文件时,附件记录其源文件绝对路径,不复制文件;粘贴文件因不保证有稳定源路径,保存到 userData/partners/{id}/runtime/assets/<assetBucketId>/。assetBucketId 是当前输入草稿生成的 UUID,添加附件不会创建新伙伴。文件拖入中间聊天区时显示透明覆盖层“松开以添加文件”,拖离或放下后消失;覆盖层不覆盖左侧栏、顶部栏或右侧资源面板。发送给 AI 的附件上下文只包含顺序、名称和路径。未选中伙伴时不允许添加附件。
  • 验收:
    • WB-COMPOSER-010-AC1 未选中伙伴时不允许添加附件,并提示先创建或选择伙伴。
    • WB-COMPOSER-010-AC2 已选中伙伴后,+ 和拖放文件保留源文件绝对路径;粘贴文件保存到 userData/partners/{id}/runtime/assets/<assetBucketId>/。
    • WB-COMPOSER-010-AC3 附件不限文件扩展名,任何可被文件选择器选中的普通文件都可以添加;不因扩展名提示不支持或拒绝加入附件列表。文件内容是否可被 AI 工具处理由 AI 工具层自行判断。
    • WB-COMPOSER-010-AC4 发送给 AI 的附件上下文只包含顺序、名称和路径,不包含发送前预解析摘要。
    • WB-COMPOSER-010-AC5 拖放仅接受文件;文件夹不处理。大小提示、附件卡片和移除逻辑与 +、粘贴一致。

WB-COMPOSER-011 使用帮助入口

  • 系统行为:Workbench 左侧栏底部在设置入口旁展示使用帮助按钮,点击后通过系统默认浏览器打开国内官网中文使用手册 https://www.guanzhangai.cn/zh/manual。
  • 验收:
    • WB-COMPOSER-011-AC1 使用帮助按钮可见,具有“查看使用帮助”的可访问名称和说明。
    • WB-COMPOSER-011-AC2 点击使用帮助按钮后,系统打开官方中文使用手册,不改变当前伙伴和输入草稿。

WB-COMPOSER-012 应用更新入口

  • 系统行为:应用更新入口位于 Workbench 左侧栏底部、使用帮助入口旁。应用启动 5 秒后静默检查更新,持续运行时每 4 小时再检查一次;发现新版本后显示“更新”,由用户主动点击后才开始下载,下载时显示进度,下载完成后显示“重启更新”;设置页不重复提供更新入口。Windows 上用户选择立即重启安装时,先完成应用关闭(刷新工作区、终止 embedding / 网页抓取 sidecar / 终端会话等子进程),再触发安装器覆盖升级,避免旧文件被占用导致卸载失败。
  • 验收:
    • WB-COMPOSER-012-AC1 没有可用更新时不显示更新入口;发现更新后入口可见。
    • WB-COMPOSER-012-AC2 用户主动点击后才开始下载,下载中显示进度且失败后可重试。
    • WB-COMPOSER-012-AC3 下载完成后可立即重启或稍后处理,稍后处理时入口保留为“重启更新”。
    • WB-COMPOSER-012-AC4 当前应用检测到本机 SQLite schema version 更高时,不初始化 Workbench 和其他业务服务,只显示独立升级恢复页,并明确展示检测版本与当前支持版本。
    • WB-COMPOSER-012-AC5 升级恢复页自动检查更新,按状态提供检查、下载、进度、失败重试和重启安装;始终保留官网中文下载页入口与退出入口。点击官网入口必须通过系统默认浏览器打开(恢复模式也要注册 openExternal,不能只渲染链接)。更新失败或不可用时不能绕过进入业务界面。页面不展示底层更新错误,统一使用可理解的中文失败提示。恢复页顶部保留 44px 窗口拖动条(Windows 另有独立 36px 原生标题栏,业务内容从其下方开始),按钮和链接使用 no-drag。

8.4 @ 参考资料

WB-SCOPE-001 @ 候选来源规则

  • 系统行为:输入 @ 后,根据当前关键字返回目录、文件和网页资料候选。本地候选相对每个工作地址根最多收录两级路径(根为第 0 级,可引用工作地址本身;其下第一层、第二层的目录与文件进入列表;第三层及更深不出现)。列表为「文件 / 网页」两组平铺,无展开、无点进目录;点击任一项即插入对应 token。工作地址根、目录、文件、网页均可选中。候选按页懒加载,单次最多 50 条,滚到底加载下一批;有关键字时在上述扁平集合内子串过滤后再分页。本地索引只补充索引状态,不决定候选是否出现。键盘上下移动高亮项时列表滚动跟随使当前项可见;Enter 插入当前高亮项。未创建或未选中伙伴时 Composer 为空态,不开放 @ 发送路径。
  • 验收:
    • WB-SCOPE-001-AC1 未选中伙伴时不把资料选择当作正常发送路径暴露给用户。
    • WB-SCOPE-001-AC2 已选中伙伴后,候选可同时出现工作地址根、根下两级内的目录/文件与全局网页;只展示“文件”和“网页”两组;点击目录与点击文件一样直接插入,不进入子层。
    • WB-SCOPE-001-AC3 在上一次索引或候选打开后新增、修改或删除本地文件时,再次打开 @(或搜索)必须反映真实目录;深度超过两级的路径不出现;新增或变更但未索引的文件仍可选择,并显示“未索引”。
    • WB-SCOPE-001-AC4 浏览与搜索均按页加载且单次不超过 50 条;滚到底可继续加载;键盘高亮超出可视区时滚动条跟随。

WB-SCOPE-002 @ 插入与删除规则

  • 系统行为:候选可通过键盘或鼠标插入为内联 token;目录、文件和网页资料都可作为合法 token 插入;输入区支持多个已插入 token 共存;token 使用无边框的紧凑图标加名称样式展示。目录、网页、PDF、DOCX、PPT/PPTX、Excel 使用各自的专属样式;Markdown、TXT 和其他文件统一使用普通文件样式。文字与图标保持同色。按 Backspace 可移除参考资料;发送后,用户消息中保留本轮参考资料 token 回显,样式与输入区 token 保持一致。
  • 验收:
    • WB-SCOPE-002-AC1 目录、文件或网页资料插入成功后,参考资料以 token 形式保留在输入流中,并进入后续发送参数。
    • WB-SCOPE-002-AC2 输入区支持多个已插入 token 共存,而不是后插入覆盖前一个范围。
    • WB-SCOPE-002-AC3 删除 token 后,对应范围不再参与后续发送。
    • WB-SCOPE-002-AC4 发送后,用户消息仍展示本轮 @ 参考资料 token,用户可从消息中看见当时选择的资料范围。
    • WB-SCOPE-002-AC5 目录、网页、PDF、DOCX、PPT/PPTX、Excel 使用专属样式;Markdown、TXT 和其他扩展名不得伪装成专属类型,统一使用普通文件样式。

WB-SCOPE-003 重复范围清理

  • 系统行为:已插入的参考资料不重复出现在候选中。
  • 验收:
    • WB-SCOPE-003-AC1 同一范围不会被连续重复插入。

WB-SCOPE-004 空候选提示

  • 系统行为:若当前没有可插入范围,系统按上下文给出明确提示。
  • 验收:
    • WB-SCOPE-004-AC2 已选中伙伴但没有匹配项时,提示没有匹配项。

8.5 AI 运行中的阻塞与提示

WB-BLOCKER-001 审批阻塞

  • 系统行为:
    • 审核权限下,AI 运行收到批量审批事件后,在输入框上方展示紧贴 composer 的审批卡片;卡片一次只展示当前一条审批项,用户可通过上下切换浏览整批,并且必须先完成整批审核后系统才会继续决策是否执行。
    • 审批卡片不展示内部策略原因,命令文本与同意/拒绝图标按钮左右排列,指导输入框与提交按钮同排展示;审批不自动超时,必须等待用户明确操作或运行被取消/关闭。
    • 等待审批期间,当前 assistant turn 的 Activity header 显示「等待用户审核中」;审核结束后 header 恢复为常规工具汇总短句。
    • 审完后,本批走过审批的工具行在 Activity 展开列表文案前仅加结果图标(同意绿勾、拒绝红叉、指导琥珀色对话气泡),不额外包灰底卡片;悬停图标时原工具文案隐藏并滑入揭示文案:同意/拒绝显示 commandExplanation(缺省回退 command),指导显示 {commandExplanation} · 已反馈:{指导语}。
    • 不在过程流展示只读 blockers 提示,也不弹出「有 n 条命令需要审核 / 审核已通过」toast。决策结果写入 chat_session_message_log 的 approval_batch_resolved annotation,刷新后可恢复。
    • 完全访问权限下,统一审批入口直接批准该 run 的所有审批项,不创建等待审批状态、不发送审批事件、不展示审批卡片与审批叙事。完全访问只跳过审批,不绕过命令安全限制、取消、工作地址内文件变更记录或其他运行时保护。
  • 验收:
    • WB-BLOCKER-001-AC1 同一批次全部选择“同意”后,当前运行恢复加载态,并按原 serial 顺序继续执行该批对应命令。
    • WB-BLOCKER-001-AC2 只要批次中任一项被“拒绝”或填写“告诉{当前伙伴名}该怎么做”(伙伴名为空时回落「馆长」),本批命令一条都不会执行,系统回到后续 AI 决策收口。
    • WB-BLOCKER-001-AC3 审批卡片第三个选项不使用独立按钮;输入框非空即视为“告诉{当前伙伴名}该怎么做”。
    • WB-BLOCKER-001-AC4 用户不操作审批卡片时,审批不会因固定超时时间自动失败。
    • WB-BLOCKER-001-AC5 完全访问 run 的审批项会自动通过且继续执行,不产生 waiting_approval、审批事件或审批卡片。
    • WB-BLOCKER-001-AC6 等待审批时 Activity header 为「等待用户审核中」;审完后恢复常规工具汇总;过程流不出现「等待批量审核」只读 blockers,且不弹出开始/通过 toast。
    • WB-BLOCKER-001-AC7 审完后走过审批的工具行仅前缀结果图标(同意/拒绝/指导可区分);悬停图标揭示 commandExplanation(指导另附反馈语),无灰底卡片与 toast/tooltip;刷新伙伴后仍可从消息记录恢复。
    • WB-BLOCKER-001-AC8 浏览器操作(browser_use,包括打开、查看、操作、截图、滚动等)属于受控沙箱交互,不触发审批卡片与审批阻塞;审核仅针对终端命令(terminal_run)安全策略。展开行中浏览器操作不前缀审批结果图标。

WB-BLOCKER-003 上下文压缩过程提示

  • 系统行为:当 AI 运行触发上下文压缩时,后端通过 assistant_process_group_started 派发 compaction 过程组,assistant turn 展示“东西太多了,让俺整理下”;压缩完成后通过 assistant_process_group_completed 更新为“呼,终于整理好了,累死俺了”。
  • 验收:
    • WB-BLOCKER-003-AC1 收到 compaction 类型的 assistant_process_group_started 事件后,当前 assistant turn 中出现运行中的上下文整理过程组。
    • WB-BLOCKER-003-AC2 收到 compaction 类型的 assistant_process_group_completed 事件后,该过程组更新为完成态并展示完成文案。

8.6 右侧内容面板

WB-PANEL-001 面板状态切换

  • 系统行为:右侧资源工作台默认折叠,折叠时不渲染面板 shell、不占主内容宽度,只在窗口右边缘保留展开按钮。展开后宽度占「中间对话区 + 右侧面板」主区的可配置比例(默认约 48%,用户拖拽后持久化);窗口缩放时中间与右侧按同一比例同步变化;中间对话区至少保留约 500px;中间|右分隔条支持拖拽,拖至约 200px 以下立即吸合折叠。资源工作台拥有独立于对话区的 44px 顶部标签栏和 44px 上下文工具栏;资源 Tab 支持文件和多个内置浏览器。顶部标签栏不使用底部边线,资源 Tab 溢出时支持触控板或鼠标滚轮横向滚动,激活 Tab 自动滚动到可见位置。同一伙伴内继续发送消息时不清空已打开资源;切换伙伴时恢复目标伙伴自己的 Tab、活动内容和展开状态。
  • 验收:
    • WB-PANEL-001-AC1 打开文件时新增并激活对应资源 Tab;再次打开同一路径文件时切换并更新已有 Tab,不重复创建;从“打开文件”选择器选中文件后,选择器 Tab 被该文件 Tab 原位替换,不残留空的选择器 Tab;通过 Tab 尾部「浏览器」或加号新建空白浏览器时每次都创建独立 Tab;从 assistant Markdown 网页链接打开时,若当前伙伴已有浏览器 Tab 正停留在同一 URL,则激活该 Tab,不重复创建。
    • WB-PANEL-001-AC2 普通文件预览和同一文件的修改 diff 共用一个文件 Tab,后打开的状态成为该 Tab 当前内容,不产生两个同路径 Tab。
    • WB-PANEL-001-AC3 关闭活动 Tab 后由相邻 Tab 接管;关闭最后一个 Tab 后显示空面板;关闭非活动 Tab 不改变当前内容。
    • WB-PANEL-001-AC4 Tab 尾部 + 菜单只提供“文件”和“浏览器”;“文件”创建工作区文件选择标签且不弹系统文件选择器,“浏览器”创建新的空白浏览器标签;两个入口使用同色线性图标。
    • WB-PANEL-001-AC5 切换伙伴后恢复目标伙伴自己的资源标签、活动标签、浏览器导航历史和面板展开状态;目标伙伴没有已打开资源时恢复空态。恢复过程中的异步数据刷新(如审核记录加载)只更新内容,不得把折叠态的面板重新展开;折叠期间刷新完成后,用户展开时直接看到最新内容。
    • WB-PANEL-001-AC6 展开态的折叠按钮位于右侧标签栏末端;折叠态只在窗口右边缘保留展开按钮。Windows 使用独立 36px 原生标题栏覆盖层,业务内容从该层下方开始;原生拖动区域只覆盖无交互空白区,资源标签、地址栏、侧栏切换、折叠入口和所有按钮均使用 no-drag 且不得被拖拽命中层覆盖。
    • WB-PANEL-001-AC7 资源 Tab 横向溢出后,鼠标纵向滚轮可转换为横向滚动;点击或新增活动 Tab 时,该 Tab 自动进入可见范围。
    • WB-PANEL-001-AC8 页面首次进入、创建伙伴和切换伙伴后,右侧 shell 不存在于布局中;点击文件、修改记录、浏览器入口或展开按钮后,以约 200ms 的宽度和位移动画滑入。折叠时先播放滑出动画,结束后再卸载并释放宽度。
    • WB-PANEL-001-AC9 折叠态展开按钮位于主标题栏右侧,展开后立即隐藏;展开和折叠按钮不得使用会撑大页面滚动范围的 portal tooltip,悬浮后页面不得出现额外横纵滚动条。
    • WB-PANEL-001-AC10 面板展开时宽度占「中间对话区 + 右侧面板」主区的可配置比例(默认约 48%,持久化用户拖拽结果);窗口拉宽/收窄时中间与右侧按同一比例同步变化;用户可通过中间|右分隔条拖拽调整;中间对话区至少保留约 500px,右侧面板至少约 280px;拖至约 200px 以下立即吸合折叠;折叠时宽度归零、多余宽度归对话区。窗口缩放或拖拽分栏时面板与内置浏览器应对齐跟手,松手后停在最终比例,不得出现错位遮挡或明显滞后。

WB-PANEL-003 文档查看与修改文件衔接

  • 系统行为:
    • 文件预览态与修改文件工作区共用 44px 紧凑头部,但主体使用不同渲染组件;头部使用“目录 > 文件”面包屑,顶层显示文件地址的目录名或文件名。
    • 支持差异渲染的修改文件在面包屑旁展示当前模式 Tag:“审核”表示展示修改差异,“预览”表示展示修改后的干净文件;Tag 旁的切换图标负责在两种模式间切换。差异数量、修改状态和回退按钮只在审核模式展示,预览模式不得展示 +N -N、“已回退 / 已删除”或回退按钮。
    • “打开方式”组合按钮展示操作系统为当前文件注册的默认应用名称和图标,下拉展示操作系统返回的其他关联应用,并在列表底部使用分割线隔开放置纯文字“打开所在文件夹”。
    • 当前文件为 .docx / .pptx / .xlsx 且打开方式列表含 WPS 时,组合按钮左侧显示问号图标,悬停提示“首次用 WPS 打开时,如弹出加载项授权,允许后 WPS 将会自动刷新显示馆长更改后的内容。”;其它格式或未检测到 WPS 时不显示。
    • 文件列表入口使用文件夹图标;普通预览和修改文件工作区中的文件列表从工具栏底部开始贴右悬浮,不挤压预览宽度,也不得覆盖工具栏交互。点击面板外部、按 Escape 或选择文件后关闭悬浮列表。“打开文件”初始空页面继续使用常驻文件列表。
    • 文件列表提供“全部 / 本次运行改动”切换:“全部”按目录懒加载,每次打开列表都会重新拉取根目录与当前已展开目录的最新磁盘内容;仅当文件列表处于展开状态时,窗口重新获得焦点或恢复可见、以及 AI Run 结束才会再刷新已加载目录,列表收起时不做这两类后台刷新;点击任何文件只打开正常预览;“本次运行改动”只聚合当前打开修改记录所属 run 的文件变化,点击后才打开该文件的审核模式。
  • 验收:
    • WB-PANEL-003-AC1 普通文件打开后,右侧除轻量工具条外全部用于文件预览;工具条提供系统打开方式,并通过其下拉菜单中的“打开所在文件夹”定位文件,不单独展示定位按钮。
    • WB-PANEL-003-AC2 同一轮 AI 修改存在多个文件时,用户点击不同修改入口会打开或切换到对应文件 Tab;每个文件 Tab 只展示当前文件的记录和预览。
    • WB-PANEL-003-AC3 PDF 搜索命中打开预览时,预览应保留整份 PDF 可滚动内容,并自动定位到命中 chunk 对应页,而不是只显示该页内容。
    • WB-PANEL-003-AC4 Markdown 使用专用预览;.txt、.log、代码、JSON、HTML 等严格 UTF-8 文件使用纯文本预览;解码失败的二进制文件不得误进纯文本渲染。
    • WB-PANEL-003-AC5 打开普通文本修改记录时使用独立文本 diff:每行只显示一个有效行号,删除行取旧行号,其余行取新行号;hunk 间以“N 行未修改”紧凑展示。
    • WB-PANEL-003-AC6 “N 行未修改”可点击展开真实未修改内容;展开数据来自修改时保存的不可变修改后行,不依赖之后可能变化的磁盘文件。
    • WB-PANEL-003-AC7 “全部”列表可标记当前伙伴内状态为 applied 的 AI 修改,但点击后仍只打开正常文件预览;可计算行数时显示 +N -N,否则显示“已改”。
    • WB-PANEL-003-AC8 “本次运行改动”默认每个逻辑文件只显示一次,展示修改次数;文件恢复到本次运行基线后不再显示,删除文件仍保留修改入口。
    • WB-PANEL-003-AC9 同一文件存在多个 Run 修改批次时,默认展示最新批次;工具栏下拉使用用户请求摘要和时间切换历史批次,不展示内部 Run ID,也不把多个 Run 强制合成一份累计 Diff。
    • WB-PANEL-003-AC10 当前文件在“全部”和“本次运行改动”中都使用稳定浅灰选中态,并在切换后自动进入可见范围。
    • WB-PANEL-003-AC11 assistant turn 的“修改的文件”列表使用 目录/文件 路径;右侧文件预览工具栏继续使用 目录 > 文件 面包屑。
    • WB-PANEL-003-AC12 文本 Diff 行背景至少覆盖整个可见画布宽度;长行产生横向滚动时,新增、删除和上下文背景应延伸到完整可滚动宽度,不得在文件列表前留下无意义白块。
    • WB-PANEL-003-AC13 从修改文件入口进入修改文件工作区时,工作区文件列表默认关闭;用户点击文件夹图标后,列表从 44px 工具栏底部开始贴右悬浮并默认进入“本次运行改动”。悬浮层不得改变预览宽度或覆盖工具栏,点击外部、按 Escape 或选择文件后关闭。点击文件总分类或其历史记录时,必须按所选记录重新进入默认模式;未回退记录进入审核模式,已回退记录进入预览模式,即使所选记录 ID 与当前记录相同也必须执行重置。打开“全部”列表时必须重新读取磁盘目录(含已展开子目录),不得继续展示上次缓存的过期条目;仅当列表处于展开状态时,窗口重新获得焦点或恢复可见、以及 AI Run 结束才会同样刷新已加载目录;列表收起时不得因窗口焦点或 AI Run 结束触发目录刷新。
    • WB-PANEL-003-AC14 当前修改记录同时具备修改后快照和差异内容时,面包屑旁展示“审核 / 预览”模式 Tag 及切换图标;docx、pptx、xlsx 和普通 UTF-8 文本文件均支持该切换。普通文本的预览模式打开 record.path 真实本地文件:若为可编辑 Markdown/UTF-8 文本则进入与普通打开一致的应用内编辑态;审核模式使用结构化文本 Diff;xlsx 的预览模式展示正式工作簿,审核模式展示带单元格边框标记的工作簿。修改记录默认进入审核模式;切入预览或回退后,差异数量、修改状态和回退按钮全部隐藏。
    • WB-PANEL-003-AC15 macOS 使用 Launch Services,Windows 使用 Shell Association Handler 查询当前文件的默认应用和其他关联应用;默认应用始终排在下拉首项并标记“默认”。Renderer 只接收不透明应用 ID、名称和图标,不能提交任意应用路径;同一应用重复注册时必须去重,查询失败时仍保留系统默认打开的降级能力。
    • WB-PANEL-003-AC16 文件工具栏不单独展示“打开所在文件夹”按钮;该入口继续放在打开系统应用的下拉列表底部。工作区文件列表使用独立文件夹图标,收起时为透明按钮,展开后保持浅灰背景、边框和圆角,收起后选中样式立即消失。
    • WB-PANEL-003-AC18 右侧处于预览模式且展示真实本地文件时,必须监听当前激活文件的外部修改;路径不区分工作地址根目录、子目录或 userData/partners/{id}/runtime/assets/,范围覆盖所有当前支持应用内预览的文件类型,而非只限文本:PDF、DOCX、PPTX、XLSX/XLSM/XLTX/XLTM、PNG/JPG/JPEG/GIF/WebP/BMP/SVG、Markdown,以及严格 UTF-8 的 TXT、LOG、代码、JSON、HTML 等文件。仅当文件内容相对上次预览发生变化时才自动读取最新磁盘内容并提示“检测到当前文件被外部修改,已自动刷新”;仅打开外部应用、锁文件或 mtime/ctime 变化而正文不变时不得刷新或提示。切换文件、关闭 Tab 或切换到审核模式后停止旧监听,窗口重新获得焦点或恢复可见时补检查;AI Run 执行期间及结束后短暂保护期内的写入只刷新不提示。审核 / Diff 模式使用固定快照,不监听或刷新源文件;修改记录切换到预览模式时必须展示并监听 record.path 的真实当前文件,而不是修改时快照。
    • WB-PANEL-003-AC19 任意受支持文件类型的 AI 修改记录处于 applied 状态时,通过系统默认应用或指定关联应用打开成功后,提示“如果外部应用仍显示旧内容,请关闭该文档后重新打开。”;该提示不按 TXT、DOCX、PPTX 或 XLSX 等扩展名区分。普通文件、失败记录、已回退记录和打开失败场景不得显示该提示。WPS 加载项已连接时仍可出现该提示,不作为失败;实际刷新由 WB-APPLY-002-AC8 负责。
    • WB-PANEL-003-AC20 DOCX、PPTX、XLSX、图片和普通文本专用工具已通过写入校验与前后 checksum 证明文件有效变化时,保存修改记录时立即保留该状态和快照;不得因目标位于 userData/partners/{id}/runtime/assets 而将成功记录改为失败。只有明确确认前后内容相同时才按无有效变化处理,不展示修改入口或固定错误条,仅临时提示“本次未检测到文件内容变化”。
    • WB-PANEL-003-AC21 DOCX 已有表格中的单元格文字或格式变化必须进入 Review Docx;内容替换在对应单元格内显示旧内容红色和新内容绿色,纯格式变化只高亮对应单元格,未变单元格不得被整表标记。变更数量按最终净变化单元格统计,修改后回读必须返回所属表格的真实内容。
    • WB-PANEL-003-AC22 当前预览文件为 .docx / .pptx / .xlsx,且系统打开方式列表包含 WPS 时,打开方式组合按钮左侧显示问号;悬停文案为“首次用 WPS 打开时,如弹出加载项授权,允许后 WPS 将会自动刷新显示馆长更改后的内容。”。PDF、Markdown、纯文本、.xlsm / .xltx / .xltm 以及打开方式列表不含 WPS 时不显示该图标。授权弹窗本身仍由 WPS 负责,见 WB-WPS-001-AC5。

WB-PANEL-004 内置浏览器面板

  • 系统行为:
    • 每个浏览器 Tab 对应独立 Electron WebContentsView,全部视图共享持久分区 persist:ncurator-browser。该面板只服务用户手动开标签和 browser_use;web_search 的外网抓取使用独立隐藏 crawler view,不得复用或污染本面板。
    • 应用启动不打开进程级 --remote-debugging-port;打开网页不挂调试。observe / act / extract / screenshot / scroll 与网页抓取 sidecar 仅在需要时把对应 WebContents 登记进本机 CDP 桥(webContents.debugger + 回环 /json/version、/json/list),操作结束卸下。
    • 浏览器 Runtime、界面 Presentation 和 AI Automation 相互独立:切换文件、折叠右侧栏或切换伙伴时,只从主窗口显示树移除 View,不关闭 webContents,不改变 AI 正在操作的那块 View;重新显示时挂载同一个 View 并展示后台操作后的实时最终状态。
    • 浏览器导航栏提供后退、前进、刷新/停止、URL 输入、输入框内“前往”按钮、地址栏右侧“将打开外部浏览器”按钮和更多操作;从 Markdown 网页链接打开内置浏览器时,先按当前伙伴已有 Tab 的当前 URL 匹配,命中则激活已有 Tab,未命中再新建并导航;地址栏导航仍作用于当前 Tab。
    • 用户地址栏与 AI navigate 共用同一套网址补全:输入什么协议就打开什么;未写协议时只补成 https://,失败不改成 http://。
    • 用户加载态只跟 Chromium isLoadingMainFrame() / did-start-loading / did-stop-loading;加载中地址栏行底边走 Chrome 式进度线。网络失败认主框架 did-fail-load(排除用户停止的 ERR_ABORTED);由馆长在同一 webContents 写入统一错误页,底部展示 Chromium 给出的 ERR_ 错误码,地址栏保留尝试打开的站点,不得显示 chrome-error://。页面可在后台继续加载,不得等加载完成才显示面板;AI navigate 启动后即打开面板(失败也打开),并等到真实标题、正文或表单后再报成功——Chromium 把网址当成标题且无正文/表单的第一屏视为未就绪;失败结果必须带回 tabId。
    • 浏览器更多菜单及新增标签页菜单使用主窗口原生子窗口承载自绘内容,覆盖在浏览器上方且不隐藏浏览器。
  • 验收:
    • WB-PANEL-004-AC1 收到 AI 浏览器面板事件后,右侧显示事件指定的浏览器 Tab;面板动画期间不逐帧缩放原生 View,动画结束后按最终 bounds 一次挂载并与正文视口对齐;分栏拖拽调整面板宽度期间,原生 View 暂停逐帧 bounds 发送并由静态页面快照占位,拖拽结束后在无补间延迟下瞬时对齐并无缝恢复原生视图,垫底快照延时退出以避免白屏闪烁。
    • WB-PANEL-004-AC2 AI 通过 browser_use 的 navigate 打开 URL:不传 tabId 时新建标签并返回 tabId,传了则在指定标签导航。list_tabs 可列出当前伙伴标签。observe / extract / act / act_instruction / screenshot / scroll 必须显式传入 tabId;screenshot 截取当前标签页视口截图;scroll 支持按视口比例向下或向上滚动页面以加载后续内容;act 执行此前 observe 返回的单个 actionId(确定性回放,支持传入 text 为输入/填写动作注入文本,对非输入动作安全过滤参数);act_instruction 支持直接按自然语言指令推导执行页面动作。需要切换页面时先 navigate。
    • WB-PANEL-004-AC3 切换到文件 Tab、收起面板或切换伙伴时,浏览器 View 从主窗口显示树移除,不使用窗口外坐标停放;webContents、页面 JS、网络请求、Cookie、滚动位置、表单和 SPA 状态继续存在。
    • WB-PANEL-004-AC4 AI 浏览器任务完成后,assistant 最终输出应使用浏览器操作获得的结果完成用户诉求,右侧浏览器面板状态与最终回答形成可理解的任务闭环。
    • WB-PANEL-004-AC5 多个浏览器标签可以打开相同 URL;Stagehand 必须按浏览器 Tab 对应的 CDP targetId 精确选择页面,不得按 URL 猜测或串页。
    • WB-PANEL-004-AC6 浏览器标签共享 Cookie、登录态、LocalStorage、IndexedDB、Service Worker 和 HTTP 缓存;除非用户主动清除浏览数据,应用不得自动清空持久分区。
    • WB-PANEL-004-AC7 新增标签页和浏览器更多菜单使用无边框原生子窗口显示在浏览器上方;菜单打开期间浏览器保持原尺寸和可见状态,点击外部、按 Escape、主窗口移动或切换 Tab 时关闭菜单。菜单不得因内置 WebContentsView 抢焦点或主窗口 resize 事件被误关;点击外部关闭需在失焦后短延迟复核菜单仍未聚焦再关闭。
    • WB-PANEL-004-AC8 浏览器更多菜单的缩小、百分比、放大必须位于同一行且都可点击;缩放操作不关闭菜单,百分比可恢复 100%;更多菜单不再提供系统浏览器打开入口。
    • WB-PANEL-004-AC9 地址为空时“前往”按钮禁用;地址非空时点击按钮或按 Enter 都导航到相同目标,按钮 tooltip 与无障碍名称均为“前往”。用户导航(含 Markdown 网页链接与地址栏前往)启动后立即返回,不等待页面 did-finish-load;AI browser_use 的 navigate 必须等到页面有真实内容,或等到系统错误页 / 空白验证超时后再返回工具结果。
    • WB-PANEL-004-AC10 内置浏览器自动化不得打开进程级远程调试口,也不得依赖固定 CDP 端口。旧端口 9333 或其他本地端口被占用时应用仍应正常启动。Stagehand 与网页抓取只在操作时按当前 Tab 或隐藏 crawler view 挂到本机回环 CDP 桥;用户打开网页时该页不得作为调试目标出现在 /json/list。
    • WB-PANEL-004-AC11 AI 在浏览器未显示时仍可按原 targetId 连续执行 observe、act、extract 和导航;恢复后必须直接显示 AI 操作后的最新网址、页面内容、滚动位置和表单状态,恢复前后 webContents.id 不变。
    • WB-PANEL-004-AC12 后台浏览器在应用运行期间不得自动销毁;仅应用退出、用户主动关闭浏览器 Tab 或删除所属伙伴时销毁。应用重启后按伙伴恢复标签顺序、URL、导航历史和缩放并按需重新创建;不承诺恢复页面 JS、内存滚动状态或未提交表单。
    • WB-PANEL-004-AC13 AI 通过 browser_use 的 act 触发网页操作时,通过 DOM 虚拟光标提供移动和点击视觉反馈;单次动作执行完毕时光标保持常驻在最后操作位置(不提前隐藏),后续动作平滑连续移动;仅当整轮 AI Run 结束(正常完成、用户取消或异常中断)时,通过运行资源管理器统一平滑淡出隐藏。
    • WB-PANEL-004-AC14 地址栏右侧提供“将打开外部浏览器”按钮(右上角外链图标);有可打开 URL 时可点击,tooltip 与无障碍名称为“将打开外部浏览器”,点击后通过系统默认浏览器打开当前页或地址栏中的 URL。
    • WB-PANEL-004-AC15 用户地址栏与 AI navigate 对网址协议的处理一致:输入什么协议就打开什么。只填主机(如 epub.cnipa.gov.cn)时补成 https://,失败停在 https,不自动改 http;写明 http:// 只走 http;写明 https:// 只走 https。地址栏始终展示本次实际尝试的地址。
    • WB-PANEL-004-AC16 网络打不开时由馆长在同一内置页写入 Chrome 式错误文档:标题「无法访问此站点」、副文「无法加载 {主机}」、建议列表、底部 Chromium did-fail-load 给出的 ERR_ 错误码、灰色圆角「重新加载」按钮。只认主框架 did-fail-load 且非 ERR_ABORTED;不另设馆长加载超时。连接或 TLS 何时失败由 Chromium 自己报。不因 https 失败改走 http。不另画 React 遮罩,不等 chrome-error://。地址栏显示尝试的站点,不显示 chrome-error://。navigate 一开始就打开右侧浏览器面板,失败也打开。重新加载走当前地址栏同一套导航。
    • WB-PANEL-004-AC17 AI navigate 不得把反爬/安全验证空白第一屏当成成功。等到有真实标题或正文/表单,或超时仍空白则失败(说明可能卡在站点安全验证)。Chromium 把网址当成标题(主机、主机:端口、路径)时不算真实标题。等待期间不挂 Stagehand。observe / extract / screenshot / act / scroll 若当前已是系统错误页或仍空白,同样失败,不得空结果报完成。
    • WB-PANEL-004-AC18 navigate 成功给模型:Tab(tabId)、有标题时 Title、URL(最终地址)。失败给模型:Error(含中文说明与错误码,需要时写入尝试过的地址)和 Tab(tabId),便于模型决定是否在同一标签重试,而不是盲目新开标签。JSON 仍用 page: { title, url },文案不再把标题和地址挤在一行 Page: 里。
    • WB-PANEL-004-AC19 主框架加载期间,地址栏行底边出现约 2px 浅蓝色进度线(约 12% 起向 85% 推进);isLoadingMainFrame() 变为 false,或已写入馆长错误页后,走到 100% 并淡出。错误页展示期间不得继续显示进度线。不在原生网页上叠转圈遮罩。

8.7 直接写回与回退

WB-APPLY-001 打开 AI 修改记录后的默认选中逻辑

  • 系统行为:从 assistant turn 打开修改记录时,自动展开右侧面板并打开或激活对应文件 Tab,但工作区文件列表默认保持关闭;用户手动打开文件列表后默认进入“本次运行改动”,并选中当前文件。同一路径只保留一个文件 Tab。Docx 工具修改使用 Review Docx,普通文本记录使用结构化文本 diff。
  • 验收:
    • WB-APPLY-001-AC1 成功打开修改记录后,界面立即可见当前文件面包屑;若记录存在审核内容则默认进入审核模式并展示回退入口,切到预览模式后隐藏回退入口和差异信息。
    • WB-APPLY-001-AC2 在同一轮多文件场景下,点击哪个修改文件入口,右侧就加载该文件记录,而不是空白态或自动跳到其他文件。
    • WB-APPLY-001-AC3 用户点击 assistant turn 中的本轮“修改的文件”入口后,右侧应进入修改的文件工作区,并默认加载该入口对应的本轮修改记录。

WB-APPLY-002 AI 修改完成后直接写回

  • 系统行为:受支持 docx、pptx、xlsx、图片生成和普通文本写任务完成后直接写回源文件或创建目标文件,并生成修改记录。普通文本支持创建、完整改写、唯一文本编辑和全部精确匹配替换;任一校验失败时不产生部分写入。各格式写入细节由 AI tool / live 回归覆盖(见 doc/ai-harness/tool-design.md)。
  • 验收:
    • WB-APPLY-002-AC1 修改现有 docx 后,源文件立即变为 AI 最终净稿,assistant turn 展示本轮「修改的文件」入口。
    • WB-APPLY-002-AC2 新建 docx 后,目标文件立即存在,assistant turn 展示本轮「修改的文件」入口。
    • WB-APPLY-002-AC3 创建或修改普通文本文件后,目标文件立即更新并生成修改记录;运行期间不展示修改入口,收到 run_completed / run_failed / run_cancelled 后 assistant turn 才展示本轮「修改的文件」,右侧可查看由真实写入前后内容计算的文本 diff。answer_completed 不视为 run 已结束。
    • WB-APPLY-002-AC4 普通文本 edit 的每个 oldText 必须唯一且互不重叠;replaceAll 替换一个 oldText 的全部非重叠精确匹配;失败时文件保持原样。
    • WB-APPLY-002-AC5 同一次 AI Run 对同一个 pptx 的多次编辑只生成一条修改记录;PPT Diff 固定比较本 Run 第一次接触文件时的状态和 Run 完成后的最终状态。
    • WB-APPLY-002-AC6 创建或修改 xlsx 后,正式路径立即包含最终净工作簿并生成一条修改记录;同一次 AI Run 对同一路径连续编辑时保持首次写入前基线,不重复生成记录。
    • WB-APPLY-002-AC7 生成 PNG、JPEG 或 WebP 图片后,正式路径立即包含可读取图片并生成一条修改记录;同一次 AI Run 对同一路径再次生成时自动更新并保持首次写入前基线。
    • WB-APPLY-002-AC8 写回 .docx / .pptx / .xlsx 后的 WPS 自动刷新见 WB-WPS-001。

WB-TERMINAL-001 终端执行

  • 系统行为:智能模式可通过终端执行命令;默认 cwd 为用户主目录。单次 terminal_run 可指定最长盯着命令结束的时间;到点后命令继续执行,本次调用不再盯。未指定时按原有默认盯时。长命令可在运行中让出控制权并由后续读取续接;命令遵守审批与安全策略。绝对路径可访问工作地址外文件。终端改文件不进入修改记录,也不能从馆长回退。涉及数据计算、对账、统计等数值处理时,须通过终端真实执行计算,不得仅靠模型推算后直接写出结论文件。终端工具协议与并发/游标细节由 AI tool 回归覆盖。
  • 验收:
    • WB-TERMINAL-001-AC3 删除伙伴、取消所属 run 或退出应用不会遗留进程。
    • WB-TERMINAL-001-AC4 terminal 命令继续遵守审批与其他安全策略;不能访问其他伙伴的终端。
    • WB-TERMINAL-001-AC7 AI 涉及数据计算、对账、统计、求和、对比等数值处理时,必须通过 terminal 执行真实计算;计算结果由终端命令产出,结果文件不自动进入修改记录与回退。
    • WB-TERMINAL-001-AC8 terminal_run 的 maxWaitSeconds 只限制本次调用盯着命令结束的时间;到点后命令继续执行,不中断命令。

WB-APPLY-003 回退本次 AI 修改

  • 系统行为:受控文件工具写回工作地址内文件时立即保存本次 run 的修改记录、有效变更校验和所需快照。AI 或用户在没有受控工具写回时产生的外部变化(含终端改文件)不归入任何 AI Run。基线内容按 SHA-256 保存;文本 Diff 根据不可变的修改前后内容生成并缓存。回退使用修改前对象,不反向计算 Diff。
  • 验收:
    • WB-APPLY-003-AC1 未发生后续修改时,回退恢复写回前 checkpoint,记录状态变为 reverted。
    • WB-APPLY-003-AC2 新建文件回退时删除 AI 新建目标文件。
    • WB-APPLY-003-AC3 回退成功后,右侧修改的文件工作区应刷新记录状态;普通文本历史 diff 继续保留并标记“已回退”或“已删除”,避免丢失本次修改记录。
    • WB-APPLY-003-AC5 Docx 工具修改保存 before 和 Review Docx;Review Docx 继续由现有 Docx Renderer 渲染并保留段落、表格、图片、字体和页面结构。
    • WB-APPLY-003-AC6 PPT 修改记录使用 Diff Manifest v4,在审核模式提供固定的修改前后页面快照;旧 v3 记录明确提示格式过期,正式 PPT 不受影响。Excel 专用工具修改 xlsx 时在审核模式提供单元格边框标记,并可切换到预览模式。
    • WB-APPLY-003-AC7 图片生成记录直接预览最终图片并提供回退,不显示不存在的图片 Diff;更新图片回退后恢复首次生成前的文件,新建图片回退后删除目标文件。
    • WB-APPLY-003-AC8 Docx Review 只展示本次 Run 初始文档到最终净稿的净变化;同一原始节点连续修改只显示一次原始红色版本和一次最终绿色版本,中间稿不得出现,改回原内容不产生修改记录;本轮新增节点只显示最终仍存在的绿色版本,新增后删除不产生净变化。
    • WB-APPLY-003-AC9 专用写工具的成功记录以工具原子写入结果、checkpoint 和前后 checksum 为权威依据。
    • WB-APPLY-003-AC10 回退 .docx / .pptx / .xlsx 后的 WPS 自动刷新见 WB-WPS-001。

WB-WPS-001 已打开的 WPS 文档随写回自动刷新

  • 系统行为:
    • 这是默认功能,设置页没有开关。馆长启动后在 127.0.0.1 开启回环服务(优先端口 18723,避开 Windows Hyper-V/WinNAT 会动态排除的 ephemeral 端口;若该端口已是本馆长 /status 通道则不再另开端口;仅当该端口被占用或系统拒绝绑定(EACCES)时才改用空闲端口监听)。
    • publish.xml 与已授权 ncurator-sync 的 path 始终写成 http://127.0.0.1:18723/addon/,不随临时监听端口改写,避免 WPS 把加载项当成新身份反复弹授权;实际监听端口只写入 port.json,加载项用它连接 SSE。从旧端口 58123 迁到 18723 只改写这一次授权地址。授权条目的 mode/path 已经正确时不再重写 authaddin.json,也不改 namelist。
    • 文字、表格、演示是独立组件,需各自载入加载项(每个组件授权一次);只有对应组件连上后,该格式窗口才会先 close 放锁再写盘再 open。加载项只按当前组件识别,不得探测其他组件的 ActiveWorkbook / ActivePresentation / ActiveDocument。本机 WPS 7.3 上 file:// / jsplugin 离线目录只会弹出授权、不会载入功能区和 JS;加载项代码必须由回环 HTTP 提供。加载项带「馆长」功能区页签(文字组件功能区上的中文页签名)。
    • 同一组件可能同时活着多个加载项实例(用户开了第二个窗口、或上一个实例还没退干净),每个加载项页面自报一个 clientId,馆长按 clientId 而不是按组件维护已打开文档表,close / open 只投给确实持有该文档的那个实例,实例断开后它登记的文档随即失效。
    • 加载项连上且文档已打开时,AI 写回或回退 .docx / .pptx / .xlsx 前先推送 close;写盘成功后再让该文档窗口显示新稿。写盘前轮询直到该路径可写,避免 Windows 独占锁尚未放下。加载项必须先真正关掉文档、复查已不在文档列表,才上报 close-result;Close 被组件静默忽略时上报失败,馆长据此放弃写盘,不让磁盘换了新稿而窗口还留着旧稿。close-result 带上本组件关闭后的剩余文档数 remaining。
    • Windows 版 WPS 用单一宿主进程承载文字 / 表格 / 演示,关掉某组件最后一篇文档后该组件就无法再 Open,因此不得用「SSE 是否断开」判断加载项能否干活:remaining 为 0 时加载项先建一个空占位文档撑住组件进程,写盘后 open 回目标文档再关掉占位,并在 close-result 里说明占位是否建起。remaining > 0 或占位已建起时推送 open,由加载项打开磁盘文件并尽量恢复滚动/选区;占位没建起来、或该组件客户端已断开时,才用该组件可执行文件拉起文档(Windows 上为 wps.exe / et.exe / wpp.exe,不用 cmd start,以免塞进其它组件已打开的窗口),Mac 用系统打开。
    • 表格与演示组件不注册 ApiEvent,系统打开后不会主动上报文档列表,馆长按固定间隔向该组件推送 list,直到该路径重新登记后再要摘录,不再二次 Open,避免 WPS 弹出不能重复打开。被指派的加载项回报 open 失败、或推送 open 后超时仍无成功结果时,降级为一次系统打开;其它实例的失败回报不作数,不得把正在干活的实例挤去走系统打开。同一路径全程只允许一次系统打开,避免双开抢锁。
    • 加载项收到 open 时若发现目标文档还开着,说明上一步 close 没落地、内存里仍是写盘前的旧稿,必须真关掉再从磁盘打开,不得只因「已经开着」就回报成功。本实例刚 close 过才允许 Open;既没 close 过、当前也没开着,上报 not open here,不得抢开别的实例或从未持有的文档。滚动/选区只用于尽量恢复。加载项只处理与自身组件扩展名相符的路径。
    • Windows 上 WPS 对已打开文档持独占锁,不先 close 则无法覆盖。
    • 本机回环 GET /status 提供诊断:已连接客户端、最近一次 dispatch、最近一次 close-result、加载项最近一次 reload-result、WPS 对 /addon 的请求。验收以 /status 为准,不靠人眼看功能区。
    • 未安装 WPS、加载项未授权、未连接或文件未在 WPS 打开时不发 close,直接尝试写盘,写成功后再发 open(无客户端则为空操作);不得因刷新失败而回滚已成功的写盘。Windows 上文件仍被 WPS 独占时写盘会失败,这是系统锁而不是馆长回滚。加载项路径未命中时仍上报 reload-result。WPS 里有未保存编辑时同样照刷,会丢这些未保存内容。
    • .doc / .ppt / .xls 以及 Microsoft Office 不在范围内。知识库不因这次刷新而重索引。
  • 验收:
    • WB-WPS-001-AC1 馆长启动即启动回环服务,把 publish.xml 写成回环 /addon 地址 http://127.0.0.1:18723/addon/,并把已有 ncurator-sync 授权条目从离线目录改写为同一 HTTP 地址;不把加载项再拷成 WPS 离线目录。未发现 WPS 加载项目录时不写系统配置。Workbench e2e 跳过覆盖拷文件,仍启动回环服务;publish.xml / 授权 path 保持优先端口,端口文件记录实际监听端口。
    • WB-WPS-001-AC2 AI 成功写回 .docx / .pptx / .xlsx 后,持有该文档的加载项实例对该路径完成 open,/status 的 reload-result 成功且摘录取自重新打开后的文档;文档还开着时不得回报 open 成功。
    • WB-WPS-001-AC3 回退上述文件成功后走同一通道再刷新一次;关最后一篇文档(remaining 为 0)时由占位文档撑住组件进程后仍走加载项 open,占位在目标重新打开后关闭。占位没建起来才用对应组件重新打开,再经 list 轮询与摘录完成这次刷新。被指派实例 open 失败或超时未成功时降级为一次系统打开,同一路径不重复系统打开。
    • WB-WPS-001-AC4 加载项未连接或用户拒绝 WPS 授权时,不发 close;文件未被独占则写盘与回退仍成功。文件正被 WPS 独占且加载项无法 close 时,写盘可以失败。同一组件存在多个实例时,close / open 只投给持有该文档的实例,另一个实例登记的同名或旧路径文档不得顶掉它。
    • WB-WPS-001-AC5 加载项首次启用可能出现 WPS 系统授权提示,文案由 WPS 客户端决定,馆长不能改写弹窗模板;发版与本地开发同一套加载项,弹窗不会因发版换成另一套文案。每个组件对同一回环地址授权成功后,馆长不得因改写临时端口、重写 namelist 或重复写 authaddin.json 再次触发该组件授权。安装时 WPS 已在运行、或更新了加载项 ribbon/JS 时需重启 WPS 后才加载。功能区出现「馆长」页签表示加载项已载入。Workbench 仅在打开方式旁用问号提示用户需要授权,对齐 WB-PANEL-003-AC22。授权弹窗由 WPS 客户端负责,不作为馆长 UI 验收。

WB-APPLY-004 后续修改后的强制回退

  • 系统行为:若回退时检测到当前文件与 AI 写回后的 checksum 不一致,先提示用户该文件已被后续修改,继续回退会丢失这些内容;用户确认后仍允许强制回退。
  • 验收:
    • WB-APPLY-004-AC1 点击任何可回退记录时先展示统一确认框“回退这次修改?”,说明文件将恢复到这次修改发生前的状态;用户确认后才发起回退。
    • WB-APPLY-004-AC2 检测到后续修改时,在统一确认之后继续展示“仍然回退这次修改?”风险确认;用户确认强制回退后,系统恢复 checkpoint 或删除新建文件。
    • WB-APPLY-004-AC3 强制回退完成后,右侧修改的文件工作区应刷新为最新记录状态,并让用户能确认回退已经生效。

WB-APPLY-005 同一轮多个修改记录入口保留

  • 系统行为:同一轮任务若实际修改多个文件,assistant turn 保留本轮全部修改入口;点击入口后打开或切换到对应文件 Tab。每个入口直接展示该文件本次真实修改与删除数量,无需点击即可见,切换伙伴后依然保持。文件入口超过 3 个时列表默认折叠,只展示前 3 个,底部提供“显示剩余 N 个文件”展开入口,展开后该入口变为“收起文件”;头部总数始终展示完整数量。Assistant 最终回答只在修改文件区域展示文件入口。
  • 验收:
    • WB-APPLY-005-AC1 同一轮任务生成的多个修改记录都会出现在同一 assistant turn 的修改的文件列表中。
    • WB-APPLY-005-AC2 点击不同修改记录入口时,右侧会加载对应修改记录;有 diff 预览的记录展示对应预览稿,而不是按源文件跳到最新轮次。
    • WB-APPLY-005-AC3 同一轮多文件修改的全部入口保留在 assistant turn 列表中,不因切换当前文件而丢失其他文件的检查或回退入口。
    • WB-APPLY-005-AC4 修改记录入口未点击时即展示真实非零的修改/删除数量;切换伙伴再切回后不点击仍保持真实数量,不重置为 0。
    • WB-APPLY-005-AC5 文件入口超过 3 个时默认只展示前 3 个,列表底部展示“显示剩余 N 个文件”(N 为剩余数量);点击后展示全部入口,底部入口变为“收起文件”,再次点击恢复折叠;头部文件总数不受折叠影响。

8.8 PPT 创建、编辑与审核模式

WB-PPT-001 AI 创建和编辑 PPT

  • 系统行为:AI 可通过 PPT 读写能力创建和编辑 pptx;写回成功后正式文件立即可读,同一次任务对同一路径聚合为一条修改记录。页面与元素级写入细节由 AI tool 回归覆盖。
  • 验收:
    • WB-PPT-001-AC1 AI 可自行新建 pptx,不依赖用户点击新建入口。
    • WB-PPT-001-AC2 新建演示文稿或插入页面时,单次调用只允许一张页面的元素规格,不接受页面数组或 HTML。
    • WB-PPT-001-AC3 文本、形状、线条、图片、表格、图表和公式按支持类型转换,不把整页默认导出为截图。
    • WB-PPT-001-AC4 AI 可继续编辑已有页面和元素。
    • WB-PPT-001-AC5 公式由 LaTeX 渲染为 SVG;公式整体可移动和缩放,内部字符为只读内容。
    • WB-PPT-001-AC9 一次编辑失败时,正式文件保持调用前状态。
    • WB-PPT-001-AC10 编辑返回成功时,其他程序已经可以读取最终 pptx。

WB-PPT-002 PPT 单页左右审核模式

  • 系统行为:用户打开 pptx 修改记录后,主区域左侧显示当前页修改前画面,右侧显示同一页修改后画面;最右侧显示缩略图。点击缩略图或滚动时左右同步切页。主区域支持滚轮缩放与拖拽平移;底部居中固定显示「滚轮缩放 / 拖拽平移」轻提示,不因缩放或拖拽操作而隐藏。审核内容严格来自同一 Run 首个 baseline 与最终 PPT 的净变化;SVG 只用于展示,不决定变化语义。
  • 验收:
    • WB-PPT-002-AC1 主区域按左侧修改前、右侧修改后一次各显示一页。
    • WB-PPT-002-AC2 缩略图支持只看变化页和查看全部页两种图标模式,默认只看变化页。
    • WB-PPT-002-AC3 新增、修改、移动页使用绿色标记,整页删除使用红色标记,不显示“修改几页”等文字差异说明;已有页面只删除内部元素时,该页仍按修改显示绿色。
    • WB-PPT-002-AC4 新增页左侧为空;删除页右侧为空。
    • WB-PPT-002-AC5 点击缩略图或滚动后,左右主区域与当前缩略图保持同步。
    • WB-PPT-002-AC6 +N 统计最终保留的新增、修改和移动单位,-N 统计最终保留的删除单位。新增整页为 +1、删除整页为 -1、移动整页为 +1,整页增删不重复统计内部元素。
    • WB-PPT-002-AC7 已有页面内新增元素为 +1、删除元素为 -1、修改或移动元素为 +1;同一元素同时修改内容、样式、位置、大小或层级只计一次。页面移动并修改两个元素时为 +3。
    • WB-PPT-002-AC8 插入或删除页面造成的自然页码变化不算移动;元素增删或置顶造成其他元素层级编号自然变化时,也不得把其他元素误算为修改。
    • WB-PPT-002-AC9 A→B→A、移动后移回、新增后删除等零净变化不生成记录;原元素修改后删除只计 -1,新页面继续修改仍只计 +1。
    • WB-PPT-002-AC10 审核模式使用固定 Diff 快照,预览模式使用干净的正式 PPT;正式文件不得包含 Diff 标记,回退按修改前 bytes 恢复。
    • WB-PPT-002-AC11 主区域滚轮缩放与拖拽平移可用;底部居中固定展示「滚轮缩放 / 拖拽平移」提示,缩放或拖拽后仍保持可见。

8.9 Excel 读取、编辑与审核模式

WB-EXCEL-001 AI 读取和编辑 Excel

  • 系统行为:AI 可通过 Excel 读写能力读取工作簿并创建或编辑 xlsx;读取支持 xlsx、xlsm、xltx、xltm,写入只支持 xlsx。Excel 不进入本地知识库单元格内容索引,只索引文件名、文档标题与工作表名等元数据。产品侧 Diff / 修改记录 / 回退由系统维护。读写 type 与字段契约由 AI tool 回归覆盖。
  • 验收:
    • WB-EXCEL-001-AC3 单次编辑失败时不产生部分写入;文件在连续编辑之间被外部修改时拒绝覆盖并提示冲突;无实际变化时不生成修改记录。
    • WB-EXCEL-001-AC4 xlsm、xltx、xltm 可以读取但不能写回;拒绝写入时源文件保持不变,并明确说明是为了避免丢失宏或模板信息。
    • WB-EXCEL-001-AC5 Excel 创建或编辑成功后,正式文件中的值与公式可被其他程序立即读取,正式文件不包含审核模式使用的红绿边框。
    • WB-EXCEL-001-AC6 新建工作簿只包含显式创建的 Sheet,不自动生成 Sheet1;最终至少保留一个 Sheet,删除最后一个 Sheet 必须失败。
    • WB-EXCEL-001-AC7 新增已存在的 Sheet、删除不存在的 Sheet、重命名到已存在名称都必须失败,且不写入部分结果。

WB-EXCEL-002 Excel 单网格审核模式

  • 系统行为:用户打开普通 Excel 文件或 xlsx 修改记录后,前端使用成熟的 Univer 工作簿组件分别预览正式 XLSX 和 Diff XLSX,不自行解析 OOXML 生成 HTML 表格。Excel 预览是只读预览:不允许编辑单元格内容,但允许切换工作表、滚动、缩放和拖动列宽查看内容。Diff 只展示本次 Run 首个 baseline 到最终工作簿的净变化;操作记录只用于识别 Sheet 和行的结构身份,不直接累加为最终差异。新增和修改单元格使用绿色中等粗细边框,删除或清空的单元格在 Diff XLSX 中保留修改前值并使用红色中等粗细边框。审核模式下,存在净变化的工作表标签右上角显示绿色圆点,仅表示该工作表有改动,不区分新增或删除;预览模式与普通打开的正式工作簿不显示该圆点。用户不使用 PPT 的修改前/修改后左右画面对比。
  • 验收:
    • WB-EXCEL-002-AC1 预览模式展示正式净工作簿,审核模式展示基于首次写入前基线生成的差异工作簿;两者均为只读预览,且均可切换工作表、滚动、缩放和拖动列宽。
    • WB-EXCEL-002-AC2 新增和修改单元格显示绿色中等粗细边框,删除或清空的单元格显示红色中等粗细边框并保留修改前值;未变化单元格不增加差异边框,正式工作簿也不带差异边框。
    • WB-EXCEL-002-AC3 同一 AI Run 对同一路径连续编辑后只保留一条有效修改记录,差异始终相对该 Run 首次写入前基线计算。
    • WB-EXCEL-002-AC4 回退已有 xlsx 时恢复写入前原始 bytes;回退新建 xlsx 时删除目标文件,修改记录状态同步更新。
    • WB-EXCEL-002-AC5 Diff XLSX 中新增 Sheet 的标签为绿色,删除 Sheet 以修改前完整内容恢复到 Diff XLSX 的原位置并将标签标为红色;恢复内容包括单元格值、样式、行高、列宽和合并单元格;正式 XLSX 不带这些差异标记。
    • WB-EXCEL-002-AC6 本版本不支持移动 Sheet 位置的 Excel Diff。
    • WB-EXCEL-002-AC7 插入或删除行时按逻辑行对齐生成联合预览:新增行只标绿最终新增内容,删除行在原逻辑位置保留旧内容并标红;其他仅因插入或删除而改变地址的原有行不得产生红绿边框,预览末尾不得生成重复行。
    • WB-EXCEL-002-AC8 同一 Run 中单元格、行或 Sheet 被多次修改时只保留最终净变化;改回 baseline、插入后删除、新增 Sheet 后删除均不产生红绿标记或变更计数;原始 Sheet 多次重命名只保留最终名称和一次重命名状态,不复制整张 Sheet 作为删除加新增。
    • WB-EXCEL-002-AC9 审核模式中存在净变化的工作表标签右上角显示绿色圆点;未变化的工作表不显示;预览模式与普通打开的正式工作簿不显示该圆点。

8.10 图片生成

WB-IMAGE-001 AI 生成图片

  • 系统行为:AI 通过 image-generation 技能调用 image_generate,以 SVG 内容作为内部绘制输入,根据目标路径扩展名生成 PNG、JPEG 或 WebP 图片。SVG 不作为额外用户产物写入工作地址。
  • 验收:
    • WB-IMAGE-001-AC1 image_generate 只接收 outputPath 和 svg,输出格式由 .png、.jpg、.jpeg 或 .webp 扩展名决定。
    • WB-IMAGE-001-AC2 工具成功后只交付目标图片文件,assistant turn 展示该图片的修改入口,右侧面板可直接预览。
    • WB-IMAGE-001-AC3 目标路径已存在时自动更新;目标不存在时自动创建,不要求 AI 额外声明 action、format 或 overwrite。
    • WB-IMAGE-001-AC4 SVG 无法安全解析、渲染或编码,或输出格式不受支持时,工具返回错误且目标文件保持调用前状态;工作地址外绝对路径可以写入,但不提供修改记录或回退。

8.11 应用内文本编辑

WB-EDIT-001 Markdown 与普通文本应用内即时渲染编辑

  • 系统行为:
    • 右侧面板打开真实本地 .md/.markdown 文件时,使用即时渲染(IR)编辑方式——文件内容渲染为排版预览,点击任意位置直接编辑文字;光标进入加粗、行内代码等 markdown 语法元素时,该元素局部露出 markdown 源可编辑。
    • 点击链接时打开目标:http(s) 经系统默认浏览器打开;相对路径 / file:// / 本地绝对路径相对当前 .md 所在目录解析后经系统默认应用打开;目标不存在或无法打开时 toast 提示。
    • 标题元素前不展示 H1/H2 等标题级别标签(Vditor 默认 ::before 标签)与 #/## 等标题源标记,标题不加额外装饰(无下划线),保持沉浸式排版;编辑区始终撑满右侧面板,不出现右侧灰色残留。编辑器不展示任何操作按钮、工具栏或交互栏,用户打开即可直接编辑。
    • 内嵌图片:相对路径、file:// 与本地绝对路径按当前 .md 所在目录解析后在编辑器内展示(不改写磁盘源);http(s) 可直接显示。双击已加载成功的图片打开应用内 ImageLightbox 预览;加载失败的图片双击不打开预览并 toast「图片无法加载」。
    • 打开 .txt 及其他严格 UTF-8 普通文本(如 .log、.json、代码、配置文件、无扩展名文本)时,使用与纯文本预览一致的纯文本编辑框直接编辑;纯文本内容(编辑态与只读预览态)每行前显示行号,行号随内容同步滚动。
    • AI 修改记录切入「预览」且目标为上述可编辑文本时,与普通打开一致进入应用内编辑并自动保存;「审核」态 Diff、预览弹窗以及 PDF/DOCX/PPTX/XLSX/图片等其他格式保持只读。
  • 保存:不做显式保存按钮与"未保存"提示;每次内容变更后防抖(约 400ms)自动原子写入磁盘(write-text-file,临时文件 + rename),并对内容做 UTF-8 合法性校验;纯文本保存时保留原文件的换行符风格(CRLF/LF)与 UTF-8 BOM。自动保存为纯覆盖,不做冲突提示。
  • 外部修改:磁盘内容与编辑器最后成功写入的内容一致时不响应;空闲(无未保存改动)时检测到外部修改自动重载最新磁盘内容;编辑中存在未保存改动时不打断编辑,下一次自动保存覆盖外部内容。
  • 范围边界:应用内编辑不生成 AI 修改记录、不进入回退体系;不限定只能编辑已添加工作地址内的文件,任意本地真实文件均可编辑。
  • 验收:
    • WB-EDIT-001-AC1 打开真实 .md 文件后直接进入即时渲染编辑态,无工具栏/操作按钮;点击任意位置光标落下,输入内容实时渲染并反映在编辑区。
    • WB-EDIT-001-AC2 点击链接打开目标:http(s) 用系统默认浏览器;相对 / file:// / 本地绝对路径相对当前 .md 目录解析后用系统默认应用打开;目标缺失或打开失败时 toast 提示。光标进入加粗、行内代码等其他 markdown 语法元素时,该元素仍局部露出 markdown 源可编辑。
    • WB-EDIT-001-AC3 打开 .txt、.json、代码等严格 UTF-8 文本后直接进入纯文本编辑框,输入与保存内容一致,不出现 markdown 化改写。
    • WB-EDIT-001-AC4 编辑后无需点击保存,约 400ms 内自动落盘,磁盘内容更新为编辑结果;界面不展示保存按钮或"未保存"标记。
    • WB-EDIT-001-AC5 空闲时外部保存文件自动重载最新内容;编辑中存在未保存改动时外部保存被下次自动保存覆盖,不弹出冲突提示。
    • WB-EDIT-001-AC6 纯文本文件保存后保留原换行符风格(CRLF/LF)与 UTF-8 BOM。
    • WB-EDIT-001-AC7 AI 修改记录「审核」态与预览弹窗中的 Markdown/文本仍为只读;切入「预览」且文件为可编辑文本时进入与普通打开一致的编辑态并可自动保存。
    • WB-EDIT-001-AC8 应用内编辑保存不产生 AI 修改记录。
    • WB-EDIT-001-AC9 打开 .md 后编辑区撑满右侧面板(无右侧灰色残留);标题前不显示 H1/H2 等标题级别标签与 #/## 等标题源标记,标题无下划线等额外装饰;拉宽窗口后页面不白屏、编辑态保持。
    • WB-EDIT-001-AC10 纯文本内容(编辑态与只读预览态)每行前显示从 1 开始递增的行号,行号随内容滚动同步对齐。
    • WB-EDIT-001-AC11 Markdown 内相对路径、file:// 与本地绝对路径图片相对当前 .md 所在目录解析;磁盘文件存在时正文内正常显示。解析只作用于编辑器 DOM 展示,不改写磁盘上的 Markdown 源路径。
    • WB-EDIT-001-AC12 双击已成功加载的图片打开应用内图片预览(ImageLightbox,可缩放、Esc/按钮关闭),不得出现 Vditor 默认白底全屏破图预览层。
    • WB-EDIT-001-AC13 加载失败的图片(缺失本地文件、失效 https 等)双击不打开预览,并 toast 提示「图片无法加载」。
    • WB-EDIT-001-AC14 http(s) 图片可直接显示(CSP img-src 允许 http: / https:);加载失败时按 AC13 处理。

8.12 定时任务

ST-ENTRY-001 左侧栏入口

  • 系统行为:Workbench 左侧栏「创建伙伴」下方展示同级、同样式的「定时任务」入口;点击后整个主区域(除左侧伙伴列表外)切换为定时任务视图,不展示聊天对话和资源面板。当存在已启用定时任务时,入口右侧展示蓝色数量 chip(显示已启用个数),时钟图标同步使用蓝色;已启用数为 0 时不展示 chip,入口恢复安静态。
  • 验收:
    • ST-ENTRY-001-AC1 「定时任务」入口位于「创建伙伴」下方,使用与「创建伙伴」一致的侧栏选项样式。
    • ST-ENTRY-001-AC2 点击入口后,主区域整块切换为定时任务视图,聊天对话与资源面板不再显示。
    • ST-ENTRY-001-AC3 存在已启用定时任务时,入口右侧可见蓝色数量 chip,数值等于已启用任务数;全部关闭或无任务时 chip 不显示。

ST-VIEW-001 视图独立与返回

  • 系统行为:定时任务视图是独立自包含组件,占据除左侧伙伴列表外的整个主区域;该视图没有聊天对话。视图顶部提供标题栏(标题旁复用与侧栏同款的已启用数量 chip),点击「创建伙伴」或点击左侧任意伙伴即返回聊天视图并切换 / 停留在该伙伴。侧栏伙伴的编辑 / 删除确认弹窗在定时任务视图下仍可正常展示。
  • 验收:
    • ST-VIEW-001-AC1 定时任务视图中不展示聊天对话或资源面板。
    • ST-VIEW-001-AC2 点击左侧任意伙伴后返回聊天视图并切换到该伙伴。
    • ST-VIEW-001-AC3 点击「创建伙伴」后返回聊天视图并打开创建弹窗。
    • ST-VIEW-001-AC4 存在已启用定时任务时,标题栏「定时任务」旁可见与侧栏同款的蓝色数量 chip。
    • ST-VIEW-001-AC5 定时任务视图下点击侧栏伙伴删除,删除确认弹窗可见且可操作。

ST-LIST-001 列表展示

  • 系统行为:视图打开后拉取全部定时任务并展示;每个任务项展示名称、调度时间摘要、主模型名称、启用开关、「立即执行」按钮、编辑图标与删除图标。无任务时展示空态与「新增配置」入口。
  • 验收:
    • ST-LIST-001-AC1 视图打开后可见已配置任务列表,而不是未初始化状态。
    • ST-LIST-001-AC2 任务项展示名称、调度时间摘要和主模型名称。
    • ST-LIST-001-AC3 无任务时展示空态和「新增配置」入口。
    • ST-LIST-001-AC4 任务项提供「立即执行」入口。

ST-FORM-001 新增与编辑配置

  • 系统行为:新增打开空表单,编辑打开预填表单。字段包括名称、任务提示词、执行时间(每天 / 每周 + 星期 + 时间点)、主模型、AI 推进偏好和执行权限;不配置伙伴。新增默认执行权限为「完全访问」,且定时任务无人值守,此处切换权限不触发 Composer 的高危二次确认。新增保存不创建专属伙伴,partnerId 为空。编辑保存保留原 partnerId;若专属伙伴已存在则可同步其名称(定时 · {任务名}),不存在则不创建。保存只更新配置,不改变启用状态。保存前校验必填项;模型选择复用现有模型选择器(预设推荐模型与自定义模型双视图)。
  • 验收:
    • ST-FORM-001-AC1 新增时可填写全部字段并保存,编辑时带出当前配置值。
    • ST-FORM-001-AC2 名称、任务提示词、执行时间或主模型缺失时,保存被拦截并给出明确提示。
    • ST-FORM-001-AC3 选择「每周」时必须选择星期几。
    • ST-FORM-001-AC4 新增表单点击遮罩不关闭,避免误触丢失输入。
    • ST-FORM-001-AC6 新增保存成功后不创建专属伙伴,partnerId 为空,侧栏不出现名称形如 定时 · {任务名} 的伙伴。
    • ST-FORM-001-AC7 编辑保存后启用状态与保存前一致;已启用任务不会因保存被关闭。
    • ST-FORM-001-AC8 新增任务默认执行权限为「完全访问」,切换为「审核」或「完全访问」均不弹出高危二次确认。

ST-PARTNER-001 专属伙伴生命周期

  • 系统行为:每个定时任务在执行时绑定一个专属执行伙伴(名称 定时 · {任务名},头像按任务 id 稳定选取)。保存配置不创建伙伴。到点或立即执行时:若尚无 partnerId 或对应伙伴不存在,系统自动创建并回写 partnerId;若已存在则直接使用。删除专属伙伴不会级联删除定时任务。
  • 验收:
    • ST-PARTNER-001-AC1 专属伙伴被删除后,定时任务仍存在。
    • ST-PARTNER-001-AC2 尚无绑定或专属伙伴缺失时,到点或立即执行会自动创建专属伙伴后再执行。

ST-SWITCH-001 启用开关

  • 系统行为:每个任务项提供启用开关,默认关闭;只有开启后该定时任务才会在到点执行。切换后立即生效。启用状态只由该开关改变,与编辑保存互相独立。
  • 验收:
    • ST-SWITCH-001-AC1 新建任务默认关闭,需用户主动开启才会执行。
    • ST-SWITCH-001-AC2 关闭后该任务到点不再触发。
    • ST-SWITCH-001-AC3 编辑并保存配置不会打开或关闭任务。

ST-DELETE-001 删除

  • 系统行为:删除前二次确认,确认后从列表移除。
  • 验收:
    • ST-DELETE-001-AC1 删除前有确认弹窗,取消不删除。
    • ST-DELETE-001-AC2 确认后任务从列表移除。

ST-RUN-001 到点触发

  • 系统行为:程序运行期间,已启用任务到达调度时间时,向其专属伙伴追加任务提示词,使用配置的主模型、偏好和执行权限;不新建额外会话,也不操作用户当前页面。尚无绑定或专属伙伴不存在时先自动创建。专属伙伴已有 running / waiting_approval 时,取消本次调度(推进到下一调度时间),写入忙碌取消提示供专属伙伴对话区展示,不自动补跑。
  • 验收:
    • ST-RUN-001-AC1 到点后往专属伙伴追加任务消息。
    • ST-RUN-001-AC2 触发过程不改变用户当前正在查看的伙伴或输入草稿。
    • ST-RUN-001-AC3 专属伙伴已有 running / waiting_approval 时取消本次执行并推进下一周期,不自动补跑。
    • ST-RUN-001-AC4 尚无绑定或专属伙伴缺失时自动创建后再执行。

ST-RUN-002 伙伴列表刷新

  • 系统行为:定时任务触发并往伙伴追加消息后,广播伙伴列表刷新,Workbench 伙伴列表展示该伙伴及其运行状态。
  • 验收:
    • ST-RUN-002-AC1 定时任务触发后,目标伙伴显示运行状态。
    • ST-RUN-002-AC2 用户无需手动刷新即可看到该伙伴运行标记。

ST-RUN-003 程序关闭错过不补跑

  • 系统行为:程序关闭期间错过的调度时间不补跑,重新打开后只等待下一次到点。
  • 系统行为:程序运行期间因系统休眠跨过触发点(超过 60 秒宽限)同样视为错过,不补跑并顺延到下一周期;到点后 60 秒内的正常延迟仍触发。
  • 验收:
    • ST-RUN-003-AC1 程序关闭期间错过的调度时间,重新打开后不会立即触发补跑。
    • ST-RUN-003-AC2 系统休眠跨过触发点后唤醒,不补跑并顺延到下一周期。

ST-RUN-004 立即执行

  • 系统行为:定时任务列表与忙碌取消胶囊均提供「立即执行」。点击后先弹出确认框(标题「立即执行定时任务?」,正文说明将按任务配置在专属伙伴执行);确认后按该任务当前配置在专属伙伴执行。若专属伙伴仍占用,不提交并提示「请等待当前任务结束,或先停止后再执行」。执行成功后清除忙碌取消提示。
  • 验收:
    • ST-RUN-004-AC1 列表「立即执行」点击后出现确认框;取消确认不执行。
    • ST-RUN-004-AC2 确认后在专属伙伴启动执行(空闲时)。
    • ST-RUN-004-AC3 专属伙伴仍占用时提示等待结束或先停止,不启动新 run。

ST-RUN-005 忙碌取消消息操作胶囊

  • 系统行为:到点因专属伙伴占用取消后,在该专属伙伴 Composer 上方展示可关闭的消息操作胶囊(与清空消息记录同壳)。主文案为 立即执行「{任务名}」(过长省略);整颗主操作 hover tooltip 为 「{任务名}」到点时伙伴正忙,本次已取消。点击可立即按该定时任务执行。;提供 × 关闭提示。点击主操作走 ST-RUN-004 确认后立即执行。关闭只清除提示,不执行任务。
  • 验收:
    • ST-RUN-005-AC1 忙碌取消后进入专属伙伴可见该胶囊,文案含任务名。
    • ST-RUN-005-AC2 点击 × 后胶囊消失且不执行任务。
    • ST-RUN-005-AC3 点击主操作先确认,确认后按立即执行逻辑处理。

9. 非目标

  • 不定义设置页中的工作地址、网页资料或模型配置行为。
  • 不定义按钮尺寸、颜色 token、面板圆角等视觉风格。
  • 不定义 AI 内部节点实现、prompt 结构、工具路由或工具 operation / schema / 结果信封细节。

附录:废弃编号

编号保留,不再作为现行验收。完整需求正文已删除。

编号 原能力
WB-CORE-002-AC1 旧版「无参考资料则不可执行」类门禁(已由默认知识范围取代)
WB-SESSION-001-AC2 发首条消息才创建伙伴
WB-SESSION-001-AC3 标题随消息改名
WB-SESSION-003-AC1 旧版标题规则拆分项
WB-SESSION-008-AC4 旧版 UI 快照兼容路径
WB-COMPOSER-004 搜索模式发送路径
WB-COMPOSER-005 发送前必须先绑定工作区
WB-COMPOSER-007-AC8 旧版模型 / 工作区选择残留
WB-COMPOSER-007-AC10 旧版推进偏好残留
WB-MODE-001 模式切换不切页面
WB-MODE-001-AC1 模式切换不替换输入组件
WB-MODE-001-AC2 智能 / 搜索模式切换
WB-MODE-002 搜索模式下无可检索资料
WB-MODE-003 智能模式与搜索模式互斥
WB-SCOPE-003-AC2 切换工作区后清空旧 @ token
WB-SCOPE-004-AC1 旧版空候选提示拆分项
WB-BLOCKER-002 搜索模式部分可检索目录 warning
WB-PANEL-002 搜索结果列表面板打开规则
ST-FORM-001-AC5 定时任务旧版表单字段 / 绑定残留
WB-PANEL-003-AC17 旧版拆分项(已由现行 AC 覆盖)
WB-PPT-001-AC6 旧版拆分项(已由现行 AC 覆盖)
WB-PPT-001-AC7 旧版拆分项(已由现行 AC 覆盖)
WB-PPT-001-AC8 旧版拆分项(已由现行 AC 覆盖)
WB-EXCEL-001-AC1 旧版拆分项(已由现行 AC 覆盖)
WB-EXCEL-001-AC2 旧版拆分项(已由现行 AC 覆盖)
WB-TERMINAL-001-AC1 旧版拆分项(已由现行 AC 覆盖)
WB-TERMINAL-001-AC2 旧版拆分项(已由现行 AC 覆盖)
WB-TERMINAL-001-AC5 旧版拆分项(已由现行 AC 覆盖)
WB-TERMINAL-001-AC6 旧版拆分项(已由现行 AC 覆盖)
WB-APPLY-003-AC4 旧版拆分项(已由现行 AC 覆盖)