dsh-mcp
omp-dsh-workers
Запускайте воркеры DeepSeek Harness (DSH) из вашей сессии oh-my-pi. oh-my-pi (OMP) — это терминальный кодинг-агент; DeepSeek Harness (dsh) — это агентный рантайм DeepSeek. Сессия становится директором: она раздаёт брифы через dsh_spawn, каждый воркер работает как постоянная сессия dsh --profile headless, а вопросы и результаты воркеров возвращаются как нативные сообщения, ретранслируемые скриптом.
Экспериментальная v0.1: интерфейсы зафиксированы в docs/contracts/, но ничто здесь ещё не проходило публичный цикл релиза.
Зачем
Харнесс OMP дорог в расчёте на задачу, и нативный субагент платит эту цену за каждое задание. Здесь она платится один раз на уровне директора; работа выполняется в DSH — быстро и экономно по токенам, а между ними только скрипт: ноль токенов модели на задачу. DSH делает запуски постоянными (--resume на настоящем session id). Когда DSH не нужен, нативные субагенты по-прежнему остаются правильным выбором.
Related MCP server: dsh-crew
Как это работает
Два уровня моделей, намеренно разделённых:
Уровень | Кто | Откуда берётся модель |
1 | Директор — ваша основная сессия OMP в режиме | модель вашей сессии OMP |
2 | DSH-исполнитель — один headless-процесс DSH на запуск |
|
Итак, @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.
Компоненты
Путь | Что это |
| Расширение OMP: |
| bridge-core: запуск в собственной отдельной группе процессов, реестр запусков, Envelope v1, канал управления, аренда владельца и сбор завершённых. Node ≥ 22, чистый ESM JavaScript, без зависимостей и без шага сборки. |
| Плагин Cordis в headless-профиле DSH: добавляет |
| Установка: симлинки в живой каталог OMP, патч профиля DSH, связывание зависимостей плагина. |
Требования
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 для тестовых скриптов; Node ≥ 22 для bridge-core.
Провайдер модели, настроенный в ваших настройках DSH; расширение нейтрально к провайдеру: оно передаёт строку
<provider>/<model>[:<effort>]в DSH.
DSH находится на стадии release-candidate. Плагин resume подключается по entry id, поэтому релиз, переименовывающий эти id, заставит патч молча перестать применяться. После каждого обновления DSH повторно запускайте dsh --profile headless --help: если --resume исчез, плагин не смонтирован; полный чек-лист есть в docs/dsh-update-checklist.md.
Установка
Репозиторий — источник истины; живые каталоги получают только симлинки, ведущие обратно в него.
1. Создайте симлинк расширения в OMP.
scripts/install-omp-links.sh [--dry-run] [--uninstall] [--omp-dir DIR]Создаёт симлинк extensions/dsh-task в $OMP_DIR (по умолчанию $HOME/.omp/agent). Идемпотентно: ссылка на тот же источник остаётся как есть, ссылка, указывающая в другое место, перенаправляется, а реальный файл в месте назначения прерывает выполнение скрипта. --uninstall удаляет только ссылки, указывающие сюда.
2. Смонтируйте плагин resume в headless-профиль DSH.
scripts/install-resume-plugin.sh # install
scripts/install-resume-plugin.sh --uninstall # removeДелает резервную копию перед каждым изменением; требует dsh в PATH и ${DSH_HOME:-$HOME/.dsh}/profiles/headless. Затем:
Создаёт симлинки
@deepseek-aiиcommanderиз$DSH_MODULESвnode_modulesплагина.Добавляет плагин:
dsh plugin --profile headless add link:<plugin dir>, после резервного копированияpackage.json.Добавляет блок
cordis.patch.yml, который отключаетheadless-startup/headless-runnerи вставляетheadless-resume-startup/headless-resume-runner.Проверяет: успех только когда
dsh --profile headless --helpупоминает--resume.
3. (только для тестов) scripts/link-plugin-deps.sh сам связывает зависимости; bun run test:resume вызывает его.
Использование
Режим директора
/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дословно. Вопросы воркеров приходят как сообщения⟨label⟩отrelay.ts, на них отвечают черезdsh_answer; результаты приходят тем же образом.Доставка как минимум однократная: событие повторно анонсируется каждые 120 с, пока подходящий
message_startне докажет, что последующее сообщение попало в контекст хода; максимум 3 попытки на событие. Доставленныйneed_inputостаётся под наблюдением доdsh_answer.Закончили раздавать работу? Завершите ход: события придут как сообщения сами по себе.
dsh_wait— синхронная альтернатива, только когда следующий шаг блокируется на этом конкретном запуске и раздавать больше нечего; конверт, прочитанный таким образом, никогда не приходит дважды.При
/dvibe off, завершении работы или переключении сессии в рамках процесса восстанавливается предыдущий набор инструментов.
Брифы, модели, resume
Дайте каждой задаче короткий
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 символов каждый, spec ≤ 512; некорректный spec приводит к ошибке до запуска:error [invalid_model].Без
modelзапуск наследует роль@dshиз OMP (modelRoles.dsh), затем откатывается к модели вашей сессии, а затем к собственному значению по умолчанию DSH.Resume: передайте
resumeFromRunId; bridge ищет егоsessionId. Не помещайтеrunIdвresumeSessionId: это разные идентификаторы, вы получитеresume_not_found.Resume работает после того, как запуск оставил конверт на диске; без него
dsh_spawnвыбрасываетhas no session to resume— как для всё ещё работающего запуска, так и для исчезнувшего (убитого рано, упавшего при старте, вычищенного). Прежде чем реагировать, проверьте, какой это случай: новый бриф для всё ещё работающего запуска дублирует работу.Переопределение модели не сохраняется: resume без
modelпересчитывает модель. Вdsh_answerвообще нет параметраmodel; чтобы продолжить на другой модели, используйтеdsh_spawnсresumeFromRunIdи явнымmodel.
Что видит директор
Карточки инструментов отображаются для людей отдельно от текста, который получает модель: ▶ dsh spawn → <label>, ✓ started <label> (<runId8>) · pid …, затем ⏳ still running с последними строками вывода или ✓ completed · model: … · session: … плюс первые строки результата. Пока отслеживаются запуски, над редактором находится доска dsh runs, а в футере показывается dsh: N running · M done. Текстовый вывод инструментов не меняется: он остаётся контрактом.
Инструменты
Инструмент | Параметры | Текст, который получает вызывающий |
|
|
|
|
|
|
|
| результат запуска, или |
|
|
|
|
|
|
| — |
|
|
| результат запуска (блокирующий, одноразовый) |
Таймаут dsh_wait — это нормально: запуск остаётся живым, и его можно ждать снова; прерывание ожидания никогда не останавливает запуск. pending от dsh_send означает, что запись достигла канала и запуск был жив при повторной проверке — это не подтверждённая доставка; ждите вместо повторной отправки. 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. |
| Нет такой сессии для возобновления. |
| Сохранённая сессия повреждена или не поддерживается. |
| Сессия уже активна, либо её сохранённая подготовка зарезервирована. |
| Никто не продлил аренду запуска; сторожевой механизм забрал её. |
| Запуск пережил свой дедлайн и был принудительно завершён. |
| Провайдер/модель отсутствует в каталоге 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 unit + 11 integration + 164 bridge = 370 тестов, проходят без установленного DSH. Unit-тесты мокают bridge-core; integration и bridge запускаются против фейкового бинарника dsh, подставляемого через DSH_BINARY. CI запускает те же три набора с чистым HOME, после typecheck, lint, format:check (строгий tsc, Biome). test:resume импортирует @deepseek-ai/* во время выполнения — DSH должен быть установлен.
Ограничения
Осиротевшие запуски зачищаются, а не предотвращаются. Запуски DSH переживают OMP-сессию; зачистка происходит при загрузке и каждые 30 с. При чистом
session_shutdownрасширение убивает свои запуски (SIGTERMсинхронно,SIGKILLпо возможности), не очищая реестр.Нет восстановления после сбоя во время выполнения: смерть в середине хода не восстанавливается; можно возобновить только сессию DSH.
Компактирование при возобновлении читает заголовок предыдущего запуска, пока не будет записан первый заголовок нового запроса.
modelв Envelope — best-effort: последняя подготовленная конфигурация запроса, а не доказательство отправки.Переопределение модели действует на один запуск, не наследуется через
resumeFromRunId.Метрики Hub не видят токены 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