Introduction¶
When developing agents with DeepSeek Harness (DSH), events that require human intervention—such as approval requests, question confirmations, and blocked goals—are often easy to miss. The dsh-session-notify plugin connects these events to browser system notifications and in-app prompts, allowing you to click and navigate directly to the corresponding session to avoid missing them.
Plugin Overview¶
This plugin is a DSH dynamic Cordis plugin maintained by Lwc-LiuWenCheng and licensed under the MIT License.
Core Features¶
- Dual-side architecture: Host and Client are separated, so it can be loaded without modifying the DSH deployment source code.
- Comprehensive coverage: Covers all human-intervention events, with 7 categories and 11 event sources in total.
- Dual-channel reminders: Provides both browser Notification API system notifications and a toast stack in the upper-right corner.
- Interactive navigation: Clicking a notification focuses the window and navigates directly to the corresponding session.
- Fine-grained configuration: Supports configuring a notification level for each category on the settings page (Off / In-app prompt / System notification).
- Low-overhead design: Uses Client→Host long polling (empty-queue suspension for 15s) and Host-side source filtering to avoid polling storms; disabled categories incur zero load.
Installation and Enablement¶
There are two ways to enable this plugin:
- Option A: Load as a dynamic plugin
- Run the build command to generate the files:
npm run build:dynamic
- In a DSH session, use the generated
dynamic/host.body.jscontent ascode.hostand thedynamic/client.body.jscontent ascode.clientto callcordis_define, then executecordis_runto activate it. - On first use, request notification permission from the DSH settings page.
- Option B: Install as a static plugin
- Run the build and pack commands:
npm run build:static
npm pack
- Run the local installation script:
powershell -ExecutionPolicy Bypass -File scripts\install-local.ps1
- Restart the DSH process for the changes to take effect.
Notes¶
- Session-level scope: A dynamic plugin only receives events within the current session scope and cannot receive cross-session events.
- Browser notification dependency: System notifications depend on the Notification API and user authorization; if unsupported, they automatically fall back to in-app prompts.
- Title fallback handling: The session title in notification bodies is taken from
sessionQuery.readTitle; if it cannot be retrieved, a generic message is used. - Lifecycle: A dynamic plugin is session-level and in-process; stopping or updating it removes all side effects.