dsh-pajama-whale
Verifieddsh-pajama-whale · v0.3.6 · MIT · Web UI
A tiny person in a blue-whale onesie you can drag around the DSH window; he sticks to the window edges, pressed flat, and blinks now and then.
Install
dsh plugin add dsh-pajama-whale Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
🐋 dsh-pajama-whale
认识一下典型的 DeepSeek Harness 开发者。
一个穿着蓝色鲸鱼连体衣、玩具大小的同事,住在你的 DSH 窗口里—— 在你等待时告诉你智能体在做什么。

他首先是个桌面玩具,其次才是状态指示器。推着他在窗口里移动,把他扔向墙壁—— 他会平贴在墙上,一直粘在那里,直到你把他拖走。什么都不会坏:没有重力、没有伤害, 也不会对你的代码指指点点。别管他,他就会打瞌睡。
当长回合运行时,可以和他玩。工具开始时,他会掏出笔记本电脑;需要你时,他会冒出思考气泡; 当上下文快用完、回合失败,或者你已经连续工作五十分钟时,他会开口提醒。
无需配置。自身不发起网络请求。整个东西只占用一个 overlay 插槽。
安装
Web(已在 DSH 0.2.1-rc.2 上验证):
dsh plugin --profile web add dsh-pajama-whale
安装最新的 npm 版本;加上 @0.3.6 可固定版本。想直接从 GitHub 标签安装?
使用 dsh plugin --profile web add github:lubenkov/dsh-pajama-whale#v0.3.6
(需要 git)。
Desktop,从终端安装。 npm 版 dsh CLI 拒绝保留的 desktop profile。
请先从应用菜单 Manage dsh Command… 安装命令,退出应用,然后运行:
dsh plugin --profile desktop add dsh-pajama-whale
之后重新打开应用。
Desktop,在应用内安装。 打开 Plugins 页面,在那里安装
dsh-pajama-whale。保持应用运行,并按照它提示的重启步骤操作。
要移除他:
dsh plugin --profile <profile> remove dsh-pajama-whale
安装时没有构建步骤:美术资源已内联进 client.js,所以只需要 dsh plugin add——
没有 postinstall 钩子,也没有运行时下载。它是一个纯 UI bundle(没有依赖,
除了它读取的那些之外不使用任何宿主服务)。
声明兼容 DSH >=0.2.1-rc.2 <0.3.0-0,写在 engines.dsh 中。DSH 会在安装和
启动 profile 时强制执行;超出范围会拒绝该 bundle,直到为确切的版本对授予豁免。
列入目录后,市场索引会保存一份自己的范围副本,因此两边需要保持同步。
API 面、豁免命令和优雅降级见 COMPATIBILITY.md。
和他一起玩
| 你 | 他 |
|---|---|
| 拖动 | 跟随指针。慢慢松开,他就留在原地;快速松开(>120 px/s),他就飞出去。没有重力,不会弹跳。 |
| 拖向墙壁 | 平贴在墙上:四个方向 × 8 帧,帧由你越过边界的距离(最多 110 px)决定;如果是扔出去的,则由撞击速度决定。 |
| 点击 | 在气泡里显示当前上下文压力(未知时显示会话标题),持续 5 秒。 |
| 悬停气泡 | 光标在那里时,显示同样的上下文读数。 |
| 点击气泡 | 打开他正在关注的会话。 |
他会跟随智能体
| 会话在做什么 | 他会做什么 |
|---|---|
| 本回合中已运行过工具 | 切换到 working 姿势——掏出笔记本电脑,12 帧 |
| 回合运行中,没有工具活动 | thinking,20 帧 |
| 回合结束 | 一次 joy 爆发 |
| 等待你的批准或回答 | 气泡显示 ? |
| 上一个回合失败 | 气泡显示 ! error,持续 6 秒 |
| 上下文压力达到 80 % | 一次 surprised;只要仍 ≥80 %,气泡就显示 context N%,低于 75 % 后 surprised 才会再次触发 |
| 连续工作 50 分钟 | 气泡建议 take a break?,持续 9 秒(每 45 分钟重复一次;少于 3 分钟的暂停仍算连续) |
| 安静一分钟 | 以循环的 16 帧 sleepy 睡着;当你用光标叫醒他时打哈欠(13 帧)——新的回合会安静地叫醒他 |

