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

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

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

小夜