# dsh-reminder ๐
English ยท ็ฎไฝไธญๆ
**A cross-window reminder plugin for DeepSeek Harness** โ while you work in any other window, it taps you on the shoulder the moment a task **finishes** or **waits for your approval**. Codex / WorkBuddy style.
---
## โจ Features
| ๐ฏ | Feature | Description |
|---|---------|-------------|
| ๐ข | Completion | Pops "Task completed" on every turn end, with session ยท duration and a green check icon |
| ๐ก | Approval | Pops "Waiting for your approval" with the tool name and an amber alert icon |
| ๐ฏ | Pops in any window | Notifies even while you work in other apps |
| ๐ฑ๏ธ | Click to return | Clicking focuses the DSH window and opens the session |
| โฑ๏ธ | Auto-dismiss | Gone in 3-5 s (adjustable) |
| ๐ต | Soft chime | A gentle two-note chime (D4โA4) โ nothing startling |
| ๐ | Deduplicated | Never pops twice for the same event |
| ๐ก๏ธ | Reminds, never acts | Never approves on your behalf |
---
## ๐ค Why
- ๐ด *Nobody calls you for approvals* โ the agent waits while you are away; now an amber popup tells you
- ๐ *Nobody tells you it's done* โ no completion signal before; now a green popup tells you
---
## ๐ Quick start
1. **Install**: `dsh plugin --profile web add ` (or `npm i dsh-reminder`), register `dsh-reminder` in the profile bundle list, restart the DSH web process
2. **Grant permission**: Settings โ Reminders โ "Enable & test notifications" โ Allow โ a test popup arrives instantly
3. **Enjoy**: Switch away and work โ the popups come to you
---
## โ๏ธ Settings
| Setting | Default | Description |
|---|---|---|
| Notification permission | unset | One-click grant + test popup |
| Approval reminders | On | Off = no approval popups |
| Completion reminders | On | Off = no completion popups |
| Duration | 3-5 s | Seconds before auto-dismiss |
| Failure alerts | Off (reserved) | Planned for v0.3 |
---
## ๐๏ธ Architecture
One package ships the **host Cordis plugin** and the **web client**:
- **host**: registers the settings namespace plus a plugin-owned Typert Remote (`reminder/getSettings` ยท `updateSettings`) โ plugin namespaces sit outside the web settings allowlist
- **client**: subscribes to the session list and conversation snapshots (turn/end, approval/requested arrive over the mux stream), pops via the Notification API with a Web Audio chime
- **Read-only**: never mutates DSH core behavior
---
## ๐ง Development
```bash
pnpm install
pnpm run typecheck # tsc --noEmit
pnpm test # node tests/unit/*.test.cjs (16 tests)
pnpm run build # esbuild: host ESM + single-file client CJS (ModuleLoader handshake) + tsc d.ts
```
- Artifacts: `lib/index.js` (host ESM), `lib/client.js` (client), `lib/types/` (.d.ts)
- Offline dev: no new dependencies; @deepseek-ai/* types and local esbuild/typescript come from `03_local/codes` (not in git)
---
## โ ๏ธ Known limits
- Chrome page notifications reject `actions` (ServiceWorker persistent notifications only) โ dismiss via auto-close or the hover โ
- Permission must be requested from a user gesture (browser policy) โ the settings button does it in one click
- The chime unlocks on the first click (autoplay policy)
---
## ๐ License
[MIT](LICENSE)