DSH Companion Studio
English | 简体中文
An early, privacy-aware desktop-companion engine for DeepSeek Harness. It is deliberately not another balance or cost meter. It turns official session facts into useful ambient feedback and leaves character art in independently installable packs.
> Status: public core preview. The runtime, privacy boundary, state machine, pack schema and bundle manifest are testable. No redistributable character pack is bundled with the core package, and npm publishing remains disabled while real-profile QA continues.
Preview

The companion is enabled in a real local DSH profile. Its state is visible at the lower right, while the composer shows the active workspace permission, model and mode.

The native DSH session strip remains visible below the composer. It reports turns, steps, LLM and tool latency, average first-token latency, throughput, cache hit rate, and input/output token counts; the companion complements these facts instead of replacing them.

The bubble shows a short, live preview of the current assistant reply above the selected pet. It reads assistant-authored text only, can be disabled independently, and never selects reasoning, user prompts, tool arguments or tool results. The surrounding conversation body is intentionally omitted from this documentation capture.

The settings panel is draggable and exposes reply preview, hourly variation, local speech controls, voice selection and local pet upload. The screenshots show the locally installed Jingyun whale-maid pack; the selected character and outfit are visible in the panel.
What is different
- Eight explicit states: idle, thinking, streaming, tool use, waiting for the user, success, error and sleep.
- A compact live bubble containing assistant text only. Reasoning, prompts, tool arguments and tool results are never selected.
- Credential-like strings are redacted before display. Preview can be disabled separately.
- Completion can be read with the browser's local Web Speech API. It is off by default, sends no audio or text to a voice service, and can be stopped immediately from the pet menu.
- Optional hourly variation rotates the selected character's outfit and plays a short showcase motion. It is off by default.
- The voice menu auto-ranks installed Mandarin voices, allows an explicit local choice and includes a short audition line.
- Shown, docked and completely hidden modes. A session-header button restores a fully hidden pet.
- Character and outfit selection is data-driven. External character plugins can register before or after the core.
- A user can upload one local PNG/WebP and use it immediately as a private pet. The image is normalized locally, stored in IndexedDB and restored after reload.
prefers-reduced-motionis respected.
Bundled demo metadata
The public core includes one art-free metadata placeholder, 星汐 / 星潮鲸灵, so the picker and outfit settings remain testable. It intentionally renders as a glyph until a user uploads a local image or installs a character pack. The preview screenshots show a locally installed Jingyun pack; the core runtime and npm package do not bundle its standalone source assets.
Pack model
The core package stays small. A separately installed DSH client plugin can import registerCompanionPack from dsh-companion-studio/client-api and register one manifest. Each manifest binds its license, palette, outfits and optional animation sprite sheets. The global Symbol registry handles either load order and returns a disposer for hot reload.
See [docs/PACK-SPEC.md](docs/PACK-SPEC.md) for the v1 contract and animation requirements.
User-created pets
The settings panel accepts a single PNG or WebP up to 5 MB and 2048×2048 / 4.19 million pixels. DSH decodes and re-encodes it as a static PNG, preserving transparency while removing metadata and animated payloads. SVG, HTML, remote URLs and arbitrary scripts are not accepted. The resulting Blob lives only in the browser's IndexedDB; an object URL exists only while the plugin is mounted and is revoked on deletion or unload.
One image receives the core's eight lightweight CSS motions, so a user does not need a sprite sheet. Advanced per-state art remains the explicit pack path. Background removal is not claimed: users should upload transparent art for the cleanest result.
Privacy boundary
The reply bubble reads the official ConversationSnapshot.partial and finalized assistant nodes. It accepts only blocks whose kind is text. The following never enter preview or speech:
- user prompts or injected context;
- reasoning blocks;
- tool names, arguments or results;
- approval/question payloads;
- telemetry, balances or model pricing.
The preview is capped and sanitized again before local speech. Speech is opt-in.
Development
# Node.js 22.19 or newer
pnpm install
pnpm check
pnpm pack --dry-runFor local evaluation after building:
dsh plugin --profile web add link:/absolute/path/to/dsh-companion-studioThe included cordis.patch.yml uses DSH's profile-bundle patch mechanism. This is a source preview rather than a published npm package.
Public-repository boundary
- MIT covers the source code in this repository.
- The core runtime and npm package do not ship standalone character-art source assets; documentation screenshots show local evaluation only.
- User-uploaded pets stay in that user's browser.
- External pack authors are responsible for declaring compatible licenses and keeping provenance records.
See [docs/ASSET-PROVENANCE.md](docs/ASSET-PROVENANCE.md) and [SECURITY.md](SECURITY.md).
Near-term gates
1. Validate streaming, tool, waiting, error and completion transitions in a real DSH profile. 2. Validate drag persistence, full hide/restore and Chinese/English local voices. 3. Build one independently licensed external pack to prove install/uninstall and load-order behavior. 4. Complete in-app visual QA with both a local upload and an external pack. 5. Only then remove private: true, publish to npm and submit to community directories.