DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins

@openma/deepseek-harness-acp

Deepseek Harness Acp

用于 DeepSeek Harness 的 Agent Client Protocol (ACP) 适配器——可从 Zed 等 ACP 客户端使用 DeepSeek Harness。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:openma-ai/deepseek-harness-acp#43138393838359f073fa0d6456b5c06ed61bb3d3
README兼容性版本

兼容性与来源证明

Deepseek Harness Acp 以 @openma/deepseek-harness-acp 发布,当前版本为 0.4.40。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
any
发布来源
github
Registry 更新时间
2026/11/4

版本

0.4.40stable
2026/10/26
0.4.39stable
2026/10/17
0.4.38stable
2026/10/17
查看其余 47 个版本收起版本
0.4.39-beta.2beta
2026/10/17
0.4.39-beta.1beta
2026/10/17
0.4.38-beta.1beta
2026/10/12
0.4.38-beta.0beta
2026/10/11
0.4.37stable
2026/10/3
0.4.36stable
2026/10/2
0.4.35stable
2026/9/29
0.4.33stable
2026/9/20
0.4.32stable
2026/9/17
0.4.31stable
2026/9/10
0.4.30stable
2026/9/7
0.4.29stable
2026/9/5
0.4.28stable
2026/9/5
0.4.27stable
2026/9/2
0.4.26stable
2026/8/24
0.4.25stable
2026/8/24
0.4.24stable
2026/8/22
0.4.23stable
2026/8/22

相关插件

正在加载相关插件…

最新版
0.4.40
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
any
许可证
Apache-2.0
发布源
github
GitHub
★ 0
周下载
2,516
查看源码 ↗项目主页 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题
0.4.23-beta.0beta
2026/8/22
0.4.22stable
2026/8/22
0.4.21stable
2026/8/22
0.4.20stable
2026/8/22
0.4.19stable
2026/8/21
0.4.17-beta.0beta
2026/8/21
0.4.16stable
2026/8/21
0.4.15stable
2026/8/20
0.4.14stable
2026/8/18
0.4.13stable
2026/8/18
0.4.12stable
2026/8/18
0.4.10stable
2026/8/17
0.4.10-beta.2beta
2026/8/17
0.4.10-beta.1beta
2026/8/17
0.4.9stable
2026/8/16
0.4.8stable
2026/8/16
0.4.7stable
2026/8/16
0.4.6stable
2026/8/15
0.4.5stable
2026/8/14
0.4.4stable
2026/8/14
0.4.3stable
2026/8/14
0.4.2stable
2026/8/14
0.4.1stable
2026/8/14
0.4.0stable
2026/8/14
0.3.0stable
2026/8/14
0.2.0stable
2026/8/14
0.1.0stable
2026/8/14
0.1.0-beta.1beta
2026/8/14
0.1.0-beta.0beta
2026/8/14

相关插件

继续浏览 integrations-communication 分类下经过校验的插件。

Remote Web Ui@linxin666/dsh-remote-web-ui通过扫码配对访问 dsh Web GUI,共享一个官方界面:设置按钮旁的二维码可将手机和 PC 配对到同一个 Web GUI(手机采用竖屏触控适配层,PC 使用完整桌面界面),通过一次性令牌和 rRemote Bridge@linxin666/dsh-remote-bridgeDSH 远程桥接:主机端通过唯一且精确的 /ios/v1 WebSocket 路由提供协议 v1——会话列表、历史记录基线、提示、包含工具活动的实时回合增量、中断以及进程内代理审批——连接到通过一次性配对的设备Im@xmanrui/dsh-im将微信、飞书、企微、钉钉、QQ、Telegram、WhatsApp、Slack、Discord 和 Matrix 接入 DSH。Ds Botds-botDS Bot:DeepSeek Harness 的一组长期运行的 Bot,支持主 Bot、Bot 间消息和群聊

README

Agent Client Protocol × DeepSeek Harness

deepseek-harness-acp

Use DeepSeek Harness from Agent Client Protocol clients such as Zed and Backchat.


