Bundle
dsh-thinking-notifier
DeepSeek Harness desktop popup plugin: shows AI thinking status in a bottom-right always-on-top card, alerts on permission requests and completion, with a DeepSeek-style UI
- Source
- 6-debug-6
- stars
- 4 stars
- License
- MIT
- Updated
- Updated 7 days ago
Readme
# dsh-thinking-notifier
A [DeepSeek Harness (DSH)](https://github.com/deepseek-ai/deepseek-harness) plugin that shows a small **always-on-top desktop popup** in the bottom-right corner of your screen. It mirrors the AI's thinking status in real time and alerts you when the AI requests permission or finishes thinking — even when you are working in other apps, browsers, or virtual desktops.
> 中文说明见 [README.zh.md](./README.zh.md)
## Features
| State | Popup | Sound |
| --- | --- | --- |
| AI is thinking | DeepSeek-blue pulsing dot + `AI 正在思考…` + elapsed time. Auto-collapses to a 25 px slim right-edge tab after 5 s; hover or click the tab to expand it again | none |
| AI requests permission | Amber pulsing dot + `AI 请求权限` + session/tool name | system Exclamation |
| AI finished thinking | Green dot + `AI 已完成思考`, auto-hides after 12 s | system Asterisk |
| Idle | Hidden | none |
- DeepSeek-style dark card (`#1E2235` / `#4D6BFE`).
- Always-on-top frameless window, bottom-right, visible over any application.
- Auto-collapses into a 25 px slim right-edge tab after 5 s while the AI is thinking, so it stays visible without blocking desktop controls.
- Hover or click the edge tab to expand it manually; new turns, permission requests, and completions expand it automatically.
- Click the **X** button to dismiss the current popup; the next new turn, permission request, or completion will show it again.
- Multiple sessions are summarized automatically.
- The popup process stays alive while DSH runs; it exits ~15 s after the status endpoint becomes unreachable.
- No browser extension required; the popup is a native desktop window.
## How it works
```
DSH process
└─ lib/index.js (host plugin)
├─ listens to session/event: turn/start, turn/end, approval/asked, approval/decided, session/title
├─ rebuilds existing session state from ctx.sessions.list() at startup
├─ serves a local status JSON at http://127.0.0.1:7389/status
└─ launches the desktop popup process
├─ Windows: desktop-popup.ps1 (PowerShell + WPF)
└─ macOS/Linux: desktop-popup.py (Python 3 + tkinter)
Desktop popup
├─ polls /status every second
├─ renders the DeepSeek-style card (running/pending/done/idle)
├─ plays a system sound on pending/done transitions
├─ auto-collapses to the right edge while running; expands on new states
└─ hides while idle, keeps running in the background
```
## Installation
### From a local checkout
```sh
cd dsh-thinking-notifier
dsh plugin --profile web add .
# Restart DSH web so the host plugin is loaded
dsh web
```
### From npm (once published)
```sh
dsh plugin --profile web add dsh-thinking-notifier
dsh web
```
### Uninstall
```sh
dsh plugin --profile web remove dsh-thinking-notifier
```
## Configuration
| Environment variable | Default | Description |
| --- | --- | --- |
| `DSH_THINKING_NOTIFIER_PORT` | `7389` | Local status server port. If busy, the next 10 ports are tried. |
## Requirements
- DeepSeek Harness Web UI (`dsh web`)
- Node.js `^22.19.0 || >=24.0.0`
- Windows: Windows 10/11 with PowerShell 5.1+ (built in)
- macOS/Linux: Python 3 with `tkinter`
## Project structure
```
dsh-thinking-notifier/
├── lib/
│ └── index.js # host plugin: status service + popup launcher
├── desktop-popup.ps1 # Windows native popup (PowerShell + WPF)
├── desktop-popup.py # macOS/Linux native popup (Python 3 + tkinter)
├── cordis.patch.yml # DSH bundle patch for persistent mounting
├── package.json # npm package + dsh.bundle declaration
├── README.md # English readme
├── README.zh.md # Chinese readme
├── CHANGELOG.md
├── CONTRIBUTING.md
└── LICENSE
```
## Troubleshooting
Debug logs are written to:
- `~/.dsh/tn-plugin.log` — host plugin lifecycle and launcher status.
- `~/.dsh/tn-launcher.log` — PID of the popup process created by the launcher.
- `~/.dsh/tn-popup-debug.log` — popup script lifecycle and polling errors.
If the popup does not appear after restarting `dsh web`, check those logs first.
## License
[MIT](./LICENSE)
Install
dsh plugin --profile web add github:6-debug-6/dsh-thinking-notifier#d97ab09f21568e22b47e02d036ef678212d2d137
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-thinking-notifier from the hub