前言¶
DSH 的理念是「一切皆插件」,界面层同样留了口子。多数插件改的是行为(工具、权限、输出),动界面视觉的少见。这个插件把一个小像素人放进聊天区域,它随会话状态动:工具在跑、出错、排队消息、上下文快满了,都有对应表现。
插件名 extreme-russian-dsh-fandom/dsh-clippy-companion,包名 @local/dsh-clippy-companion,维护者是 extreme-russian-dsh-fandom。目录页把它归到「客户端」分类,GitHub 星标为 0,属于解决个人趣味需求的插件,不是基础设施。
下面介绍它是什么、怎么装、怎么换 sprite pack。
这是什么¶
一句话:在 DeepSeek Harness 聊天区里放一个可拖动、可切换皮肤包的同伴,跟随当前对话状态做动画和提示。
它解决的不是效率问题,而是「对话区是纯文本,看不出后台在发生什么」这件事。工具调用超过十秒、上下文快填满这些状态,原来只能靠看日志判断;这个插件把它们变成一个可见的小人表情。
两块皮肤包随包发布:
- Clippy,使用 OpenClippy 的图块。
- Doomguy,DOOM II 状态栏的头部像素图,附带梗图脸。
拖动区域是拿会话列本身量出来的,所以同伴不会跑到侧边栏或「已展示文件」面板里,侧边栏折叠、右侧面板、窗口缩放、输入区变高这些布局变化,它都能跟上。
核心功能¶
可核实的能力如下。
可拖动。 在会话列内任意拖动,位置被夹在这个列的范围内,并写入 localStorage,刷新后保留,窗口尺寸变化后再适配。
皮肤包切换。 右键(触屏长按)同伴切换 pack,也可以走 Settings → General → Companion。选择会被记住。
每个包有自己的台词风格。 待机循环、问候、反应、随机句子都来自该 pack 的 preset.json。
上下文掉血。 只有 DOOM 包用这个机制:读取 token 计量条的实时压力值,低于 35% 显示健康,35% 起带伤,65% 起重伤。若该表情没有对应残缺变体,就保持正常帧。
感知 Agent 状态。 一轮对话中,它会反映思考状态、当前工具(编辑 / 读取 / shell / 通用工具)、工具成功或失败、等待用户决策、排队给下一轮的消息(举手一拍,不显示气泡)、超过十秒的工具调用(Clippy 用 IdleFingerTap,Doomguy 用 Angry),以及一轮结束。此时气泡短暂接管,活动动画随后恢复。
梗图脸。 DOOM 包里带了 22 张高分辨率 Reddit 梗图脸,缩到与状态栏头部相同的 24×29 尺寸。部分有专属台词,其余在待机动画间隙随机出现。
可戳。 单击同伴(或它有焦点时按 Enter)会弹出一句主题气泡短评;连续戳它会不耐烦,双击会甩一张梗图脸。
打盹。 安静五分钟后它会睡,冒一个 Zzz 气泡,换成该包的睡眠动画(如果有);之后任何一轮活动、点击、按键或评论都会用唤醒动画叫醒它。
键盘可操作。 Tab 聚焦,方向键移动(按住 Shift 步长更大),Enter 或 Space 说话,Menu 键或 Shift+F10 打开 pack 菜单,Escape 关闭。
跟随主题与减少动效。 气泡、菜单、设置行使用宿主主题 token,只有美术图保留自身配色。系统开启 prefers-reduced-motion: reduce 时,同伴停在静止帧,不播循环动画。
安装与启用¶
README 里的安装方式:它是普通的 pnpm 依赖,GitHub 引用或本地检出都能装。桌面应用里走 Plugins 页,命令行(Windows / Linux / macOS)如下:
# 从 GitHub 安装
dsh plugin --profile desktop add github:extreme-russian-dsh-fandom/dsh-clippy-companion
# 从本地检出安装(Windows)
dsh plugin --profile desktop add C:\path\to\dsh-clippy-companion
# Linux 或 macOS
dsh plugin --profile desktop add /path/to/dsh-clippy-companion
desktop 换成你自己的 profile 名(web、tui,…)。dsh plugin 把参数原样转给 pnpm,所以 github: 就是 pnpm 的 GitHub 简写;要固定版本就在后面追加 #<branch-or-commit>。
两种安装方式的更新成本不一样:本地目录是 link 过去的,改完只需重新启用插件;GitHub 引用是把包复制过去的,得先 push 再重装。不需要 build 步骤。
装完重启 Harness,然后刷新页面。插件在 Plugins 设置里显示为 Clippy Companion。
卸载:
dsh plugin --profile desktop remove @local/dsh-clippy-companion
或者直接在 Harness 的 Plugins 页移除。
典型用法¶
装好后没有别的配置要做,默认就是 Clippy 包常驻聊天区。日常操作只有两种:
1、想换风格时,右键同伴切到 Doomguy,或到 Settings → General → Companion 里选。
2、想让它回一句时单击,或它有焦点时按 Enter。
想确认上下文压力机制是否生效,可以先开着 DOOM 包跑一个长上下文任务,观察 token 计量条变化时同伴脸部的变体切换。
自定义 Sprite Pack¶
每个 pack 是 assets/ 下的一个目录,文件结构如下:
assets/<pack>/
preset.json pack 描述
sprite-data.json frameWidth, frameHeight, animations[{duration, position}]
<sheet>.png preset.json 里引用的图块
LICENSE | LICENSE.md
preset.json 关键字段:
scale缩放帧尺寸与背景定位,pixelated打开像素化的最近邻渲染。version给图和 manifest 的 URL 做 cache-busting。改了图就要 bump,否则浏览器在它的缓存有效期内还会拿旧图(preset.json本身总是重新拉取)。greeting载入后播一次,rest用于减少动效和兜底,idle在停顿之间随机取。speech把一个 locale key 映射到反应动画;可选memeIdle(动画名数组)和memeChance(0–1)让待机偶尔冒出一张梗图脸,双击的梗图爆发也用同一个列表。- 可选
poke({ key, anim }列表)回答单击,pokeMad回答连续第三戳,sleep/wake指定睡着和醒来的动画。缺了的项会回退到该 pack 里兼容的动画。 - 掉血变体就是普通 manifest 动画加后缀:
Angry、AngryHurt、AngryBad。客户端会取该基础名下存在的最高档。
新增一个 pack:把目录丢进 assets/,再在 client.js 的 PRESETS 里加一行即可。Host 侧不用改,assets 路由是整个目录的前缀。
DOOM 包要重建的话,在仓库根目录运行:
python tools/build-doom-pack.py
脚本会给经典图块建立索引、洪水填充梗图表的黑色背景、把梗图脸缩到 24×29、把所有帧装进 32×32 格子,输出 faces.png 和掉血档位 manifest。经典图块每个表情存五档血量(100/80/60/40/20 百分比),三个掉血档用 100/60/20。构建过程会断言生成的动画不混用血量档位,避免一段动画中途换血腥程度。
实现要点¶
index.js(Host 侧)把assets/以只读方式挂到/clippy-companion/assets/<pack>/...,带路径穿越、扩展名和内容类型检查。client.js(Client 侧)在conversation.input.dock注册一个隐藏 probe,用它量出会话列,并把contextPressure和inbox投影、会话活动(运行中、当前工具、最近一次工具结果、待输入、排队消息)传给同伴;同伴渲染在shell.overlay,设置里那一行注册在settings.general.item。- 图块帧靠单张 sheet 上的
background-position位移绘制,时序直接读各 pack 的sprite-data.json。
package.json 里 dsh.client 声明 "platform": "web"、"immediately": true,注入 @deepseek-ai/dsh-client-ui-conversation,版本 1.5.0,许可证 MIT。
适用场景与注意¶
适合在桌面 / Web 端常驻聊天窗口、想直观看到后台在跑什么、并且不介意界面多一个小像素人的人。想自定义皮肤或加表情包的,README 的 pack 说明已经够用。
几件需要注意的事:
1、插件以当前 dsh 进程的权限运行,能接触到会话内容。安装前先把源码和许可证看一遍(本包许可证为 MIT),不要只凭目录页简介就全局启用。
2、星标为 0,维护者是个人账号,更新节奏没有保证。需要长期依赖的话,建议直接把仓库拉到本地改造,走本地目录安装。
3、它不是官方产物。目录站是独立站点,与 DeepSeek / 幻方没有官方从属关系。
4、contextPressure 等数据来自宿主投影,换版本后如果行为异常,先检查插件的注入点是否仍然匹配。
小结¶
这个插件的价值不在功能复杂度,而在于把会话状态变成屏幕上可见的东西,同时把皮肤包的接口暴露得很清楚:一张按 32×32 格子排布的图块加一份 preset.json 就能换一个造型,无需改 Host。适合愿意自己折腾视觉效果的 DSH 用户。
目录页:https://www.skillhub.cn/plugins/extreme-russian-dsh-fandom/dsh-clippy-companion
仓库:https://github.com/extreme-russian-dsh-fandom/dsh-clippy-companion