A marquee mood-light ring around the DSH web UI edge that reacts to session state, turning green while the agent works, pink when done, and yellow when something needs attention, with colors, ring width, rotation speed, and flash frequency configurable from the settings panel.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:lihang-lh/dsh-moon-light
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time. Only install sources you trust, and pin a commit (github:owner/repo#sha).
README
A marquee-style mood-light ring around the DSH web UI edge. It reads the current session state and automatically switches the light color and rhythm:
| Session state | Light | Signal (host-published session summary) |
|---|---|---|
| Agent is working | 🟢 Green flowing band + flash | summary.running === true |
| Done / idle (nothing pending) | 🩷 Pink band (steady) | not running, not blank, nothing pending |
| Needs attention (approval / plan review / question) | 🟡 Yellow band (slow pulse, highest priority) | summary.pendingInteraction set |
| No session / blank session / disabled | Off | no current session or blank === true |
The ring is purely decorative (pointer-events: none) and never blocks
interaction; animations stop automatically under prefers-reduced-motion.
Settings
A "氛围灯" (Mood Light) page is registered in the DSH settings panel
(Settings → Mood Light). Every parameter is adjustable live and persisted to
localStorage:
- Enabled toggle
- Ring width: 1–40 px slider
- Opacity: 5%–100% slider
- Style:
marquee (rotating band)/linear gradient (static) - Band style (marquee only):
segmented marquee (classic)/smooth gradient - Rotation speed: 0–60 s per revolution (0 = static)
- Flash: 0–10 s per cycle (0 = steady; per-state override available)
- State colors: three color pickers each for running / done / pending
- Reset to defaults
Install
dsh plugin --profile web add "github:lihang-lh/dsh-moon-light"
Restart dsh web after installing — the client plugin catalog is composed at
startup. Settings made in the panel are kept in localStorage and survive
restarts.
For development, install from a local checkout with link: (symlink — edits
take effect after restart, no reinstall):
dsh plugin --profile web add "link:/your/local/path/dsh-moon-light"
Uninstall:
dsh plugin --profile web remove dsh-moon-light
Config priority
localStorage (settings panel) > plugin row config (cordis.patch.yml /
profile patch) > built-in defaults. Third-party namespaces are not exposed by
the host settings wire, so user configuration lives in localStorage (same
pattern as dsh-skin).
Override deployment defaults via a profile patch without touching the plugin:
# ~/.dsh/profiles/web/cordis.patch.yml
- id: mood-light
config:
width: 12
rotate: 24
gradientType: 'linear'
states:
running:
colors: ['#22c55e', '#4ade80', '#bbf7d0']
flash: 0.8
How it works
- Hand-written client bundle following the DSH client-modules protocol
(
window.__ModuleLoader__.load({ id, factory })); depends only on the platform seed modulereactand collaborates through theslotsservice. No build step. - Renders into
shell.overlay(frame-level overlay, click-through) andsettings.section(settings page), both registered under idmood-light. - Session state comes from the
useSessionssnapshot selector standard prop:SessionSummary.running/blank/pendingInteractionmap to the running / success / warning modes (resolveModeinclient.js). - The ring is a
position: fixed; inset: 0layer withpadding+mask-composite: excludecarving out the outer band; an innerinset: -50%rotatingconic-gradientdisc is clipped into the band by the mask (rotatecontrols the marquee speed; segmented mode uses hard color stops, smooth mode uses a continuous gradient;flashpulses the overall brightness).
Development
node --check client.js # bundle syntax
node scripts/test.cjs # state mapping / config merge / persistence tests
A standalone preview is available at docs/preview.html — open it in a
browser to see the marquee effect and tune the parameters without installing
anything.
Files
| File | Purpose |
|---|---|
index.js |
Host entry (empty apply, satisfies the Cordis loader) |
client.js |
Browser-side marquee mood light + settings page (core) |
cordis.patch.yml |
Plugin row + deployment default config |
docs/preview.html |
Standalone effect preview (no install needed) |
scripts/test.js |
Logic tests (state mapping / config / persistence) |
.github/workflows/ci.yml |
Syntax + test CI |
package.json |
dsh.bundle / dsh.client declarations |
Links
More in this category
zhu1090093659/dsh-web-ui#packages/dsh-web-ui-all★ 4634
Plugin and skin collection for the DSH Web UI: task board, Git graph, right-side panel, remote mobile UI, pet, live token stats, and a skin center.
omdsh-dev/DSH-better-sidebar★ 2203
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
ccch1mneyyy/dsh-TUI★ 1996
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
omdsh-dev/dsh-at-file★ 391
Codex-style `@file` mentions: search workspace files in the composer and attach their contents to prompts.
omdsh-dev/dsh-genui★ 223
Interactive UI components rendered inline in replies: layout, charts, forms, quizzes, mermaid, 3D scenes, and an action event loop back to the model.
huiliyi37/dsh-tianshu-tui★ 215
A terminal UI (TUI) for DeepSeek Harness.