apps/cli/cordis.yml holds the whole composition flat — the host runtime rows, the api-gateway row, the webserver row, and the ten dshClient rows. AppCLIEntry is the pre-cordis glue: layered env (ambient > cwd .env > $DSH_HOME/.env, fixing DSH_HOME=... dsh web not finding its key), patch composition from the three non-yml sources (profile json through the static PROFILE_MAPPINGS table, CLI flags, the resolved frontend distIndex), the Loader include boot (--dev appends the hmr row before the settle), and the fail-loud triple (assertEntriesLoaded + installFailLoud + an all-ACTIVE sweep for PENDING fibers). web.ts shrinks to argv parsing + the URL line.
225 lines
6.1 KiB
YAML
225 lines
6.1 KiB
YAML
# 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: 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/<id>/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: i18n
|
|
name: '@deepseek-ai/dsh-client-i18n'
|
|
|
|
- id: ui-layout
|
|
name: '@deepseek-ai/dsh-client-ui-layout'
|
|
|
|
- id: ui-sidebar
|
|
name: '@deepseek-ai/dsh-client-ui-sidebar'
|
|
|
|
- id: ui-conversation
|
|
name: '@deepseek-ai/dsh-client-ui-conversation'
|
|
|
|
- id: ui-question
|
|
name: '@deepseek-ai/dsh-client-ui-question'
|
|
|
|
- id: ui-trajectory
|
|
name: '@deepseek-ai/dsh-client-ui-trajectory'
|