Skip to content
dsh.fish
Bundle

dsh-reminder

Bottom-right reminder cards for the DeepSeek Harness web GUI: an amber persistent card when an approval waits for you, a green self-dismissing card when a task completes

Source
Aisland-SJL
stars
18 stars
License
MIT
Updated
Updated yesterday

Readme

# dsh-reminder ๐Ÿ””

<p align="center"><b>English</b> ยท <a href="README.zh.md">็ฎ€ไฝ“ไธญๆ–‡</a></p>

**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.

<img src="assets/toast-preview.svg" alt="Toast preview" width="720">

---

## โœจ 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 <dsh-reminder>` (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)

Install

dsh plugin --profile web add github:Aisland-SJL/dsh-reminder

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