独立会话窗口(Session Popout)
本项目由 AI 全程辅助制作。 需求、设计方向与验收由作者把握,代码、文档与排查过程由 AI 结对完成。发布前经过人工审阅,文中所有功能说明以实际行为为准。
顺便一提,下面的介绍也是ai写的,所以ai味很重也别找我麻烦嘞。
让你可以从侧边栏拖拽会话,使其成为一个独立窗口,省得来回切换会话的插件!
DeepSeek Harness 的会话默认都挤在同一个窗口里:想同时盯着两个会话跑、想把某个会话扔到第二块屏、想一边看长回复一边在别处干活,都得反复点侧栏。这个插件把「一个会话」变成一个真正的操作系统窗口 —— 关掉它不影响主窗口,主窗口也照常工作。
什么时候用得上
- 一个会话在跑长任务,另一个还要继续聊。 长任务那个扔进独立窗口让它自己跑,主窗口留在你正在聊的会话上,两边都不用退出、不用切。
- 想把某个会话丢到第二块屏幕。 独立窗口是真正的系统窗口,能拖到任意显示器、能单独全屏、能被系统窗口管理器记住位置。
- 一边等长回复,一边在别处干活。 等着看结果的那个会话单独开一窗放在旁边,主窗口腾出来干别的事,不必为了瞄一眼进度切来切去。
看起来是什么样
拖出去的窗口是 DSH 自己的会话界面:
- 顶部还是「对话 / 轨迹」标签、模型名、右上角那排控制件
- 中间还是原来那套对话流,Markdown、代码块、工具调用卡片全部照旧渲染
- 底部还是输入框、识图 / 上传、状态栏
- 侧边栏自动收起,于是窗口里只剩下这个会话本身
换句话说,是把 DSH 的那一块 切 了下来,而不是重画一个。插件本身不参与对话渲染 —— 对话由宿主画,插件只做三件事:开窗、把侧栏收掉、在会话头部加两个小按钮。
能做什么
| 能力 | 说明 |
|---|---|
| 拖拽开出独立窗口 | 在侧边栏按住会话条目往外拖,松手的地方就是新窗口出现的地方 |
| 窗口之间拖拽合并 | 把一个窗口拖到另一个上面,两个会话并成一个集合窗口 |
| 集合窗口 | 一个窗口里横排多个会话成员,左侧成员栏可切换、可拆出 |
| 收回 | 点窗口里的「⇲ 收回」,会话回到主窗口继续显示 |
| 跟随宿主主题 | 窗口的原生标题栏跟着 DSH 的明暗主题走 |
| 热更新 | 改了插件代码不用重启 DSH,HMR 会重新装载 |
安装
从 GitHub 安装(现在就能用):
dsh plugin add github:lumine-423/dsh-session-popout
或者下预构建包(不用本地编译,装得更快):
dsh plugin add "https://github.com/lumine-423/dsh-session-popout/releases/latest/download/dsh-session-popout.tgz"
以后会发布到 npm,那时就只需要 dsh plugin add dsh-session-popout。
装好后从侧边栏拖任意一个会话即可,不需要额外配置。
收录状态
- ✅ GitHub 仓库已上线:lumine-423/dsh-session-popout,带 release 与预构建
dsh-session-popout.tgz(资产名不带版本号,安装命令因此不会随发版失效) - ⏳ 插件市场目录:PR 已提交 —— awesome-dsh-plugin#8306。目录有一条自动检查要求仓库创建满 1 天;首次跑会红,该检查每 6 小时自动重跑,满 1 天后会自行转绿,不需要重开 PR
- ⏳ npm 包
dsh-session-popout:尚未发布,发布后市场能显示下载量
依赖什么
- DSH 桌面版(
dsh-desktop-runtime)。插件需要借桌面版自带的 Electron 来开原生窗口;纯 Web 版 /dsh web没有这个能力,插件会安静地不生效。 - Electron 的查找顺序:环境变量
DSH_POPOUT_ELECTRON→ 当前进程自身 →<home>/.dsh/electron/。想用系统里另一份 Electron,设这个环境变量即可。
已知限制
这个插件用了一部分 DSH 的内部接口,而不是公开稳定的插件 API。具体包括:
- 布局服务的
beginNavigation()、toggleSidebar()、closeRightbar() - 会话快照里的
retainedBy.mainView判断主视图归属 - 布局层给的
data-shell-overlay等 DOM 稳定标记 - 会话头部槽位
conversation.session.header.utilities
这意味着 DSH 升级后有可能失效。失效时的表现通常是窗口里只剩背景、或者按钮不出现,而不是崩溃。遇到请在 issue 里附上 DSH 版本号。
其余限制:
- 只在 Windows 上实测过;macOS / Linux 的代码路径写了但没有真机验证
- 一个会话同时只能在一个窗口里出现
- 集合窗口的成员栏不支持拖拽排序(用下拉切换)
出问题时
插件在窗口里自带一份自检:如果打开 3.5 秒后 DSH 的会话界面还没画出来,窗口底部会浮出一块说明,列出它检查到的每一层(外框、侧栏状态、浮层、会话目录、打开状态、启动期错误)。把那块截图发到 issue 里,比描述「白了」有用得多。
开发
# 直接改源码即可,profile 里是 link 形式,改完刷新页面生效
# client.js 会被 index.js 的 watcher 检测到并触发热重载
结构:
| 文件 | 职责 |
|---|---|
index.js |
宿主侧:HTTP 路由、拉起并管理窗口管家进程 |
client.js |
前端:拖拽开窗、收侧栏、打开会话、会话头部按钮 |
window/main.cjs |
窗口管家主进程:创建 BrowserWindow、合并/拆分/关闭 |
window/preload.cjs |
注入页面:标记窗口身份、收敛外壳布局、上报自检 |
License
PolyForm Noncommercial 1.0.0 加一条源码可得性补充条款。SPDX 标识:LicenseRef-PolyForm-Noncommercial-1.0.0-With-Source-Availability。
你可以:
- 免费用,随便用,私人、学习、研究、业余项目、慈善、教育、公共研究、政府机构使用都算允许用途
- 读源码、改源码、自己改着玩
- 原样转发给别人
但不能:
- 拿去商用 —— 卖钱、放进收费产品、当作商业服务的一部分,都不行。要商用请单独联系作者谈授权
- 改完闭源发给别人 —— 你把改过的版本发出去,就必须把改过之后的完整源码用同样条款、免费、放在拿到你版本的人找得到的地方公开。只发打包产物、压缩产物、编译产物不算
完整条款见 LICENSE。
No comments yet. Be the first to write one.