dsh-helm
dsh-helm
Многоузловая управляющая плоскость DSH: расширение однокомпьютерного коннектора «ChatGPT ↔ DSH» до многоузловой управляющей плоскости. DeepSeek Harness (DSH) на нескольких машинах регистрируются в едином хабе через агенты узлов (node-agent), и ChatGPT через единую точку входа может маршрутизироваться к любому узлу — чтение и запись кода, управление сессиями, просмотр состояния здоровья, при этом ни один узел не раскрывается в публичную сеть.
ChatGPT Web(连接器/插件)
│ OpenAI Secure MCP Tunnel(tunnel-client,TLS)
▼
Hub 控制平面 MCP 127.0.0.1:3471(ChatGPT 入口) mesh <hub-ip>:3470(节点接入)
│ 路由:显式 target → session owner → workspace owner → presence → default
├──────────────┬──────────────┬──────────────┐
▼ ▼ ▼ ▼
node-agent node-agent node-agent node-agent (每台机器:出站 WS + HMAC 握手)
│ │ │ │
▼ ▼ ▼ ▼
daemon 3457 → DSH daemon 3457 → DSH …… (各节点本地 helm daemon,Bearer 鉴权)Каждый узел запускает
dsh-helm agent: только исходящее соединение с хабом (mesh WS), внутренний мост к MCP локального helm-демона (127.0.0.1:3457/mcp).Хаб — единственная точка входа: ChatGPT вызывает инструменты через MCP хаба (3471), хаб пересылает на нужный узел по политике маршрутизации; количество узлов прозрачно для ChatGPT.
Совместимость с одиночной машиной: при одном узле и
node_id == hub defaultNodeIdмаршрутизация и поведение вызова инструментов эквивалентны однокомпьютерному демону (summary/guard/steer — надстроечные улучшения, не влияют на существующую семантику вызовов).
Возможности
Регистрация нескольких узлов и heartbeat: идентичность узла
node_id(UUID) + HMAC-рукопожатие с вызовом; heartbeat 15 с, аренда 45 с; при таймауте heartbeat агент новой версии автоматически переподключается (обнаружение полуоткрытых соединений и переподключение).Пятиуровневая маршрутизация:
явный target_node → session owner → workspace owner → однозначный presence → defaultNodeId как запасной; при неясной цели destructive/write-операций — fail-closed отказ (route_confirmation_required), никаких догадок.Прослеживаемость пересылки: каждый результат пересылки сопровождается
_route.node_name(display_name), указывающим узел исполнения;route_explain— предварительный прогон без исполнения.Поверхность MCP-инструментов 19+5: 19 инструментов однокомпьютерного демона (
code_*/sessions_*/projects_list/supervisor_healthи т.д., параметры snake_case без изменений) сохранены как есть, добавленыnodes_list/node_get/route_explain/presence_claim/presence_release; все маршрутизируемые инструменты имеют необязательныйtarget_node.presence: ручное объявление (пин на 10 минут) + автоматическое обнаружение активного приложения macOS (desktop sidecar); в 15-секундном окне неоднозначности при высокой уверенности по двум узлам → признаётся ambiguous, автоматический выбор не выполняется.
Многоуровневое состояние здоровья: control / channel / adapter / datapath / serena / tunnel — каждый уровень отчитывается независимо, никогда не сворачивается в единый
status: ok.Агрегация между узлами:
workspaces_list/sessions_list/agents_list/projects_listвозвращают плоские результаты по нескольким узлам (каждая запись сnode_id).Аудит и журнал маршрутизации: регистрация узлов, heartbeat, решения маршрутизации, изменения presence — всё сохраняется в БД (
audit/route_log).Красная линия метаданных: хранилище хаба содержит только метаданные (узлы/аренды/сессии и каталоги рабочих областей/аудит), никогда не хранит содержимое сессий DSH.
Related MCP server: Peta Core
Структура каталогов
dsh-helm/
├── packages/
│ ├── protocol/ # wire 协议:envelope、JSON-RPC、HMAC 握手、常量
│ ├── store/ # SQLite:节点注册表、presence、目录、审计
│ ├── hub/ # 控制面:Router、WS mesh 3470、MCP 3471
│ ├── node-agent/ # 节点代理:出站 WS、重连、本地 DSH 桥
│ ├── presence/ # presence providers(手动/macOS/浏览器)
│ ├── platform/ # 跨平台适配(launchd/systemd/Windows 模板)
│ └── cli/ # dsh-helm CLI(init/agent/hub/status/nodes/…)
├── tests/integration/ # 双 fake node 端到端测试
└── scripts/ # ops 脚本(bash,macOS 优先)Быстрый старт
Предварительно: Node.js >= 22.5, pnpm, curl; на каждой машине-узле заранее установлены DSH и helm-демон (127.0.0.1:3457/mcp, Bearer token в ~/.agent-chatgpt-helm/token).
# 1. 安装 CLI(构建 + 写 ~/.local/bin/{dsh-helm,dsh-helm-agent,dsh-helm-hub},幂等)
./scripts/install.sh
# 2. 初始化节点身份(生成 ~/.dsh/helm/node.json,权限 0600)
dsh-helm init
# 3. 编辑 ~/.dsh/helm/node.json:设置 hub_url 与 local_mcp_token
# hub_url:内网/Tailscale 用 ws://<hub-ip>:3470,生产用 wss://
# 4. hub 机器:启动控制面(mesh 3470 + MCP 3471;默认只绑 127.0.0.1)
dsh-helm hub
# 多机场景:dsh-helm hub --bind <tailnet-ip> --mcp-bind 127.0.0.1
# 5. 节点机器:启动 agent(先前台验证,再装自启服务)
dsh-helm agent
./scripts/install-service.sh # macOS:launchd 服务(com.dsh-helm.node-agent)
# 6. 自检与状态
./scripts/verify.sh # 0 全绿 / 1 警告 / 2 严重
./scripts/health.sh # 节点状态表(走 hub MCP supervisor_health)
dsh-helm status # 本地配置与连接状态Добавление дополнительных узлов: после dsh-helm init на новой машине-узле передайте node_id и token из node.json администратору хаба по защищённому каналу, затем выполните на машине хаба (идемпотентно: добавление/обновление таблицы токенов, автоматическая перезагрузка службы launchd):
./scripts/register-node.sh <node_id> <token>Подробный процесс см. в docs/onboarding.md.
Подключение ChatGPT
Два пути, выбор по этапу развёртывания:
A. Прямое подключение одной машины (начальный этап): если на локальной машине уже есть helm-демон, хаб рассматривает локальный узел как local node, поведение идентично однокомпьютерному коннектору, туннель не требуется.
B. Многоузловой (управляющая плоскость, рекомендуется): OpenAI Secure MCP Tunnel подключается к MCP хаба (3471), ChatGPT — одна точка входа для управления всеми узлами.
Полный учебник на стороне OpenAI Platform (создание туннеля / привязка workspace / создание API key / параметры tunnel-client / прокси) см. в docs/chatgpt-tunnel-setup.md; на стороне ChatGPT Web (режим разработчика / создание коннектора / тестирование) см. в docs/chatgpt-connector.md.
Компромисс двух топологий: каждый демон со своим туннелем+коннектором (несколько точек входа, каждый управляет своим), или один туннель хаба + один коннектор для управления N узлами (единая точка входа, рекомендуется — маршрутизация хаба target_node/правила маршрутизации, ответы с node_name).
HA управляющей плоскости (двойная Control Plane)
Два хаба образуют кворум (2/2) управляющей плоскости; при отказе любого из них другой продолжает обслуживать чтение маршрутов и точки входа узлов.
Роли и аренда: побеждает меньший
--cp-priority— становится лидером (единственный писатель); лидер каждые 10 с продлевает аренду у peer; если peer недоступен дольше TTL аренды (--cp-failover-ms, по умолчанию 45 с) → обе стороны переходят вread-only-no-quorum, операции записи возвращаютQUORUM_LOST. follower никогда не повышается в одностороннем порядке — при потере кворума только чтение без записи (CAP: приоритет безопасности).Восстановление: переподключение peer → полная синхронизация реестра → принудительные перевыборы (term+1) → подтверждение аренды обеими сторонами → восстановление записи. В течение всего окна восстановления обе стороны остаются в режиме только чтения.
Несколько endpoint у агента: в
node.jsonнастраиваютсяhub_url+fallback_urls, при переподключении циклический перебор с закреплением после успеха; при сбое автоматическое переключение на вторую CP.Наблюдаемость:
GET /cp-statusвозвращаетrole/phase/writeMode/quorum/term/leaderId/peers/syncOk/leaseEpoch/failoverCount;dsh-helm doctorи карточка «控制面 HA» в Dashboard отображают напрямую.HA точки входа ChatGPT:
--mcp.server-urlу OpenAI tunnel-client ограничен каналом, без failover на несколько бэкендов в рамках одного коннектора. Локально запускаетсяdsh-helm ha-proxy(по умолчанию127.0.0.1:3481,--primary http://127.0.0.1:3471 --secondary http://<peer-cp>:3471), туннель по-прежнему указывает на один коннектор (3481); при потере связи с основной CP автоматическое переключение на резервную CP, после восстановления — обратно. Двойной туннель + двойной коннектор — альтернативная топология.Развёртывание второй CP:
dsh-helm hub --cp-peer ws://<peer-cp>:3470 --cp-priority 1 --cp-id <node-id> --cp-token-env DSH_HELM_CP_TOKEN;DSH_HELM_TOKENна обеих сторонах содержит обе таблицы токенов узлов (при переключении любого агента другая CP сможет аутентифицировать). Если MCP должен быть доступен между машинами, используйте--mcp-bind <tailnet-ip>(ограждение Tailscale ACL, в однокомпьютерном сценарии остаётся loopback).
Сопряжение устройств (добавление нового DSH-устройства)
Dashboard «新增 DSH 设备» → генерация одноразового кода сопряжения (действителен 10 минут, одноразовое потребление, хранится только хэш); на новой машине выполняется dsh-helm join --control-plane ws://<hub>:3470 --code <code> для входа в сеть (генерация долгосрочного node token, запись в ~/.dsh/helm/node.json, хаб хранит только hash/статус). API сопряжения — только loopback + защита от CSRF заголовком; в журналах только префикс хэша. Подробнее см. docs/security.md §5.
MCP Context Isolation (стабильность больших контекстов)
Уменьшение размера ответов и мониторинг при длительной работе коннектора ChatGPT ↔ DSH и сессиях с большим контекстом (совместимый слой, цепочка не меняется):
sessions_get по умолчанию — сводка: по умолчанию возвращается только структурированная сводка (
id/title/status/workspace/created_at/updated_at/last_message_summary/last_assistant_summary/current_goal/current_goal_seq/last_user_message/recent_evidence{commits,paths,errors,tests}/history_ref/safety_sanitized/token_estimate/continuation_available, без messages). Сводка генерируется агентом узла: у DSH запрашиваются только последние 20 сообщений (SUMMARY_WINDOW),current_goal— наиболее действенная пользовательская инструкция в окне (с исходным seq),recent_evidence— извлечение регулярными выражениями, строки с подозрением на учётные данные удаляются до попадания в любое поле сводки (флагsafety_sanitized). Замеры на практике: ответ ранней большой сессии 75 КБ → 1,2 КБ; приёмочный fixture информационной точности (1000 сообщений) ~107 КБ → 0,7 КБ, ответ по умолчанию <1 КБ. Кэш в~/.dsh/helm/summaries/<session_id>.json(TTL 60 с, инвалидация после операций записи).Полная история по запросу:
include_messages=true(настраиваемыйmax_messages, по умолчанию 20) возвращает полные сообщения; параметрbefore_seqпередаётся, но DSH 0.1.1 не реализует настоящую пагинацию (проверено на практике: max_messages ≤100 и beforeSeq не работает) — история старше последних 100 сообщений в настоящее время недоступна,history_refявно указывает достижимый диапазон (reachable_max_messages:100); старые вызовы (без параметров) автоматически переходят на сводку, вызывающей стороне не нужно менять параметры, но обратите внимание: возвращаемое содержимое меняется с полных сообщений на сводку (при необходимости исходного текста явно укажитеinclude_messages=true).Response Size Guard: единый middleware для всех MCP-ответов хаба,
MAX_RESPONSE_BYTES=50000; при превышении автоматическое smart-truncate (гарантированно остаётся корректным JSON, добавляются метаданныеtruncated), журнал[mcp-guard] <tool> original=.. returned=.. truncated.Мониторинг состояния: в хабе добавлены
GET /metrics(количество запросов/средний и максимальный размер ответа в байтах/счётчики усечений и ошибок/активные соединения/детализация perTool),GET /readyz(готовность HA-кворума),GET /version; в Dashboard добавлена вкладка «MCP 控制面».Внеочередная коррекция/немедленное вмешательство:
sessions_promptподдерживаетmode=queue|steer(по умолчанию queue — семантика очереди без изменений);steerв обход очереди через host API DSH внедряется в выполняющийся раунд (структурированный возвратsteered/queued/rejected/unavailable), событие истории DSHagent/inbox/splicedподтверждает внедрение. Проектная экспертиза и детали реализации — в docs/priority-queue.md.
Поддержка платформ
Платформа | hub | node agent | presence | Автозапуск службы |
macOS | ✅ проверено | ✅ проверено | ✅ desktop sidecar автоматически + вручную | ✅ launchd ( |
Linux | ✅ частичная поддержка | ✅ частичная поддержка | ✅ вручную | ✅ шаблон systemd ( |
Windows | ⚠️ требуется Node ≥22.5 | ⚠️ каркас | 🚧 ожидает проверки на реальном устройстве | 🚧 шаблон Task Scheduler |
Основной код не содержит логики, специфичной для платформ (launchd/osascript/PowerShell полностью изолированы в
packages/platformиpackages/presence); macOS на двух машинах (Tailscale) проверено на реальном оборудовании, Linux/Windows ожидают проверки.
Документация
Документ | Содержание |
Архитектура, протокол, решения маршрутизации, модель данных, поверхность инструментов | |
Создание туннеля OpenAI Platform и настройка tunnel-client | |
Создание и использование коннектора ChatGPT Web | |
Подключение новой машины к управляющей плоскости | |
Учётные данные, сетевые границы, Tailscale ACL, сводка модели угроз | |
Симптом → диагностика → решение | |
Полная модель угроз (15 угроз) | |
Базовая линия совместимости с вышестоящим beforewave helm |
Ключевые аспекты безопасности
Учётные данные:
~/.dsh/helm/node.json(node token) и файл токена демона — оба 0600; таблица токенов хаба внедряется через переменную окруженияDSH_HELM_TOKEN(не сохраняется на диск); токены не появляются в argv/git/журналах; учётные данные туннеля внедряются синтаксисомenv:.Привязка: хаб по умолчанию привязан только к
127.0.0.1; для межмашинного доступа рекомендуется Tailscale +--bind <tailnet-ip>,--mcp-bind 127.0.0.1сохраняет MCP только на loopback. MCP хаба (3471) v1 без аутентификации — категорически запрещено прямое раскрытие в публичную сеть; в production mesh используетсяwss://(TLS обеспечивается обратным прокси/внешним https-сервером).fail-closed: деструктивные операции (
sessions_prompt/sessions_resume) без чёткой цели отклоняются; в окне неоднозначности presence не выполняются догадки.Без хранения содержимого: store хранит только метаданные и аудит, содержимое сессий DSH не сохраняется.
Подробная модель безопасности — в docs/security.md и docs/threat-model.md.
Расслоение статуса и фактов
Версия v0.1.0. Автоматическая проверка полностью зелёная (модульные тесты + сквозные интеграционные тесты полного протокола с двумя фейковыми узлами + приёмка информационной точности: 399/399 (48 файлов), build/lint чистые); дымовой тест на реальном оборудовании macOS с двумя машинами через Tailscale завершён. doctor/dashboard/install реализованы; онлайн RPC-команды CLI (nodes/node/route-explain/presence/rotate-token) всё ещё требуют подключения к живому хабу (в настоящее время выводят requires live hub connection, планируется в следующей вехе), те же возможности доступны через MCP-инструменты хаба (nodes_list и др.); session handoff v1 честно возвращает unsupported.
Возможности расслоены по силе доказательств (без смешения):
Уровень | Содержание | Доказательства |
Реализовано и протестировано | Пятиуровневая маршрутизация + fail-closed, HMAC-рукопожатие, presence (вручную + обнаружение рабочего стола macOS), многоуровневое состояние здоровья, HA с двойной CP (quorum/аренда/failover + ha-proxy), сопряжение устройств (pair/join), MCP Context Isolation (сводка по умолчанию/Response Guard/steer вне очереди), 15 подкоманд CLI | Модульные + интеграционные тесты полностью зелёные; отчёт о приёмке — в docs/fidelity-acceptance.md и docs/priority-queue.md |
Зависит от вышестоящего, но проверено на практике | DSH 0.1.1 | Дымовой тест реальной цепочки + записи зондирования (docs/priority-queue.md §2/§5) |
Официально не задокументировано / экспериментально | Семантика двойного экземпляра нескольких tunnel-client в одном OpenAI-туннеле (ступень 2 лестницы отказоустойчивости, требует проверки); поддержка платформ Linux/Windows | Ноль упоминаний в официальной документации OpenAI (docs/chatgpt-disaster-recovery.md); таблица платформ выше |
Известные ограничения и незакрытые риски | ①История старше последних 100 сообщений недоступна (в DSH 0.1.1 beforeSeq не работает; путь исправления = архивирование истории агентом, см. fidelity §7); ②MCP хаба (3471) v1 без аутентификации — категорически запрещено раскрытие в публичную сеть; ③онлайн RPC-команды CLI не подключены к живому хабу; ④аудит без защиты от подделки/хэш-цепочки, статическое хранение токенов в открытом виде (подробнее threat-model §4/§5) | Приёмка/дымовой тест на практике; модель угроз по пунктам docs/threat-model.md |
Явно не обещается: гарантии production-ready; HA — избыточность самоуправляемой управляющей плоскости, без SLA / обещаний zero-downtime; без получения официальных границ возможностей OpenAI (HA с несколькими экземплярами туннеля, автоматическая ротация ключей) обещаний нет. Вердикт приёмки — CONDITIONAL PASS (точность и замкнутость безопасности; полнота ограничена границами протокола DSH 0.1.1).
ops-скрипты
Скрипт | Назначение |
| Установка CLI (проверка node / сборка / три wrapper), идемпотентно |
| Удаление ( |
| Самопроверка (node / wrapper / node.json 0600 / локальный демон / порт хаба), код выхода 0/1/2 |
| Таблица состояния узлов (приоритет MCP хаба, деградация к локальному store) |
| Установка node agent как службы launchd (macOS), |
| Регистрация/обновление node token на машине хаба (идемпотентно, автоматическая перезагрузка launchd) |
| Самовосстанавливающийся watchdog 15 с (подъём на уровне процесса, блокировка одного экземпляра) |
Все скрипты совместимы с bash 3.2, префикс вывода [dsh-helm], идемпотентны, только зондируют и не изменяют существующие службы на производственных портах (3080/3457/3458).
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables cluster-aware command execution and automatic task routing across distributed nodes based on system load, architecture, and OS requirements. It supports parallel execution, remote node management via SSH, and dynamic load balancing for agentic workflows.4MIT
- AlicenseNot gradedqualityCmaintenanceActs as a proxy/router for multiple downstream MCP servers, exposing only meta-tools to the host to reduce token usage, enabling efficient search and invocation of tools from a fleet of servers.7MIT
- AlicenseNot gradedqualityBmaintenanceEdge-deployed predictive decision engine and circuit-breaker orchestrator for AI agents. Features low-latency telemetry, automated failover routing, and Bitcoin Lightning micro-payments.MIT
Related MCP Connectors
Agent-native collaboration network: orchestrate a team of long-running agents from any MCP client.
Single entry point for the GOSCE portfolio: routes orchestrators to verified agents by capability, w
Agent-to-agent network for teams: dm, who-knows-X routing, shared rooms. Human-in-the-loop.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/lixiaoshuang79/dsh-helm'
If you have feedback or need assistance with the MCP directory API, please join our Discord server