$DSH_HOME/.env had just become an ordinary environment layer, which left the harness resolving user-facing values from a flattened process.env that could no longer say where a value came from. A key stored through the web page stayed shadowed by an older key in the user's own .env. An endpoint could be redirected by the project: the invoking directory's .env is materialized like every other layer, and a base URL decides where a resolved API key is sent, so a DEEPSEEK_BASE_URL written into a model-editable workspace would send the user's credential — and the prompts carrying their code — to whatever host that file named. Give every user-facing value one ordering, with four kinds of source: explicit for this run per-operation override, CLI argument > authored by deployment --config / --config-replace > this launch's shell inherited process environment > product-managed store settings.yaml, .credentials.yaml > discovered file $DSH_HOME/.env > defaults schema default, shipped base, public default The domains differ only in which tiers exist. The earlier split — credentials ranking the environment over the managed file while settings ranked over the environment — was inconsistent: the distinguishing fact is who authored the source, not the domain. packages/util/environment owns an immutable snapshot with per-layer provenance. getFrom(name, sources) searches only the layers a caller names, and omitting one is a refusal rather than a demotion: the adapters ask for ['process', 'user-env'], so no reordering can let a project file back into a decision it was excluded from. isBootstrapOnly rejects, before anything is materialized, any .env setting a variable that governs how a process launches (PATH, SHELL, NODE_OPTIONS, LD_PRELOAD), where code or model-visible instructions load from (the whole DSH_* namespace, HOME, XDG_*), or how the network is reached (proxy and CA variables). The namespace is denied wholesale so a switch added later cannot become settable by being forgotten, and there is no opt-out. verify-config-source-ownership keeps both rules: no unregistered process.env read under packages/*/*/src (26 allowlisted with reasons), and no apiKey, baseURL, or headers inlined from the environment in shipped Cordis config — removing those inlines is what makes the deployment tier meaningful.
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.