The adapter composes the harness in-process and maps its session-event log onto the full ACP vocabulary: streamed text and reasoning, tool calls with diffs and display terminals, plans, permission requests, session modes, config options, slash commands, skills, and MCP servers. Credentials never touch your editor config — it reuses the key you saved in the dsh Web UI, or dsh-acp login saves one to the same store.

One package, standalone or plugin

A · dsh profile plugin (recommended)B · Standalone server
Best forNormal installation and upgradesConnecting an ACP client without managing a dsh profile
Installdsh plugin --profile acp add @openma/deepseek-harness-acp@latestnpm i -g @openma/deepseek-harness-acp
Zed runsdsh --profile acpdsh-acp
HarnessThe dsh that owns the profileYour installed dsh, then the package's locked private runtime
Compositiondsh-base + this bundle + your profile's own patchesdsh-base + this bundle (profile machinery booted in-process)

Both shapes share $DSH_HOME: the same credential store, settings, presets, and session logs as dsh web — conversations started in the Web UI can be listed and loaded from the editor.

Other dsh surfaces can mount the transport-independent @openma/deepseek-harness-acp/plugin on their Base Host tree and own the transport adapter. The TUI profile uses this path: it starts a separate TUI Client process and connects ACP over that process's standard stdin/stdout; it does not start dsh-acp or use an in-process Client stream.

The package is therefore not only a CLI wrapper. It is also the ACP surface plugin used by other dsh applications: one Host composition can expose the same sessions, tools, presets, skills, and persistence through a transport chosen by the surface.

DSH compatibility