空闲时他只会眨眼(75 %)或摇尾巴(25 %),每 1.9–4.5 秒一次,外加罕见的
hmm… 想法。一共是 12 张精灵图里的 129 帧。当你拖动他或他贴在墙上时,
姿势和一次性情绪会暂停:压扁帧优先。
一个气泡,严格优先级
hover / click 上下文 → ? 等待 → ! error → take a break? →
context N%(≥80 %)→ 空闲 hmm…(3.6 秒,每 70–160 秒)。悬停或点击总是优先,
所以宠物永远不会对你隐藏上下文读数。
省电又安静
- 无需构建,无需下载。 全部 12 张图(2.3 MB WebP、129 帧)都以 data URI
内联进单个 3.1 MB 的
client.js。插件自身不发起任何外部请求。 - 空闲时很省。 当宠物空闲且没有姿势在播放时,
requestAnimationFrame循环会停止。 精灵帧按各动画自己的速率前进——sleepy8 fps、yawn10 fps、thinking和working12 fps、尾巴/joy/surprised14 fps、blink16 fps。呼吸是每 25–40 秒 一次的约 3.4 秒 CSS 动画。标签页隐藏时浏览器会暂停requestAnimationFrame, 呼吸也会被显式停止;状态计时器和空闲想法计时器会被浏览器降频,但不会取消。 在prefers-reduced-motion下,呼吸和随机情绪会被禁用(姿势动画仍会播放)。 - 从不挡路。 他只挂载到
shell.overlay,在他身体和气泡之外, overlay 是pointer-events: none。 - 记住自己的位置。 位置、贴住的墙和压扁深度保存在
localStorage, 窗口缩放时会做边界钳制。
语言与隐私
英语和中文文案通过 ctx.locale 跟随“设置 → 语言”(其他语言回退到英语)。
插件只读取会话状态、上下文压力、会话标题和最近的工具活动来选择姿势。
它不向任何地方发送数据,没有遥测,只在你的机器上的 localStorage 中保存宠物的位置、
贴住的墙、压扁深度和粘贴标志。
如果他没有出现
- 确认你安装到的 profile 就是你启动的那个。
- 检查 DSH 版本是否在声明范围内。超出范围时,安装或启动 profile 会拒绝该 bundle; 只有在接受风险后才授予确切版本豁免(见 COMPATIBILITY.md)。
- 设置
localStorage['pajama-whale:debug'] = '1'并重新加载:气泡会打印实时通道 (会话 id、插槽钩子、运行状态)。缺失的通道列在 COMPATIBILITY.md 中——即使没有它们, 宠物仍会渲染和拖动。
开发
Node 20+;只有在重新打包美术资源时才需要带 Pillow 的 Python 3。
python tools/build-sheets.py # PNG 帧 -> WebP 精灵条(需要 assets/sprites/)
node tools/build-client.mjs # 精灵条 -> client.js 的 data URI
node tests/validate.mjs # 校验包、精灵图、语言包和体积预算
CI 在 Node 20 和 24 上运行同样的校验,如果提交的 client.js 与其源文件不一致就会失败。
| 路径 | 作用 |
|---|---|
src/client.src.js |
可读的客户端源码,带精灵图占位符 |
client.js |
实际发布的构建产物(内联 data URI) |
assets/build/*.webp |
打包好的精灵图 + manifest.json |
tools/build-sheets.py |
打包器(PNG 帧 → WebP 精灵条) |
tools/build-client.mjs |
内联器(精灵条 → client.js) |
index.js |
空的宿主半边;宠物只在浏览器侧运行 |
assets/sprites/(约 64 MB 的源美术包)没有提交;提交的是打包后的
assets/build/*.webp,所以除非你要重画帧,否则永远不需要它。
如果这只小鲸鱼让你的 DSH 窗口更可爱,点个 ⭐ 能让更多人发现他: github.com/lubenkov/dsh-pajama-whale
许可证
代码和美术资源均采用 MIT 许可证。