化口水为乐趣,把大肥鱼流的口水变成游戏连击!
31.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/8 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add liceses/dsh-hmm-wait该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · tool
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 27 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(dependency_conflict · 2026/10/30) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意未发布到 npm registry,仅可从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-hmm-wait(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/10 15:48:33
安全扫描自动 · 静态分析源码v2.7.0🟢 扫描:未发现敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。
发起外部网络请求
查看扫描证据(共 2 处,展示前 2 条)
- 发起网络请求src/client/api.ts:48
const response = await fetch(EVENTS_PATH, { headers: { accept: 'text/event-stream' } }) - 发起网络请求src/client/api.ts:142
const response = await fetch(TEST_PATH, {
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/schemastery@deepseek-ai/dsh-settings@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-llm@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-settings-plugins给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 口水变游戏连击
README
由 DeepSeek 最新模型翻译生成dsh-hmm-wait — 思维链弹幕插件
English: A DSH plugin that taps the model's streaming reasoning and flies configurable danmaku across the web GUI whenever it says "hmm", "wait" or "let me".
推理模型「想事情」的那几十秒里,界面上是空的 —— 你只能干等。这个插件把那段空白变成动静:模型思维链(reasoning)里一出现 hmm / wait / let me,GUI 上就飞过一条弹幕;连续命中还会在角上堆起一个街机风的连击计数。
弹幕飞过 + 连击 HUD 效果实拍:左上角一条弹幕正在飞过(hmm… 让我再想想),右下角是连击计数 HUD(×1 / HMM)。这张是用配置卡片上的「测试弹幕」按钮触发的 —— 该按钮不需要模型参与,是插件自带的验证入口;飞过时的位置、速度、描边、抖动都按左侧那份配置生效。
展开完整文档(README 剩余 1 节)
dsh-hmm-wait — 思维链弹幕插件
English: A DSH plugin that taps the model's streaming reasoning and flies configurable danmaku across the web GUI whenever it says "hmm", "wait" or "let me".
推理模型「想事情」的那几十秒里,界面上是空的 —— 你只能干等。这个插件把那段空白变成动静:模型思维链(reasoning)里一出现 hmm / wait / let me,GUI 上就飞过一条弹幕;连续命中还会在角上堆起一个街机风的连击计数。
弹幕飞过 + 连击 HUD 效果实拍:左上角一条弹幕正在飞过(hmm… 让我再想想),右下角是连击计数 HUD(×1 / HMM)。这张是用配置卡片上的「测试弹幕」按钮触发的 —— 该按钮不需要模型参与,是插件自带的验证入口;飞过时的位置、速度、描边、抖动都按左侧那份配置生效。
它给你三样东西:
| 你在界面上看到 | 什么时候出现 | 归谁管 |
| 弹幕飞过(默认右→左、顶部、黄字黑描边) | 思维链流里命中触发词,且过了句首 / 冷却 / 限流三道闸 | 触发词 · 配置 |
| 角上的 Combo HUD(×N 弹跳、分级变色、里程碑播报) | 连续命中:两次间隔 ≤ comboWindowMs 就连击 +1 | 配置 |
| 一条测试弹幕 | 你点配置卡片上的「测试弹幕」 | 不需要模型参与 |
它不改变模型。 tap 挂在官方 llm/stream waterfall 上,是观察者:不改写 chunk、不吞 chunk,自己的检测抛错也只吞自己(src/index.ts:181-207)。总开关关掉后 host 连监听都不挂,零开销。
一次命中在界面上是什么样(文字示意)
┌─ DSH Web GUI ───────────────────────────────────────────────┐
│ │
│ hmm, wait — 这个报错看着不像网络问题… ← 弹幕飞过 │ │ (触发词所在句,截断到 maxContextChars 字) │ │ │ │ ┌───────────┐ │ │ │ ×3 │ │ │ │ COMBO │ │ │ │ wait │ │ │ │ BEST 7 │ │ │ └───────────┘ │ └─────────────────────────────────────────────────────────────┘
弹幕层是 shell.overlay 上的一层全屏 fixed 覆盖物(pointer-events: none), 点击穿透,不挡你操作;文字与位置全部来自设置快照,改一下立刻生效。
快速开始
前置条件(先确认这三条,再动手):
1. dsh 已装好并能起 Web GUI(dsh 在 PATH 上)。本插件是 dsh 插件,不是独立应用。
2. Node ≥ 22.18(或 ≥ 24.11)—— 出处:package-lock.json 里构建链的 engines.node
(tsdown@0.22.2 / rolldown-plugin-dts / dts-resolver 均为 ^22.18.0 || >=24.11.0)。
package.json 没有 engines 字段,所以这条不会被 npm 强制拦住,只会在构建时报错。
(本机 Node v24.12.0,npm test 实跑通过。)
3. 装完 host 半边要重挂插件才生效;只改浏览器半边时刷新页面即可。
git clone https://github.com/liceses/dsh-hmm-wait.git && cd dsh-hmm-wait
npm install && npm run build
dsh plugin --profile web add link:$(pwd)
Windows:最后一行把 $(pwd) 换成绝对路径,例如
dsh plugin --profile web add "link:D:\src\dsh-hmm-wait"。
从 Release 的 tgz 装:dsh plugin --profile web add ./dsh-hmm-wait-0.1.0.tgz(走 file: 依赖)。
装配细节(bundle patch / dsh.client 声明 / 卸载)见 docs/ARCHITECTURE.md。
跑起来之后你会看到:侧栏 「插件」→「已安装」→「查看 hmm-wait」,配置卡片默认展开(defaultOpen),字段就是下面配置项一览那 25 个。
先别急着发消息 —— 点卡片底部的 「测试弹幕」:host 会广播一条模拟弹幕,弹幕层立刻飞一条。
这一步不需要模型、不需要思维链,用来确认「装上了、链路是通的」。
确认通了,再给模型发一条需要「想一想」的任务;思维链里出现触发词时,弹幕就会飞。
目录
| 想了解 | 看这里 |
| 它到底在听什么词、能不能自己加 | 触发词 |
| 25 个配置字段的默认值与含义 | 配置项一览 |
| 从流到屏幕的完整链路 | 工作原理(30 秒版) |
| 哪个文件干什么 | 文件地图 |
| 弹幕不出现怎么办 | 排障 |
| 有什么做不到的 | 已知限制 |
| 想改代码 | 开发 |
| 凭什么说它工作 | 验证记录 |
| 许可证 | 许可 |
触发词:它到底在听什么
默认三个触发词,都写在 src/schema.ts 的 DEFAULT_CONFIG.triggers 里:
| 触发词 | 类型 | 为什么是它 | 不会误命中 |
| hmm | 单词 | 英文思维链里最常见的「卡一下」 | shmmmer(前面是字母) |
| wait | 单词 | 自我纠正的起手式 | await(前面是字母) |
| let me | 含空格的词组 | 重新规划的开场 | —— |
这三条不是「关键词表」,是流式扫描:chunk 把词切成两半也认得(hm + m, let me check 照样命中 hmm)。回归测试 R5a/R5b 就是盯这件事的。
判定规则(四道闸,按顺序)
| 闸 | 规则 | 源码 | 效果 |
| 1. 词边界 | (?:^\|[^\p{L}\p{N}])(触发词) | src/detect.ts:46-48 | 前置不能是字母/数字 → await 不触发 wait |
| 2. 匹配位置 | sentence-start:触发词之前(自最近边界 \n。!?!?;; 起)只能有空白或引号;anywhere:任意位置 | src/detect.ts:58-67 | 默认只认句首/段首,避免一句里到处乱弹 |
| 3. 冷却 | 同一触发词在 cooldownMs 内只弹一次 | src/detect.ts:139-144 | 防流式 chunk 把同一个词重复触发 |
| 4. 限流 | maxPerSecond 每秒滑动窗口,全局限流 | src/detect.ts:77-92 | 防思维链刷屏时弹幕炸屏 |
命中后还会重置句子缓冲,所以同一句不会弹第二次(src/detect.ts:152)。
另外每路 llm/stream 各建一个 detector 实例,句子状态不跨请求泄漏(src/index.ts:188)。
几个真实例子(都来自 scripts/run-detector-tests.mjs 的断言):
| 思维链文本 | 命中? | 为什么 |
| 明白了。wait,我再想想 | ✅ wait | 句首 |
| 好的,注意 wait,我看看 | ❌ | 句中出现,默认模式不认 |
| 第一步完成。\nwait a second,好了 | ✅ wait | 换行也算句子边界 |
| “wait,让我想想” | ✅ wait | 句首只允许空白/引号,中文引号算引号 |
| we await the result | ❌ | 词边界挡住 |
| 注意 wait。然后 | ❌ | 边界在触发词之后,不算句首 |
能自己加吗?能,但只支持字面量
面板上有一行 「触发词(逗号分隔)」 输入框(src/client/panel.tsx:217-225):
- 英文逗号 , 和中文逗号 , 都能当分隔符,两头空白会被去掉,空项忽略(panel.tsx:54-59);
- 支持含空格的词组(let me 就是),所以能加 hold on、等一下 这类;
- 不支持正则:每个触发词在编译前都会过 escapeRegExp(src/detect.ts:38-40), . 进去就是字面的 .。想写正则触发词得改源码 —— 见 docs/ARCHITECTURE.md §4.1(那里写了怎么把 triggers 的语义放开成正则片段);
- 输入框清空后点保存会回退成默认三个词(panel.tsx:143),不会变成「没有触发词」。
中文触发词也能用:嗯 配 sentence-start 在 好的,接下来。嗯,我想想 上正常命中(测试 R13)。
配置项一览
全部 25 个字段,默认值来自 src/schema.ts 的 DEFAULT_CONFIG,面板标签与控件范围来自 src/client/panel.tsx。配置命名空间是 dsh-hmm-wait,host 侧注册为 applies: 'live',所以保存即生效,不用重启。
触发与节奏
| 字段 | 类型 | 默认 | 面板标签 | 说明 |
| enabled | boolean | true | 开关 | 总开关。关掉后 host 卸掉 llm/stream 监听(不是空转),弹幕层也清屏 |
| triggers | string[] | ['hmm', 'wait', 'let me'] | 触发词(逗号分隔) | 只支持字面量,自动正则转义 |
| match | sentence-start \| anywhere | sentence-start | 匹配位置 | 默认只认句首/段首(推荐);anywhere 认任意位置 |
| caseSensitive | boolean | false | 大小写敏感 | 关掉时 Hmm / HMM 也命中(只对英文触发词有意义) |
| cooldownMs | number | 5000 | 触发冷却(ms) | 同一触发词的防重复间隔;面板范围 500–120000 |
| maxPerSecond | number | 3 | 全局限流(条/秒) | 每秒最多推几条;面板范围 1–30 |
弹幕外观与动效
| 字段 | 类型 | 默认 | 面板标签 | 说明 |
| direction | 4 枚举 | right-to-left | 流动方向 | right-to-left / left-to-right / top-to-bottom / bottom-to-top |
| speed | number | 120 | 速度(px/s) | 飞行时长 = 实际距离 ÷ speed;面板范围 20–600 |
| zone | top \| bottom \| full | top | 显示区域 | top/bottom 各占视口高度 40%,full 占 96% |
| fontSize | number | 18 | 字号(px) | 同时决定轨道行高(fontSize × 1.7)与轨道条数;面板范围 10–64 |
| color | string | #ffd866 | 文字颜色 | CSS 颜色,面板是取色器 |
| opacity | number | 0.92 | 透明度 | 面板范围 0.05–1 |
| shake | boolean | true | 抖动提醒 | 出现瞬间左右抖一下,用来"一眼注意到" |
| shakeIntensity | number | 4 | 抖动幅度(px) | 面板范围 1–20;抖动时长随速度缩放(0.25–0.7s) |
| maxOnScreen | number | 12 | 同屏上限 | 超出时挤掉最旧的(src/client/state.ts:84);面板范围 1–50 |
| showContext | boolean | true | 弹幕文本 | 触发词所在句 / 仅触发词 |
| maxContextChars | number | 80 | 文本最大字符 | 超出截断并加 …;面板范围 8–200 |
| fontFamily | string | ''(空) | 弹幕字体 | 留空 = 用内置风格化字体栈 'Arial Black', Impact, 'Segoe UI', 'Microsoft YaHei', sans-serif(danmaku.tsx:149-152) |
| shadow | boolean | true | 弹幕框阴影 | 关掉 = 外阴影、黑描边、深色背景块一起去掉(danmaku.tsx:154-159) |
Combo 连击 HUD
| 字段 | 类型 | 默认 | 面板标签 | 说明 |
| comboEnabled | boolean | true | 连击计数 HUD | 连击 HUD 总开关 |
| comboWindowMs | number | 6000 | 连击窗口(ms) | 两次命中间隔超过它 → 连击中断;面板范围 1000–60000 |
| comboPosition | 4 枚举 | bottom-right | HUD 位置 | bottom-right / bottom-left / top-right / top-left |
| comboMilestones | boolean | true | 里程碑播报 | 连击达标后全屏播一句(文案见下) |
| comboPop | boolean | true | 中央跳字 | 每次连击更新,屏幕中央弹一下 ×N COMBO |
| comboSound | boolean | true | 连击音效 | Web Audio 现场合成,零音频文件;浏览器未交互过时静默跳过 |
Combo HUD 的具体表现
连击数由 host 侧状态机算(src/combo.ts),挂进程级根上下文,所以刷新页面、热重载、重装插件都不丢;浏览器只负责画。
| 连击数 | 分级 | 颜色(深色主题 / 浅色主题) |
| 1–4 | tier 1 | #f2f2f2 / #ffffff |
| 5–9 | tier 2 | #ffd866 / #ffd93d |
| 10–19 | tier 3 | #ff9f43 |
| ≥ 20 | tier 4 | #ff4d4f / #ff3b3b(弹跳更快) |
里程碑文案(src/client/combo.tsx:18-24):10 热身完毕! · 20 脑内风暴! · 30 CPU 燃烧中! · 50 模型宕机边缘! · 100 AI の 沉思极限!
一个要说清楚的实现细节:代码是「连击数 ≥ 某档阈值就播报,文案取已达到的最高档」,不是「只在 10 的倍数播报」——combo.tsx:17 的注释与 docs/ARCHITECTURE.md §2.3 的"×10/×20/…"都写得比实际严格。
行为以 milestoneText()(同文件 35-41 行)为准。
工作原理(30 秒版)
一句话:它监听模型流式输出里的 reasoning-delta 分片,扫触发词,命中就把一条事件推给所有打开的页面,页面负责画。
模型流式输出(dsh-llm 的 llm/stream waterfall) │ │ chunk: { type: 'reasoning-delta', index, text } ▼ ┌───────────────────────────────────────────────────────────────┐ │ host 半边(node 进程) │ │ │ │ 观察者 tap ── 逐 chunk 原样透传,顺手扫 reasoning-delta │ │ │ │ │ ├─ 每路流一个 Detector(句子状态互不污染) │ │ │ ├─ 词边界 (?:^|[^\p{L}\p{N}])(触发词) │ │ │ ├─ 句首判定 sentence-start / anywhere │ │ │ ├─ 冷却 同一触发词 cooldownMs 内只弹一次 │ │ │ └─ 限流 maxPerSecond 每秒滑动窗口 │ │ │ │ 命中 │ │ │ ▼ │ │ ├─ Combo 状态机(挂 ctx.root,进程级,热重载不丢) │ │ │ │ DanmakuEvent { id, ts, trigger, │ │ │ │ text, combo, │ │ │ ▼ comboMax, sessionId}│ │ └─ SSE Hub(环形缓冲最近 50 条;新连接立即补发) │ │ │ │ │ webServer 路由:GET /api/dsh-hmm-wait/events (SSE 订阅) │ │ GET /api/dsh-hmm-wait/stats (诊断) │ │ POST /api/dsh-hmm-wait/test (测试弹幕) │ └────────────────────────────┬──────────────────────────────────┘ │ SSE: event: danmaku / ping ▼ ┌───────────────────────────────────────────────────────────────┐ │ 浏览器半边(dsh Web GUI) │ │ shell.overlay(全屏 fixed、点击穿透) │ │ ├─ 弹幕层:按 id 分轨道 → Web Animations 飞行 → 抖动 │ │ └─ Combo HUD:×N 弹跳 / 分级变色 / 里程碑 / COMBO END │ └───────────────────────────────────────────────────────────────┘
四件事值得单独说:
- 事件源:llm/stream 是 dsh-llm 的官方 waterfall 事件,每次流式调用都会走
ctx.waterfall(llm, 'llm/stream', options, next),监听器签名 (options, next) => stream。
本插件返回的是 next() 的包装流,逐 chunk yield 原样透传,检测逻辑全在 try/catch 里。
chunk 形状只做鸭子类型判断(type === 'reasoning-delta' 且 text 是字符串),不 import dsh-llm 的运行时符号。
- 推送:SSE(不是 EventSource,用 fetch + ReadableStream 手解帧,兼容性更好)。
断线 1s 重连;45s 收不到任何数据(含 30s 心跳 ping)判定半开、主动掐断重连;页面从后台回前台立即查一次。重连时 host 会把环形缓冲里的最近 50 条补发,客户端按事件 id 去重(保留最近 500 个 id),所以不会重复弹。
- 配置:host 注册 dsh-hmm-wait settings 命名空间(schemastery schema,applies: 'live');浏览器半边 ctx.settingsScope.bind({ namespace }) 订阅,把快照镜像进模块 store,弹幕层与 HUD 通过 useSyncExternalStore 消费。弹幕订阅与配置镜像解耦 ——配置链路卡住也不会导致"页面活着但弹幕全无"。
- 连击在 host 算:DanmakuEvent 自带 combo / comboMax,浏览器纯渲染。
所以连击状态跨刷新、跨重连、跨插件热重载都在。
文件地图
| 路径 | 作用 |
| src/index.ts | host 入口:settings 注册 + llm/stream tap(可动态挂/卸)+ 三条路由 |
| src/schema.ts | 配置类型 + DEFAULT_CONFIG + 命名空间常量(host/client 共享,零依赖) |
| src/schema-def.ts | schemastery schema(只给 host,避免 schemastery 被打进浏览器 bundle) |
| src/detect.ts | 流式触发检测器:词边界 / 句首判定 / 冷却 / 限流。纯函数、无依赖、可单测 |
| src/combo.ts | 连击状态机。纯逻辑、可单测 |
| src/protocol.ts | SSE 协议:DanmakuEvent 形状、三条路径、帧编码(host/client 共享) |
| src/routes.ts | SSE hub(订阅集合 + 心跳 + 最近 50 条环形缓冲)+ events / stats / test 路由 |
| src/client/index.tsx | 浏览器入口:注入 CSS、镜像配置、注册三个槽位 |
| src/client/danmaku.tsx | 弹幕层:轨道分配、按方向/视口算飞行距离、抖动 |
| src/client/combo.tsx | 街机风 Combo HUD:弹跳、分级变色、里程碑、COMBO END |
| src/client/panel.tsx | 配置卡片(25 个字段,编辑先暂存 → 保存/丢弃) |
| src/client/api.ts | SSE 订阅(1s 重连 + 45s 半开看门狗)+ 测试弹幕调用 |
| src/client/state.ts | 模块级 store:弹幕队列、combo 快照、配置快照(useSyncExternalStore) |
| src/client/audio.ts | 街机合成音效(hit / milestone / break),Web Audio,零音频文件 |
| src/client/styles.ts | 注入页面的 CSS(抖动 keyframes + 卡片 + HUD,深浅主题双色板) |
| src/vendor/dsh-plugin-config-slot.tsx | 配置面板注册适配层(逐字内置,见迁移文档) |
| cordis.patch.yml | bundle patch:向 profile roster 插入 id: hmm-wait 一行 |
| tsdown.config.ts | 双产物构建:host ESM + client CJS(__ModuleLoader__ 包裹) |
| scripts/run-detector-tests.mjs | 检测器回归测试(18 条断言,R1–R15) |
| scripts/build.sh | 构建入口(bash,dsh 插件工具链兼容) |
| docs/ARCHITECTURE.md | 开发文档:包结构、运行架构、装配、扩展指南、故障排查 |
| docs/dsh-0.1.6a2-plugin-config-panel-migration.md | 0.1.6a2 面板挂载点迁移的定位与实机验证记录 |
它长在哪(座位表)
| 面 | 槽位 | 说明 |
| 弹幕层 | shell.overlay(list, root, order 100) | 全屏 fixed、点击穿透 |
| Combo HUD | shell.overlay(list, root, order 120) | 同一层的第二个条目,位置四角可配 |
| 配置面板 | plugins.bundle.config(keyed, key=dsh-hmm-wait) | dsh 0.1.6a2 统一插件管理页里本插件自己的页面(侧栏「插件」→「查看 hmm-wait」);rc7 时代的 settings.plugin.item 槽位在 0.1.6a2 已被移除 |
排障
面板里找不到 Hmm-Wait 卡片
host 没装配上这一行。查两处:
dsh plugin --profile web ls # 确认 hmm-wait 行存在
以及 cordis.patch.yml 是否被当作 profile bundle 层应用(它通过 package.json 的 dsh.bundle.patch 字段生效)。装完 host 半边必须重挂插件,只刷新页面没用。
测试弹幕正常,但真实对话里一条弹幕都没有
测试弹幕走的是 POST 路由,绕过了检测器 —— 它只证明"SSE 链路通"。真实弹幕不出现,按顺序查:
1. 模型有没有吐 reasoning? 非推理模型(或关闭了思考)根本没有 reasoning-delta chunk,检测器拿不到输入。换个会输出思维链的模型试。
2. 触发词是不是在句首? 默认 sentence-start 只认句首/段首。
临时把「匹配位置」改成 anywhere 验证一下。
3. 冷却与限流是不是压住了? cooldownMs 默认 5000、maxPerSecond 默认 3。
4. 触发词是不是被词边界挡了? await 不会命中 wait。
连测试弹幕都不出现
SSE 订阅失败。打开浏览器 DevTools → Network,看 events 请求:
curl http://127.0.0.1:19387/api/dsh-hmm-wait/stats
{"ok":true,"subscribers":1,"connections":[…],"events":N,"ts":…}
subscribers 是 0 → 页面的 SSE 没连上(路由没注册,或代理吞了流式响应)。
events 一直是 0 → host 根本没广播(tap 没装上,或 enabled 是关的)。
改了配置没反应
- 卡片是编辑先暂存的:改完必须点 「保存」(顶部会出现「未保存」徽章)。
点「丢弃」会还原。
- 确认 host 侧 ctx.settings.register 成功(同一命名空间重复注册会报错)。
- 浏览器半边只刷新页面即可;host 半边改动要重挂插件。
和别的插件(比如重试类)一起用会不会打架
不会。tap 是观察者,多个监听器可以叠加;重试会重新触发流,冷却机制兜底。
已知限制
- 只对"会输出思维链的模型"有意义。 非推理模型、或把 thinking 关掉的会话里, reasoning-delta 不存在,本插件就只是"装了个安静的面板"。
- 只认字面量触发词。 正则触发词要改源码(src/detect.ts 的 escapeRegExp),面板做不到。
- 只监听 reasoning-delta。 最终回答正文里的 hmm 不会触发 —— 这是设计:弹幕的意义是「模型正在想」,正文阶段已经想完了。想加别的源(比如工具调用开始)见 docs/ARCHITECTURE.md §4.3。
- package.json 没有 engines 字段。 所以 Node 版本要求只写在文档里,
npm 不会拦住低版本 Node;真正的约束来自构建链(见快速开始)。
- peer 范围是 ^0.1.0-rc.7(= >=0.1.0-rc.7 且 <0.2.0)。0.1.x 内升级不用管;跨到 0.2 时 npm 会提示 peer 不匹配 —— 但插件运行时的依赖全部从宿主解析,不会因此装出第二份实例。
- Electron / file:// 形态下 SSE 是否可用取决于 client-connection 桥(docs/ARCHITECTURE.md §6 的仓库自述)。桥不支持流式时,功能静默降级:面板与配置照常,只是没有弹幕。
- 音效可能被浏览器自动播放策略拦掉。 Web Audio 需要用户交互过(sticky activation)才能
resume();被拦时静默跳过,不影响其他功能。
- 弹幕文本是思维链原文的片段。 它会在屏幕上显示模型思考时的那句话(截断到 maxContextChars)。介意的话把「弹幕文本」改成 仅触发词。
- 动画依赖 Web Animations API(element.animate),极老的浏览器内核不支持。
开发
npm run typecheck # tsc --noEmit(strict)
npm test # 检测器回归测试(18 条断言,R1–R15)
npm run build # tsc 出 d.ts + tsdown 出双 bundle(lib/index.js + lib/client.js)
npm pack # 产出可分发 tgz(files: lib/ + src/ + cordis.patch.yml)
bash scripts/build.sh # 等价入口(typecheck + build)
测试怎么跑起来的:scripts/run-detector-tests.mjs 直接 import '../src/detect.ts',不预先编译(靠 Node 的原生类型剥离),所以改完 detect.ts 立刻 npm test 就能看到结果。
断言覆盖:边界在触发词之后、句中不命中、句首/换行/引号句首、流式拆词、中文句子后的英文句首、 anywhere 模式、await 不误命中、同句双词只弹一次、冷却、限流、中文触发词、超长流防膨胀、缩进段首。
三个扩展点(细节见 docs/ARCHITECTURE.md §4):
| 想改什么 | 动哪里 |
| 触发词算法(同义词库 / 放开正则) | src/detect.ts(escapeRegExp 处放开)+ 补 run-detector-tests.mjs 断言 |
| 弹幕动效(新方向 / 新轨道策略) | src/client/danmaku.tsx 的 flight() / placement + src/schema.ts 的方向枚举 + schema union + panel.tsx 加控件 |
| 新事件源(比如工具调用也弹幕) | src/index.ts 再加一个 ctx.on(...),命中后走同一个 hub.broadcast;要区分来源就给 DanmakuEvent 加 kind |
浏览器半边的纪律:src/client/** 不能 import schema-def.ts(会把 schemastery 打进浏览器 bundle)。配置类型与默认值从 schema.ts 拿,schema 本体留在 host 侧。
热重载边界:SSE hub 与 combo 状态机挂在 ctx.root 上(APP_HUB_KEY / APP_COMBO_KEY),所以插件重装时已订阅的页面不会断、连击也不会归零;路由与样式跟随 fiber 的 ctx.effect 拆除。
docs/ARCHITECTURE.md §2.3 有卸载命令。
验证记录
| 事项 | 状态 | 出处 |
| 检测器回归测试 18 条断言 | 本机实跑通过(Node v24.12.0,npm test → ALL PASS) | scripts/run-detector-tests.mjs |
| 0.1.6a2 统一插件管理后配置面板正常渲染、字段与 ~/.dsh/settings.yaml 一致 | 仓库内记录的实机验证(记录时间 2026-09-18,环境 @deepseek-ai/dsh@0.1.6-alpha.2,profile web) | docs/dsh-0.1.6a2-plugin-config-panel-migration.md §三 |
| 0.1.6a2 的挂载点迁移根因(settings.plugin.item → plugins.bundle.config,键从命名空间换成组合包名) | 同一次定位的结论,含受影响插件全量清点 | 同上 §一 |
| 弹幕动效、Combo HUD 的观感 | 未在本机重跑带 reasoning 的真实对话去逐条核对 | —— |
本文档里所有字段默认值、枚举取值、面板范围、判定规则逐条对着源码写的,出处标在每张表旁边;命令全部来自仓库文件(package.json scripts、cordis.patch.yml 注释、 docs/ARCHITECTURE.md、scripts/build.sh)。
许可
BSD-3-Clause —— 声明见 package.json 的 license 字段。
仓库根目录没有 LICENSE 文件(GitHub 因此识别不到许可证,licenseInfo 为 null)。
要不要补一个 LICENSE 文件、版权署名怎么写,得仓库主人定 —— 本次改写没有代加。
相关
- docs/ARCHITECTURE.md —— 开发文档(包结构 / 运行架构 / 装配 / 扩展 / 排障)
- docs/dsh-0.1.6a2-plugin-config-panel-migration.md —— 0.1.6a2 插件配置面板迁移记录预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
liceses/dsh-hmm-wait
化口水为乐趣,把大肥鱼流的口水变成游戏连击!
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,330已汉化DeepSeek 客户端
74.5
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,636已汉化DSH
72.2
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,349已汉化DSH
71.6
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,311已汉化DSH
71.4
智能体运行框架路由HarnessRouter/harnessrouter
智能体 harness 的统一接口。
★ 3,984已汉化DSH
71.3
这是你的仓库?认领条目