Boot
An empty backpack, filled one layer at a time
A running dsh is a plugin tree. The tree is not hard-coded; startup composes it layer by layer.
Six steps to leave the house
- 01
dsh web
Call the caretaker.
apps/cli/src/bin.ts parses arguments and calls loadLayeredEnv.
- 02
Choose a profile
Take out the box named web.
loadProfile reads dsh.profile.bundles from $DSH_HOME/profiles/<name>/package.json.
- 03
Stack patches
Empty each bag into the backpack in order.
composeEntries runs applyEntryPatches over an empty list.
- 04
boot()
Lay down the baseplate and attach the bricks.
Create the root Context, mount Loader + include + group, and wait for every fiber to reach ACTIVE.
- 05
Assert
Count every brick and shout if one is missing.
assertEntriesLoaded / assertEntriesActivated fail loudly, restore the TTY, then exit(1).
- 06
Open the window
Web mode opens the mailbox and glass.
web-runtime prints the URL and opens the browser by default. headless creates one Agent, submits the task, and prints the final assistant text.
Patch layers · Later wins
--patch and environment switches
Attach one final note before leaving.
Launcher overlays such as DSH_TELEMETRY_DISABLED can disable rows. dsh --profile web --dump-config prints the tree that actually boots on your machine.
$DSH_HOME/cordis.patch.yml
A higher-priority note that applies to every box on this machine.
The home layer overrides the profile layer. watchUserPatches watches both files and transactionally recomposes them through HMR.
profiles/<name>/cordis.patch.yml
Your own note attached to this box.
It replaces a whole config row by id or inserts a new row. There is no deep merge; every field you keep must be restated.
dsh-web-app or dsh-headless
Choose the box with a window, or the one that goes home after one task.
web-app inserts webserver, apiproxy, the client plugin roster, workspace, and storage. headless inserts a one-shot runner.
dsh-base
The largest bag: brain, hands, journal, fence, and keys.
The first layer of every shipped profile. It inserts llm, session, agent, tools, sandbox, fs, shell, skills, subagents, and more—about 70 lines—with bash / pwsh gated by platform.
Empty root []
An empty backpack. No bricks have been packed yet.
The profile's cordis.yml is written as an empty array on every startup. The tree is built entirely from patches, so dump-config cannot drift from the real boot.
One process, different outfits
A Profile decides how the whole city is assembled. An agent preset decides what one agent wears by mounting a smaller tree inside an isolate realm.
standard
Standard mode
A complete coding agent: edit files, run commands, browse, use skills, plan, and ask helpers.
The full toolset and coding persona. Official Standard mode.
code
PTC Mode
The standard kit plus a lab where TypeScript orchestrates multiple tool rounds.
The UI label is now PTC Mode; the internal code preset and Code Mode SDK names remain.
minimal
Minimal mode
Only a mouth and eraser, useful for evaluating models.
Persistent bash plus str_replace_editor. Official Minimal mode.
cordis
Creator mode
The agent may inspect attached bricks and add another one itself.
standard plus runtime introspection, in-memory plugin trials, and preset composition. Official Creator mode.