Dsh Any Agent

io.github.xmtlzzz由 GitHub 账号 xmtlzzz 发布v0.6.3更新于 Nov 8, 2026

Drive DeepSeek Harness (DSH) as a long-lived, resumable coding agent from any MCP client.

已验证STDIO仅桌面开发者工具AI 与机器学习

概览

AI 生成的概览

一个 MCP 服务器,把目标派发给 DeepSeek Harness,作为可长期运行、可恢复的编码代理,并让你监督和收取结果。

可以做什么
  • 创建、发送任务并列出 DSH 会话,可设置工作区、权限层级、审批策略和模型
  • 增量读取运行中的输出,获取已完成运行的结果及其复核单,并记录通过、部分通过或失败
  • 在运行中介入改向、排队留言、中断当前轮次,或释放与抢占写锁
  • 从跨会话收件箱裁决待审批请求,并查看或修改会话队列
  • 执行只读健康检查,并通过终端视图或本地只读面板观察派发的工作
适用场景
适合把耗时的编码任务交给另一个代理、在编辑器或机器重启后仍保持任务存活、之后再收取结果的场景。也适合同时运行多个代理会话,并查看它们调用了什么、消耗了多少。
运行要求
需要 Node.js 22.15 或更高版本,并已安装 DeepSeek Harness 且模型路由与凭据可用。以 npm 包 dsh-any-agent 安装,用 dsh-any-agent-setup 完成配置,然后让客户端通过 stdio 重新连接。清单中未声明任何环境变量或请求头。
安装前请注意
该代理会写代码并执行 shell 命令,因此审批与权限层级很重要;挂载到 DSH 的外部 MCP 工具会绕过其沙箱。抢占写锁可能终止持有锁的其他进程。面板为本地只读,但会展示活动数据;推理内容按设计不写入日志。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Dsh Any Agent,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

🧪 0.6.2 offline suite green · 👀 new live call-chain view (watch / dashboard, with token usage) · 🔌 MCP over stdio · 📦 Zero dependencies · 📜 MIT

An MCP server that drives DeepSeek Harness as a long-lived coding agent. Hand it a goal, let it write code and run scripts, steer it mid-flight, and collect the result when you are ready.

Claude Code · Claude Desktop · Codex · Cursor · Windsurf · Zed · Gemini CLI · opencode · VS Code — or any client that speaks MCP over stdio.

🎯 The problem this solves

You already have a coding agent in your editor. What you do not have is one that can:

  • hand a multi-hour job to another agent and walk away — then collect the result when it's done;
  • keep the job alive across restarts of your editor, your session, your machine's idle reap;
  • cut in mid-flight when it's going the wrong way, without destroying the work;
  • run several of them at once and switch between them;
  • see what it is doing without asking the agent — which tools it called, which approvals went through, how many tokens it spent.

DSH (DeepSeek Harness) can do all of that — it has file/shell tools, skills, subagents and workflows — but it is a GUI-first application. Its own sdk profile exposes only 3 requests and can't resume, cancel, or answer approvals.

This server is the missing adapter: it makes DSH into a well-behaved background agent that any MCP client can hire, supervise and collect from.

Think of it as &job — like & in a shell, but for an agent.

✨ Why it's different

CapabilityWhat you get
🔄 A dead process never kills a conversationThe identity lives on disk. A crash, an idle reap, even restarting this whole server costs you nothing — the next call transparently resumes it, memory intact (verified across processes).
🗣️ You are never stuck waitingSteer a conversation mid-flight — interject to stop and redirect (~100 ms to reach idle, measured over four cancelled turns), or queue a remark for after the current turn. Interrupting never damages the conversation.
📡 Completion notification, not pollingLong tasks return instantly with a run_id; when the turn ends, a sentinel file is written atomically so a background task in your host wakes you. No polling, no occupied turn.
🪟 Many conversations at oncedsh_list(only_running) shows what's live; dsh_read gives cursor-based incremental output. Cycle between them like windows.
👀 You can see it yourselfdsh-any-agent watch (terminal) or dsh-any-agent dashboard (local read-only web page) lays dispatched work out as a call chain — client → conversation → run → tool calls / approvals — with per-run tokens and context-window use, updating while the run is going. Separate processes, never touch the write lock, and show work from every client together.
🧠 Reasoning hidden by defaultYou get "thought for N chars / M seconds" statistics instead of context-burning prose — and it is never logged, never written to disk.
🤫 Silent by defaultNot one byte on stderr, so nothing pollutes your host's logs. stdout carries the protocol and nothing else.
🧩 Capabilities composeDSH can mount its own MCP servers (IDA Pro, browsers, your internal tooling), so this is a bridge to a whole toolbox.
🛡️ Read-only that really is read-onlyread-only sandbox plus auto-denied approvals, for working on untrusted samples.
🔎 Caller review, not blind relayEvery result carries a review ticket (checklist + evidence + dsh_review entry). The caller verifies with its own tools, then records pass / partial / fail. Advisory by default — it never blocks the next dispatch, and a failed review is not silently fed back to DSH.

