dsh-acp is an independent, client-neutral Agent Client Protocol (ACP) adapter for a user-installed DeepSeek Harness (DSH).
Any ACP client that supports the negotiated protocol version and advertised capabilities can connect over stdio.
- Discovers an existing DSH source installation without installing, updating, or modifying it.
- Rejects unknown DSH versions, unknown layouts, basename collisions, and runtime drift.
- Loads the selected, versioned DSH driver only after discovery and fingerprint validation.
- Translates DSH sessions, streaming events, cancellation, steering, and permissions to ACP.
- Advertises only capabilities implemented by the selected driver.
The current driver supports the DSH 0.0.1 source layout. See compatibility for the exact surface and limitations.
Its current session surface is new, load, resume, fork, workspace-scoped
list, and close. It also supports text/resource-link prompts, steering,
one-shot permission requests, and stdio/Streamable HTTP MCP servers. Features
without a safe DSH 0.0.1 seam—including delete, auth/provider management,
images, embedded context, elicitation, and SSE MCP—remain unadvertised.
DSH's credential-backed built-in web search/fetch surface and repository plugin
loader are disabled; an ACP-explicit MCP server remains a separate,
client-configured tool boundary.
dsh-acp [serve] [--dsh-path <path>] [--dsh-home <path>]
dsh-acp inspect --json [--dsh-path <path>] [--dsh-home <path>]
dsh-acp doctor --json [--dsh-path <path>] [--dsh-home <path>]
dsh-acp --version
serve is the default. Its stdout is reserved exclusively for newline-delimited ACP JSON-RPC frames. Diagnostics go to stderr and are bounded and credential-redacted.
inspect --json performs read-only discovery and prints one JSON result. doctor --json additionally checks that the discovered installation remains unchanged. Neither command proves a live ACP connection; the ACP client's bounded initialize handshake is the final readiness check.
For a runtime fingerprint fence:
dsh-acp serve \
--dsh-path /absolute/path/to/dsh \
--node /absolute/path/to/node \
--expected-runtime-fingerprint sha256:...
Legacy --candidate and --dsh-root spellings are accepted as aliases for --dsh-path. They still go through full discovery and cannot bind an unchecked checkout.
See the complete CLI contract.
Published releases use dsh-acp as the canonical npm name and publish the
same version and executable payload as the @offloophq/dsh-acp scoped mirror.
Install either identity, not both in the same npm prefix, because both own the
same dsh-acp executable:
npm install --global dsh-acp
# or
npm install --global @offloophq/dsh-acp
The source repository and its published GitHub Releases are public:
- GitHub Release assets can be downloaded anonymously and checked against the
release
SHA256SUMSfile. - The
dsh-acppackage and its@offloophq/dsh-acpmirror publish the same executable payload through public npm identities. - A downstream distributor can fetch a fixed public release artifact, verify its checksum, and ship the adapter in its own package.
The default release artifact is an esbuild-produced, portable JavaScript bundle for Node.js ^22.19.0 or >=24.0.0. This adapter is not shipped or executed as TypeScript, and it does not invoke npm, pnpm, npx, the tsx CLI, or network downloads at runtime. The versioned driver does import DSH's already-installed TypeScript sources through DSH's own validated tsx loader; that loader and source tree remain DSH-owned prerequisites.
Experimental Bun standalone compilation exists for six desktop targets, but the CI job retains only its manifest and not the binaries. The current in-process DSH driver is not Bun-compatible, and Bun embeds LGPL-licensed JavaScriptCore/WebKit, so every binary distribution remains gated on runtime compatibility plus separate relinking and license reviews. See distribution.
Requirements are Node.js ^22.19.0 or >=24.0.0 and npm 11.
npm ci
npm run check
node scripts/package-release.mjs
node scripts/verify-release.mjs
Build outputs are written to dist/; release assets are written to release/.
See npm publishing for the dual-package identity,
one-time registry bootstrap, Trusted Publisher, release-tag, trust-boundary,
and recovery contracts.
- Discovery never downloads or mutates DSH.
- PATH basename matches are treated as candidates, not identity proof.
- The logical install anchor, physical checkout, critical file contents, Node version, and tsx version are fenced before construction and again before DSH boot.
servekeeps non-protocol output off stdout.- Diagnostic serialization is bounded and redacts credential-shaped keys, headers, URLs, and values.
- The DSH composition used by the driver disables DSH telemetry and owns cleanup of sessions and the root fiber.
- Every boot uses an adapter-owned private temporary configuration, forces the
reviewed
workspace-write/askbaseline, and leaves the installed DSH source configuration unchanged. - Persisted, fork-seeded, and newly returned DSH event logs are rejected if
their permission preset, sandbox mode, or approval policy is dangerous,
unknown, or outside the exact reviewed event shape. Only absent facts or
read-only/workspace-writeplusaskcan be adopted. - The final boot layer disables DSH's built-in repository, web search/fetch,
and telemetry rows, then verifies that no global web service or
web_search/web_fetchtool survived composition.
This is not process-wide network isolation. DSH workspace-write constrains
file writes; a bash/execute command may still use host networking, and an
ordinary tool call does not necessarily raise an ACP permission request. The
selected model transport and ACP-explicit MCP servers are intentional separate
network paths. Standalone clients must apply policy appropriate to their trust
model. A client that requires protected admission must fail closed until its
outer network/provider interception conformance has passed; a successful ACP
initialize alone is not protected-readiness proof. The vendor capability
metadata reports this explicitly as offloop.dsh-acp.security.
Report vulnerabilities through the repository's private vulnerability reporting channel. Do not include API keys, credentials, prompts, or customer data in a public issue.
Original project code is licensed under the MIT License. Bundled dependencies and optional runtimes retain their own licenses; see THIRD_PARTY_NOTICES.md. DSH is an external prerequisite and is not included or redistributed by this project.