DeepSeek Harness Hub
← 返回列表

dsh-plugins/dsh-thought-buddy

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
⚠ 装前注意

一个 DeepSeek Harness Web 插件,在“Deep…

基本兼容但装前注意:未发布到 npm registry,仅可从源码安装 · 最近上游提交 2026/9/3 · 已提供中文文档

A DeepSeek Harness Web plugin that puts a dynamic little buddy — a GrokBot-style animated avatar with a synchronized typewriter status line — right in front of the "Deep diving..." indicator. 在「Deep diving...」状态提示前,放一只动态小伙伴——GrokBot 风格动画头像,状态文字还会同步打字机变换。

综合分
37
GitHub 分
37
用户评分
★ Stars
7
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add dsh-plugins/dsh-thought-buddy
未发布到 npm registry,仅可从源码安装,改用 GitHub 源安装
数据截至 2026/9/18(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查⚠ 装前注意

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

npm 包@dsh-plugin/dsh-thought-buddy(未发布到 npm,仅可源码安装)
Node 引擎要求 >=20 · 基线 Node 22.19 满足
dsh CLI 依赖未声明 dsh 版本约束
入口文件main/exports/bin 已声明

未发布到 npm registry,仅可从源码安装

验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/18 09:27:11

用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-thought-buddy

一个 DeepSeek Harness Web 插件,在“Deep diving...”指示器正前方放置一个动态小伙伴——一个 GrokBot 风格的动画头像,并配有同步的打字机状态行。

DSH Plugin

dsh-thought-buddy 是 DeepSeek Harness Web GUI 的一个纯客户端插件。当模型正在工作时,显示 Deep diving... 的状态胶囊会长出一个 Grok 风格的小机器人头像:它会眨眼、以弹性形变切换表情、四处游移目光,并轻轻上下浮动——全部通过 requestAnimationFrame 实时绘制为 SVG,且零运行时依赖。每当头像切换表情时,状态文本都会以打字机效果重写自身(逐字符删除,然后打出下一个词)。

头像动画移植自 nasawz/GrokBot(一个纯 Flutter CustomPaint 组件)到 Web:全部 25 种表情 × 2 只眼睛 × 48 点眼环、18 种身体形状,以及 39 种状态及其表情/眨眼节奏均得以保留。

效果预览——在 Deep diving... 状态前方动画的 GrokBot 头像

功能特性

| 功能 | 描述 |
| --- | --- |
| GrokBot 头像 | 思考状态表情池 [8,16,14,17,5] 自动循环;表情之间弹性形变;320 毫秒眨眼(随机 3.5–7 秒间隔);球面转头投影 + 游移目光;轻柔的 1.7 秒呼吸浮动 |
| 表情同步打字机 | 每次表情切换时,状态文本通过打字机效果离开 Deep diving...(逐字符删除、暂停,然后打出下一个词),循环 55 个候选词(Accomplishing…Working),例如 Reticulating...;React 重新渲染永远不会覆盖它(文本 fiber 的子字符串从不改变,因此 React 会跳过) |
| Emoji 模式 | 循环 emoji 列表(默认 🤿 🫧 🌊 🐙 🔍 🧠 💭)的回退模式,每次切换时弹入 |
| 主题感知 | 遵循 prefers-color-scheme:浅色 #5b7fe5/#fffdf7,深色 #6689ea/#181a15(与 DSH 主题匹配) |
| 减少动态效果 | 在 prefers-reduced-motion: reduce 下,上下浮动和转头摆动被禁用;表情变化和眨眼仍然保留 |
| 自清理 | 一旦状态胶囊离开 DOM,动画立即停止;插入的节点在 React 重新渲染后仍然存在,如果被移除,会在下一次变更时重新断言 |

安装

复制下面的代码块并粘贴给你的 DSH 代理(此 Web GUI 中的助手)。代理会为你执行安装和验证——无需手动 npm 或编辑配置文件:

Install the @dsh-plugin/dsh-thought-buddy plugin into the profile I specify (or ask me if I didn't name one). The npm package name is @dsh-plugin/dsh-thought-buddy; use the GitHub source github:dsh-plugins/dsh-thought-buddy, or file: / link: for local development.

Steps:
1. Add the plugin dependency: dsh plugin --profile  add @dsh-plugin/dsh-thought-buddy (or the equivalent plugin-manager command for my profile).
2. Verify node_modules/@dsh-plugin/dsh-thought-buddy resolves and holds a built lib/ directory (at least lib/index.js and lib/client.js). The runtime has no dependencies; building the TypeScript sources needs the typescript devDependency (npm ci/npm install once). If the artifacts are missing, run npm run build in the plugin directory and re-add.
3. Make sure the profile manifest's dsh.profile.bundles includes @dsh-plugin/dsh-thought-buddy — the bundle patch (cordis.patch.yml) inserts the plugin row automatically at boot.
4. Do not start the profile — install and verify only, then report what you changed.

然后重启 dsh web,刷新页面,并向模型发送一条消息——小伙伴会出现在 Deep diving... 前面。所有运行时选项都通过 localStorage 设置(见下文);没有设置页面。

从本地检出安装(link:)

对于本地开发,通过 link: 依赖将插件接入 Web 配置文件(示例:C:\Users\Administrator\.dsh\profiles\web):

// package.json (profile)
"dependencies": { "@dsh-plugin/dsh-thought-buddy": "link:C:/path/to/dsh-thought-buddy" },
"dsh": { "profile": { "bundles": [ /* ... /, "@dsh-plugin/dsh-thought-buddy" ] } }

1. 构建产物:npm run build → 编译 TypeScript 并生成 lib/client.js + lib/index.js
2. 在配置文件中运行 pnpm install(可离线工作)
3. 重启 dsh web——客户端模块清单在启动时组合,因此新 bundle 需要重启
4. 刷新页面并向模型发送一条消息

配置(localStorage,重新加载时应用)

| 键 | 默认值 | 描述 |
| --- | --- | --- |
| dsh-thought-buddy.enabled | 1 | 0 禁用插件 |
| dsh-thought-buddy.mode | avatar | emoji 切换到 emoji 循环 |
| dsh-thought-buddy.size | 18 | 头像大小,单位为 px(8–64) |
| dsh-thought-buddy.emojis | 🤿 🫧 🌊 🐙 🔍 🧠 💭 | 以空格/逗号分隔的 emoji 列表(emoji 模式) |

// 控制台示例
localStorage.setItem('dsh-thought-buddy.mode', 'emoji')
localStorage.setItem('dsh-thought-buddy.size', '22')
location.reload()

开发

dsh-thought-buddy/
├── ref/GrokBot/            # 参考项目(被 git 忽略,只读)
├── src/
│   ├── index.ts            # 宿主半部分(空操作的挂载行)
│   └── client/
│       ├── data.ts         # 生成的类型化数据:25 个表情 × 2 只眼睛 × 48 个点,18 种形状,39 种状态
│       └── index.ts        # 客户端引擎:SVG 头像 + 打字机 + 观察器 + apply()
├── scripts/
│   ├── gen-data-lib.mjs    # Dart 解析 + data.ts 渲染辅助工具
│   ├── gen-data.mjs        # 从 ref/GrokBot 的 Dart 源码重新生成 data.ts
│   └── build.mjs           # 从 tsc 输出组装 lib/client.js(__ModuleLoader__ 契约)
├── test/verify.mjs         # 针对构建产物的无浏览器测试(SVG、节奏、打字机)
├── tsconfig.json           # 宿主半部分编译:src/index.ts → lib/(node ESM)
├── tsconfig.client.json    # 客户端半部分编译:src/client/.ts → .build/client/(普通脚本)
├── demo/                   # 本地预览(node demo/server.mjs → 4173)
└── cordis.patch.yml        # 打包补丁:插入 thought-buddy 行

npm install           # 仅一次 — 安装 typescript devDependency
npm run gen           # 刷新数据(在上游 GrokBot 数据变更后)
npm run typecheck     # 对两个半部分进行类型检查(不输出)
npm run build         # 编译 TS → lib/ + .build/client/,然后组装 lib/client.js
npm run verify        # 完整的无浏览器验证
node demo/server.mjs 4173   # 预览 http://127.0.0.1:4173/demo/demo.html(先运行 npm run build)

客户端半部分以 TypeScript“普通脚本”形式编写(没有 import/export,
因此类型和数据都保持在同一个全局作用域中)。tsc 将它们编译为普通
JS 到 .build/client/,然后 scripts/build.mjs 将这两个文件拼接进
window.__ModuleLoader__ 工厂——与之前相同的加载器契约。
data.ts 必须在 index.ts 之前求值(构建顺序是固定的)。

架构

- 宿主半部分:仅提供 cordis 打包挂载行(cordis.patch.yml 插入 thought-buddy),因此 client-modules 会发现 dsh.client 声明和 exports["./client"],在 /plugins/@dsh-plugin/dsh-thought-buddy/client.js 提供浏览器半部分。
- 客户端半部分:apply(ctx) 注册一个 MutationObserver,监视 [data-conversation-scroll] [role="status"] 中文本包含“diving”的胶囊元素;头像/打字机挂载在文本前方,并随胶囊元素的 DOM 生命周期存在。
- 动画:逐帧移植 Flutter 的 _GrokBotState._onTick —— 临界阻尼弹簧表达式变形(ω=7,1/120 子步长)、思考池表情切换、320 毫秒眨眼曲线、球形头部转向投影(asin/cos 深度剔除)、游移凝视;多边形坐标每帧写入 SVG 的 points 属性。
- 打字机:在胶囊文本节点上由定时器驱动的状态机。React 从不触碰该节点,因为文本 fiber 的 children 字符串始终是 "Deep diving..."(bail-out),与注入的头像节点完全一样。

⚠️ 两种不同的 inject:bundle 导出的 exports.inject 是 cordis 服务依赖(此插件只使用 ctx.effect,因此它必须是空数组——把包名放在那里会让 fiber 永远等待一个不存在的服务,启动会以 pending (waiting for service: ...) 失败);package.json 的 dsh.client.inject 是 客户端模块依赖声明(此插件不需要任何依赖,因此省略)。

链接

- 仓库:https://github.com/dsh-plugins/dsh-thought-buddy
- npm:https://www.npmjs.com/package/@dsh-plugin/dsh-thought-buddy

许可证

BSD-3-Clause。眼环几何、身体形状和状态节奏源自 nasawz/GrokBot(BSD-3-Clause,Copyright (c) 2026 nasawz),并在 LICENSE 文件中注明。

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

同作者(dsh-plugins)的其他插件

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群