DSH bundled profiles: first run, directory and manifest
DeepSeek Harness does not place five ready-made profiles on disk at install time; it initializes them on first use from built-in templates. web, headless, sdk, sdk-minimal, and acp each get a directory under $DSH_HOME/profiles/<name> and each has its own bundle set and patch timing. That difference explains why a web patch hot-reloads while a headless patch waits for a restart.
DeepSeek Harness: The five bundled profiles
Same launcher, different combinations and patch timing. Compare:(source)
| Profile | Combination | Patch application |
|---|---|---|
web | base + web-app | live |
headless | base + headless | startup only |
sdk | base + sdk-app | startup only |
sdk-minimal | independent bundle | startup only |
acp | base + acp-app | startup only |
web is for browser interaction, headless for one-shot tasks, sdk and sdk-minimal for JSON-RPC clients, and acp for automation clients. Only web explicitly applies patches live; the other four settle configuration at startup.
dsh web is a hard-coded alias for dsh --profile web. The other four have no alias; use dsh --profile headless or dsh --profile sdk-minimal.
DeepSeek Harness: What the directory and manifest contain
A profile is a manifest plus configuration layers, not one YAML file. After initialization, inspect three places:(source)
package.json— contains thedsh.profilemanifest and ordereddsh.profile.bundles. Expected: the bundle list explains what the profile is made of.cordis.patch.yml— the profile’s persistent patch. Expected: your edits live here and survive restarts.node_modules/— out-of-tree bundles and plugin dependencies. Expected: only present after installing third-party packages.
Bundled bundles (@deepseek-ai/dsh-base, dsh-web-app, dsh-headless, dsh-sdk-app, dsh-sdk-minimal, dsh-acp-app) always resolve from the current dsh installation, not from the profile’s node_modules. Upgrading dsh changes their version; out-of-tree bundles must be updated separately.
DeepSeek Harness: What first startup does
Startup does not read one complete config file; it starts from an empty root and stacks layers. The order:(source)
- Create a missing profile — the five bundled names initialize from templates; other missing names fail. Expected: the directory and base manifest appear.
- Apply bundle patches — in
dsh.profile.bundlesorder. Expected: the base tree forms. - Apply the profile patch —
profiles/<name>/cordis.patch.yml. Expected: profile-specific changes apply. - Apply the home patch —
$DSH_HOME/cordis.patch.yml. Expected: shared preferences apply. - Apply command-line
--patch— in argv order. Expected: temporary overrides win last.
Later layers win for the same row. A patch replaces the target row’s entire config, not deep-merge it; that is the root of many “I changed one field and lost the others” reports.
DeepSeek Harness: Three ways to enter a profile
Alias, explicit profile, and template replacement solve different problems. Compare:(source)
dsh web— alias for--profile web, for daily Web UI use. Expected: no need to remember the profile name.dsh --profile <name>— any profile, including headless, sdk, and acp. Expected: launcher flags first, application arguments after.--from-default-profile— replaces a custom profile with a template. Expected: good for rebuilds, not for upgrades that preserve configuration.
If you are starting for the first time, use dsh web. For CI, decide between headless and sdk first; their output contracts differ.
DeepSeek Harness: Common misconceptions
Most profile initialization problems come from assuming one profile behaves like another. Four:(source)
- “All profiles hot-reload” — only
webapplies patches live; the other four apply at startup. Expected: restart after editing headless config. - “Any name auto-creates” — only the five bundled names do; other names need
dsh plugin. Expected: no empty profile starts by accident. - “Bundled packages come from node_modules” — they resolve from the dsh installation. Expected: upgrading dsh changes their version.
- “Patch is a deep merge” — it replaces the whole
config. Expected: preserve the other fields in the row.
DeepSeek Harness: From template to a runnable check
After first initialization, verify four things instead of assuming “the directory exists”. Checklist:(source)
- Directory and manifest —
profiles/<name>/package.jsonexists and bundles are non-empty. Expected: not an empty directory. - Startup has no config error — no schema validation or module resolution failure. Expected: the process reaches a running state.
- Patch applied —
--dump-configshows the profile layer. Expected: not just a file edit without stacking. - Entry matches — web opens a page, headless runs a task, sdk answers a client. Expected: not “starts but unusable”.
If any fails, read the startup log and dump first; do not reinstall immediately.
Configuration layer order
A profile is built from an empty root, and the layer order decides who wins. Official order:
| Order | Layer | Source |
|---|---|---|
| 1 | Bundle patches | dsh.profile.bundles list |
| 2 | Profile patch | profiles/<name>/cordis.patch.yml |
| 3 | Home patch | $DSH_HOME/cordis.patch.yml |
| 4 | Command-line patch | argv-ordered --patch |
Later layers win; a patch replaces the whole config. This table explains “I edited the profile patch but the home patch overrode it”.
DeepSeek Harness FAQ
Which bundled profile is the lightest?
sdk-minimal is the independent minimal combination, without dsh-base, keeping only the SDK protocol, adapter, local execution, and persistence. It is not a general Web UI.
Can I copy web configuration to headless? You can copy patches, but the bundles and tool sets differ. Dump the result and verify each field instead of assuming compatibility.
Can I rename a profile directory?
Not recommended. Names appear in launch arguments, manifests, and credential references. Create a new name with --from-default-profile instead.
The short version: the difference between bundled profiles is not the name but the bundle set and patch timing. Read the manifest before editing configuration.
FAQ
DeepSeek Harness: no. These five bundled profiles initialize from built-in templates on first use under $DSH_HOME/profiles/<name>. Any other missing profile name fails explicitly and suggests dsh plugin --profile <name> add <package>.
DeepSeek Harness: the bundled templates differ: web is base + web-app and applies patches live; headless, sdk, sdk-minimal, and acp apply patches at startup. The final YAML combination also decides whether dsh-hmr watches configuration.
DeepSeek Harness: it is the ordered bundle list that decides which configuration layers are stacked at startup. The bundled template writes its own list, and installing a dependency with a dsh.bundle declaration updates it.
DeepSeek Harness: bundled bundles such as dsh-base, dsh-web-app, dsh-headless, dsh-sdk-app, dsh-sdk-minimal, and dsh-acp-app always resolve from the running dsh installation. Out-of-tree bundles resolve from pnpm-managed node_modules inside the profile.
DeepSeek Harness: configuration parsing, schema validation, module resolution, or plugin startup failures report an error and exit non-zero. Initialization writes and runtime resolution are separate; inspect the logs and profile directory before deleting the home.
Related Terms
- profile
- A profile is a startable DeepSeek Harness combination under $DSH_HOME/profiles/<name>, made of a dsh.profile manifest in package.json and layers such as cordis.patch.yml.— DeepSeek Harness reference - dsh CLI behavior
- dsh.profile.bundles
- dsh.profile.bundles is the ordered bundle list in a profile manifest. It decides which configuration layers apply at startup; later layers win.— DeepSeek Harness reference - dsh CLI behavior
- sdk-minimal
- sdk-minimal is one of the five bundled profiles. It uses an independent bundle instead of base + app, inserts a complete tree on an empty root, and applies patches only at startup.— DeepSeek Harness reference - dsh CLI behavior
- HMR
- HMR is DeepSeek Harness configuration hot reload. Whether it is mounted depends on the final YAML combination; without it, patch changes require a restart.— DeepSeek Harness reference - dsh CLI behavior
Sources
- DeepSeek Harness reference - dsh CLI behavior· deepseek-ai
- DeepSeek Harness reference - Plugin configuration catalog· deepseek-ai