dsh-ctl:通过 SSH 驱动常驻 dsh web 进程的环回控制面

前言

DeepSeek Harness(DSH)提供多种运行 profile,其中只有 web 能在进程不退出的前提下长期承载会话。dsh web 自带的 /api 面向浏览器:需要启动 token、签名 cookie,以及 Host/Origin 信任边界,从 shell 或远端脚本直接调用并不顺手。

DSH bundle 插件可以通过 ctx.webServer 注册一等 HTTP 路由,这些路由落在上面的浏览器围栏之外。dsh-ctl 利用这一机制,在环回地址上暴露一套小型的 JSON API;再配合 SSH,可以在不向外网暴露端口的情况下,远程列出、创建、注入 prompt、跟踪输出并取消会话。

下面介绍该插件的定位、能力、安装方式与典型用法。

这是什么

dsh-ctl 是维护者 StarChen-Cycler 发布的 DSH 工作流类插件(社区目录分类:工作流)。它为长期运行的 DeepSeek Harness dsh web 进程提供 Loopback HTTP control plane:在本地 HTTP 服务上挂载 /ctl/* 接口,并用仓库内 scripts/ 下的 ctl 辅助脚本包装 curl,使具备 SSH 权限的机器用 ssh <host> ctl ... 即可完成运维式操控。

插件当前版本为 0.1.4(MIT 许可证),与资料中声明的 DSH 0.1.5-rc.2 做过验证。

核心功能

资料中可核实的操作面包括:

  1. 健康与索引:GET /ctl/health 查看版本、端口、pid、平台、Node、运行时长等;GET /ctl 为路由索引。
  2. 会话生命周期:列出会话(可按 running=1 筛出正在执行的)、创建会话(可指定 cwd、预设权限等)、单会话查询、重命名、取消当前 turn。
  3. 驱动与观测:向会话注入 prompt(queue 等待当前 turn 结束再投递,steer 切入当前 turn);tail 读取历史快照与实时帧;inspect 读持久化状态且不唤醒 agent;control 查看 live 队列与运行统计。
  4. 扩展能力:会话绑定 schedule(cron、daily、weekly 等);hypo-checkpoint 与 dsh-hypo-before-compact 相关的 memory checkpoint 开关;presets 查询 profile 暴露的权限预设;调试用的 debug/shape 只读 schema 内省。

GET /ctl/sessions?running=1 反映进程内 live 状态而非磁盘归档,资料称在 prompt 后约 300 ms 内 running 会变为 true,turn 结束后回到 false。判断会话是否在跑应依赖 running 等 live 信号,不宜仅凭 lastUserInputAt 时间戳推断。

环境与依赖

  1. DSH 0.1.5-rc.2 或更新(dsh --version 自检)。
  2. 使用基于 @deepseek-ai/dsh-web-app 的 profile(官方 web 模板或派生模板)。
  3. Node.js 18+(DSH 自带运行时,一般无需系统 Node)。

安装与启用

先基于默认 web 模板创建专用 profile,再以 link 方式安装插件(安装命令须与 README 一致,勿凭仓库名臆造 github: 写法):

# 从官方 web 模板创建 profile
dsh --profile fleet --from-default-profile web

# 安装插件(路径、tarball 或发布后的 npm 均可)
dsh plugin --profile fleet add link:/absolute/path/to/dsh-ctl

dsh plugin 会在 profile 目录内转发给 pnpm 并记录 bundle,无需手改 package.json。安装完成后 profile 的 bundles 中会包含 dsh-base、dsh-web-app、dsh-ctl。

启动常驻服务时关闭自动打开浏览器,端口可自行选择,绑定地址保持默认环回:

dsh --profile fleet --port 17390 --no-open

长期运行可交给本机服务管理器(Linux 上可用 systemd,macOS 可用 launchd 等)。README 给出了 macOS LaunchAgents 的 ProgramArguments 示例,核心即为上述 dsh --profile fleet --port 17390 --no-open。

典型用法

凡能 SSH 到宿主机的机器均可执行下列命令,无需端口转发或额外 tunnel(README 原文表述)。

# 健康检查
ssh <host> ctl health

# 会话列表,最新在前
ssh <host> ctl sessions --limit 20

# 仅当前正在执行的会话
ssh <host> ctl sessions --running

# 在指定工作区创建会话
ssh <host> ctl create --cwd /srv/work

# 注入任务
ssh <host> ctl prompt <session-id> "summarise the failing tests"

# 读取输出(历史快照 + 最长 N 秒 live 帧)
ssh <host> ctl tail <session-id>

# 停止当前 turn
ssh <host> ctl cancel <session-id>

对已在跑的会话,可先 ctl control 看队列,用 ctl inspect 读持久化状态;注入时选用 --mode queue(进入下一轮)或 --mode steer(切入当前轮)。两种模式在送达前都会先返回,在 control 里观察队列,而不是在落地前指望 tail。

可将 scripts/ 中的 ctl 拷到目标主机,或在本地用 --host 指定远程。

更完整的请求/响应形状见仓库 docs/API.md。

适用场景与注意

适合谁:需要在单机或内网保留一个 dsh web 进程,又从 CI、跳板机或其它节点用 SSH 编排 agent 会话的团队;希望避免把 DSH Web UI 的 cookie/token 流程硬塞进 shell 脚本的场景。

权限与安全:插件路由挂在同一 dsh web 进程上,以该进程的权限访问工作区与工具能力。安装前应阅读源码与 MIT 许可证,确认 link: 路径可信;控制面默认在 loopback,对外暴露仍取决于你如何部署 SSH 与主机加固。

生态说明:DSH 强调「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方并无官方从属关系,本文不以「官方应用商店」口吻描述。

结尾

dsh-ctl 把常驻 dsh web 翻译成一套可通过 SSH 调用的环回 JSON API,补上「只有 web profile 能保活会话、但浏览器 API 难脚本化」之间的缝隙。

  • 社区目录页:https://www.skillhub.cn/plugins/StarChen-Cycler/dsh-ctl
  • 源码与 README:https://github.com/StarChen-Cycler/dsh-ctl
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye