
让 AI 思考时自动弹短视频:dsh-video-slackingoff 插件开发记
让 AI 思考时自动弹出短视频窗口,思考结束自动关掉——摸鱼不用记着关,干活不被打扰。
Auto-pop a short-video window while your AI agent is thinking, and auto-close it when the turn ends — slack off without remembering to close the tab, work without being interrupted.
声明在前:这个插件是我本人开发的,已经开源放出来供大家随意使用(MIT 协议)。仓库地址:https://github.com/Jay-R-J/dsh-video-slackingoff。下面把它的安装方法、痛点由来一五一十讲清楚,照着读就能明白怎么零基础上手使用。
如果你读过之前那篇 把 DeepSeek Harness 变成 RPG 工作台,应该对「插件即一行声明、Host / Client 两半架构」这套 DSH 哲学不陌生了。dsh-video-slackingoff 这次走的是另一条路子——不改变 AI 的任何能力,只在它埋头思考的那几十秒里,给你长出一个摸鱼窗口。
说白了,AI Agent 一轮思考动辄几十秒到几分钟。与其盯着 spinner 发呆,不如刷刷短视频。思考一开始自动弹窗,思考结束自动关掉,摸鱼不用记着关,干活不被打扰。这就是这个插件的全部价值。
环境要求
在装之前,先把基础环境对齐:
| 依赖 | 版本 | 说明 |
|---|---|---|
| Node.js | >= 18 | 构建与运行 |
| DeepSeek Harness CLI | 任意较新版本 | 必须先全局安装(npm install -g @deepseek-ai/dsh),否则 dsh plugin 等命令不存在 |
| DeepSeek Harness | web profile | 插件面向 dsh web 界面 |
| 现代浏览器 | 任意较新版本 | 需在地址栏允许本站弹窗(首次自动弹窗会被拦) |
关键点:这个插件面向 web 界面,TUI / headless 模式下窗口不会弹出(事件逻辑仍然会跑,但你看不到弹窗)。所以使用场景就是浏览器里开 dsh web。
安装
前置:先全局安装 dsh 命令行工具
没有它就没有 dsh plugin / dsh web 这些命令:
1 | npm install -g @deepseek-ai/dsh |
如果这步已经做过,直接跳到下一步。
一条命令安装本插件
1 | dsh plugin --profile web add dsh-video-slackingoff |
dsh plugin add 会自动把包加入 profile 层叠(包声明了 dsh.bundle.patch),无需手写补丁——这是 DSH 插件机制的好处之一,省掉手动改 cordis.patch.yml 的麻烦。
重启 dsh web
安装完成后必须重启 dsh web,界面右下角才会出现药丸:
1 | # 先 Ctrl+C 停掉旧的 dsh web 进程,然后重新启动 |
卸载
不想要了就一条命令走人:
1 | dsh plugin --profile web remove dsh-video-slackingoff |
原理速记:插件挂在根上下文监听
session/event广播,Host 面把running/enabled状态通过 webServer 路由暴露给浏览器,客户端 bundle 由 dsh 的dsh.client字段扫描自动打包,所以lib/产物 +dsh两个字段就够用了,不用自己写打包配置。
痛点:等 AI 思考的那几十秒
用 DeepSeek Harness(下面简称 dsh)写代码、查资料,每发一句话,Agent 就埋头思考。短的话十几秒,长的话几分钟。这段时间里我能干啥?
- 盯着屏幕等 —— 浪费生命
- 切到别的窗口干别的事 —— 经常忘了回来看,结果 Agent 早想完了,我还在刷手机
- 主动打开短视频摸鱼 —— 但 Agent 想完了我又忘了关,视频一直在背后响
痛点很清晰:思考期间想摸鱼,但摸完得记得关。
能不能让这件事自动化?思考一开始自动弹个视频窗口出来,思考结束自动关掉。这就是 dsh-video-slackingoff 的由来。
使用方法
面板挂在界面右下角(shell.overlay 插槽),一切都是自动的——AI 一开始思考就弹窗,想完就关窗,完全不用主动点按钮。
状态药丸
右下角的药丸实时反映当前状态:
| 状态 | 颜色 | 含义 |
|---|---|---|
| 摸鱼中 | 绿 | AI 正在思考,窗口已弹出 |
| 摸鱼 开 | 灰 | 开启状态,AI 没在思考 |
| 摸鱼 关 | 灰 | 总开关关了,不弹窗 |
| 弹窗被拦 | 黄 | 浏览器拦了,去地址栏允许一次 |
面板交互
| 操作 | 效果 |
|---|---|
| 点击药丸 | 切换总开关,开 ↔ 关,状态落盘到 $DSH_HOME |
| 点击「选视频」按钮 | 弹出视频源列表(快手 / 抖音) |
| 在列表里点选某个视频源 | 写入 localStorage,下次自动用这个 |
| 首次自动弹窗被拦 | 浏览器地址栏允许本站弹窗一次,本轮内自动恢复 |
| 用户误关窗口 | 下一轮 tick 自动重开,不会出现剩余时间没窗口 |
选视频
点「选视频」按钮,列表里点选快手或抖音,存到 localStorage,下次自动用这个。选的是整站首页,独立窗口打开后用户登录态正常,该咋刷咋刷。
弹窗被拦:浏览器的统一规则
window.open 在「非用户手势触发」时会被所有浏览器默认拦截。本插件是 AI 思考时自动弹窗,触发点在 setTimeout 回调里,不是用户点击,首次必然被拦。
这跟浏览器品牌无关,是 Web 安全策略。
解决方案分两步:
- 首次被拦 → 用户去地址栏允许一次本站弹窗
- 本轮内自动恢复 → 客户端 tick 里检查
popupRef.current === null || popupRef.current.closed,shouldRun 时重试window.open
关键代码:
1 | const popupMissing = popupRef.current === null || popupRef.current.closed |
这个重试逻辑顺便解决了另一个问题:用户误关窗口后,下一轮 tick 会自动重开,不会出现「本轮思考剩余时间没窗口」的死局。
轮询退避:500ms 还是 2s
最初固定 500ms 轮询。思考可能持续几分钟,500ms 一次 fetch 略密。改成退避:
running时 500ms(接近边沿触发,不延迟)idle时 2s(省请求)- host 不可达时也退避到 2s
用 setTimeout 链式调度替换 setInterval,每次 tick 里决定下次延迟。
License
MIT 协议,可以放心用于个人和商业场景。
开源
代码在 GitHub:https://github.com/Jay-R-J/dsh-video-slackingoff,MIT 协议。
欢迎 issue、PR,也欢迎在此基础上整点别的花活——比如「思考时自动泡茶计时器」「思考时自动放白噪音」之类。思路都是一样的:监听 session/event,状态通过 webServer 路由暴露,客户端按状态做对应的事。
摸鱼愉快。
更新时间: 2026-08-25
作者: Jay
作者本人开发并开源(GitHub 仓库),MIT 协议。愿你在 AI 思考的间隙里,也能摸得明明白白。





