$DSH_HOME/.env carried two incompatible jobs. As credentials-local's writable secret store it could not be hoisted into process.env — hoisting makes every stored key read as a read-only launch override and blocks rotation from the TUI and the web page. But its name and dotenv format promise an environment file, so a DEEPSEEK_BASE_URL sitting beside a working DEEPSEEK_API_KEY in the same file was silently ignored: only the credential provider read the document, and it addresses credential references alone. Split the two jobs into two files. .credentials.yaml is the provider-managed store: a strict YAML mapping of CredentialRef to non-empty string, no version field, no wrapper level. Because it holds credentials and nothing else, a non-mapping root, a non-identifier key, a non-string value, an empty string, a duplicate key, and malformed YAML are all rejections rather than skipped entries — loud at boot and at a write, warn-and-keep-last-good on a live reload. The dotenv physical-line editor gives way to a patch of the parsed document, so comments and untouched entries keep their formatting and any string value round-trips, multi-line included. Writer lock, read-modify-write, atomic 0600 write under a 0700 directory, watcher, self-write suppression, and quiescent disposal are unchanged. $DSH_HOME/.env becomes the user's ordinary environment layer. app-boot's new loadLayeredEnv loads the invoking directory's .env then the Harness home's, giving user < project < inherited; the home resolves from the inherited environment first, so a project .env cannot redirect it. Credential precedence is unchanged: the live environment still wins read-only over the file, and shadowed writes still reject. Whether a provider-managed store should instead win over the environment is a separate decision. No migration: a key already in $DSH_HOME/.env keeps resolving through the new environment layer, as a read-only env source that shadows the stored one.
12 KiB
Third-Party Notices
DeepSeek Harness is licensed under BSD 3-Clause. It depends on the third-party open-source software listed below. Each project remains under its own license; nothing in this file changes those terms.
This file lists direct dependencies declared by the workspace. It is generated from the workspace manifests by scripts/gen-third-party-notices.ts: a pre-commit hook regenerates it whenever a staged file changes one of its inputs, and scripts/gen-third-party-notices.spec.ts asserts in the test lane that the committed bytes match. Deleting a manifest runs no hook, so that case is caught by the assertion instead. Run pnpm run verify-third-party-notices for the standalone check.
The complete npm transitive closure, with exact pinned versions, is recorded in pnpm-lock.yaml — inspect it with pnpm licenses list. The Python closure is recorded in python/sdk/uv.lock, and the Landlock launcher workspace keeps its own in native/landlock-run/pnpm-lock.yaml.
Vendored source (vendor/)
The Cordis framework and its foundation libraries are source-vendored into this repository rather than consumed from npm. All are MIT-licensed; each directory preserves its upstream LICENSE file. Exact upstream commits and local modifications are recorded in vendor/README.md.
| Package | Upstream | License |
|---|---|---|
cosmokit |
github.com/deepseek-harness/cosmokit | MIT |
schemastery |
github.com/deepseek-harness/schemastery | MIT |
cordis |
github.com/cordiverse/cordis | MIT |
@cordisjs/plugin-loader |
github.com/cordiverse/cordis | MIT |
@cordisjs/plugin-include |
github.com/deepseek-harness/cordis | MIT |
@cordisjs/plugin-group |
github.com/deepseek-harness/cordis | MIT |
@cordisjs/plugin-timer |
github.com/deepseek-harness/cordis | MIT |
@cordisjs/plugin-hmr |
github.com/deepseek-harness/cordis | MIT |
@cordisjs/plugin-logger-console |
github.com/deepseek-harness/cordis | MIT |
Runtime npm dependencies
External packages that a workspace package resolves at runtime. scripts/install.sh installs this repository itself, so the tier covers every plugin a user can mount from cordis.yml — not only what the dsh CLI/TUI, the Web UI, and the Python SDK runtime load by default.
pnpm applies local patches to the following packages at install time, so shipped artifacts carry modified copies; each patch file is the complete record of the modification:
@earendil-works/pi-tui@0.80.7—patches/@earendil-works__pi-tui@0.80.7.patchnode-pty@1.1.0—patches/node-pty@1.1.0.patch
Development-only npm dependencies
External packages directly declared only by repository tooling, test infrastructure, the documentation site, the demo leaves, or the native launcher's build workspace. No shipped surface names them itself. A package here may still be pulled in transitively by a runtime dependency — pnpm-lock.yaml is the authority on the full closure — so this tier records who declares a package, not what a build ultimately bundles.
eslint-plugin-sonarjs (LGPL-3.0-only) and lightningcss (MPL-2.0) run only as development tooling; their code is not linked into or distributed with any DeepSeek Harness artifact.
Python SDK dependencies (python/)
Direct dependencies of the pyproject.toml manifests, plus uv as the development workflow tool.
| Package | License | Role |
|---|---|---|
hatchling |
MIT | build backend |
pydantic |
MIT | runtime dependency of deepseek-harness |
pytest |
MIT | test-only |
uv |
MIT / Apache-2.0 | development workflow tool |
Fetched at build time
| Package | License | Role |
|---|---|---|
@yao-pkg/pkg |
MIT | invoked by scripts/build-exe-for-python-sdk.ts to assemble the single-file SDK runtime executable |
First-party sibling releases
node-addon-landlock-run (and its platform packages) is released from a DeepSeek Harness sibling repository under BSD 3-Clause. It is listed here for completeness; it is first-party, not third-party.