Back to marketplace

dsh-dynamic-island

UI & Experience

YLifeOnlyOnce/dsh-dynamic-island

A tiny glass companion for DeepSeek Harness: breathes while agent thinks, pulses while working, checks before touching anything. Liquid Glass looks, zero dependencies.

  • dsh
  • dsh-plugin
  • dsh-plugins
  • harness
GitHub Stars
4GitHub
Views
0DSH Plugin Hub
Forks
1GitHub
Open issues
0GitHub Issues
Manifest version
0.3.5dsh-dynamic-island
Latest push
Aug 14, 2026GitHub
License
MITJavaScript
Plugin type
Host + ClientRuns in both Host and Web Client

README

View source

πŸ›°οΈ DSH Dynamic Island

A tiny glass companion for DeepSeek Harness β€” it breathes while the agent thinks, pulses while it works, and politely checks with you before touching anything.

🍎 Liquid Glass looks Β· 🌱 zero extra dependencies Β· πŸ‘€ always knows what your agent is up to

δΈ­ζ–‡ Β· MIT


Status: a high-fidelity design prototype β€” the place where a Dynamic Island for DeepSeek Harness gets designed, iterated, and proven before it becomes a real plugin. ⭐ Star it to keep the island in orbit.


πŸͺŸ The island, in the wild

Chilling over the workspaceOpens when it needs youLeaves a tiny receipt

The island lives quietly in the corner of your workspace. The moment your agent starts doing something worth knowing about β€” thinking, running a tool, waiting for your approval, or hitting a snag β€” it springs to life.

🧭 What is this?

dsh-dynamic-island is a high-fidelity, Apple Liquid Glass–inspired Dynamic Island concept for DeepSeek Harness. It turns the agent's inner life β€” thinking, tool calls, approvals, failures, completion β€” into a lightweight, readable, slightly companion-like surface that sits on the edge of your screen.

This is not an unrelated desktop pet. Every shape change comes from real Harness state: you always know whether the agent is working, what it's doing, whether it needs your call, and how the task ended.

✨ Why you'll like it

  • 🍬 Genuine Liquid Glass β€” layered transparency, springy shapes, and light that actually moves. All hand-rolled CSS, no UI library.
  • 🎯 Status first, always β€” the companion's face, core light, edge color, and words all tell the same story. No fake animations pretending to be "AI thinking".
  • 🀫 Low-disturbance by design β€” it stays a quiet dot until something matters. When a task completes it leaves a short receipt, then settles back down.
  • πŸ›‘οΈ Respectful of your call β€” approvals mirror the harness's native input area: the island is a second, synchronized place to act, never a rogue state machine.
  • β™Ώ Accessible & polite β€” respects prefers-reduced-motion, never relies on color alone, and keeps approval actions as real buttons.
  • 🌱 Zero runtime dependencies β€” React and a sprinkle of CSS. Nothing else.

🎨 The five moods

MoodThe vibeTone
πŸ›°οΈ Idleagent/status: idle β€” a quiet dot that says "ready when you are"slate
🧠 ThinkingBreathing core; capsule shows the current task & stepaqua
πŸ› οΈ WorkingTeal pulse while a tool runs β€” name and progress on screenmint
🫡 ApprovalWarm coral edge β€” expands with real 批准 / ζš‚δΈ buttonscoral
βœ… CompleteA soft refractive highlight + a result receipt + a stack of recent winslime
⚠️ AlertOrange pause β€” failure summary and a way back inamber
πŸ”’ Blockedturn/end {blocked} β€” the goal paused, waiting for you to unblockviolet
βœ‚οΈ Max-tokensturn/end {max-tokens} β€” output truncated, ask it to continuerose

πŸ”Œ How it talks to DeepSeek Harness

The concept maps each Harness signal to one island mood β€” a narrow, versionable client protocol instead of drowning in the raw event stream:

Island moodDSH signal
idleagent/status: idle
thinkingagent/status: running, step/start, assistant/chunk (reasoning-delta)
workingtool/call β†’ the matching tool/result (incl. error / meta)
approvala pending approval in the composer
completea successful turn/end + assistant/message.usage
alerttool/result error, agent/request-error, turn/end {error}
blockedturn/end {blocked}
max-tokensturn/end {max-tokens}

On top of the eight moods, each state also carries payload fields (stream, tool cards, receipt, goal, todos, jobs):

Island elementDSH signal
Streaming preview (reasoning vs. answer tinted)assistant/chunk (text-delta / reasoning-delta)
Tool-command cards (exit code / duration / copy)tool/call.arguments + tool/result
Result receipt (files / checks / tokens / duration)turn/end.reason + assistant/message.usage
Goal progress ringgoal package: roundsStarted / round cap
Todo ticker + three-state checklisttodo/write (whole-list snapshot, last-write-wins)
Background job chipsjobs package: running | stopping | completed | killed | failed + detail
Recent-wins receipt stackturn/end sequence
Model badgerequest/context (provider Β· model)
Stop / retry / unblock / continueagent/turn-stopping / agent/request / goal unblock / turn resume
Subagent notesubagent/start / subagent/end