🧭 Positioning: a dispatcher, not a capability aggregator

This server dispatches; it does not re-implement what DSH already does. The caller gives a goal, and DSH decides which tools, skills, subagents or team to use. Nothing from DSH's tool surface is proxied, duplicated or preloaded.

Owned by DSH (this server stays out)Owned by this server (dispatch semantics)
File I/O, shell, search, editingSession identity and cross-crash resume
Skills, subagents, Agent Teams, task boardAsync dispatch, receipts, completion sentinels
Model routing, sandbox, approval policyIncremental read, interject, interrupt, live call-chain view
Memory/context/compactionApproval bridge, write-lock governance, queue, inbox
worktrees (the agent creates them with git)Setup, status, doctor, audit

Dispatch on demand: dsh_send passes a goal, not a tool manifest, and the caller does not need to know DSH's tool list. The DSH agent picks what it needs — including capabilities added after this server was built (for example the experimental Agent Teams). This server does not grow one MCP tool per DSH feature.

Team mode (opt-in since 0.5.0): off by default. Run dsh-any-agent team on and reconnect; the profile switches to dsh-team (the experimental Agent Teams packages), and dsh_send then adds a short "form a team if this needs parallel or multi-role work" line; simple tasks are not forced into a team. Turn it off with dsh-any-agent team off, or for one call with dsh_send(team=false). The team profile disables the legacy subagent tools and replaces them with nine team tools; teammates share one workspace.

Only dispatch semantics become tools: start, send, read, get, review, interject, interrupt, approve, queue, inbox, status, release, takeover, doctor. No file I/O, no shell, no editor, no task board.

When to add something outside DSH: only when you need a guarantee rather than a behavior — for example, several top-level sessions editing the same repository need outer worktree isolation. For collaboration, prefer letting DSH run the team itself (mount the experimental team packages into the profile; teammates share one workspace).

Quick start

Requires Node.js ≥ 22.15 and DSH installed with a working model route and credentials. See Requirements for details.

bash
npm install -g dsh-any-agentdsh-any-agent-setupdsh-any-agent-setup --yes

The second command previews the changes; --yes applies them. Reconnect your client's MCP server, then ask your agent to start a DSH conversation in your project, dispatch a task, and collect the result. The dispatch workflow shows the tool sequence.

Want to see it first? Watch the 54-second promo — dispatch, interject, the sentinel landing and the caller's review, with the terminal replayed from a real run:

[▶ Play the dsh-any-agent promo (54 seconds)]

Before your first task: read the Usage Notes, especially the model-config and external-MCP permission boundaries. External MCP tools bypass DSH's sandbox. For a fresh machine, follow the migration guide.

Full contents

🧰 Tools

ToolWhat it does
dsh_startCreate a conversation: workspace, permission tier, approval policy, reasoning effort (default max), model
dsh_sendHand it a task. Defaults to wait=false: returns a run_id + sentinel_file immediately, the turn runs in the background and the sentinel file notifies you when it's done (recommended). wait=true blocks until the turn ends; hitting timeout_ms (default 0 = wait forever) only downgrades to background — the turn is never cancelled and the result is never lost
dsh_listAll conversations with live state: running / idle / detached, elapsed time, current tool, output so far. only_running=true for active ones
dsh_readCursor-based incremental read of what a running conversation is producing right now. The cursor is a revision number: an entry whose text grew since your last read reappears — match it by seq and replace its text, don't append again
dsh_getConversation details; with run_id, the final result of that dispatch (the "collect the result later" entry point) plus its review ticket. Run records live in memory (last 20) — use the sentinel file after a restart
dsh_reviewCaller review. Submit pass / partial / fail for a completed run, with notes and optional findings. The verdict is written to <state dir>/reviews/<conversation_id>/<run_id>.review.json and back into the in-memory run and sentinel. Advisory by default: it never blocks the next dsh_send
dsh_interjectInterject while it's busy: interject = stop and redirect, queue = wait for the current turn, then speak. This round writes a sentinel too, and the reply carries its sentinel_file. On an idle conversation it behaves like wait=true and blocks until the turn ends
dsh_takeoverPreempt the write lock. The only way out when another DSH process holds it (DSH has no steal API — preempting means killing the holder). It classifies the holder first: our own orphaned child → taken automatically; another live instance → needs force; GUI/unknown → never killed, reported instead
dsh_interruptStop the current turn (the conversation stays healthy)
dsh_releaseHand the conversation back (frees the write lock so you can open it in your own DSH GUI). Still resumable; forget=true writes a tombstone — by-id lookups are refused until you delete $DSH_HOME/.dsh-any-agent-forgotten/<id>.json
dsh_approval_decideAdjudicate a pending approval (only when on_approval=ask)
dsh_statusLightweight status check (single conversation)
dsh_inboxCross-conversation approval inbox: every pending approval with reason, input and age; decide with dsh_approval_decide
dsh_queueInspect/modify the session queue: list / remove / update / promote (created by dsh_send(queue=true), memory only)
dsh_doctorRead-only health check: DSH version, profile, state/dir writability, orphan locks, sessions and RSS, effective config

