dsh-nu replaced every shell command with Nushell and refused bash/pwsh syntax before it spawned; in practice the refusals were too noisy. Drop the flake input, install plain dsh, and remove the docs describing the Nushell-only shell. Assisted-by: DeepSeek Harness (deepseek-flash)
2.8 KiB
dsh configuration
dsh is installed by this module (packages.nix) and configured at runtime, not by Nix. It boots a
profile: an ordered stack of patch layers over an empty root entry list, where later layers win.
| # | Layer | Path | Writer |
|---|---|---|---|
| 1 | bundles | shipped with the profile | upstream |
| 2 | profile | $DSH_HOME/profiles/<name>/cordis.patch.yml |
dsh, at runtime |
| 3 | home | $DSH_HOME/cordis.patch.yml |
you |
$DSH_HOME defaults to ~/.dsh. Settings UI changes are written to the profile patch; a home-layer
row outranks it, so the UI rejects that setting with
Configuration for "..." is overridden by a home patch. This repository ships no home layer:
profile patches remain machine-local runtime state, the place for private endpoints (LAN servers,
staging gateways) too. Nix installs plain dsh from nur-ryan4yin, with no package wrapper and no
--patch overlay.
Three behaviours that are easy to get wrong:
- A patch row's
configreplaces the row's config object instead of deep-merging into it. Repeat every key you mean to keep; the shippedagent-looprow repeatsagents: []for this reason. - The web and desktop surfaces give each agent preset its own compaction service, so a top-level
compaction-basicrow never reaches a session. Compact by setting the route's modelcontextWindowandmaxTokensinstead. dsh-llm-pi-airegisters its providers once, so mount only one instance: a second one fails withprovider "..." is already declared.
To see what your own patches actually change:
dsh <profile> --dump-config # composed tree with every layer applied
dsh <profile> --dump-default-config # the same tree without the home layer or --patch overlays
The dsh-base bundle sets agent-default-model to the API-key route (deepseek-official /
deepseek-flash). The account route never falls back to an API key, so a host holding only
DEEPSEEK_API_KEY fails new sessions with ACCOUNT_SIGN_IN_REQUIRED.
In this repository, just dsh-web boots the web profile through mihomo's mixed port.
Global rules
dsh-base already mounts dsh-agent-instructions (maxBytes: 65536) and rules.nix links
agents/global-rules.md into both scopes it reads — $DSH_HOME/AGENTS.md and, from 0.2.1-alpha.2
on, $DSH_AGENTS_HOME/AGENTS.md — so no patch row is needed; identical content renders once.
- The scopes come from the environment:
0.2.1-alpha.2removed the row'sdshHome/agentsHome. - Nested
AGENTS.mdfiles are discovered byread/write/edit, not bycdinsidebash, and nothing is watched: an external edit lands on the next such call, or on resume.