# 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. Toast preview --- ## โœจ 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)