DeepSeek Harness Plugin Hub

Publish and manage complete Harness Profiles. Discover Plugins for your next setup.

Explore

PluginsPresetsDocsNews

Community

Publish a pluginContactReport an issue

Resources

Plugin Hub on GitHubDeepSeek HarnessSystem statusPrivacy notice
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

Independent and unofficial. Not affiliated with, authorized by, or endorsed by DeepSeek.

Notification — DSH Plugin for DeepSeek Harness
DeepSeek Harness Plugin Hub
ProfilesPluginsCategoriesNewsDocsSign inManage Profiles
ProfilesPluginsCategoriesNewsDocsSign in
← Plugins

@citisen/dsh-notification

Notification

DeepSeek Harness plugin: per-state desktop notifications — a card per session state with its own bell, volume, and system-notification template

The plugin will be installed here. Keep web if you are unsure.

npx -y @deepseek-ai/dsh plugin --profile web add @citisen/dsh-notification@0.2.0
READMECompatibilityVersions

Compatibility and provenance

Notification is published as @citisen/dsh-notification and currently resolves to version 0.2.0. The Hub verifies its manifest and preserves the exact installation source for reproducible installs.

DSH compatibility
*
Runtime surfaces
web
Release source
npm
Registry updated
10/16/2026

Versions

0.2.0stable
9/30/2026
0.1.0stable
9/30/2026

Related plugins

Loading related plugins…

Latest
0.2.0
DSH
*
HMR
Process restart
Tree shaking
Safe tree shaking not declared
Unpacked size
319.2 kB
Files
17
Surface
web
License
MIT
Source
npm
Weekly downloads
35
View source ↗Project homepage ↗
README badge

Click the badge to copy Markdown for your README.

Do you maintain this Plugin?Claim benefit · Priority security scan

Verify the GitHub repository declared in package.json to manage this listing. After you claim it, Hub will prioritize a security scan of the current version and publish the result when it passes.

Claim this Plugin →
Report an issue

Related plugins

More verified plugins in integrations-communication.

Acp App@deepseek-ai/dsh-acp-appThe dsh ACP profile bundle: automation-only JSON-RPC stdio and process lifecycle over dsh-baseAb Publishdsh-ab-publishBrowser-automation publishing tool that logs into and posts to arbitrary websites, in one publishable plugin packageAb Wechat Scrapedsh-ab-wechat-scrape--- description: "The out-of-tree wechat_scrape tool: retrieves WeChat official-account articles, filters promotional blocks, and saves each as a Markdown file, for maintainers of this machine's dsh profiles." kind: "package-reference" ---Remote Web Ui@linxin666/dsh-remote-web-uiScan-to-pair remote access for the dsh web GUI that shares one official interface: a QR beside the settings button pairs phones and PCs into the same Web GUI (a portrait-touch adaptation layer for phones, full desktop on PCs) through one-time tokens and r

README

dsh-notification

A dsh plugin that plays a sound when one of your sessions needs you — built for the desktop application, and it works in the browser too.

While you are looking at the interface it already tells you everything: the sidebar has a state per session, and the conversation has its own streaming indicators. This plugin adds the other half — a chime whenever a state you asked about arrives, whether or not you are looking: in another application, with the window behind something else, or sitting right in front of it. If the card is on, it sounds.

What it adds

Settings → General gains a Session notifications row: one master volume, and then one card per state.

StatePlays whenDefault sound
Waiting for an answerthe agent asked a questionBeethoven, Symphony No. 5 — the fate motif
Waiting for approvalthe agent asked for permissionBach, Toccata and Fugue in D minor BWV 565
Waiting for a plan reviewthe agent proposed a planthree taps on one note, then an octave above, held
Ended with an errorthe session's agent reported an errorthe Dies irae plainchant
Finisheda turn endedBeethoven, Symphony No. 9 — "Ode to Joy"
Starteda turn beganMozart, Eine kleine Nachtmusik K. 525 — off by default

