前言¶
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