dsh-pip-window
把 DeepSeek Harness 的会话搬进一个系统级置顶小窗。
点侧边栏底部的「小窗」,当前会话就会在一个 Document Picture-in-Picture 窗口里打开 —— 系统级浮窗,切到别的应用也一直在最上层,可以一边看 agent 干活一边做别的事,不用一直占着一个浏览器标签页。
小窗截图
特性
| 能力 | 说明 |
|---|
| 实时对话 | 直接读官方客户端服务 ctx.sessions,流式输出边生成边显示 |
| 可折叠的思考与工具行 | 「思考 · 402 字」「已搜索代码,浏览网页 · 3 次」,点开看细节,样式对齐主界面 |
| 发送与停止 | Enter 发送、Shift+Enter 换行;生成中按钮自动变成停止 |
| 发图片 | 点回形针选择,或直接 Ctrl+V 粘贴;支持 png / jpeg / webp / gif |
| 跟随会话 | 主界面切会话,小窗自动跟着切 |
| 主题与排版完全对标 | 开窗时把主文档的样式表、--dsw-* 变量、主题属性和字体一起搬过去,不是另画一套皮肤 |
| 侧边栏入口 | 展开与收起两种宽度都和「设置」对齐 |
| 底栏会话统计 | 与主界面底栏同源(直接读官方投影,不是本地估算):N 轮 N 步 · tok/s · 累计 tok · 缓存命中 · 上下文占用% |
安装
从 GitHub
dsh plugin --profile web add github:cyberbutterfly0/dsh-pip-window
从本地目录(开发时)
dsh plugin --profile web add link:/absolute/path/to/dsh-pip-window
装完刷新页面,侧边栏底部就会出现「小窗」。
桌面端(没有实测过)
官方桌面端使用独立的 profile,需要单独装一次:
# 先启动一次桌面端,让它初始化 profile,然后完全退出
dsh plugin --profile desktop add github:cyberbutterfly0/dsh-pip-window
desktop profile 的包管理要用桌面端自带的那份 CLI(应用菜单里的「管理 dsh 命令…」可以注册)。
这条路没有实测过。 本插件只在 Web 端(dsh web,Chrome + http://127.0.0.1:3080)验证过,作者没有安装官方桌面端。上面这段是按官方 apps/desktop 文档写的,能不能装通、小窗在 Electron 壳里能不能弹出来,都还没有人试过。想试的话,在桌面端里按 F12 打开 DevTools(打包版本也支持),先跑一句 typeof window.documentPictureInPicture —— 不是 "undefined" 就说明 PiP 这个 API 在壳里可用。试出来了欢迎开 issue 说一声。
用法
- 侧边栏底部点「小窗」,小窗打开后跟随当前会话
- 输入框 Enter 发送、Shift+Enter 换行;点回形针或
Ctrl+V 加图片
- 生成中按钮变成停止,点一下中断
- 关掉小窗后,随时从侧边栏再开
已知限制
- 浏览器要求:
documentPictureInPicture 需要 Chrome / Edge 116+、Firefox 151+。Safari 至今不支持,各移动端浏览器也不支持。
- 需要安全上下文:
https://、http://localhost 或 http://127.0.0.1 才行。用局域网 IP(http://192.168.x.x:3080)打开时,浏览器根本不会暴露这个 API。
- 小窗标题栏的地址改不掉:标题栏显示的是源站(如
127.0.0.1:3080),这是文档级 PiP 规范的安全要求——UA 必须在标题栏持续标明控制该窗口的源,防止置顶窗口冒充其它界面。页面设的文档标题不会影响它,位置与大小同理也由浏览器掌控。会话身份请看窗口内部的标题行。
- 只对 Web 客户端生效(
dsh.client.platform: "web")。
- 桌面端未实测:只在 Web 端验证过。官方桌面端是 Electron 壳、且用独立的
desktop profile,安装方式见上面的「桌面端」一节,但那条路还没人跑通过。
- 契约锚定 dsh
0.1.7-alpha.2:实现里用到了 data-sidebar-collapsed 属性、--dsw-* 变量、localStorage 的 dsh.sessions.current 这些内部细节,dsh 升级后可能需要跟改(最可能先坏的是窄栏对齐、主题搬运、会话跟随)。
- 发送与停止没有自动化测试:一测就会往真实会话里塞消息,目前靠手动验证。
开发
零构建:client.js 是手写的 CJS 式 bundle,没有 JSX/TS,React 全部走 createElement。改完刷新页面即可生效(bundle URL 带内容 hash,不用重启 dsh,也不用重新 dsh plugin add)。
诊断日志
// 打开
localStorage.setItem('dsh-pip-window:debug', '1')
// 关闭
localStorage.removeItem('dsh-pip-window:debug')
打开后重开小窗,控制台会打印两条诊断:
pip rows —— 行数、阶段、流式正文字数与思考字数、最后一行摘要
pip dom —— 小窗里真实的 DOM 统计(小窗是独立 document,主标签页的 devtools 看不到它)
文件
| 文件 | 作用 |
|---|
client.js | 客户端半:开窗、搬运样式、渲染、收发消息 |
index.js | Host 半:目前只做契约自检(数据全部走客户端服务,没有自建 HTTP 端点) |
cordis.patch.yml | 往 profile 里插入插件行 |
许可
MIT