Skip to content
dsh.fish
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

  • 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.
Source