👀 Live view: see what the dispatched work is doing

The tools above are for the calling agent. You, sitting at the client, usually see one dsh_send and nothing else. Since 0.6.1 the server writes each conversation's activity to a local event stream, so you can watch the call chain without going through the agent:

text
claude-code  pid 8328└─ e896d16a  temperature module  running · total 278k/17k · context 3%   ├─ ✓ run-…-1  [send] · done · 1m24s · 8 tools · 69k↑ 4.1k↓ tok   └─ ▶ run-…-2  [queue] · running · 156k↑ 12k↓ tok         ✓ read   temp.js                  13ms         ✓ edit   temp.js                  18ms         ◆ approval auto-allow ⚠ danger-full-access  node --test         ▶ pwsh   node --test
bash
dsh-any-agent watch
bash
dsh-any-agent dashboard --open
[dsh-any-agent dashboard: conversations grouped by client on the left, the run timeline with a timing bar per tool call in the middle, overview, token usage, tools and files on the right (sample data)]
  • watch: the call chain in your terminal, redrawn in place like top (no scrolling spam). watch <conversation id prefix> follows one conversation; --once prints once and exits.
  • dashboard: a local read-only web page; --open launches it in your default browser. Left: conversations grouped by client. Middle: the run timeline, with a timing bar per tool call and approvals/escalations highlighted. Right: overview, tool breakdown, files touched, approvals, and token usage (input / output / cache hit, context window, per-turn chart).
  • English / 中文: follows your system language by default; pass --lang en|zh to choose, or switch from the page's top-right corner.
  • Doesn't disturb running work: both are separate processes that only read event files — they never touch the write lock or DSH. Use them to watch progress, and don't open MCP-driven conversations in the DSH GUI (that takes the write lock; see usage notes 3.10).
  • Safety and privacy: the dashboard binds 127.0.0.1 only, its URL carries a one-time token, it checks the Host header, and it has no control that changes state. Command, path and prompt previews are redacted first; reasoning is never written at any level. DSH_MCP_LIVE=meta keeps only tool names and status; off disables it.

Details in Usage · side view; event format and design trade-offs in the live view design.

📚 Documentation map

DocumentContents
SetupRequirements, profile bootstrap, 9 MCP clients
UsageDispatch/collect, sentinels, many conversations, live view, reasoning
Live view designEvent stream format, watch / dashboard, token source, privacy trade-offs
Team modeDefault behavior, how to disable (per client), verify and revert
Permissions & privacyTiers, approvals, GUI visibility, logging
Write lockFour holder classes, takeover, GUI contention
Environment variablesEvery switch and its default
TestsOffline/integration suites and coverage
Known limitationsLimits, profile naming
CompatibilityDSH version matrix, team-package requirements, upgrade checks
ArchitectureWhy ACP, sdk/plugin comparison
Release processRelease checklist

🧑‍🤝‍🧑 Team mode (opt-in)

Off by default. Run dsh-any-agent team on and reconnect; the profile switches to dsh-team (the experimental Agent Teams packages) and dsh_send adds a short "form a team when this needs parallel or multi-role work" line. Simple tasks are not forced into a team. Turn it off with dsh-any-agent team off, or for one call with dsh_send(team=false).

Full steps (commands, verification, rollback) are in Team mode.

Star History

[Star History Chart]

来源:README.md,提交 467dc6f

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.6.3最新Nov 8, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分