Every sound is a short phrase from a public-domain classical work, chosen to suit its state. Started is switched off because a turn beginning is not worth interrupting anyone for; turn it on in its card if you want it.

Each card has its own switch, volume, timbre and melody. One switch, because a card can do one thing: make a sound. Once that sound is longer than a single blip the melody is worth editing — see the melody.

There is no "when may it ring" rule — no window focus, no "do not alert me about the session I am looking at", no minimum gap. A state that matches and a card that is on are the whole condition; to be quiet, drag the master volume to 0 or switch the card off. The reasoning is below.

Install

dsh plugin --profile desktop add @citisen/dsh-notification

Then restart the application. Use --profile web for the browser profile.

Uninstall

dsh plugin --profile desktop remove @citisen/dsh-notification

Quit the application fully first — it manages the desktop profile, and the command refuses to touch a profile that is in use. The command removes the package, its entry in dsh.profile.bundles, and the installed copy of it.

Then delete your settings, which the command cannot reach. The plugin's row carries a config: block holding everything you changed from the defaults, and it lives in your own patch file:

# $DSH_HOME/profiles/desktop/cordis.patch.yml
- id: notification
  name: "@citisen/dsh-notification"
  config:
    masterVolume: 1
    # ...and the per-state settings

Delete that whole entry. If you leave it, the plugin is gone but its configuration is not, and every start prints this:

dsh: [.../cordis.patch.yml] patch: entry "notification" not found

It is a warning rather than a failure — the application still starts, and the settings are simply ignored — but it will say so on every launch until the entry is removed. If you want to keep those settings before deleting them, copy the block out of the file first.

If you installed from a local checkout

pnpm remove does not prune a directory junction installed with link:, so the link survives the removal and points at your checkout. It does not keep the plugin loaded — the package is gone from the dependency list, the bundles list and the plugin roster — but it sits in node_modules and makes it look as though something is still installed. Delete the link by hand:

# removes the link, not the checkout
cmd /c rmdir "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\@citisen\dsh-notification"

rmdir on a junction removes the link and leaves D:\path\to\dsh-notification untouched. Do not use Remove-Item -Recurse if you are unsure: on some PowerShell versions that follows the junction and deletes the checkout behind it.

Settings

Turning it off without uninstalling

Drag the master volume to 0: every card goes silent, every setting is kept, and dragging it back restores the sound. To switch the plugin itself off, use dsh's own plugin manager — that edits the profile's bundles list and needs an application restart.

Everything lives in one row under Settings → General:

  • Master volume — multiplies each card's own volume, so both numbers matter. 0 is the mute.
  • The state switcher — the six states down the left. Each entry shows how many sessions are in that state right now, and a switched-off state is dimmed. Selecting one shows its card.

That is the only global setting, because it answers the only global question with an honest answer: how loud. Each card's own switch answers whether, and the switches that were removed answered are you looking — which the plugin cannot know, and which it got wrong every time it guessed.

On a card:

ControlMeaning
Alert for this statethe card's switch — the only one it has
Volumethis card's level, multiplied by the master volume
Timbreone of the eleven voices below
Melodythe notes to play — see below
Playplays the sound; speaks only when nothing sounded — see below
Resetputs every field on this card back to its shipped value

Play does two things at once, which is why there is one button and not two. It plays the state's sound through the real audio path — the actual timbre, the actual melody, the actual product of the card's volume and the master's — and the sound is the report: nothing is printed when it played. The card speaks only when nothing sounded ("the volume is 0, so nothing would sound"), because that is the one outcome you cannot diagnose by listening. Pressing it on a state that is switched off still answers the question, by testing the card as though it were on.

The audio line works the same way and appears only while something is wrong: audio is still locked — press Play once to unlock it, or the one line for a build with no Web Audio at all. Once sound works, the line is gone — there is nothing to report about a thing that is working.

It is also the click that unlocks audio the first time.

The melody

The melody is written as note names with optional lengths:

