dsh-mcp
omp-dsh-workers
자신의 oh-my-pi 세션에서 DeepSeek Harness (DSH) 워커를 실행하세요. oh-my-pi (OMP)는 터미널 코딩 에이전트이고, DeepSeek Harness (dsh)는 DeepSeek의 에이전트 런타임입니다. 세션이 디렉터가 됩니다. 디렉터는 dsh_spawn으로 브리프를 나눠주고, 각 워커는 지속적인 dsh --profile headless 세션으로 실행되며, 워커의 질문과 결과는 스크립트가 중계하는 네이티브 메시지로 돌아옵니다.
실험적 v0.1: 인터페이스는 docs/contracts/에 고정되어 있지만, 여기의 어떤 것도 아직 공개 릴리스 주기를 거치지 않았습니다.
Why
OMP 하네스는 작업당 비용이 높고, 네이티브 하위 에이전트는 모든 작업에서 그 비용을 지불합니다. 여기서는 디렉터 수준에서 한 번만 지불합니다. 작업은 DSH에서 빠르고 토큰을 아끼며 실행되고, 그 사이에는 스크립트만 있을 뿐입니다. 작업당 모델 토큰이 0입니다. DSH는 실행을 지속 가능하게 만듭니다(실제 세션 ID에 --resume). DSH가 필요하지 않다면 네이티브 하위 에이전트가 여전히 올바른 선택입니다.
Related MCP server: deepseek-subagent-mcp
How it works
의도적으로 분리된 두 가지 모델 수준:
수준 | 주체 | 모델 출처 |
1 | 디렉터 — | OMP 세션 모델 |
2 | DSH 실행기 — 런당 하나의 DSH headless 프로세스 |
|
따라서 @dsh는 dsh_spawn에 model이 없을 때 실행기가 상속하는 모델을 가리킵니다. 감시자는 코드이지 모델이 아닙니다.
flowchart TD
D["Director<br/>main OMP session, /dvibe on"]
B["dsh-bridge<br/>argv spawn · run registry · steer channel"]
X["DSH headless run<br/>+ resume plugin"]
L["relay.ts<br/>script representative, in-process"]
D -->|"dsh_spawn — brief, label, model"| B
B -->|"dsh --profile headless [--resume]"| X
X -->|"Envelope v1 (last stdout line)"| B
B -->|"pollRun, 1s"| L
L -->|"⟨label⟩ question / result / failure (followUp)"| D
D -->|"dsh_answer — resumes the session"| B
D -.->|"steering: dsh_list → dsh_send / dsh_wait by runId"| B
D -.->|"dsh_kill by runId"| B디렉터는 dsh_spawn으로 생성하고, dsh_answer로 답하며, dsh_send로 조종하고, dsh_wait로 기다리고, dsh_kill로 취소합니다. dsh_list는 라벨을 runId로 해석합니다.
Components
경로 | 설명 |
| OMP 확장: |
| bridge-core: 자체 분리 프로세스 그룹에서 생성, 실행 레지스트리, Envelope v1, 스티어 채널, 소유자 리스 및 정리. Node ≥ 22, 순수 ESM JavaScript, 의존성 없음, 빌드 단계 없음. |
| DSH headless 프로필의 Cordis 플러그인: |
| 설치: 라이브 OMP 디렉터리로의 심링크, DSH 프로필 패치, 플러그인 의존성 링킹. |
Requirements
oh-my-pi v18 — 18.0.3 / 18.0.4에서 검증됨;
@oh-my-pi/*는^18.0.4로 고정됨.DSH ≥ 0.1.1-rc.2가
PATH에 있고,headless프로필이 존재해야 함.테스트 스크립트용 bun; bridge-core용 Node ≥ 22.
DSH 설정에 모델 프로바이더가 구성되어 있어야 함. 확장은 프로바이더 중립적이며,
<provider>/<model>[:<effort>]문자열을 DSH에 전달합니다.
DSH는 릴리스 후보 단계에 있습니다. 리줌 플러그인은 엔트리 ID로 연결되므로, 해당 ID의 이름을 바꾸는 릴리스가 나오면 패치가 조용히 적용되지 않게 됩니다. DSH를 업그레이드할 때마다 dsh --profile headless --help를 다시 실행하세요. --resume이 사라졌다면 플러그인이 마운트되지 않은 것입니다. 전체 체크리스트는 docs/dsh-update-checklist.md에 있습니다.
Install
저장소가 진실의 원천입니다. 라이브 디렉터리는 항상 저장소를 가리키는 심링크만 받습니다.
1. OMP에 확장을 링크합니다.
scripts/install-omp-links.sh [--dry-run] [--uninstall] [--omp-dir DIR]$OMP_DIR(기본값 $HOME/.omp/agent) 아래에 extensions/dsh-task 심링크를 만듭니다. 멱등적입니다. 같은 소스를 가리키는 링크는 그대로 두고, 다른 곳을 가리키는 링크는 다시 지정하며, 대상 위치에 실제 파일이 있으면 스크립트가 중단됩니다. --uninstall은 여기를 가리키는 링크만 제거합니다.
2. DSH headless 프로필에 리줌 플러그인을 마운트합니다.
scripts/install-resume-plugin.sh # install
scripts/install-resume-plugin.sh --uninstall # remove모든 변경 전에 백업합니다. PATH에 dsh가 있어야 하고 ${DSH_HOME:-$HOME/.dsh}/profiles/headless가 필요합니다. 그런 다음:
$DSH_MODULES에서@deepseek-ai와commander를 플러그인의node_modules로 심링크합니다.package.json을 백업한 후 플러그인을 추가합니다:dsh plugin --profile headless add link:<plugin dir>.headless-startup/headless-runner를 비활성화하고headless-resume-startup/headless-resume-runner를 삽입하는cordis.patch.yml블록을 추가합니다.검증:
dsh --profile headless --help에--resume이 언급될 때만 성공입니다.
3. (테스트 전용) scripts/link-plugin-deps.sh는 의존성을 자체적으로 링크합니다. bun run test:resume이 이를 호출합니다.
Usage
디렉터 모드
/dvibe는 디렉터 모드를 전환합니다./dvibe on//dvibe off는 명시적입니다. 모델은dvibe도구(action: "on" | "off")로도 전환할 수 있으며, 이 도구는 축소된 도구 세트에 유지됩니다.켜져 있는 동안 도구 세트는
read,todo,dsh_spawn,dsh_answer,dsh_send,dsh_wait,dsh_list,dsh_kill,dvibe로 축소되고, 시스템 프롬프트에 디렉터 지시문이 추가됩니다.dvibe도구는 결과에 그 지시문을 반환합니다. 모델은before_agent_start가 실행된 후에 이 도구를 호출하므로, 턴 프롬프트는 규칙을 담을 수 없습니다.브리프는
dsh_spawn에 그대로 전달됩니다. 워커 질문은relay.ts에서⟨label⟩메시지로 도착하며dsh_answer로 답합니다. 결과도 같은 방식으로 도착합니다.전달은 최소 한 번(at-least-once)입니다. 일치하는
message_start가 후속 메시지가 턴 컨텍스트에 들어갔음을 증명할 때까지 이벤트는 120초마다 다시 알려집니다. 이벤트당 최대 3회 시도합니다. 전달된need_input은dsh_answer가 올 때까지 계속 감시됩니다.작업 나눠주기를 끝냈나요? 턴을 종료하세요. 이벤트는 자체적으로 메시지로 도착합니다.
dsh_wait는 동기적 대안입니다. 다음 단계가 특정 런에서 블로킹되고 나눠줄 작업이 남아 있지 않을 때만 사용하세요. 이렇게 읽은 엔벨로프는 두 번 도착하지 않습니다./dvibe off, 종료 또는 프로세스 내 세션 전환 시 이전 도구 세트가 복원됩니다.
브리프, 모델, 리줌
각 작업에 짧은
label을 지정하고 선택적으로model을 지정하세요. 둘 다dsh_spawn매개변수입니다. 라벨은 나중에dsh_list,dsh_answer,dsh_send에서 런을 찾는 데 사용됩니다.모델 표기법은
<provider>/<model>[:<effort>]입니다. effort 수준:off,minimal,low,medium,high,xhigh,max. 마지막:뒤의 접미사는 그중 하나일 때만 effort로 간주되며, 그렇지 않으면 콜론은 모델 이름에 속합니다. 공백이나 제어 문자는 허용되지 않습니다. provider/model은 각각 200자 이하, 스펙은 512자 이하입니다. 형식이 잘못된 스펙은 생성 전에 실패합니다:error [invalid_model].model이 없으면 런은 OMP의@dsh역할(modelRoles.dsh)을 상속하고, 세션의 모델로 폴백하며, 그다음 DSH 자체 기본값으로 폴백합니다.리줌:
resumeFromRunId를 전달하세요. 브리지가 해당sessionId를 조회합니다.resumeSessionId에runId를 넣지 마세요. 서로 다른 식별자이며,resume_not_found가 발생합니다.리줌은 런이 디스크에 엔벨로프를 남긴 후에만 작동합니다. 엔벨로프가 없으면
dsh_spawn은has no session to resume을 던집니다. 아직 실행 중인 런과 사라진 런(조기 종료, 시작 시 충돌, 정리됨) 모두 해당합니다. 대응하기 전에 어떤 경우인지 확인하세요. 아직 작업 중인 런에 새 브리프를 보내면 작업이 중복됩니다.모델 오버라이드는 고정적이지 않습니다.
model없이 리줌하면 모델을 다시 계산합니다.dsh_answer에는model매개변수가 아예 없습니다. 다른 모델로 계속하려면resumeFromRunId와 명시적model을 사용해dsh_spawn을 호출하세요.
디렉터가 보는 것
도구 카드는 모델이 받는 텍스트와 별도로 사람을 위해 렌더링됩니다: ▶ dsh spawn → <label>, ✓ started <label> (<runId8>) · pid …, 그다음 마지막 출력 줄과 함께 ⏳ still running 또는 첫 번째 결과 줄과 함께 ✓ completed · model: … · session: …. 런이 추적되는 동안 편집기 위에 dsh runs 보드가 표시되고 푸터에는 dsh: N running · M done이 표시됩니다. 도구의 텍스트 출력은 변경되지 않으며 계약으로 유지됩니다.
도구
도구 | 매개변수 | 호출자가 받는 텍스트 |
|
|
|
|
|
|
|
| 런의 결과, 또는 |
|
|
|
|
|
|
| — |
|
|
| 런의 결과 (차단형, 일회성) |
dsh_wait의 타임아웃은 정상입니다. 런은 계속 살아 있으므로 다시 기다릴 수 있습니다. 대기를 중단해도 런이 멈추지 않습니다. dsh_send의 pending은 쓰기가 채널에 도달했고 재확인 시 런이 살아 있었다는 뜻입니다. 확정된 전달이 아니므로 다시 보내는 대신 기다리세요. dsh_task는 엔벨로프를 남기지 않으므로 해당 런은 계속할 수 없습니다. 체인은 dsh_spawn을 통해 이어집니다.
디렉터가 신뢰할 수 있는 줄
이 줄들은 도구의 텍스트 출력에 포함되며 details에만 있는 것이 아닙니다. 따라서 일반 텍스트를 읽는 디렉터는 실행기, 연속성, 오류 코드를 검증할 수 있습니다:
model: <provider>/<model>[:<effort>]
session: <sessionId>
error [<code>]: <message>
# and one line per run from dsh_list:
<runId> state=<state> label=<label|-> model=<spec|default> started=<ISO-8601>오류 코드
모든 실패는 부분 성공이 아니라 엔벨로프 코드가 포함된 명시적 오류 턴으로 반환됩니다.
Envelope 코드 | 의미 |
| DSH 바이너리가 시작되지 않았습니다. |
| 실행이 실패 종료 코드로 끝났습니다. |
| 실행이 기한 내에 완료되지 않았습니다. |
| 실행이 취소되었습니다. |
| DSH가 유효한 Envelope v1을 반환하지 않았습니다. |
| 재개할 세션이 없습니다. |
| 저장된 세션이 손상되었거나 지원되지 않습니다. |
| 세션이 이미 활성 상태이거나 저장된 준비가 예약되어 있습니다. |
| 아무도 실행의 임대를 갱신하지 않아 watchdog이 회수했습니다. |
| 실행이 기한을 넘겨 종료되었습니다. |
| 제공자/모델이 DSH 카탈로그에 없습니다. |
| 모델은 존재하지만 effort 또는 메타데이터가 모델에 맞지 않습니다. |
기본값: 실행 기한 30분, 소유자 임대 5분, 각 dsh_wait 창마다 갱신됩니다.
테스트
bun run test # unit + integration + bridge = 370 tests, no installed DSH needed
bun run test:resume # resume plugin — needs an installed DSH이 트리에서 확인된 수: 단위 195개 + 통합 11개 + 브리지 164개 = 370개 테스트, DSH가 설치되지 않은 상태에서 통과합니다. 단위 테스트는 bridge-core를 모킹하고, 통합 및 브리지 테스트는 DSH_BINARY를 통해 주입된 가짜 dsh 바이너리로 실행됩니다. CI는 typecheck, lint, format:check(엄격한 tsc, Biome) 후에 깨끗한 HOME으로 동일한 세 개의 스위트를 실행합니다. test:resume은 런타임에 @deepseek-ai/*를 가져옵니다 — DSH가 설치되어 있어야 합니다.
제한 사항
고아 프로세스는 예방되지 않고 정리됩니다. DSH 실행은 OMP 세션보다 오래 지속됩니다. 정리는 로드 시와 30초마다 수행됩니다. 정상적인
session_shutdown시 확장 프로그램은 레지스트리를 지우지 않고 자체 실행을 종료합니다(SIGTERM동기,SIGKILL최선 노력).진행 중 충돌 복구 없음: 턴 중간에 종료된 것은 복원되지 않으며, DSH 세션만 재개할 수 있습니다.
재개 시 압축은 첫 번째 새 요청 헤더가 작성될 때까지 이전 실행의 헤더를 읽습니다.
envelope의
model은 최선 노력입니다: 마지막으로 준비된 요청 구성이지 전송 증명이 아닙니다.모델 재정의는 실행별로 적용되며,
resumeFromRunId를 통해 상속되지 않습니다.허브 메트릭은 DSH 토큰을 볼 수 없습니다.
상태, 기록, 라이선스
실험적 v0.1 (0.1.0). 인터페이스 계약은 docs/contracts/에 있으며, docs/dsh-update-checklist.md는 DSH 업그레이드를 다룹니다. 사용자나 모델이 읽는 모든 것은 영어이고, 코드 내 주석과 테스트 이름은 러시아어입니다. MIT 라이선스.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
This server cannot be deployed
Maintenance
Related MCP Connectors
Build Apps and run code in 30 languages — sandboxed, with persistent sessions for agent loops.
Shared control plane for AI coding agents — tasks, memory, decisions, file locks. 12 tools.
Work on your own computers from Claude or ChatGPT: run commands, edit and search files.
Live SEO workflow tools for Claude Code, Codex, and AI agents.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables dispatching work to DeepSeek Harness agents from Claude Code/Codex, with native progress UI, tier policy, and vision/image generation through MCP tools.569 npm199MIT
- AlicenseAqualityCmaintenanceEnables AI coding agents like Claude Code or Codex to delegate tasks to a DeepSeek Harness subagent with its own context window, providing tools for task delegation, result waiting, continuation, and supervision with sandboxed execution.6MIT
- AlicenseAqualityBmaintenanceEnables Codex and Claude Code to delegate implementation, research, debugging, and long-log work to DeepSeek Harness, then observe, continue, or cancel those sessions without leaving the primary workflow.153MIT
- AlicenseNot gradedqualityCmaintenanceEnables an interactive Claude Code session to delegate blocking tasks to headless pi and OpenCode workers, and lets all three peers exchange messages and list paired sessions over a shared local file bus. It exposes 18 tools covering sync/async asks, steering, abort, session lifecycle, state inspection, and cross-agent messaging.216 npm1MIT