# 功能与开发状态 ## 功能 - 默认单对话视图,不打扰现有工作流。 - 从侧边栏拖拽会话到中间区域 → 自动打开 Mission Control,并把“当前会话 + 拖入会话”放入面板。 - 每个面板是可交互的 mini chat: - Markdown 渲染(复用 DSH `MarkdownText`); - reasoning 折叠块、工具调用/工具结果卡片、斜杠命令生命周期卡片,全部**默认折叠**,点击 summary 展开,与单对话模式的收拢语义一致; - 流式 partial 输出; - 取消当前 turn(运行中只显示 Stop,空闲只显示 Send); - 队列消息展示与移除; - 加载更早历史; - 输入 `/` 弹出斜杠命令菜单,选中后走 `session.command`; - 输入框随内容自动增高,最多 6 行后内部滚动;输入框上边缘可上下拖拽调整高度,并持久化; - 支持图片附件:📎 按钮选择文件、拖拽文件到面板、在面板内 `Ctrl/Cmd+V` 或右键粘贴剪贴板图片(同时复制的文字照常进输入框)、缩略图预览与移除,发送时随消息提交(与单对话一致的 PNG/JPEG/WebP/GIF); - 聊天区右下角有“滚动到底”按钮,仅在向上翻看历史时出现; - 审批 / 计划模式等复杂交互显示“open in main conversation”,一键跳回主对话。 - 每个面板顶部有独立工具栏:权限预设(Perm)、模型(Model)、思考模式(Think),与主对话共享同一份会话状态。 - 面板信息分两层显示:第一行对话标题,第二行目录 + git branch/worktree(非 git 目录只显示目录名)。 - 布局为动态行数的横向布局:新面板默认加入第一行;每行超出屏幕宽度时,自动把该行最右的面板递归移到下一行,直到每行都完整可见(2 行、3 行或更多,按需要自动产生)。 - 面板标题栏原生拖拽(drag image 跟随鼠标):在同一行内可重排;向下拖到行下方会显示换行预览,松手后创建新行;向上拖回上一行。`⋮⋮` 拖拽把手固定在标题栏水平正中(整条标题栏可拖,按钮除外),右侧 `⤢` 回到单对话按钮与 `×` 关闭按钮之间保持 6px 安全间距。 - 面板跨行移动时保留原有对话 DOM,不重新加载消息、输入草稿、滚动位置或会话订阅。 - 从侧边栏把新会话拖入 Mission Control 时按落点放置:最右边追加到行尾、两个面板之间插入中间、下方进入下一行,随后自动执行防溢出换行。 - 没有持久化尺寸时,面板按所在行的可用宽度等分;右边缘、下边缘和右下角都可拖拽调整尺寸,最小 360×280。向下拉超过当前行时,面板临时置顶覆盖下一行并继续跟随鼠标;松手后行高按“行内最高面板”重算,下方行被整体推出去,放不下时网格出现纵向滚动——拖多少就长多少,不再被下方面板挡住。 - 面板四边与四角均可拖拽调整尺寸:左边缘拖拽会同步反向调整左侧邻居的宽度;上边缘拖拽会在行内产生上方留白(底部固定)。 - 内部面板拖拽到放不下的行时,目标行显示红色虚线预览,松手后弹回原位,不会被强制塞到最右边。 - 聊天滚动条与右侧 resize 手柄分离,两者都可正常点击拖动。 - 页面内“Add”选择器可添加尚未打开的面板。 - 面板列表、行归属、面板尺寸与输入框高度持久化到 `localStorage` v5,刷新后恢复;旧版本只迁移面板列表。 ## 当前实现状态(TDD 切片) 已通过 Web e2e(Playwright + DSH web scaffold)验证: 1. Mission Control 导航入口与页面。 2. 拖拽打开 Mission Control 并显示两个面板。 3. 面板内实时渲染会话消息。 4. 面板内发送消息只影响当前面板。 5. 面板列表刷新后恢复。 6. git branch 信息通过 host RPC 显示。 7. 页面内选择器添加/移除面板。 8. 默认大尺寸布局、三边 resize 以及刷新后的尺寸恢复。 9. 含斜杠命令历史的会话加入面板时,命令卡片正常渲染且不会打挂 Mission Control。 10. 默认单行布局、拖拽标题栏打开第二行,且行归属在刷新后恢复。 11. `/` 斜杠命令菜单和每面板权限/模型/思考选择控件可用。 12. 工具/推理默认折叠,点击后可展开。 13. 面板重排、侧边栏按落点插入(行尾/中间/下一行)以及输入框自动增高。 14. 行溢出自动递归换行、手动拖到新行、每行完整可见。 15. 输入框拖拽调高、滚动到底按钮、面板标题栏进入单对话视图(⤢ 与 × 间距 6px、拖拽把手居中)。 16. 面板内图片附件选择、拖拽上传、剪贴板粘贴、预览移除与随消息提交。 17. 向下拉长面板跨过行边界:拖拽中置顶覆盖、松手后下方行被推出,且不产生回弹。 18. 面板跨行移动后继续使用同一个 DOM 节点,避免长对话重新渲染造成的可感知延迟。 ## 已知限制 - 纯插件无法复用 DSH 内置 Conversation 组件,所以每个 pane 是插件自绘的 mini chat,视觉和交互尽量接近主对话,但复杂功能(审批弹窗、详细设置等)在 pane 内以跳转主对话的方式处理。 - 行布局由“宽度是否溢出”自动决定,不是完整 tmux/i3 自由分割。 - 使用了一个受控的内部 API 桥接(`Session.open()`),详见 `FUTURE_UPSTREAM.md`。 ## 构建 ```bash DSH_CHECKOUT=/path/to/deepseek-harness-studio bash scripts/build.sh npm run build:client ``` 或在 DSH 开发环境中使用注入器: ```bash dev_build_plugin /path/to/multiple-chat-panels dev_inject_plugin /path/to/multiple-chat-panels ``` ## 测试 跨行移动的本地回归测试: ```bash npm test ``` Web e2e 位于 DSH 仓库的 `apps/web/tests/multiple-chat-panels.e2e.ts`(开发期 seam)。运行: ```bash pnpm vitest run --config vitest.web.config.ts apps/web/tests/multiple-chat-panels.e2e.ts ```