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 — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
A mood-light ring around the DSH web UI edge. It reads the current session state and automatically switches the light color and rhythm. The default effect is soft glow (diffuse) — borderless, a multi-layer inward-diffusing scattered light with a subtle organic irregularity. Marquee (rotating band) and linear gradient (static) remain selectable styles.
| 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:
soft glow (diffuse, default)/marquee (rotating band)/linear gradient (static) - Band style (marquee only):
segmented marquee (classic)/smooth gradient - Rotation speed: 0–60 s per revolution (0 = static)
- Glow spread (glow only): 0–200 px, how far the halo diffuses inward
- Wobble (glow only): 0–10, subtle organic distortion of the halo edge (0 = off)
- 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: 'glow' # default soft glow; 'conic' | 'linear' | 'glow'
glowSpread: 40 # glow halo spread (px)
glowWobble: 2.5 # glow irregularity (0..10)
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). - The soft-glow (glow) style is a full-screen
position: fixed; inset: 0layer (no background, no mask) whose shadow is built in JS from the state primary/secondary colors +width+glowSpreadas a chain of multi-layer blurred inset box-shadows (no zero-blur solid core layer — spread grows fromwidthtowidth+glowSpreadwhile alpha falls, so light fades in smoothly from the screen edge with no crisp border) injected into--ml-glow-shadow; a hidden<svg>adds anfeTurbulence+feDisplacementMapfilter whosescaleisglowWobble(0 disables the filter), making the halo edge slightly organic/irregular. - The default effect style is soft glow (diffuse) — soft and borderless
out of the box;
conic/linearcan still be selected in the settings page or via row config.
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#packages/dsh-task-board★ 8296
Task board for the dsh web GUI: a sidebar multi-column kanban whose cards run in real DSH agent sessions and can also be scheduled with cron expressions, executed host-side even with the browser closed.
zhu1090093659/dsh-web#packages/dsh-web-all★ 8296
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★ 3968
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
ccch1mneyyy/dsh-TUI★ 3948
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 3877
A fixed-corner whale widget for the DSH web GUI — balance, today's usage and per-turn cost with peak/off-peak pricing, editable balance-alert and daily-budget bubbles, a module-based custom bubble queue with A/B weighted choices and random lines or images, 30+ vendor templates (OpenAI, OpenRouter, Kimi, SiliconFlow, Ark, Zhipu, MiniMax and more) with per-model balance and subscription quota, plus task-end sound, imported audio, custom roles and a resource manager. Local-only, no telemetry.
Devin-AXIS/deepseek-design#deepseek-idesign★ 1413
Visual design studio for websites, app prototypes, posters, cards, reports, and magazines, with templates, direct element editing, selection-aware AI draft handoff, and export.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.