Skip to content

feat(workbench): 支持文件树独立 Pane 与路径拖拽 - #665

Draft
yovinchen wants to merge 9 commits into
feat/session-workbench-webfrom
feat/issue-661-file-tree-workbench
Draft

feat(workbench): 支持文件树独立 Pane 与路径拖拽#665
yovinchen wants to merge 9 commits into
feat/session-workbench-webfrom
feat/issue-661-file-tree-workbench

Conversation

@yovinchen

Copy link
Copy Markdown
Contributor

关联 Issue

Closes #661

依赖 #659 / #662 提供的 Desktop 与 WebUI Session Workbench 共享多 Pane 基础。本 PR 以 feat/session-workbench-web 为 Base,Review 时只展示文件树独立 Pane 与工作区路径拖拽的增量;待 #662 合并后再同步并转向 main

功能摘要

  • 将 File Tree 从 Right Dock 专用内容改造成稳定的 fileTree Workbench Surface,Desktop 与 WebUI 都可以通过拖拽或菜单将其打开到中央画布,并参与四向分屏、Pane 移动、关闭、聚焦与布局恢复。
  • 为文件树 Surface 使用项目级稳定身份,同一项目只保留一个交互式文件树视图;进入 Workbench 后,Right Dock 不再重复渲染第二棵树,而是显示定位到现有 Pane 的入口。
  • 为文件树文件和文件夹增加独立的 workspacePath 内容拖拽协议,与 Pane 布局拖拽完全隔离,避免文件内容拖放被解释成 Workbench 自动分屏。
  • 拖到具体 Composer 时插入该 Pane 对应会话的结构化文件/文件夹引用,随后聚焦输入框;不会复制到上传暂存区、不会自动发送消息。
  • 拖到同项目本地或 Gateway 终端时,通过 xterm paste 管线插入绝对路径;不附加换行、不自动执行命令,并继续遵守 stdin 禁用状态。
  • 为 POSIX shell、PowerShell 和 cmd.exe 提供分别对应的安全路径引用规则,覆盖空格、单引号、非 ASCII 字符以及危险控制字符拒绝。
  • 跨项目 Composer/终端落点显示受阻状态,不把来源相对路径静默解释为目标项目路径;没有本地到远端路径映射的 SSH 终端继续拒绝本机路径投放。
  • 保留 Finder / Explorer / 浏览器外部文件拖入的上传或工作区导入语义,内部文件树拖拽不会进入原生文件上传分类器。
  • 补齐 WKWebView/Tauri 对内部 HTML 拖拽的悬停桥接,使 Desktop 输入框和终端显示与 WebUI 相同的接受/禁止反馈,并在离开或切换落点时及时清理状态。
  • 优化 File Tree、Terminal Pane 向主会话画布拖动时的性能:原始 pointermove 按动画帧合并,同一语义落点内不重复触发页面级 React 渲染,拖拽幽灵改用 compositor translate3d 更新。
  • 保留 feat(workbench): 支持 Desktop 与 WebUI 的多会话和终端分屏 #662 的 capture 阶段窗口监听:菜单、xterm 或嵌套控件即使阻止事件冒泡,拖拽 move/up 仍能到达 Workbench;本 PR 的帧合并与该监听语义已完成冲突整合。

关键交互与安全边界

File Tree Surface

  • Workbench 布局中持久化 Surface 类型和项目身份,不持久化文件节点、临时搜索结果或后端请求状态。
  • 文件树离开 Right Dock 后由中央 Pane 持有交互视图,Right Dock 只保留定位状态,避免重复请求和状态竞争。
  • 关闭 File Tree Pane 只关闭视图,不删除工作区、文件、终端或会话。

Composer 引用

  • payload 包含来源项目、工作区根、规范化相对路径和 file | dir 类型。
  • 实际落点由命中的 Composer DOM 和 Pane 会话身份决定,不依赖页面级“当前会话”。
  • 投放仅插入引用 Chip,不触发上传、复制、发送或模型调用。

Terminal 路径

  • 路径通过目标终端自己的 xterm 输入管线插入,不直接写 PTY 后端。
  • POSIX / PowerShell / cmd 分别引用;控制字符和 cmd 的上下文敏感扩展标记会被拒绝。
  • 目标必须是同项目、允许 stdin 的本地/Gateway 终端;SSH 无显式映射时保持拒绝。

