Affected area
- Desktop UI (
agent-ui / agent-gui)
- Gateway WebUI (
agent-gateway/web)
- Session Workbench / Right Dock
- Composer references and terminal input
Problem statement (what should this solve)
当前右侧 File Tree 虽然由共享 agent-ui 组件提供,Desktop 与 WebUI 也已经具备文件列表、搜索、展开和文件操作能力,但它仍是依赖 Right Dock 上下文的单例工具,不是像终端一样拥有稳定身份、可拖入 Workbench 任意拼接的独立 Pane。
文件树节点也只支持打开、选择和右键插入引用,缺少直接拖拽语义:
- 不能把整个 File Tree 从 Right Dock 拖到 Workbench 的左、右、上、下分屏区域。
- 不能把文件或文件夹拖到某个 Composer,创建对应的结构化文件引用。
- 不能把文件或文件夹拖到某个终端,插入经过当前 shell 正确转义的路径。
- 多会话、多项目和多终端 Pane 下,如果仍依赖页面级“当前会话/当前项目”,拖放很容易被路由到错误的输入框或终端。
- Desktop 原生文件拖放和 Web 外部文件上传表达的是“导入/上传”,不能替代工作区内部路径的“引用/插入”。
需要将 File Tree 从 Right Dock 专用面板解耦为共享 Workbench Surface,并建立独立于布局拖拽的工作区路径引用协议,使 Desktop 与 WebUI 保持相同交互和安全边界。
Proposed behavior
1. File Tree 成为独立 Workbench Surface
- 把
FileTreePanel 的数据、状态和动作依赖从 RightDockContext 抽离为显式 Surface props/controller。
- 新增
fileTree Workbench Surface,使用项目身份生成稳定 surface key,并支持四向分屏、Pane 移动、关闭、聚焦、尺寸约束与布局恢复。
- Right Dock 的 File Tree 标签支持拖出和“在分屏中打开”,交互与现有终端入口一致。
- 同一项目第一阶段只允许一个交互式 File Tree 视图;进入 Workbench 后,Right Dock 显示定位/聚焦入口,避免重复请求、订阅和状态竞争。
- 关闭 File Tree Pane 只关闭视图,不改变项目、文件或会话状态。
2. 文件和文件夹拖到 Composer 时创建引用
- 文件树行支持拖拽,payload 必须携带来源项目、工作区根、相对路径和
file | dir 类型。
- 拖到具体 Composer 后,调用该 Pane 自己的 Composer 引用接口,插入与现有
@ 文件/文件夹 一致的结构化 Chip。
- 插入后聚焦输入框,但不自动发送消息,也不把工作区文件复制到上传暂存区。
- 目标路由必须使用实际命中的
paneId + conversationId + project,不能依赖页面级当前会话。
- 当前引用模型只保存项目内相对路径,因此 v1 拒绝跨项目拖入并显示明确受阻提示;不得把来源路径静默解释为目标项目路径。
3. 文件和文件夹拖到终端时插入路径
- 每个终端视图注册明确的文本插入目标,拖放后通过 xterm 的 paste/input 管线插入路径并聚焦终端。
- 只插入文本,不附加换行,不自动执行命令。
- 根据目标 shell 生成安全路径:POSIX shell、PowerShell 和
cmd.exe 分别使用各自的转义规则,并拒绝 NUL/控制字符。
- 本地终端和 Gateway 项目终端插入该项目下的绝对路径,并要求来源项目与终端项目相同。
- SSH 终端不能把本机路径直接当成远端路径。v1 在没有显式
localRoot -> remoteRoot 映射时拒绝投放;后续可在 SFTP/SSH 工作区映射建立后开放。
4. 布局拖拽与内容拖拽保持隔离
- 整个 File Tree 标签/Pane 的移动继续使用 Workbench 布局拖拽协议。
- 文件树节点使用独立的
workspacePath 内容拖拽协议,不能加入会触发 Pane 自动停靠的 WorkbenchDragPayload。
- Composer、终端和不支持的目标应显示明确的接受/禁止状态,例如“引用文件”“引用文件夹”“插入路径”“不能引用其他项目”“SSH 未配置路径映射”。
- 保留外部 Finder/Explorer/浏览器文件拖入的现有上传或工作区导入语义,不与内部路径拖拽互相覆盖。
5. Desktop 与 WebUI 共用核心实现
- File Tree Surface、节点拖拽状态机、目标注册、路径校验、shell 转义和提示样式下沉到
@liveagent/ui。
- Desktop 只保留 Tauri 文件系统和原生 drop 适配;WebUI 继续通过 Gateway shim 访问文件系统。
- 使用 Pointer Events 和统一 hit testing 实现应用内部拖拽,不通过浏览器
File/DataTransfer 伪造工作区文件。
- 鼠标和触控笔支持拖拽;Touch v1 保留菜单式“引用到当前输入框/在分屏中打开”降级入口。
Acceptance criteria
Estimated change scope
crates/agent-ui/src/components/project-tools/file-tree/**
crates/agent-ui/src/components/project-tools/RightDock*
crates/agent-ui/src/components/workbench/**
crates/agent-ui/src/components/chat/MentionComposer*
crates/agent-ui/src/components/project-tools/XTermViewport.tsx
crates/agent-ui/src/lib/workbench/**
crates/agent-ui/src/lib/chat/mentionReferences.ts
crates/agent-ui/src/lib/projectTools/**
crates/agent-gui/src/pages/ChatPage.tsx
crates/agent-gui/src/pages/chat/surfaces/**
crates/agent-gateway/web/src/app/GatewayApp*
crates/agent-gateway/web/src/app/workbench/**
- Desktop / WebUI targeted tests
Alternatives considered
- 只在 Right Dock 内给文件行增加 HTML5 drag/drop:无法进入任意 Workbench Pane,也会让 Desktop/Web 与原生文件上传协议混杂,不采用。
- 把文件节点加入现有 Workbench 布局 payload:Pane 中心命中可能被解释为分屏/停靠,内容引用与布局操作语义冲突,不采用。
- 同时渲染 Right Dock 和 Workbench 两棵完整文件树:当前数据 hook 会形成重复请求、订阅和状态竞争;v1 使用单交互视图租约。
- 终端直接写 PTY 后端:会绕过 xterm paste、stdin 禁用和背压管线;应通过终端视图输入 sink 插入。
- SSH 终端直接插入本机绝对路径:本地项目根与远端目录没有可靠对应关系,容易执行错误命令,不采用。
Non-goals
- v1 不支持没有显式映射的本地路径到 SSH 远端路径转换。
- v1 不把文件树改造成多根工作区权限模型;仍遵循一个
WorkspaceProject.path 的项目权威边界。
- v1 不允许拖放自动发送消息或自动执行终端命令。
- v1 不改变外部文件上传、目录授权或工作区导入协议。
Related issues / pull requests
Pre-submit checklist
Affected area
agent-ui/agent-gui)agent-gateway/web)Problem statement (what should this solve)
当前右侧 File Tree 虽然由共享
agent-ui组件提供,Desktop 与 WebUI 也已经具备文件列表、搜索、展开和文件操作能力,但它仍是依赖 Right Dock 上下文的单例工具,不是像终端一样拥有稳定身份、可拖入 Workbench 任意拼接的独立 Pane。文件树节点也只支持打开、选择和右键插入引用,缺少直接拖拽语义:
需要将 File Tree 从 Right Dock 专用面板解耦为共享 Workbench Surface,并建立独立于布局拖拽的工作区路径引用协议,使 Desktop 与 WebUI 保持相同交互和安全边界。
Proposed behavior
1. File Tree 成为独立 Workbench Surface
FileTreePanel的数据、状态和动作依赖从RightDockContext抽离为显式 Surface props/controller。fileTreeWorkbench Surface,使用项目身份生成稳定 surface key,并支持四向分屏、Pane 移动、关闭、聚焦、尺寸约束与布局恢复。2. 文件和文件夹拖到 Composer 时创建引用
file | dir类型。@ 文件/文件夹一致的结构化 Chip。paneId + conversationId + project,不能依赖页面级当前会话。3. 文件和文件夹拖到终端时插入路径
cmd.exe分别使用各自的转义规则,并拒绝 NUL/控制字符。localRoot -> remoteRoot映射时拒绝投放;后续可在 SFTP/SSH 工作区映射建立后开放。4. 布局拖拽与内容拖拽保持隔离
workspacePath内容拖拽协议,不能加入会触发 Pane 自动停靠的WorkbenchDragPayload。5. Desktop 与 WebUI 共用核心实现
@liveagent/ui。File/DataTransfer伪造工作区文件。Acceptance criteria
file/dir引用 Chip。conversationId路由,不串到焦点之外的其他会话。Estimated change scope
crates/agent-ui/src/components/project-tools/file-tree/**crates/agent-ui/src/components/project-tools/RightDock*crates/agent-ui/src/components/workbench/**crates/agent-ui/src/components/chat/MentionComposer*crates/agent-ui/src/components/project-tools/XTermViewport.tsxcrates/agent-ui/src/lib/workbench/**crates/agent-ui/src/lib/chat/mentionReferences.tscrates/agent-ui/src/lib/projectTools/**crates/agent-gui/src/pages/ChatPage.tsxcrates/agent-gui/src/pages/chat/surfaces/**crates/agent-gateway/web/src/app/GatewayApp*crates/agent-gateway/web/src/app/workbench/**Alternatives considered
Non-goals
WorkspaceProject.path的项目权威边界。Related issues / pull requests
Pre-submit checklist