The two shipped surfaces offered different tools for no recorded reason: session checkpoints, tool-result pruning, the goal tools, and Ralph were in `tui.cordis.yml`; `tool-todo` and web search were in `web.cordis.yml`. Neither offered session search, a string-replacement editor, or a repeat-tool guard, though none of the three is surface-specific. Move the rows that are not surface-specific into `base.cordis.yml` and add those three. Web search moves there too — the TUI decision the change that made it a Web default deferred. Both surfaces now assemble the same 27 tools. This adds only. No row is removed from either surface and no existing row's configuration is edited: executors, sandbox composition, access defaults, `tools.mode`, and the workflow tool are exactly what they were. Two rows stay surface-specific: `tmux-context` (no terminal multiplexer in a browser) and `session-reference` (its index has one writer owner). Ship `dsh-mcp-client` as a dependency without a row: the plugin mounts one server per instance and `command` is required, so a default would name a third-party server and spawn it outside `ctx.bash` on every launch. The CLI README carries the YAML for mounting one from a personal config.
102 lines
4.0 KiB
YAML
102 lines
4.0 KiB
YAML
# `dsh` (the default surface) — the full-screen TUI, as a patch list over
|
|
# `base.cordis.yml`. The launcher includes the base and applies this file, then
|
|
# any `--config` overlay, then the personal `~/.dsh/config.yaml`, as sibling
|
|
# patch lists at ONE include level: patches never cross an include boundary, so
|
|
# stacking overlays as nested includes would silently stop reaching base rows.
|
|
#
|
|
# A patch replaces the targeted row's whole `config`, so each row below restates
|
|
# every key it owns. A patch whose `id` matches no row is skipped with a Loader
|
|
# warning, which is deliberate: one personal overlay is shared across surfaces,
|
|
# so a row that exists only under `web` must not fail the TUI's boot.
|
|
#
|
|
# The launcher owns session identity and the exit line, and provides both on the
|
|
# boot context rather than through config, so no key here — and no overlay
|
|
# replacing one — can drop `--resume`.
|
|
|
|
# ── surface-specific values the base deliberately omits ─────────────────────
|
|
|
|
# `main` is the agent the TUI drives. `provider`/`model` are the route `dsh
|
|
# login` rewrites and a personal overlay repoints; `cwd` anchors the session to
|
|
# the invoking directory, which is also what scopes `/resume` to this workspace.
|
|
- id: agent-loop
|
|
config:
|
|
agents:
|
|
- id: main
|
|
provider: deepseek-official
|
|
model: deepseek-v4-pro
|
|
cwd: !!js process.cwd()
|
|
|
|
# Keep the persona to identity and behavior; tool plugins own tool guidance.
|
|
# The loop resolves {{model}} from this agent's configuration.
|
|
- id: system-prompt
|
|
config:
|
|
persona: |
|
|
You are a coding agent powered by the {{model}} model.
|
|
|
|
Verify your work by running the code or tests. Keep answers brief and
|
|
factual.
|
|
|
|
# Shipped default: full thinking at max effort on every request. Exact-model
|
|
# resolution materializes request defaults before the request header is logged.
|
|
- id: llm-deepseek
|
|
config:
|
|
apiKey: !!js process.env.DEEPSEEK_API_KEY
|
|
baseURL: !!js process.env.DEEPSEEK_BASE_URL
|
|
thinking: enabled
|
|
reasoningEffort: max
|
|
|
|
# This single-session app resolves relative paths from the process cwd.
|
|
- id: fs-local
|
|
config:
|
|
cwd: !!js process.cwd()
|
|
|
|
# The shipped TUI presents the native tool registry.
|
|
- id: tools
|
|
config:
|
|
mode: native
|
|
|
|
# ── TUI-only rows ───────────────────────────────────────────────────────────
|
|
|
|
- insert:
|
|
# Relational runtime checks over the authoritative event streams; each
|
|
# companion registers the assertions its own package owns.
|
|
- id: invariants
|
|
name: '@deepseek-ai/dsh-invariants'
|
|
- id: session-invariant
|
|
name: '@deepseek-ai/dsh-session/invariant'
|
|
- id: agent-invariant
|
|
name: '@deepseek-ai/dsh-agent/invariant'
|
|
- id: scope-invariant
|
|
name: '@deepseek-ai/dsh-scope/invariant'
|
|
- id: agent-loop-invariant
|
|
name: '@deepseek-ai/dsh-agent-loop/invariant'
|
|
|
|
# The derived query index behind `/resume`. The launcher provides a unique
|
|
# process-local path because this SQLite backend has one writer owner; the
|
|
# project-local fallback applies when no launcher sets the typed slot.
|
|
- id: session-reference
|
|
name: '@deepseek-ai/dsh-session-reference'
|
|
|
|
# Terminal-multiplexer context, mounted only where a terminal exists.
|
|
- id: tmux-context
|
|
name: '@deepseek-ai/dsh-tmux-context'
|
|
config:
|
|
refreshIntervalMs: 900000
|
|
|
|
# The keyboard-backed provider behind ask_user_question and the plan-mode
|
|
# review, and the front door it renders inside.
|
|
- id: tui-prompt
|
|
name: '@deepseek-ai/dsh-tui/prompt'
|
|
|
|
# The TUI renders exactly the agent the agent-loop row bound, so it reads the
|
|
# same launcher-owned identity rather than restating one.
|
|
- id: tui
|
|
name: '@deepseek-ai/dsh-tui'
|
|
config:
|
|
sessionId: !!js configuredAgentIdentities?.main?.id ?? 'main'
|
|
showReasoning: true
|
|
maxToolOutputLines: 6
|
|
|
|
- id: tool-ask-user
|
|
name: '@deepseek-ai/dsh-tool-ask-user'
|