A5:200ms E6:200ms          two notes, each ringing for its own length
G4 G4 G4 Eb4:680ms         four notes; the bare ones use the shipped pacing
A5:120ms -:80ms E6:240ms   a rest is a step that sounds nothing
880 1318.5                 a frequency in Hz, for a pitch with no name
off                        no sound for this state
  • Note names are A5, C#4, Bb3 — any octave, sharps and flats both accepted.
  • A written length is the whole item: the note rings that long and the next one starts when it ends. s, ms and m all work, and a bare number means seconds.
  • An item with no length keeps the shipped pacing — 130 ms of sound, the next starting 90 ms later — which is what makes A5 E6 one interval rather than two separate knocks.
  • A rest (-) occupies its time and sounds nothing.
  • A frequency in Hz is accepted wherever a note name is.

Anything the reader cannot understand is reported under the field and costs only its own item, so a typo never silences the whole melody.

Timbres

Eleven voices ship. The four waveforms are single-tone; the other seven are built from partials, which is what makes them sound like an instrument rather than a tone:

VoiceSounds like
sinepure tone — the plainest chime
trianglesoft flute — gentle, few harmonics
squarechip — hollow and unmistakably electronic
sawtoothbuzz — bright and harsh, cuts through noise
bellstruck metal with a long tail
glasshigh and bright, short
marimbaa wooden bar, fast even decay
plucka short filtered string
wooda click with almost no pitch — the least intrusive
blipone very short tone
digitala two-partial electric chime

Generating a melody

Melodies are plain text, so they can be written by a model and checked without listening. The analyzer prints exactly what a melody will do:

node scripts/analyze-sound.mjs "G4:170ms G4:170ms G4:170ms Eb4:680ms" --voice bell
node scripts/analyze-sound.mjs "A5:220ms -:80ms E6:400ms" --voice marimba --json
node scripts/analyze-sound.mjs --voices

It reports each note's pitch, frequency, start time and how long it rings, plus the envelope the chosen timbre gives it. --json emits the same as data, and a melody with an unusable token exits non-zero — so a generator can gate on it.

Why there are no such switches

Five global rules used to live here, and all five were answering one question: are you looking right now? — when sound plays (while the window is not in front / always / never), stay quiet about the session I am looking at, stay completely quiet while the window is in front, minimum gap between sounds, and do not repeat the same state within.

They are gone for one reason: guessing wrong cost exactly the notification the plugin exists for. One conversation, open in the main view, a long turn, the user in another application — the window was still visible, so when sound plays: while the window is not in front refused the chime. A rule meant to prevent annoyance prevented the notification instead. The two switch-shaped rules also contradicted each other: under that same default, stay quiet about the session I am looking at could only ever fire in a situation the scope had already silenced.

What survives was never a time rule and is not one now: one sound per instant — when the interface publishes several state changes at once, the most urgent one is the one you hear. Two changes a second apart are two events and each gets its own sound. Being quiet is a volume, not a mode.

Limitations

  • finished is the end of a turn, not a verdict on it. It is read from the session going quiet rather than from dsh's unread flag — which dsh suppresses for the session in the main view, so a plugin leaning on it could never chime for the conversation you are actually watching. That is also the cost: a turn that errored ends too, and if the error is reported after the turn is, you may hear the chime for Finished where Ended with an error was meant.
  • The same state can chime on every change into it. Nothing rate-limits a repeat any more: a session flapping between two states sounds each time. Switch its card off, or turn that card down, if it is a session you would rather not hear about.
  • failed means the session's agent reported an error. dsh does not forward which turn it was, and the event is not replayed after a reconnect.
  • Audio needs one click to unlock before the first sound. This is the browser's autoplay policy and cannot be bypassed; pressing Play on any card is the click. The row says "audio not initialized yet" until then.
  • The interface is bilingual (English and Chinese).

Development

See DEVELOPMENT.md for the build and the design notes.

License

MIT