Back to home

vilicvane

dsh-plugin-web-notify

Browser notifications for the DeepSeek Harness Web GUI.

Stars
0
Language
JavaScript
Created
Aug 14, 2026
Updated
Aug 14, 2026

Introduction

dsh-plugin-web-notify

Browser notifications for the DeepSeek Harness Web GUI.

Shows a browser notification when:

  • a conversation turn finishes while you are not watching that session;
  • the agent starts waiting for you — an approval request, a plan review, or a question.

Features

  • Click to focus and switch — clicking the notification brings the GUI window to the front and switches to the finished/asking session.
  • Turn summaries — when a turn completes, the notification first shows a "summarizing…" hint (only when the host summary capability is detected) and is then replaced with a one-sentence summary of what the turn accomplished, generated by a small model (host-side; configurable provider/model).
  • Stays until dismissed — notifications use requireInteraction and stay on screen until you click or dismiss them (set the REQUIRE_INTERACTION constant in client.js to false for the OS default auto-dismiss timing).
  • Chime — plays a short two-tone sound along with the notification (browsers allow page audio after the page has been interacted with at least once).
  • No interruptions — no notification while the page is focused on the finished/asking session; you already see it.
  • One toast per session — notifications for the same session replace each other instead of stacking.
  • Subagents ignored — subagent sessions do not produce notifications.
  • Permission on first click — the notification permission is requested automatically on the first click inside the page; grant it once and you are done.
  • Bilingual — notification text follows the browser language (Chinese / English).

Install

Add the plugin to your dsh profile and register it in the Loader.

From GitHub

dsh plugin --profile web add github:vilicvane/dsh-plugin-web-notify

This is equivalent to running pnpm add github:vilicvane/dsh-plugin-web-notify inside the profile directory.

From npm

Once the package is published to the npm registry:

dsh plugin --profile web add dsh-plugin-web-notify

Then append an insert row to the profile's cordis.patch.yml ($DSH_HOME/profiles/web/cordis.patch.yml):

- insert:
    - id: web-notify
      name: dsh-plugin-web-notify
      config:
        provider: deepseek-official
        model: deepseek-chat

The config block is optional and defaults to deepseek-official / deepseek-chat. All settings and their defaults:

KeyDefaultMeaning
providerdeepseek-officialLLM provider route used for summaries.
modeldeepseek-chatSmall/fast model used for summaries.
maxInputChars4000Cap on the turn text (user request + assistant reply) sent to the model.
maxOutputTokens150Cap on the summary length.
timeoutMs60000Summary generation timeout.
systemPrompt(built-in)System prompt for the summarization call.

Restart dsh web, refresh the page, and click anywhere once to grant the notification permission.

How it works

  • index.js (host half) registers /web-notify/summary and /web-notify/capability routes on the DSH web server. On a summary request it reads the finished turn's user/assistant text on demand from the in-memory session store (ctx.sessions), then streams a call to the configured small model (ctx.llm.stream, with the session-title purpose so the provider disables model thinking and the token budget goes to the summary text) and caches the one-sentence result per session.
  • client.js (client half) is a Cordis client plugin. It injects the sessions service and watches the session-list snapshot for running → false transitions and for pendingInteraction (approval / plan-review / question) arrivals. It probes the capability route at apply (and again after server connection resets), so completion notifications start with a "summarizing…" hint only when the host summary is actually available. The client polls the summary route; the summary replaces the hint (same tag) once ready, and failures degrade back to the plain completion text.

Notes

  • Windows may deliver Chrome notifications quietly (notification center only, no banner, no sound). Check Windows Settings → System → Notifications → Google Chrome and enable "Show notification banners" and "Play a sound"; also make sure Focus Assist is off.
  • Browsers do not expose a configurable auto-dismiss duration; the operating system controls it. This plugin uses requireInteraction so notifications stay visible until clicked or dismissed.
  • The chime is subject to the browser autoplay policy: it plays only after the page has been interacted with at least once.
  • Bringing a window to the front without a user gesture is restricted by browsers, so automatic focusing on show is best-effort; clicking the notification always focuses the window and switches to the session.
  • Summaries are generated only when a completion notification actually fires (one small-model call per notified turn), and only the truncated turn text is sent — tool outputs and the rest of the log are never transmitted.

License

MIT