dsh-grok-buddy
Grok Bot's own face in your DSH sidebar: the GrokBot avatar shows each session's six runtime states — idle, working, waiting, blocked, thinking, done — with no extra UI. Color is project identity; motion is state.
What it is
Grok Bot's own face in your DSH sidebar: the GrokBot avatar shows each session's six runtime states — idle, working, waiting, blocked, thinking, done — with no extra UI. Color is project identity; motion is state.
How to install
Run this in the DSH web profile, then refresh the page.
$ dsh plugin --profile web add dsh-grok-buddy@0.2.2
DSH versions accepted
>=0.1.7-rc.1
Author and traction
devzer0o0 · ★ 2 · Updated 2026-11-10
About this plugin
dsh-grok-buddy
把 Grok Bot 本人那张脸,装进 DeepSeek Harness 的会话列表
每个会话在侧栏那一行,原来的彩色小圆点换成一只会呼吸的 GrokBot 头像。
它在思考、在跑工具、在等你点确认、失败了、还是刚干完 —— 看脸就知道。
= 22">
左边是 DSH 默认的彩色小圆点,右边是装上之后。位置、行高、槽位宽度都没变,只是圆点换成了一张脸。
---
这是什么
一句话:DSH 侧栏里每个会话的状态,由 Grok Bot 那张脸来演。
它没有另画一套图标,也不是随便找个 emoji 顶上去 —— 用的是 Grok Bot 自己的头像和表情:
一颗圆滚滚的 blob,两只眼睛贴在球面上,转头时会跟着透视变形、转到背面会消失;
表情切换是带弹簧的形变,平时还会随机眨眼。
它真的会动 —— 下面这张是从产品渲染器逐帧抓下来的(不是示意图):
目录
- [这是什么](#这是什么)
- [为什么是这张脸](#为什么是这张脸)
- [三层分开:状态 / 动作 / 表情](#三层分开状态--动作--表情)
- [六态判定(唯一语义)](#六态判定唯一语义)
- [颜色是身份,动作是状态](#颜色是身份动作是状态)
- [界面适配:不是只有侧栏那一种行](#界面适配不是只有侧栏那一种行)
- [安装](#安装)
- [刷新、重启与验收](#刷新重启与验收三件事不一样)
- [诊断(默认关闭)](#诊断默认关闭)
- [工作原理](#工作原理)
- [开发](#开发)
- [未完成与已知边界](#未完成与已知边界)
- [致谢与许可](#致谢与许可)
为什么是这张脸
Grok Bot 的设计文章把这件事讲得很清楚:他们要解决的不是「怎么再塞一个进度指示器」,
而是「怎么让头像本身承担状态」。
> We could have represented each state with a separate indicator, but that would
> have added another layer of UI for the user to interpret. Instead, we explored
> how much of the lifecycle the avatar itself could carry.
所以这里也照做:不新增任何 UI 元素,只把侧栏原本那个彩色小圆点换成一个会呼吸的头像。
会话行高保持 32px,头像画布从 20px 适度放大到 24px(边长增加 20%)。
画布包含彩带的安全边距,因此头像本体从约 13.3px 增至 16px,不是把彩带裁掉来放大脸。
前导位同步扩展;有定时任务时钟时按「24px 头像 + 2px 间隔 + 16px 时钟」并排,标题顺延。
24px 下思考单点约 4.5–5.4 CSS px;彩带保留官网小尺寸加粗与前后遮挡。
原生项目文件夹仍是 16px,不受会话头像尺寸调整影响。
三层分开:状态 / 动作 / 表情
这是本插件最容易被误解的地方,先讲清楚:
| 层 | 是什么 | 出现在哪里 |
| --- | --- | --- |
| 运行状态(runtimePhase / displayPhase) | 只有六种:idle / working / waiting / blocked / thinking / done | 接口、文档、读屏标签、data-dsgb-phase |
| 动作(motion) | 内部动画资源名:rest / spin / half-lidded / bang / tri-dot / orbit | data-dsgb-motion(明确标注是动画资源) |
| 图形构成(figure) | 这一态画的是什么:avatar / avatar+trail / exclamation / dots / avatar+orbit | data-dsgb-figure |
| 表情素材(expression) | 25 张眼型,只服务 idle / working / done 的眼睛造型 | 只在渲染引擎内部 |
所以:
- 素材库有多少条,不等于插件有多少种状态。 素材库里还有 proud、excited、
curious、sleeping 等二十多个预设,它们不是运行状态,也不再是六态动画的实现。
- 表情图里的名字,不等于运行状态。 [docs/faces.html](docs/faces.html) 里那些 sleeping /
waking / searching / curious / proud 只是 idle 的表情素材参考,不参与会话状态判定。
- 事实与标志位(selected / seen / consumed / stale)也不是状态。
六态判定(唯一语义)
实现在 [src/decision.js](src/decision.js),宿主与页面共用这一份,没有第二套优先级。
| 状态 | 中文 | 判定条件 |
| --- | --- | --- |
| idle | 空闲 | 默认;没有在途任务;或完成展示已结束/已被消费 |
| working | 正在处理 | 会话活跃,且当前任务还有未结束的工具调用 |
| waiting | 正在等待 | 会话活跃,且有未解决的审批、提问或计划评审 |
| blocked | 已阻止 | 当前任务已被确认因错误而停止,且该停止尚未被真实恢复或新一轮取代;提醒被看过并切走后展示退回 idle(事实仍为 blocked) |
| thinking | 思考 | 会话活跃,处于模型请求/推理/生成阶段,且无更高优先级事实 |
| done | 完成 | 当前轮有明确的成功终态,且完成展示仍活跃、未被消费 |
blocked = 任务级错误停止(不是「有错误」)
一句话定义:**当前会话的当前任务已被确认因错误停止执行,且这个停止事实还没有被
真实恢复执行或新一轮任务取代。**
它明确不表示:出现过错误 / 有一条 error 记录 / 某个工具调用失败 / 模型正在自动重试 /
暂时没有输出 / 网络看起来异常 / 用户主动取消。
事实分三层,代码里也分开存([lib/fold.js](lib/fold.js)):
| 层 | 字段 | 作用 |
| --- | --- | --- |
| A. 错误诊断 | facts.error | 某次工具/请求/重试报了什么错。只用于日志与 tooltip,不参与判定 |
Compare in this category
The five most-starred plugins in the same category.
| Plugin | Author | Stars | Version | Updated |
|---|---|---|---|---|
| open-design | nexu-io | 106.9K | 0.25.1 | 2026-11-10 |
| huashu-design | alchaincyf | 29.1K | 3.3.0 | 2026-11-10 |
| dsh-web | zhu1090093659 | 10.3K | 0.0.1 | 2026-11-10 |
| baoyu-design | JimLiu | 6.3K | 2.12.2 | 2026-11-10 |
| dsh-wallpaper-engine | elysia395 | 6.3K | 1.4.2 | 2026-11-10 |