This release supports @deepseek-ai/dsh >=0.1.7-rc.2 — a minimum-version floor declared in engines.dsh (the field dsh's own plugin loader checks, with prereleases included), never an exact-version list. It is deliberately not a @deepseek-ai/dsh peer dependency: npm and pnpm match peer ranges without prereleases, so a peer floor would reject every dsh prerelease. A newer dsh is always attempted: API differences between dsh generations are feature-detected where they are used (for example dsh 0.2.1's subagents.drainDescendants versus 0.2.0's drainContinuableDescendants), and a dsh newer than the newest tested version (0.2.1-rc.2) only logs a warning. Only a dsh below the floor is refused. CI exercises the tested profile matrix (runtime/compatibility.json) plus the next dist-tag. The bundled runtime is DSH 0.2.0-rc.2, including the upstream cross-process session write lock.

Runtime selection has exactly two rules (Martty issue #157):

  • Standalone (dsh-acp bin): the packaged runtime is always used — ambient installs in the invoking directory, on PATH, or in global npm are never consulted. An explicit --dsh-path/DSH_PATH/DSH_ACP_HOST (or the literal value bundled) selects an installation instead, and is refused with a message naming the version found, its source, and the supported range when it falls outside it.
  • Plugin mode (dsh plugin add, Martty launched as a dsh plugin): the hosting dsh is the runtime, checked against the same range at mount time; an out-of-range host fails with the same refusal message.

The resolved runtime is always reported: the launcher logs harness host: @deepseek-ai/dsh <version> via <source> to stderr, and the initialize response carries agentCapabilities._meta.dsh.runtime ({base, version, source}) for clients to display.

A competing load/resume returns a standard JSON-RPC error. Closing the session or exiting the owner process allows another process to resume it. Every process writing shared sessions must use a fixed backend; older hosts do not participate in this lock.

Restoring historical sessions uses the host's V3 migration, which preserves the original log. Upgraded sessions cannot be read by older hosts. Multi-root workspaces remain unsupported.

A · dsh profile plugin (recommended)

npm install -g @deepseek-ai/dsh
dsh web                                                    # save your API key once
dsh plugin --profile acp add @openma/deepseek-harness-acp@latest
// Zed settings.json
{
  "agent_servers": {
    "DeepSeek Harness": { "command": "dsh", "args": ["--profile", "acp"] }
  }
}

The plugin command creates $DSH_HOME/profiles/acp, installs or upgrades the adapter, and registers its dsh.bundle patch. The bridge mounts over @deepseek-ai/dsh-base — the same product baseline as dsh web, with the module-reload watcher off. Extend the profile in $DSH_HOME/profiles/acp/cordis.patch.yml like any other dsh profile. A global dsh-acp installation is not required for this path.

B · Standalone server

npm install -g @openma/deepseek-harness-acp
dsh-acp login        # interactive; or save the key in the dsh Web UI
// Zed settings.json
{
  "agent_servers": {
    "DeepSeek Harness": { "command": "dsh-acp" }
  }
}

The standalone binary uses the runtime archived inside this package unless a harness is named explicitly via --dsh-path / DSH_PATH / DSH_ACP_HOST. DSH is declared as an engines.dsh floor (see DSH compatibility), never an npm-installed dependency: plugin mode uses the Host's tree, while standalone maps the same imports to the private runtime. When a real $DSH_HOME/profiles/acp exists, that profile owns the composition.

Plugin and extension model

There are two independent ways to extend an ACP-backed surface.

To use portable Agent Plugins, Codex plugins, Claude Code plugins, or Pi packages through an ACP client, add the Agent Plugins Bridge to the same profile:

dsh plugin --profile acp add @openma/dsh-agents-plugins-bridge@latest

The Bridge contributes ordinary Host rows. Imported commands, skills, tools, hooks, MCP connections, agents, and Pi extensions therefore reach ACP through this adapter's existing projections; there is no ACP-specific plugin import runtime. The Bridge's Web management panel and MCP Apps HTML renderer remain Web surfaces and are not sent over ACP.

For extensions that need a session-owned background lifecycle without an open terminal UI, use Martty owner. It is a generic ACP rpc client: this package remains the server/transport, while Martty owns the long-lived Session and explicit startup/shutdown slash commands.

Extend the Host composition

The ACP adapter rides the Cordis tree that the profile already owns. Add dsh plugins to that profile to change the agent composition instead of forking the ACP server: providers and models join the live catalog, commands and skills join the advertised session surface, tools and subagents appear through standard session/update, and the same session persistence remains available to every surface.

For applications embedding ACP, the public package entries are:

ExportRole
@openma/deepseek-harness-acp/pluginComplete Host-side surface plugin. It fills the ACP-required Host services that Base leaves to a surface and provides ctx.acpServer. It does not claim a transport.
@openma/deepseek-harness-acp/serverLower-level transport-independent acpServer provider for a Host tree that already supplies the injected composition services.
@openma/deepseek-harness-acp/stdioStandard profile adapter: connects ctx.acpServer to process stdin/stdout.
@openma/deepseek-harness-acp/bridgeNode stream adapter and compatibility entry for older profile patches.

ctx.acpServer.connect(stream) creates a connection-owned bridge fiber over the existing Host composition. The transport owner retains process, stream, and TTY lifecycle; the ACP plugin retains session and agent semantics. This is the shape used by @openma/deepseek-harness-tui: ACP stays on the Base Host tree while a separate TUI Client process owns its own Cordis tree.

Adding a Cordis service does not automatically invent a wire method. Prefer a standard ACP capability or event projection whenever one exists; add an adapter only for behavior that must cross the client boundary.

Extend ACP without breaking ordinary clients

Optional wire behavior follows ACP's extension conventions:

  1. Advertise support in initialize metadata, with a namespaced and versioned capability such as _meta.dsh.cordis.protocol.
  2. Carry annotations on standard messages in namespaced _meta fields when no new request is needed.
  3. Name custom JSON-RPC requests and notifications with a leading underscore, and send them only after both peers negotiated the matching capability.
  4. Keep the standard ACP path complete. A client that does not advertise an extension must still get normal sessions, prompts, updates, cancellation, auth, and config options.

DSH tool result values

The ACP metadata registry is the authoritative list of every _meta field this adapter reads or emits. It records direction, carrier, shape, negotiation requirements, and replay behavior, including native DSH tool values at _meta.dsh.toolResult.value.

The current package applies this pattern to the built-in _dsh/cordis/* family used by the TUI for Client capability discovery, dynamic Package lifecycle, and package-private Host/Client RPC. It is an explicit, versioned extension—not a synchronization of Cordis plugin ids, fibers, or inject across processes. The bridge's internal method registry is not currently a public arbitrary-extension API; new extension families should first define a stable capability, ownership, lifecycle, and fallback contract.

Authentication

No keys in editor config, no secrets pasted into chat. ACP clients follow the protocol: initialize advertises the Agent Auth methods the client declared it can use.

  1. API key — api-key, or api-key:<provider> per live route. The client may pass _meta["api-key"].apiKey.
  2. Terminal — terminal-login, when the client declares clientCapabilities.auth.terminal (or _meta["terminal-auth"]). The client runs the advertised dsh-acp login command itself — the adapter never supplies a command path — and the saved key is picked up on the next authenticate or session/new.
  3. Browser — browser, only when the client declares clientCapabilities.elicitation.url. The adapter starts a localhost sign-in page and hands its URL to the client through url elicitation — headless, SSH, and WSL sessions all see the URL. The secret never travels over ACP; the page's own timeout bounds the wait, and a decline or cancel ends the flow with auth_required instead of hanging.
  4. Custom gateway — gateway, only when the client opts in with clientCapabilities.auth._meta.gateway === true. The client sends _meta.gateway { baseUrl, headers, providerName? }.

The adapter writes credentials to the harness store. Missing credentials fail session/new and session/prompt with auth_required (-32000) carrying data.authMethods — the same advertised list — so the client can open its auth UI from any failure. Typing a native auth command (/login, /logout) gets a plain "isn't available in this environment" reply pointing at the client's sign-in/sign-out and ends the turn — it is never advertised, never reaches the model, never changes credentials, and never returns auth_required.

logout is scoped to one provider route — the one named by _meta.provider, or the active provider when omitted — and clears only that provider's stored key and gateway base-URL. Re-authenticating overwrites the same provider's credential; authenticating a second provider adds alongside the first; dsh-acp login --provider <route> replaces it out of band. The active method, provider, and credential name are pushed to the client as _auth/status_update whenever they change.

  1. Harness credential store — $DSH_HOME/.credentials.yaml (mode 600), the file the dsh Web UI writes; hot-reloaded. Save a key with dsh-acp login [--provider <route>], or the Web UI (Settings → Models).
  2. Process environment — DEEPSEEK_API_KEY / DEEPSEEK_BASE_URL (and the matching ANTHROPIC_API_KEY / OPENAI_API_KEY for those routes) in the environment that launches the agent.

The credential gate is the current provider route. An Anthropic-only store is enough for an Anthropic session; a DeepSeek key does not unlock another provider.

Features

  • Streaming — assistant text and reasoning deltas; assembled-message fallback.
  • Images — promptCapabilities.image is advertised when the composition mounts ctx.attachments (dsh-base does). ACP image blocks are validated, stored with saveImage, and kept in wire order with surrounding text. resource_link stays a textual file pointer.
  • Tool calls — ACP kinds, human titles, file locations, real diffs from fs-tool hunks, raw input/output; command output on a display terminal when the client supports one, fenced output otherwise.
  • Permission presets as session modes — read-only / workspace-write / danger-full-access, each a named {sandbox, approval} pair recorded as a durable session fact (also exposed as a config option for clients that only render those).
  • Agent composition — when the profile mounts agentPresets, an uncategorized config option id: "agent" lists the roster (standard / code / minimal / cordis, plus user copies). Switching rebuilds the agent live with history preserved. Authoring (copy/rm) stays on the Web settings page; there is no /preset slash.
  • Live model catalog — providers × models from the running composition (third-party providers added in the Web UI appear immediately), plus reasoning-effort selection that follows your product default. Model option ids are stable: bare model ids while one provider is registered, provider::model as soon as there are several — never keyed on the current default provider (which every switch rewrites), so an id a client cached keeps working. Bare ids are still accepted on input and resolve to the provider that serves them.
  • Slash commands — adapter built-ins (/status, /model) plus the harness command registry (/compact, /goal, /permission, /plan, …) executed without a model turn, plus skills (/skill-name — the harness's own invocation gesture). Login and logout are ACP methods, not chat commands.
  • Plans & usage — todo_write snapshots as ACP plans; token accounting as usage_update and per-turn usage.
  • Sessions — session/resume restores a durable session without replaying its transcript; remains the full-history path. Also supports , silent restore when a client prompts an old session after an agent restart, and titles as . Multi-root sessions are not advertised: non-empty on , , , or return until .

Configuration

Flags win over environment variables, which win over defaults. All optional — with no flags, sessions follow your product defaults (settings.yaml).

FlagEnvDefaultPurpose
--dsh-pathDSH_PATHauto-detectDeepSeek Harness installation
--providerDSH_PROVIDERproduct defaultProvider route override
--modelDSH_MODELproduct defaultModel override
--max-tokensDSH_MAX_TOKENSprovider defaultPer-request output-token cap
--permission-modeDSH_PERMISSION_MODEworkspace-writeInitial permission preset
--reasoning-effortDSH_REASONING_EFFORTproduct defaultoff / high / max
—DEEPSEEK_API_KEY—API credential (fallback to the credential store)
—DEEPSEEK_BASE_URLDeepSeek endpointOpenAI-compatible endpoint override
—DSH_ACP_DEBUGoffVerbose stderr diagnostics

Subcommands: dsh-acp login [api-key] (interactive when omitted; input never echoes), dsh-acp update (self-update via npm).

Permissions and sandboxing

Sessions start in workspace-write: bash and file mutations are confined to the session's cwd (plus shared temp roots), and a model retry requesting wider access raises an ACP permission request. Always allow (this session) flips the approval policy to never for that session. danger-full-access disables both the sandbox and the prompts — use it only in disposable checkouts or containers. Each level is one durable preset (sandbox + approval together), the same three the Web UI offers.

Architecture

ACP client (Zed, …)
   │  ACP JSON-RPC over stdio
   ▼
dsh-acp
   ├─ src/bin.ts              selects one DSH tree before Host imports evaluate
   ├─ src/profile-boot.ts     boots the harness's own profile machinery
   │                          (dsh-base + this bundle + $DSH_HOME layers)
   ├─ src/harness.ts          host discovery (DSH_PATH → cwd → PATH → npm -g → bundled runtime)
   └─ src/bridge/             the ACP bridge (a cordis plugin)
        ├─ index.ts           sessions, prompts, cancel, modes, options,
        │                     commands, credentials, MCP mounts
        ├─ translate.ts       session-event → ACP update projection (pure)
        ├─ history.ts         stored-log replay for session/load (pure)
        ├─ fork.ts            session/fork meta, message lookup, inclusive cut (pure)
        └─ prompt.ts          ACP prompt blocks → harness content blocks (pure)
   ▼
external or package-bundled dsh     (agent spine, llm, persistence, sandbox,
                                     tools, presets, skills, compaction, …)

When embedded by another surface, only the transport edge changes:

dsh Base Host Cordis tree
   ├─ product plugins (agents, tools, skills, persistence, …)
   └─ @openma/deepseek-harness-acp/plugin
         └─ acpServer.connect(Stream)
                │ standard ACP + negotiated extensions
                ▼
          surface-owned Client process

The bridge consumes the harness session/event firehose — the same append-only log persistence stores — so live streaming, history replay, and session/list agree by construction. All harness modules, including cordis itself, load from one host tree: plugin and service identity is never split across copies.

Development

npm install         # dev deps include the harness packages (types + tests)
npm run typecheck   # tsc --noEmit
npm test            # vitest: unit + e2e smoke (boots the real composition; no model calls)
npm run build       # esbuild → dist/

To also run the e2e suite against a standalone host install:

npm install --prefix /tmp/dsh-host @deepseek-ai/dsh
DSH_ACP_TEST_HOST=/tmp/dsh-host npm test

Live iteration: paired profiles

Keep the profile your editor uses on the published package, and point a second profile at this worktree via a pnpm symlink:

dsh plugin --profile acp add -w @openma/deepseek-harness-acp   # stable
dsh plugin --profile acp-test add -w "link:$PWD"               # dev (symlink)

The dev loop is npm run build + restart — dist/ and cordis.patch.yml are read through the link. (pnpm treats file: as a copy install and caches same-version tarballs; link: avoids both.)

{
  "agent_servers": {
    "DeepSeek Harness": { "command": "dsh", "args": ["--profile", "acp"] },
    "DeepSeek Harness (dev)": { "command": "dsh", "args": ["--profile", "acp-test"] }
  }
}

Automated compatibility review

When .github/workflows/dsh-update.yml opens a new bundled-dsh upgrade PR, it automatically dispatches a Cursor cloud agent to review ACP compatibility with the new dsh version. The agent:

  • Reads dsh release notes and API changes between versions
  • Tests the ACP adapter with the new dsh version
  • Pushes fixes directly to the PR branch if needed
  • Posts a verdict comment on the PR (safe to merge / safe after fixes / not safe)

This requires the CURSOR_API_KEY organization or repository secret (a Cursor API key from the Cursor Dashboard). If the secret is not configured, the workflow skips the agent dispatch with a warning and leaves the PR open for manual review.

The agent uses the Cursor Cloud Agents API v1 with workOnCurrentBranch: true to push directly to the PR's head branch without creating a new branch or PR.

To manually test the review workflow on an existing PR, trigger the workflow via Actions → Update bundled dsh → Run workflow and provide the PR number. The dispatch logic lives in scripts/dispatch-cursor-review.sh.

License

Apache-2.0.

session/load
session/list
session_info_update
additionalDirectories
session/new
session/resume
session/load
session/fork
Invalid params
dsh supports multiple workspace roots
  • Fork — initialize advertises sessionCapabilities.fork: {} and agentCapabilities._meta.jetbrains.air.fork = { version: 1, inclusive: true } (deep-merged next to dsh.cordis). session/fork creates a new session id and leaves the source session unchanged. Without _meta.jetbrains.air.fork, the new session copies the source's committed log. With that block, the copy keeps the selected assistant message and everything before it, and drops every later message. messageId is the ACP id <turn>:<step> (a <id>:segment:<n> id is also matched as <id>). An optional messageFingerprint (sha256: + SHA-256 of the assistant text) and 1-based messageOccurrence disambiguate. A bad version, a bad fingerprint, a missing id, or a point that is not in the log is JSON-RPC -32602 — the adapter does not silently copy the whole session. Unknown session ids and subagent child sessions are also -32602. Only persisted assistant messages are fork points; a running turn's live stream is ignored. If the selected message itself contains tool calls, those calls are removed from the copied message (their results are stored after the message, so keeping the calls would leave an illegal transcript and would make session/load replay continue past the message). Tool calls and results from earlier messages stay. session/load on the new session replays through that assistant message and no further; session/prompt continues from there. The fork response carries the same modes and configOptions shape as session/new.
  • MCP servers — per-session mcpServers mount @deepseek-ai/dsh-mcp-client instances (stdio + streamable HTTP); tools join as mcp__<server>__<tool>; a failing server never takes the session down.
  • Steering — the initialize response advertises _meta.steering.supported: true. Send _session/steering with { sessionId, prompt, _meta: { steering: { idleBehavior: "promptRequired" } } } to inject into an active turn; { outcome: "injected" } leaves its original prompt request and output stream in charge. If that turn ends before injection, the response is { outcome: "promptRequired", reason: "noRunningTurn" } and the client sends an ordinary session/prompt. Omitting idleBehavior uses the same behavior. Concurrent session/prompt steering remains supported.
  • Real cancellation — session/cancel interrupts the live turn through the harness agent.