# dsh web — the full web-shape composition: host runtime (layer 1), the # transport/service layer (layer 2), and the browser plugin roster (dshClient # rows the modules node half scans into window.__DSH_BOOT__). Row order # carries no load semantics (activation is service-availability driven); the # grouping below is for readers. `--dev` appends the dsh-client-hmr row in # code (AppCLIEntry) — prod and dev differ by exactly that one row. # AppCLIEntry patches this tree before boot: profile json + CLI flags + # distIndex land as config patches over the rows below (yaml = engineering # defaults, json = user config, user wins per field). # ── layer 1: runtime ──────────────────────────────────────────────────────── - id: timer name: '@cordisjs/plugin-timer' - id: llm name: '@deepseek-ai/dsh-llm' - id: session name: '@deepseek-ai/dsh-session' - id: session-title name: '@deepseek-ai/dsh-session-title' config: fallbackMaxWords: 5 fallbackMaxBytes: 40 maxTitleBytes: 80 # Model-made titles on the first-message cadence (the web sidebar renders # session/title). Same values as the TUI composition. - id: session-title-llm name: '@deepseek-ai/dsh-session-title-first-message-llm' config: targetWords: 5 targetCjkCharacters: 10 maxInputBytes: 4096 maxOutputTokens: 64 timeoutMs: 60000 - id: system-prompt name: '@deepseek-ai/dsh-system-prompt' config: persona: '' - id: tools name: '@deepseek-ai/dsh-tools' - id: user-interaction name: '@deepseek-ai/dsh-user-interaction' - id: agent name: '@deepseek-ai/dsh-agent' - id: tasks name: '@deepseek-ai/dsh-tasks' - id: agent-loop name: '@deepseek-ai/dsh-agent-loop' config: agents: [] # The native DeepSeek adapter; reads the key/base-url the boot's layered # .env loading (cwd then $DSH_HOME) left in the environment. - id: llm-deepseek name: '@deepseek-ai/dsh-llm-deepseek' config: apiKey: !!js process.env.DEEPSEEK_API_KEY baseURL: !!js process.env.DEEPSEEK_BASE_URL - id: session-persistence-jsonl name: '@deepseek-ai/dsh-session-persistence-jsonl' config: root: './.sessions' - id: storage name: '@deepseek-ai/dsh-storage' - id: storage-json name: '@deepseek-ai/dsh-storage-json' config: root: './.storages' - id: storage-domain name: '@deepseek-ai/dsh-storage-domain' config: backend: json - id: workspace name: '@deepseek-ai/dsh-workspace' - id: bash-local name: '@deepseek-ai/dsh-bash-local' - id: tool-bash name: '@deepseek-ai/dsh-tool-bash' - id: tool-todo name: '@deepseek-ai/dsh-tool-todo' - id: tool-tasks name: '@deepseek-ai/dsh-tool-tasks' # fs cwd stays the package default (process.cwd()) — the same value the # gateway injects into session.cwd, so paths and sessions agree. - id: fs-local name: '@deepseek-ai/dsh-fs-local' - id: fs-policy name: '@deepseek-ai/dsh-fs-policy' - id: tool-fs name: '@deepseek-ai/dsh-tool-fs' - id: tool-fs-search name: '@deepseek-ai/dsh-tool-fs-search' - id: workspace-context name: '@deepseek-ai/dsh-workspace-context' config: maxBytes: 65536 - id: skill name: '@deepseek-ai/dsh-skill' - id: skill-local name: '@deepseek-ai/dsh-skill-local' - id: tool-skill name: '@deepseek-ai/dsh-tool-skill' # token-meter rejects unknown config keys — keep this row bare. - id: token-meter name: '@deepseek-ai/dsh-token-meter' - id: compact-basic name: '@deepseek-ai/dsh-compact-basic' - id: subagent name: '@deepseek-ai/dsh-subagent' - id: subagent-spawn name: '@deepseek-ai/dsh-subagent-spawn' config: providerName: spawn - id: subagent-fork name: '@deepseek-ai/dsh-subagent-fork' config: providerName: fork - id: tool-subagent name: '@deepseek-ai/dsh-tool-subagent' config: provider: spawn toolName: subagent - id: tool-subagent-fork name: '@deepseek-ai/dsh-tool-subagent' config: provider: fork toolName: subagent_fork - id: workflow-workerthread name: '@deepseek-ai/dsh-workflow-workerthread' config: provider: spawn - id: tool-workflow name: '@deepseek-ai/dsh-tool-workflow' - id: timeout-policy name: '@deepseek-ai/dsh-timeout-policy' - id: spill-local name: '@deepseek-ai/dsh-spill-local' # Omitting maxInlineBytes makes the whole policy a silent no-op — always # state it explicitly. - id: spill-policy name: '@deepseek-ai/dsh-spill-policy' config: maxInlineBytes: 50000 # The API gateway: the transport-agnostic dispatch face every client shape # shares. provider/model are the host default routing — the profile json's # mapping target (user config overrides these engineering defaults). - id: api-gateway name: '@deepseek-ai/dsh-host-apiproxy' config: provider: deepseek model: deepseek-v4-flash # ── layer 2: transport/service ────────────────────────────────────────────── # Plain route-registration carrier. distIndex is an assembly fact, not user # config — AppCLIEntry resolves the frontend dist and patches it in; host and # port arrive as CLI-flag patches over these defaults. - id: webserver name: '@deepseek-ai/dsh-host-webserver' config: host: 127.0.0.1 port: 3080 # ── browser plugin roster (dshClient rows; node halves are layer-2 hosts) ── # Dual-face: node half scans this very tree for dshClient rows, composes # window.__DSH_BOOT__, serves /plugins//client.js; browser half is the # module table the shell kernel constructs before cordis exists (§4.7 — # adopted as a plugin entry by the kernel, never fetched). - id: modules name: '@deepseek-ai/dsh-client-modules' # Owns both ends of the web transport: node half binds the gateway to the # webserver under /api; browser half is the fetch/SSE client. - id: connection name: '@deepseek-ai/dsh-client-connection' - id: client-runtime name: '@deepseek-ai/dsh-client-runtime' - id: ui-theme name: '@deepseek-ai/dsh-client-ui-theme' - id: locale name: '@deepseek-ai/dsh-client-locale' - id: ui-layout name: '@deepseek-ai/dsh-client-ui-layout' - id: ui-sidebar name: '@deepseek-ai/dsh-client-ui-sidebar' - id: ui-settings name: '@deepseek-ai/dsh-client-ui-settings' - id: ui-settings-general name: '@deepseek-ai/dsh-client-ui-settings-general' - id: ui-models name: '@deepseek-ai/dsh-client-ui-models' - id: ui-conversation name: '@deepseek-ai/dsh-client-ui-conversation' - id: ui-workspace name: '@deepseek-ai/dsh-client-ui-workspace' - id: ui-question name: '@deepseek-ai/dsh-client-ui-question' - id: ui-trajectory name: '@deepseek-ai/dsh-client-ui-trajectory'