Align the one-shot app with the shared agent-spine contract that landed on master after this branch began. Expose maxParallelToolCalls, dshHome, toolBash, and toolTasks through the Loader schema and route them with pickSpineConfig(). This restores deployment control over tool-call concurrency, the shared Harness home, background bash, and task_output wait bounds instead of silently retaining owner defaults. Exercise all four fields through the composed runtime, document the package-level contract, and regenerate the config catalog from the owning interface.
examples/ — ready-to-run demo bundles
Pre-composed plugin bundles a thin leaf cordis.yml loads instead of assembling the spine and a front door by hand. These are demo / reference packages — the -demo npm suffix marks each one as non-product surface, readable straight off the package name. The runnable leaves under the repo-root examples/ and the Python SDK runtime are the consumers; each is just its swappable backends plus one bundle entry.
| Package | npm name | Role |
|---|---|---|
agent-spine-demo/ |
@deepseek-ai/dsh-agent-spine-demo |
The executor-less/UI-less agent spine as one bundle plugin (timer + llm + sessions + system-prompt + tools + skills + agents + invariants + tool-bash + workspace-context + tool-skill + agent-loop) |
stdio-demo/ |
@deepseek-ai/dsh-stdio-demo |
Terminal chat app: the spine + JSONL persistence + TTY-selected dsh-tui/dsh-stdio front door + a pre-created main agent, with a boot bin |
cli-demo/ |
@deepseek-ai/dsh-cli-demo |
Headless one-shot app: the spine + JSONL persistence + a pre-created main agent, with text and DSH-native JSON output |
acp-demo/ |
@deepseek-ai/dsh-acp-demo |
ACP server app: the spine + JSONL persistence + the acp bridge (no stdout logger), with a boot bin |
jsonrpc-demo/ |
@deepseek-ai/dsh-jsonrpc-demo |
Bin-only runtime that boots an external cordis.yml for the stdio JSON-RPC SDK client |
agent-spine-demo is the shared bundle; stdio-demo, cli-demo, and acp-demo compose it with terminal, headless one-shot, and ACP front doors and own their boot bins. jsonrpc-demo mounts no composition of its own — it boots whatever tree the deployment's cordis.yml names, and is what the Python SDK runtime launches.
These are not product API. The spine pieces they bundle live in core/, the bridges/channels/boot-glue in ui/, and the swappable backends (LLM adapter, bash executor) in their capability groups; a demo bundle just picks one concrete composition of them. Swap or fork one freely.
Do not confuse this group with the repo-root examples/: that directory holds the runnable cordis.yml leaves; this group holds the bundles those leaves load.
The jsonrpc bin/exe names are legacy
jsonrpc-demo renamed like its siblings, but its bin is still dsh-jsonrpc-agent and the single-file executable is still dsh-jsonrpc-agent-pkg (referenced across the Python distribution). Those names are the SDK's runtime-startup surface; they are reconciled when the SDK unifies that startup flow, not by this move.