Replay & persistence read session/event; live interaction reads agent/*. A production plugin still needs to pin down the client slot/connection injection points β€” and rules for no active session, a dropped stream, parallel sessions, and HMR reloads. That work is tracked on the roadmap.

The full "what DSH needs Γ— what the signal layer can do Γ— how the island shows it" analysis lives in docs/analysis.md.

πŸš€ Run it

npm install
npm run dev

Open the address Vite prints β€” the η΅εŠ¨ε²›ζΌ”η€Ί dock at the bottom flips between the eight moods:

  • In approval, hit 批准 / ζš‚δΈ and watch the island reflect the result instantly;
  • Hit ζŸ₯ηœ‹θΏ‡η¨‹ to expand the in-island activity feed: tool cards with exit code, duration, and a one-click copy of the command;
  • Hit 清单 to expand the full three-state task checklist; the goal ring shows goal round progress;
  • Retry on alert, unblock when blocked, continue past max-tokens (stop is left to the native Harness UI);
  • A model badge shows the model in use (replacing the background-job chips);
  • Drag the island from any blank spot to reposition it β€” the spot is remembered across reloads;
  • Press ⌘K (or Ctrl+K) for the command palette β€” type to filter, ↑↓ to move, ↡ to run;
  • Hit β–Ά θ‡ͺεŠ¨ζΌ”η€Ί to watch the whole arc β€” idle β†’ thinking β†’ working β†’ approval (auto-approved) β†’ complete β€” and press Esc to tuck the island away at any time.

πŸ”Œ Integrating into DSH (plugin)

This project is a DSH client plugin β€” the repo root is the dual-face package, published to npm as dsh-dynamic-island:

# Install straight into Harness (web profile)
dsh plugin --profile web add dsh-dynamic-island
dsh --profile web          # restart β†’ the island floats over the GUI, draggable, position remembered

# Or as a regular dependency (dev / referencing the browser half)
npm install dsh-dynamic-island

For local development you can also install from source (npm run build:plugin emits lib/client.js, then dsh plugin --profile web add /path/to/this-repo).

Every mechanism is verified against the DeepSeek Harness source:

  • Mount point: the Web GUI's shell.overlay floating slot (ui-layout's additive list seat reserved for frame-wide overlays β€” badges, toasts, status pills β€” currently with zero registrants). No changes to apps/web are needed.
  • Shape: dual-face npm package β€” dsh.client declaration + exports["./client"] browser half (lib/client.js, built by scripts/build-plugin.mjs as a __ModuleLoader__.load closure factory with platform-table externs) + an empty node half (src/index.js). Installed with one command, dsh plugin --profile web add <pkg>.
  • Data: the browser half subscribes ctx.sessions.currentProvideInfo β†’ session snapshot + projections (goal, todos, tokenUsage, contextPressure, permissions) β†’ src/plugin/protocol.js derives the island model β†’ the same src/components React tree renders it (demo and plugin share one UI).

In-repo pieces: src/client/ (browser half: index.js, IslandDock.jsx, island-store.js, live-bridge.js, styles.js, locales.js), src/index.js (node half), cordis.patch.yml, src/plugin/protocol.js (protocol adapter). The full blueprint, dev workflow, and honest gaps live in docs/integration.md.

🧱 Built with

  • React 19 + Vite 8 β€” plain and fast
  • Hand-rolled CSS β€” every glass panel, orbit, and breathing core is bespoke
  • Zero UI frameworks β€” the point is proving the design, not the stack

πŸ—ΊοΈ Roadmap

  • Eight-state island with Liquid Glass looks (incl. idle / blocked / max-tokens)
  • Synchronized approval actions (a mirror of the native input area)
  • Streaming output preview (assistant/chunk, reasoning vs. answer tinted)
  • Tool-command cards (exit code, duration, copy)
  • Result receipts (files, checks, tokens, duration) + recent-wins receipt stack
  • Goal progress ring + full task checklist (goal, todo/write)
  • Model badge (request/context, shows the model in use)
  • ⌘K command palette + auto-play demo
  • Integration blueprint + plugin skeleton (repo root is the dual-face client package)
  • build:plugin emits the loader-compliant bundle; smoke-tested (handshake / factory / apply / bridge / verbs)
  • Real-GUI integration pass (live-bridge on-device check + retry/continue/unblock/approve wired to real remotes) πŸš€

πŸ’› Keep the island in orbit

If this made you smile, hit the ⭐ β€” it's the fuel that turns a design prototype into a real plugin. Issues, ideas, and "why not also support X?" are all welcome.

Built with 🫢 for the DeepSeek Harness community.

Comments

0
Newest first