dsh-acp-activity
Community ACP automation server for DeepSeek Harness with committed tool-activity frames (tool_call/tool_call_update) — dsh-plugin
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 30, 2026
- Updated
- Aug 30, 2026
Introduction
@winghv/dsh-acp-activity
Community automation-only Agent Client Protocol server for DeepSeek Harness over JSON-RPC stdio, with committed tool-activity frames: automation clients see tool_call / tool_call_update frames alongside assistant messages, so a bash run or a file edit is visible on the wire instead of only in the session log.
This is a community alternative transport to @deepseek-ai/dsh-acp for deployments that need tool visibility. It is derived from DeepSeek Harness's packages/acp/acp and packages/examples/acp-demo (MIT), and is not an official DeepSeek AI package.
Install
npm install -g @winghv/dsh-acp-activity
Requires Node ^22.19.0 || >=24.0.0 and a Harness runtime composition (cordis.yml) providing the agent spine, model adapter, tools, and persistence — the same composition shape @deepseek-ai/dsh-acp-demo expects.
Usage
dsh-acp-activity --config ./cordis.yml
The config schema matches @deepseek-ai/dsh-acp-demo (provider, model, persona, persistenceRoot, workspaceContext, ...). In your cordis.yml, mount this package's plugin (acp-activity) in place of acp-demo; every other leaf stays the same. Stdout carries only ACP JSON-RPC frames — never attach a stdout logger.
Tool activity contract
| Source | Wire frame |
|---|---|
committed tool/call | one tool_call: toolCallId = session call id, title = tool name, status: 'in_progress', kind = conservative name heuristic (execute/search/edit/read/delete/move/fetch/think, else other), rawInput = reparsed model arguments JSON (dropped when invalid) |
committed tool/result | one tool_call_update: status = completed/failed (from the result error identity), text/image result blocks as verified content entries |
Tool frames ride the same ordered output chain as assistant messages and are observational: delivery failure warns without settling or failing the owning prompt, because the model-facing outcome of a tool is still its tool result. Raw deltas, reasoning, plans, titles, usage, and tool-private meta presentation payloads stay off the wire.
Everything else — fresh-session semantics, one-shot permission negotiation, image admission, cancellation, disposal ladder, one-connection-many-sessions — matches @deepseek-ai/dsh-acp at the pinned upstream version (see peerDependencies).
Versioning and upstream tracking
The version tracks the upstream release it is ported from: 0.1.1-rc.2.1 = upstream 0.1.1-rc.2 + this package's first patch set. On every upstream bump, diff packages/acp/acp and packages/examples/acp-demo, port non-tool changes, run the ported test suite, then publish the next -N revision.
Development
npm install
npm test # vitest — ported upstream bridge specs plus tool-activity specs
npm run build # esbuild bundle into lib/
License
MIT — see LICENSE. Derived from deepseek-ai/deepseek-harness (MIT).