Bundle
dsh-think-phrases
Top-right widget counting 'let me' / 'we' / 'let's' / 'I'll' across all reasoning chains of the current conversation.
- Source
- deathbook
- stars
- 1 stars
- License
- MIT
- Updated
- Updated 2 days ago
Readme
# dsh-think-phrases
> 🤖 本项目由 **DeepSeek V4 Flash Max** 完全自主生成。
🔗 GitHub:<https://github.com/deathbook/dsh-think-phrases>
---
右上角思维链短语统计插件,适用于 **DSH Desktop** 与普通 `dsh web` 环境。
统计当前会话所有思维链(reasoning blocks)中
`let me` / `we` / `let's` / `I'll` 的出现次数,
便于快速查看当前对话的 DeepSeek-V4-Pro-0813 模型是否进入灰测思维链。
## 安装
```bash
# npm(推荐)
dsh plugin --profile desktop add dsh-think-phrases
# 或 GitHub
dsh plugin --profile desktop add github:deathbook/dsh-think-phrases
# 源码安装(本地开发 / 调试)
git clone https://github.com/deathbook/dsh-think-phrases.git
cd dsh-think-phrases
pnpm install
# 在 profile 的 dependencies 中 link 到本地目录
```
安装后重启 DSH 宿主。插件会通过 `cordis.patch.yml` 自动挂载到 profile 的 bundle 组合中。
## 兼容性
| 环境 | 支持 |
| --- | --- |
| DSH Desktop 2.x | ✅ |
| 普通 `dsh web` / `dsh console` | ✅ |
| DSH 上游(无 Desktop service) | ✅ |
本插件**不依赖** Desktop 专用 service(`desktopProfiles`、`desktopPnpm`、`desktopWindow`),
在同一套源码下同时兼容 Desktop 与普通 DSH 环境,符合
[DSH 插件生态倡议书](https://github.com/anywhere-labs/deepseek-harness-desktop/blob/master/docs/plugin-ecosystem.md)
的三条原则:**组合优先 · 声明清晰 · 兼容优先**。
## 功能
- 统计思维链中的高频短语/单词:
- `let me`
- `we`(匹配表达"我们"的 `we`,包括 `we're`、`we'll`、`we-need`、`pre-we` 等;不匹配 `weird`、`sweet` 等单词里偶然出现的 `we`)
- `let's`
- `I'll`(同时统计全写 `I will`)
- 全部忽略大小写。
- 只统计思维链(reasoning)文本,不统计可见正文与用户消息。
- 面板实时显示每项计数和总计。
## 设计
由可复用模板 `dsh-plugin-template` 派生,采用双半边架构(符合 DSH 插件生态的
组合优先原则):
- **宿主半边** `src/index.ts` + `src/projection.ts` — 注册 `thinkPhrases` 会话投影:
投影框架对**完整会话日志**逐条执行 `apply`(仅统计 `assistant/message` 事件的
reasoning 块,支持 surface replace 回退),不受客户端窗口截断影响。
- **客户端半边** `src/client/` — 挂载到官方 slot `conversation.session.header.utilities`
(会话头部右侧工具区),通过 `useProjection('thinkPhrases')` 实时读取计数;
丸粒按钮显示总数,点击拉出面板、点外部或 Esc 收起。
## 计数规则
| 短语 | 正则 | 说明 |
| --- | --- | --- |
| `let me` | `/\blet\s+me\b/gi` | |
| `we` | `/\bwe\b/gi` | 匹配表达"我们"的 `we`,含 `we're`/`we'll`/`we-need`/`pre-we`;不匹配 `weird`/`sweet` 等 |
| `let's` | `/\blet(?:['']s|s)\b/gi` | 含直/弯引号与无引号变体 |
| `I'll` | `/\bi(?:[''']ll|\s+will)\b/gi` | 含 `I will` 全写及大小写/直弯引号变体 |
忽略大小写;只统计思维链(reasoning)文本,不统计可见正文与用户消息。
## 目录结构
```text
dsh-think-phrases/
├── src/
│ ├── client/
│ │ ├── ThinkStatsWidget.tsx # 客户端统计面板组件
│ │ ├── index.ts # 客户端插件入口(导出 inject + apply)
│ │ └── think-stats.module.css # 面板样式
│ ├── index.ts # 宿主插件入口(导出 name + apply)
│ └── projection.ts # thinkPhrases 会话投影与计数规则
├── .gitignore
├── LICENSE # MIT
├── README.md
├── cordis.patch.yml # bundle 挂载声明
├── package.json
├── pnpm-lock.yaml
├── tsconfig.json
└── tsdown.config.ts
```
## 构建
```bash
pnpm install
pnpm run build # lib/index.js (宿主) + lib/client.js (浏览器) + lib/types
```
构建产物 `lib/` 随包发布(`package.json` `files` 字段),但不在 Git 仓库中跟踪(`.gitignore`)。
## 安装到 profile
将 `dsh-think-phrases` 加入 profile 的 `dependencies`(`link:`/`file:`/工作区即可),
并在 `dsh.profile.bundles` 追加 `"dsh-think-phrases"`,然后 `pnpm install` 并重启 dsh 宿主
(插件集合与客户端引导图均在启动时组合)。
## 标签
DSH 插件生态通用标签:
- `dsh`
- `dsh-plugin`
- `deepseek`
- `harness`
- `reasoning`
- `stats`
## 声明
本插件遵循 [DSH 插件生态倡议书](https://github.com/anywhere-labs/deepseek-harness-desktop/blob/master/docs/plugin-ecosystem.md) 的三条原则:
- **组合优先**:通过官方 slot(`conversation.session.header.utilities`)和 service(`sessionProjections`、`slots`)组合能力,不覆盖其他插件的内部实现。
- **声明清晰**:明确声明依赖的 `inject`(`slots`、`sessionProjections`),不依赖运行时巧合。
- **兼容优先**:同时在 Desktop 与普通 DSH 环境下可用,不破坏已有组合。
## License
[MIT](./LICENSE)Install
dsh plugin --profile web add github:deathbook/dsh-think-phrases
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-think-phrases from the hub
- This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.