Desktop / WebUI 事件适配

  • WebUI 继续使用 HTML5 dragenter / dragover / drop
  • Desktop 将 Tauri 原生 enter / over 的物理坐标转换为 CSS 坐标,再按 data-workspace-path-drop-zone 找到 Composer 或终端。
  • 原生桥接仅复用共享反馈层和最终 drop 处理,不会把内部路径伪造成浏览器 File

改动范围

  • 模块:agent-uiagent-guiagent-gateway/web、Workbench 设计文档
  • 主要路径:
    • crates/agent-ui/src/components/project-tools/file-tree/**
    • crates/agent-ui/src/components/project-tools/RightDock*
    • crates/agent-ui/src/components/project-tools/XTermViewport.tsx
    • crates/agent-ui/src/pages/chat/ChatComposerBar.tsx
    • crates/agent-ui/src/lib/chat/workspacePathDrag.ts
    • crates/agent-ui/src/lib/workbench/**
    • crates/agent-gui/src/pages/ChatPage.tsx
    • crates/agent-gui/src/pages/chat/hooks/useTauriFileDrop.ts
    • crates/agent-gateway/web/src/app/GatewayAppView.tsx
    • crates/agent-gateway/web/src/app/workbench/useGatewayWorkbench.ts
    • crates/agent-gui/test/**
    • docs/design/session-workbench-pane-architecture.md

截图与运行预览

Desktop:File Tree 作为独立 Workbench Pane

Desktop File Tree Workbench Pane

截图展示:

  1. File Tree 已从 Right Dock 移入中央 Workbench,与会话和终端 Pane 组合布局。
  2. Right Dock 不再重复展示第二棵文件树,而是提示文件树已在工作台中打开。
  3. 文件树 Pane 保留搜索、刷新、目录展开和文件类型图标。

WebUI 使用相同的 @liveagent/ui File Tree Surface、Workbench 布局与路径拖拽协议。WebUI 多 Pane 运行预览及基础宿主验证见依赖 PR #662;本 PR 没有把 Web 截图冒充 Desktop 原生运行证据。

验证结果

  • Desktop 前端全量测试:2689/2689 通过。
  • WebUI 前端全量测试:661/661 通过。
  • 合并依赖分支后的高优先级定向回归:40/40 通过,覆盖:
    • 拖拽帧合并与同落点 React 渲染次数;
    • capture 阶段 window move/up 监听;
    • Workbench 拖拽状态机与最终坐标提交;
    • Desktop 原生 workspace path hover/drop 桥接;
    • WebUI 附件按落点 Pane 路由;
    • primary/background Composer 禁用边界;
    • Desktop Pane Host 身份解析。
  • Shared UI、Desktop、WebUI TypeScript 检查全部通过。
  • Desktop 与 WebUI Vite 生产构建全部通过。
  • 改动文件 Biome 检查通过。
  • git diff --check origin/feat/session-workbench-web...HEAD 通过。
  • 已合并依赖分支最新提交 51c10b1a,不存在剩余冲突。

本次增量仅修改 TypeScript/React、测试、文档和截图,没有 Rust、Go、protobuf 或依赖锁文件变化,因此未重复运行依赖 PR #662 已通过的 Rust/Go 全量检查。

依赖关系与合并顺序

  1. 先 Review / 合并 feat(workbench): 支持 Desktop 与 WebUI 的多会话和终端分屏 #662
  2. 将本 PR 的 Base 从 feat/session-workbench-web 切换到 main,同步最新 origin/main 并重新确认差异与 CI。
  3. 完成 Desktop/WebUI 最终人工拖拽验收后,将本 PR 从 Draft 标记为 Ready。

风险与回退

  • Workbench 功能继续受既有 VITE_LIVEAGENT_SESSION_WORKBENCH 开关控制,关闭后回到原单 Pane 路径。
  • 外部文件上传、工作区文件夹导入和内部路径引用使用独立 payload/路由,可分别回退。
  • File Tree Surface 不引入新的后端权限,也不扩大项目 cwd、Git、Worktree、Bash 或结构化文件工具边界。

提交前检查

  • 已关联需求 Issue [Feature] 文件树支持 Workbench 独立 Pane 与文件路径拖拽引用 #661
  • 已同步目标依赖分支,不存在合并冲突。
  • 改动范围聚焦于 File Tree Surface、路径拖拽和必要的跨端适配。
  • 不包含密钥、令牌、环境配置或敏感运行数据。
  • 已更新 Workbench 设计文档。
  • 已补充 Desktop 实际运行截图,并明确 WebUI 预览边界。
  • 已完成 Desktop/WebUI 全量前端测试、类型检查和生产构建。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant