UI Enhancements

dsh-museai-tavern

yejiming/dsh-museai-tavern · ★ 28

yejiming

MuseAI Tavern tab for DeepSeek Harness.

License
MIT
Added
2026-08-23
Maintenance
active
Install kind
github
npm
@yejiming/dsh-museai-tavern

No manifest check is available; listing does not imply compatibility or security review.

安装

dsh plugin --profile web add github:yejiming/dsh-museai-tavern

GitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试

For install and environment setup, plus plugin development tutorials, see DSH community docs ↗

README

Source README · body: en · Read Chinese README

Table of contents
  1. Features
  2. Quick install
  3. Method 1: npm (recommended)
  4. Method 2: GitHub source
  5. Architecture
  6. Configuration
  7. HTTP surface (used by the browser half)
  8. Development
  9. License

中文 | English

Adds a MuseAI tab to the right of the Trajectory tab in DeepSeek Harness's conversation tab bar, bringing MuseAI's five desktop pages (Background / Chat / Adventure / Bond / Settings) into the DSH web GUI, with every model call reusing DSH's own model configuration — no separate API / key configuration.

Features

  • MuseAI conversation-view tab: registered on the conversation.view slot (order 15, right of Trajectory at order 10); the session pane renders the MuseAI view with its own five-page navigation (Background / Chat / Adventure / Bond / Settings).
  • Background page (without the AI extraction of world books / character cards): manual world-book / character-card management (custom fields, character-card tree grouped by world book), JSON import/export, MuseAI / SillyTavern dual-format export with SillyTavern conversion preview, style presets, AI memory distillation, world-book deletion (with or without its cards).
  • Chat page: partner roleplay. Bind a world book + character card, streaming conversation (Markdown + collapsible thinking + stop), session history / title editing, style presets, memory archiving, context usage ring.
  • Adventure page: text adventure / GM storytelling. World book + multi character-card selection (checking a world book brings out its cards), dynamic role loading, three input modes, streaming story with [[TOOL]] bubbles and <choices> candidate buttons, multi-card memory archiving, session saving.
  • Bond page: relationship overview, bond timeline, linked chat / adventure sessions.
  • Settings page: all system prompts (copied verbatim from MuseAI's defaults; editable / resettable) and per-agent sampling parameters (temperature / maxOutputTokens / maxContextTokens / thinkingDepth, …); the model area is a "DSH model picker": follow the DSH default model, or pick any provider/model from DSH's configured catalog — no baseUrl / API key / connectivity test anywhere.
  • Persistence: data (world books, character cards, sessions, settings, style presets) is persisted server-side through the plugin's storage domain at $DSH_HOME/storages/museai.json (storage-domain json backend), with browser localStorage only as an offline mirror; survives restarts.

Quick install

Requires DeepSeek Harness >=0.2.0-rc.1 (including 0.2.0-rc.2). Check your installed version with dsh --version; 0.1.x is no longer supported.

Two install methods, neither requires a local build (the prebuilt output in lib/ is committed, and no prepare/prepack scripts are declared).

# Install from npm (initializes the profile on first use)
dsh plugin --profile web add @yejiming/dsh-museai-tavern

Method 2: GitHub source

# Install from the GitHub source (lib/ is committed, no build at install time)
dsh plugin --profile web add github:yejiming/dsh-museai-tavern

Verify after install:

dsh --profile web --dump-config   # should list the museai and museai-routes rows

Start the web GUI:

dsh --profile web

In the web GUI: open any session → the MuseAI tab appears right of Trajectory → check the Settings page for the model (defaults to following DSH's default model, or pick from the catalog) → create a world book / character card in Background → chat with a character, run an adventure, inspect relationships in Bond.

Model prerequisite: DSH must have at least one configured model (provider/model); otherwise the settings page shows an empty-state hint and generation requests return an error.

Architecture

Browser (apps/web)                       Host process (dsh --profile web)
┌─────────────────────────────┐          ┌──────────────────────────────────────┐
│ MuseAI view (conversation.  │  fetch   │ @yejiming/dsh-museai-tavern (host row)│
│  .view, order 15)           │ ───────▶ │  · museaiStore service (domain/mem)  │
│  · Background/Chat/Adventure│          │ @yejiming/dsh-museai-tavern/routes    │
│  · Bond/Settings (DSH model │          │  · /plugins/museai/models|chat|       │
│    picker)                  │          │    complete|store/*|sessions/*        │
│  · zustand + syncStorage    │          └──────────────┬───────────────────────┘
└─────────────────────────────┘                         │ ctx.llm (DSH models)
                                                        ▼
                                     DeepSeek / other configured adapters

One npm package, two mount faces, two host rows:

Face Entry Mounted by
Host row (store service / config) lib/index.js (row museai) host composition: opens the museai storage domain (memory fallback on failure), provides museaiStore; headless-safe
Routes row (model bridge / store / sessions) lib/routes.js (row museai-routes) host composition: registers /plugins/museai/* via nested inject where a webserver exists; skipped headless
Browser half (tab / pages) lib/client.js (dsh.client declaration) browser: registers the MuseAI tab and its five pages

Configuration

Every field has a loader default; no library defaults; no credential fields.

Key Meaning
chatTimeoutMs end-to-end streaming timeout (default 120000 ms)
completeTimeoutMs one-shot completion timeout (default 120000 ms)
modelsTimeoutMs model-catalog interrogation timeout (default 10000 ms)
maxCompleteChars captured non-streaming output cap (default 20000 chars)
# cordis.patch.yml or profile-layer override example
- id: museai
  config:
    chatTimeoutMs: 180000

HTTP surface (used by the browser half)

  • GET /plugins/museai/models — DSH model catalog {groups, failures, defaultSelection}
  • POST /plugins/museai/chat — streaming generation (NDJSON: start/delta/thinking_delta/done/error/aborted)
  • POST /plugins/museai/complete — one-shot generation {text, reasoning}
  • GET/PUT /plugins/museai/store/<key> — one store blob (settings/partners/partnerChat/story/stylePresets/agent)
  • GET /plugins/museai/sessions/<kind> and GET/PUT/DELETE .../sessions/<kind>/<id> — session records (kind=partner|story)

Development

pnpm install
pnpm build        # tsdown both halves + type declarations
pnpm typecheck    # server-side typecheck (client below)
npx tsc -p tsconfig.client.json --noEmit   # client typecheck
pnpm test         # vitest (server routes / storage domain + ported utils)

lib/ is committed, so installing and debugging (including dsh plugin add .) never requires a build. To rebuild the artifacts, just run pnpm install: all @deepseek-ai/* dependencies are published on npm, so there is no need to copy or symlink node_modules from a local DSH checkout anymore. pnpm-workspace.yaml follows the dsh convention (nodeLinker: hoisted); pnpm 11's supply-chain policy blocks freshly published packages and dependency build scripts, so the repository pre-declares minimumReleaseAgeExclude (0.2.0-rc.1 and its companion dependencies) and allowBuilds: esbuild.

Development dependencies pin the minimum supported version, 0.2.0-rc.1, while host peer dependencies accept >=0.2.0-rc.1. The client uses Cordis Context and dsh-client-ui-renderer; the model bridge handles errors and cancellation reported through finish.reason. After changing source files, run pnpm build and include lib/ with the changes so source installs receive the updated artifacts.

License

MIT