dsh-launch
khellendros97/dsh-launch
Supervision par broker détaché de services de longue durée (serveurs de développement, watchers, API simulées) qui survivent aux tours, aux sessions et aux redémarrages de DSH, avec un onglet Service dans la barre latérale (enregistré via l'API d'extension de better-sidebar) et des outils de modèle service_start/stop/restart/list/logs.
Installer
dsh plugin --profile web add github:khellendros97/dsh-launchREADME
dsh-launch
DSH 服务管理插件:在独立 broker 进程中监督长驻服务(dev server、watcher、mock API、worker),服务在对话回合结束、会话关闭、甚至 DSH 自身重启后继续运行。单包发布——Service 侧边栏 tab、broker、模型工具全部在此包内;better-sidebar 只负责承载 tab(经其扩展 API 注入,无需任何 better-sidebar 改动)。
- 根因:
pwsh后台任务(jobs)绑定在 owner 会话作用域上,会话/回合结束时dsh-jobs-local会取消归属任务。 - 解法(机制参考 omp 的 launch daemon broker):服务由 detached broker 进程以
detached + stdio 落盘方式拉起;broker 只做监督(日志增量、pid 探活、就绪检测、崩溃退避重启),自身空闲即退;DSH 下次启动时重新拉起 broker 并按 pid 收养仍在运行的服务。
安装
前置:DSH web 环境 +(可选,仅 UI 需要)dsh-better-sidebar。
dsh plugin --profile web add dsh-launch
一条命令完成安装 + 自动挂载(包内 cordis.patch.yml 注册进 dsh.profile.bundles)。装完重启 dsh web + 硬刷新浏览器(Cmd/Ctrl+Shift+R)。没有 better-sidebar 时插件以 headless 模式运行(工具可用,无 UI tab)。
能力
| 入口 | 说明 |
|---|---|
| Service tab(侧边栏) | 服务卡片:标题 / logo(可选,URL 或图片路径)/ 状态徽标 / PID·运行时长·重启次数 / 启动 / 停止 / 重启 / 日志;可见时轮询本插件自有的 fenced /launch/api 路由 |
service_start | 启动长驻服务:name + command(+ 可选 cwd/title/logo/env/readyLog/readyPort/restart),等待就绪后返回;就绪判定会先剥离 ANSI 转义并对 IPv4/IPv6 双栈探测端口 |
service_stop / service_restart / service_list / service_logs | 模型工具:停止(整树杀)/ 重启 / 列举 / 读日志尾 |
ctx.launch(cordis 服务) | ping / list / start / stop / restart / describe / logs,供其他插件消费 |
架构
DSH 宿主进程 ──────────────► dsh-launch broker(detached 独立进程)
dsh-launch 插件(host) ┌ 命名管道 NDJSON 协议(token 认证,管道名按
├ ctx.provide('launch') │ runtimeDir 哈希,多部署不冲突)
├ service_* 模型工具 │ 每服务状态机:starting→running→ready→
├ /launch/api fenced 路由 │ stopping→exited/failed (+restarting 退避)
└ presence 文件注册 └ 每服务:daemons/<name>/{meta.json, output.log}
│ │ spawn detached + unref
▼ ▼
dsh-launch 插件(client) ◄─────── 服务子进程 ×N(stdio→output.log,存活于一切之外)
└ ctx.betterSidebar.registerTab('service')
- 运行时目录:
~/.dsh/tmp/dsh-launch/(插件配置runtimeDir可覆盖):broker.token、broker.pid(单实例租约)、presence/*.json(DSH 存活标记)、daemons/<name>/(元数据 + 日志,8MB 轮转)。 - 就绪检测:
readyLog(输出正则,ANSI 已剥离)和/或readyPort(TCP 探测,无 host 时同时探127.0.0.1与::1);start/restart等待就绪(默认 20s,上限 60s);broker 重启收养starting记录时会重扫日志尾部的已滚过就绪标记。 - 重启策略:
no / on-failure(默认)/ always,指数退避 1s→30s。 - Windows 命令执行:
command字符串服务经cmd.exe /d /c <command.cmd>由内置 node 启动器(broker/launcher.cjs)执行——detached 的 cmd 会丢失批处理子进程输出,启动器规避了该问题;整树停止用taskkill /T。
测试
npm test
# broker 冒烟 15 项:启动/就绪(ANSI·IPv6)/日志/停止/重启/持久化/杀 broker 后收养/收养尾部重扫
# 接线 13 项:服务提供/工具注册/presence/真实 broker 往返/fenced 路由信封/围栏拒绝/客户端契约
安全说明
- 服务以运行 DSH 的同一用户身份、脱离任何沙箱执行(这是服务存活的前提)。服务等同于用户在终端启动的进程。
/launch/api与/launch/service-logo全部经过 Host 头信任围栏(loopback 或trustedHosts);broker 管道仅绑定本机(命名管道 + token)。- 插件卸载(HMR/禁用)不会停止服务或 broker;broker 在无 presence 且空闲 15s 后自行退出,服务继续运行。
配置
插件行可选 config:
- id: dsh-launch
name: dsh-launch
config:
runtimeDir: '~/.dsh/tmp/dsh-launch' # 覆盖运行时目录(默认同左)
idleGraceMs: 15000 # 无客户端/无 presence 后的退出宽限
maxLogBytes: 8388608 # 单服务日志轮转阈值
限制
- 服务名全局唯一(全机一个 broker 作用域)。
- 无 PTY / 无 stdin:交互式进程请用 better-sidebar 终端。
- broker 死亡窗口内(DSH 未运行且 broker 已退出)崩溃的服务不会自动重启(detached 服务本身不受影响)。
Plugins associés
deepseek-harness
deepseek-ai/deepseek-harness
dsh-web (dsh-plugin-manager)
zhu1090093659/dsh-web
dsh-web
zhu1090093659/dsh-web
dsh-web-ui (dsh-plugin-manager)
zhu1090093659/dsh-web-ui