Skip to content

[Feature] Gateway WebUI 支持 Session Workbench 多会话与终端分屏 #659

Description

@yovinchen

Affected area

  • Gateway WebUI (agent-gateway/web)
  • Desktop UI shared layer (agent-ui / agent-gui)
  • Agent sessions / streaming

Problem statement (what should this solve)

桌面端已通过 #357 支持 Session Workbench 多会话分屏,但 Gateway WebUI 仍以单一“当前会话”为页面级状态:侧栏会话、工作区和 Right Dock 终端无法拖入中央画布形成独立 Pane,用户也无法在浏览器中同时观察或操作多个会话与终端。

如果只在 WebUI 外层增加分屏容器,会继续存在以下问题:

  • 背景 Pane 的发送、停止、队列、附件、工具审批可能被错误路由到当前焦点会话。
  • 切换焦点可能重新挂载会话宿主,导致流式订阅、Composer 草稿和滚动状态丢失。
  • 同一终端会话可能同时被 Right Dock 与 Workbench 消费,造成输出流重复订阅或输入竞争。
  • 桌面端与 WebUI 各自维护拖拽状态机、终端绑定和布局 reducer,长期会产生行为漂移。

需要在保留 #357 桌面端既有语义的基础上,把可复用的 Workbench 能力下沉到共享 UI 层,并为 Gateway WebUI 提供完整的多 Pane 宿主和按会话路由。

Proposed behavior

1. 桌面端与 WebUI 共用 Workbench 核心

  • 将窗口布局 reducer、拖拽状态机、拖放提交、终端运行时绑定、视图租约和终端 Pane 宿主迁移到 @liveagent/ui
  • Desktop 仅注入 Tauri 终端 client 与窗口级单例;WebUI 注入 Gateway 终端 client 与内存绑定。
  • 侧栏、项目、Right Dock 和 SSH Overlay 使用同一种拖拽起点与 pointer capture 语义。

2. Gateway WebUI 支持多会话 Pane

  • 会话侧栏支持拖拽和“在分屏中打开”。
  • 工作区行可拖入画布,在目标 Pane 中创建对应项目的新会话。
  • 每个会话 Pane 保持稳定宿主,焦点变化只切换 primary/background 绑定,不重新挂载 DOM。
  • 草稿会话获得真实 conversation ID 后,承载它的 Pane 原位重绑,不关闭或闪回只读历史。
  • 会话被删除时关闭对应 Pane;切换、关闭 Pane 不应停止后台运行。

3. 按 conversationId 隔离交互状态

每个 Pane 的以下行为必须显式按 conversation ID 路由:

  • 流式订阅与历史窗口
  • Composer 草稿与发送/停止
  • 排队消息及队列编辑
  • 上传文件与粘贴导入
  • 工具审批
  • 模型选择、运行状态与轨迹视图

背景 Pane 的操作不得依赖页面级 displayedConversationId

4. Gateway WebUI 支持终端 Pane

  • Right Dock 的既有终端和“新建终端”入口可拖入画布,也提供菜单式分屏入口。
  • 本地终端 Pane 按持久化 launch spec 恢复;显式关闭的会话不能被自动复活。
  • 使用窗口级 binding store 与 view lease,确保一个终端输出流同时只由一个交互视图消费。
  • 终端关闭、幽灵会话、应用重启和 Pane 关闭需要有确定的解绑/恢复语义。

5. 布局与降级

  • 支持 Pane 边缘四向分屏、画布边缘停靠、Pane 重排和分隔线调整。
  • 窄画布无法满足最小 Pane 尺寸时自动停靠或给出明确提示,不能生成非法布局。
  • 保留 VITE_LIVEAGENT_SESSION_WORKBENCH=0 逃生开关,可回退单 Pane 模式。

Acceptance criteria

  • WebUI 可从会话侧栏通过拖拽或菜单打开第二个会话 Pane。
  • WebUI 可把工作区、既有终端和新建终端入口拖入 Workbench。
  • 多个会话可同时流式运行,草稿、上传、队列、审批和停止操作互不串线。
  • 聚焦 Pane 切换不重新挂载其他会话宿主,不丢失草稿或流式状态。
  • 草稿转正式会话后 Pane 原位重绑,焦点和输入状态保持不变。
  • 同一终端不能同时被 Right Dock 和多个 Pane 交互式占用。
  • 布局提交经过 revision/CAS 校验,过期拖放不会覆盖新布局。
  • 会话或终端被删除/关闭时,对应 Pane 与运行时绑定正确回收。
  • 归档或缺失工作区显示受阻状态,不把 Pane 静默绑定到其他项目。
  • Feature Flag 关闭后保持现有单 Pane WebUI 行为。
  • Desktop 与 WebUI 的共享 Workbench、拖拽和多 Pane 路由均有自动化回归测试。

Estimated change scope

  • crates/agent-ui/src/lib/workbench/**
  • crates/agent-ui/src/components/workbench/**
  • crates/agent-ui/src/components/chat/ChatHistorySidebar*
  • crates/agent-ui/src/components/project-tools/RightDock*
  • crates/agent-ui/src/components/workspace-editor/**
  • crates/agent-gui/src/pages/chat/workbench/**
  • crates/agent-gui/src/pages/chat/surfaces/**
  • crates/agent-gateway/web/src/app/GatewayApp*
  • crates/agent-gateway/web/src/app/workbench/**
  • crates/agent-gateway/test/webui/**

Alternatives considered

  • WebUI 单独复制桌面 Workbench 实现:短期直接,但布局、拖拽、终端租约和恢复语义会形成两套实现,不采用。
  • 只支持两个固定会话栏位:无法复用现有 PaneTree、终端 Pane 和四向分屏能力,也不能覆盖项目/终端拖放场景。
  • 焦点切换时复用单一页面级会话宿主:背景会话无法独立保持 Composer、订阅与交互状态,不满足多 Pane 目标。

Related issue

Pre-submit checklist

  • I searched existing issues and pull requests and found no duplicates.
  • This proposal is focused on a single feature or improvement.
  • I understand a PR should come after this issue is confirmed by maintainers, otherwise it will be converted to draft.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions