dsh-fatfish: Big Fat Fish desk pet in the top-right corner of the DSH input box, changing expressions based on conversation status

前言

在 DSH 里长时间跑会话时,界面往往只有输入框、消息流和运行指示,缺少一种「当前在干什么」的直观反馈。有人会在侧边栏看日志,有人盯着 running 状态猜 agent 是否在干活;这些做法能工作,但和输入区是分离的。

下面介绍社区插件 dsh-fatfish(大肥鱼桌宠):把动画形象贴在会话输入卡片上沿外侧,根据待命、输入、生成、待批准、待回答、出错、完成、闲置、上下文吃撑等九种状态切换表情。表情以 WebP 动画内嵌在客户端 bundle 里,不依赖外部 CDN,属于 DSH 生态里「趣味换装」类的小改动——不改 Host 逻辑,也不增加配置项。

这是什么

dsh-fatfish 由维护者 kabarryo 发布,仓库 kabarryo/dsh-fatfish,社区目录页见 skillhub.cn/plugins/kabarryo/dsh-fatfish。当前 package 版本为 0.1.0,代码许可证 MIT;表情素材来自 diwer/ai-biaoqingbao(CC BY-NC-SA 4.0,非商业等限制见仓库 NOTICE)。

插件只做一件事:在 DSH 会话输入区注册 overlay 与 dock 两个 client slot,显示约 96px 见方的大肥鱼,并在状态变化时从对应表情组里随机选一张动画。README 说明本插件由 DSH + DeepSeek V4.1 Flash 开发与维护,Host 侧 index.js 为空实现,逻辑全在 client.js。

核心功能

九种状态与判定

状态优先级(高到低):出错 > 待批准/待回答 > 生成中 > 完成(6s)> 吃撑了 > 输入中 > 闲置 > 待命。每次进入状态从组内随机取表情;同一状态停留超过约 45 秒(±25% 抖动) 会再随机换同组另一张(组内只剩一张时不轮换)。

状态 判定要点 表情组(README 编号)
待命 不在跑、失焦、静默 < 180s 081 期待 · 019 在吗
输入中 输入框获得焦点 009 收到 · 020 来了 · 022 马上到
生成中 SessionSnapshot.running 074 干饭人 · 075 先吃一口 · 065 赶工中 · 076 咖啡续命
等你批准 pendingInteraction.kind === 'approval' 034 啊这 · 028 拜托了 · 021 等一下
等你回答 pendingInteraction.kind === 'question' 033 真的假的 · 049 尊嘟假嘟 · 093 确认眼神
出错 promptError / lastAgentError / openError(8s) 037 麻了 · 036 我裂开了 · 069 我太难了
完成 回合结束后 6s 094 恭喜 · 003 点赞 · 091 满血复活 · 047 拿捏了
闲置 失焦、静默 ≥ 180s 脚本:064/044 随机开场 → 120s 后 007×3 圈 → 018×2 圈 → 073 锁定
吃撑了 上下文占用 ≥ 85% 且失焦 088 撑了 · 072 让我缓缓

闲置不是简单表情池:进入后按 README 描述的脚本顺序播动画,播完停在最后一帧,直到离开闲置状态。

摆放与输入区布局

宠物贴在输入卡片上沿外侧、距右边 40px,缩放后约 96px 见方,明暗主题下都不挡输入框与发送按钮。合成阶段按底部基线对齐,避免宽构图「浮」在卡片上方。

同时注册透明占位带 conversation.input.dock(高 102px),正文滚动区域整体上移,静止时最后一行停在宠物上方。插件只使用 conversation.input.overlay 与 conversation.input.dock 两个 slot;若上游改名需同步改插件。

素材与体积

共 29 张大肥鱼表情(README 与简介一致),对应九种状态分组;素材取自 diwer/ai-biaoqingbao 的 100 张系列中挑选结果,帧数与帧序沿用原始素材,构建时合成动画 WebP 并内联进 client.js(约 1 MB),无需运行时拉取外部图片。

安装与启用

要求:DSH 0.2.x(Web 或桌面版 profile),Node >=20,无额外 npm 依赖。

克隆仓库

先把插件放到本地目录(路径可按习惯调整,下面以 ~/dsh-fatfish 为例):

git clone https://github.com/kabarryo/dsh-fatfish.git ~/dsh-fatfish

若目录已存在,在仓库内执行 git pull 更新即可。

登记到 profile

编辑目标 profile 的 package.json:

  • Web:~/.dsh/profiles/web
  • 桌面版:~/.dsh/profiles/desktop

在 dependencies 中加入本地 link,并把 bundle 名追加到 dsh.profile.bundles 末尾(<你> 换成实际用户名或绝对路径):

{
  "dependencies": {
    "dsh-fatfish": "link:/Users/<你>/dsh-fatfish"
  },
  "dsh": {
    "profile": {
      "bundles": ["...", "dsh-fatfish"]
    }
  }
}

重启 DSH

改完 package.json 或 cordis.patch.yml 后必须重启 DSH:Web 版重启 dsh web,桌面版退出重开。README 强调 bundle 只在启动时加载,漏重启是最常见的手动安装失误。

也可把 README「推荐:让 agent 安装」里的四步说明交给能执行命令的 agent,由它定位 profile、备份 package.json、登记 link 并重启验收。

典型用法

安装并重启后,打开任意会话即可验收:

  1. 确认输入框右上方出现大肥鱼。
  2. 点击输入框,应进入「输入中」组表情。
  3. 发送一条消息,生成过程中应切换到「生成中」组。
  4. 若会话出现待批准或待提问交互,表情应对应 approval / question 状态。

插件没有配置项,也不提供 Host 侧 API;改 client.js 后刷新页面即可(client bundle 按 mtime 增量读取),无需为此重启。

维护者若改素材或分组,需在仓库内两步构建:

python3 scripts/build_emotes.py
python3 scripts/build_plugin.py

适用场景与注意

适合谁:希望在 DSH 输入区获得会话状态可视化、又愿意接受非商用表情素材许可约束的用户;分类上属于社区目录的「趣味换装」,不改变 agent 能力本身。

运行与权限:插件随当前 DSH 进程的 client bundle 在浏览器或桌面壳内执行,安装前宜通读仓库源码与 LICENSE、NOTICE,确认可接受 MIT 代码许可与表情 CC BY-NC-SA 4.0 限制(内嵌动画帧视为修改版,同样不可商用)。

已知限制(来自 README):

  • 表情仅在会话页输入区可见,侧栏与插件页没有。
  • 「吃撑了」依赖本插件对 contextPressure 的投影(阈值 85%),不是 DSH 内置状态。
  • 换表情组需改 scripts/build_emotes.py 的 POOLS 后重跑构建。
  • 部分原图顶部被裁,呆毛不完整等情况按素材原样保留。

卸载:从 profile 的 package.json 删除 dependencies.dsh-fatfish 与 bundles 中的 "dsh-fatfish",重启 DSH;~/dsh-fatfish 目录可保留或删除。

结尾

dsh-fatfish 把大肥鱼桌宠绑在 DSH 会话输入框右上角,用九种状态和 29 张动画表情反映当前交互节奏,素材内嵌、零配置启用。DeepSeek Harness 社区采用「一切皆插件」的思路,目录站点 skillhub.cn 与 DeepSeek / 幻方无官方从属关系;细节与截图以 GitHub README 为准。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye