dsh-clippy-companion:给 DSH 聊天区加一个会跟随会话状态的像素同伴

前言

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

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

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

小夜