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: dsh-crew
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 라이선스.
This server cannot be deployed
Maintenance
Related MCP Connectors
- mcp-serverOAuthai.cdbx
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.
Live SEO workflow tools for Claude Code, Codex, and AI agents.
Turn Claude into a creative studio: DNA-locked characters, images, video, voiceover — 55 tools.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables Claude Code to delegate tasks to OpenCode subagents asynchronously, with tools for starting tasks, polling status, and fetching results.772 npm2MIT
- 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.602 npm149MIT
- AlicenseAqualityBmaintenanceEnables 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.151MIT