# Conflicts: # docs/config-catalog.md # docs/event-producer-consumer.md # docs/rfc/implemented/feature/2026-07-05-dynamic-workflows.md # examples/acp-agent/tests/acp.snapshot.ts # packages/code-runtime/code-runtime-worker/tests/built-lib.e2e.ts # packages/code-runtime/code-runtime-worker/tsdown.config.ts
@deepseek-ai/dsh-jsonrpc
Stdio JSON-RPC plugin for out-of-process SDK clients such as Python deepseek_harness. HarnessSdkServer handles initialize → session/prompt → shutdown plus session and subagent notifications over JsonRpcLineTransport. This package owns the protocol; jsonrpc-agent boots the external cordis.yml that chooses the surrounding runtime. See the single-executable RFC for the distribution design.
Wiring
inject: ['agents']. The server gets or creates one agent per sessionId on session/prompt and demuxes subagent/end through the registry. If initialize.model lacks a registered adapter, it mounts dsh-llm-deepseek using $DEEPSEEK_API_KEY and $DEEPSEEK_BASE_URL; a config-registered adapter wins. Persistence, tools, and other adapters come from the surrounding cordis.yml.
Config
No cordis.yml keys. JsonRpcConfig.input, output, and exit are test-only runtime seams; production uses process stdio and process.exit.
stdout is the protocol
stdout carries only JSON-RPC frames. The loading config must omit stdout loggers; diagnostics go to stderr.
Shutdown and exit semantics
A shutdown request flushes its response, disposes the plugin fiber, then exits 0. Disposal idempotently shuts down every SDK-created agent to quiescence, detaches subscriptions, and closes the transport. Bare fiber disposal only stops serving; it does not exit. The app bin owns root disposal for stdin EOF (0), SIGTERM (0), and SIGINT (130).
Wire notes
initialize.serverInfo.name is the wire-stable deepseek-harness-sdk-runtime. Each session permits one in-flight prompt; overlap fails immediately, other sessions remain independent, and the session is reusable after settlement. Persistence roots and deployment persona remain in cordis.yml.