dsh-fixed-port-bridge:为 DSH 提供固定本地端口

前言

DeepSeek Harness(DSH)桌面端的启动器在代码里写死 --port 0,因此每次启动时 web 端口都由操作系统随机分配。同一台机器上连续几次启动,端口可能依次变成 59507、65361、54266、58834 这类数值。桌宠、IDE 插件、浏览器书签或本地反向代理如果写死了 DSH 地址,每次重启 DSH 都要改配置。

社区插件 dsh-fixed-port-bridge(GitHub:Alice-Marx/dsh-fixed-port-bridge,npm:@ljwei-stak/dsh-fixed-port-bridge)在 DSH 进程内监听你在配置里指定的端口,把 TCP 连接原样转发到宿主当次真实绑定的随机端口。客户端从此只需记住一个固定地址。

这是什么

维护者仓库为 Alice-Marx/dsh-fixed-port-bridge,在 SkillHub 等社区目录中归类为「联网工具」。插件不单独起守护进程:生命周期跟着 DSH 走,DSH 起来它就在。

数据流可以概括为:

你的客户端 ──固定端口──► 本插件(跑在 DSH 进程里)──► DSH 真实端口(随机)

核心功能

进程内 TCP 转发

插件通过 ctx.inject(['webServer']) 拿到宿主 web 服务,惰性读取真实绑定的 listenedPort,再用 net.createServer 在配置的 port 上监听;每个连接用 socket.pipe 原样转发。不需要扫描端口、不需要开机自启。

端口配置与热切

装好后重启一次 DSH,设置里会出现「固定端口」板块(settings.section)。在面板里填端口并保存即可热切到新值,不必再重启 DSH;桌宠或脚本侧同步改成同一端口即可。

端口取值优先级(先到先得):

  1. <profileDir>/.dsh-fixed-port-bridge.json(设置面板保存时写入)
  2. 插件 cordis.patch.yml 里的 config.port
  3. 内置默认 19387

一旦存在第 1 项,它会一直盖住 yml 里的 config.port。若要交回 yml 控制,需删除 <profileDir>/.dsh-fixed-port-bridge.json 再重启 DSH。

首次安装尚未落盘时,默认来自 cordis.patch.yml:

- insert:
    - id: fixed-port-bridge
      name: "@ljwei-stak/dsh-fixed-port-bridge"
      required: false
      config:
        port: 19387      # ← 首次安装的默认值

修改 yml 需要重启 DSH,并记得把客户端地址改成新端口。

设置面板 HTTP 端点

设置 UI 通过宿主 web 面上的两个 exact 路由读写状态(同源,走 DSH 当次真实端口或固定端口均可):

方法 路径 作用
GET /coopanion/fixed-port-bridge/state 读状态:{ ok, port, source, listening, hostPort, canPersist, configPath }
POST /coopanion/fixed-port-bridge/port 热切端口并落盘,body 为 { "port": 19387 }

source 为 file(状态文件)或 config(尚未落盘时的 config.port)。常见错误包括:403 forbidden(Host 非 localhost)、400 invalid-port(端口不在 1024–65535)、400 port-in-use(新端口绑不上时旧端口继续监听)等。详见仓库 README 错误码表。

兼容与容错

插件不声明 engines.dsh,bundle 上带 required: false;apply 全程 try/catch,异常只记日志,避免拖垮整个 DSH。固定端口默认只绑 127.0.0.1。

安装与启用

1. 插件市场(桌面端推荐)

在 DSH 插件市场里,来源填仓库地址:

https://github.com/Alice-Marx/dsh-fixed-port-bridge

桌面端的 desktop profile 由 Electron 应用独占管理,命令行 dsh plugin 按设计不能改它,桌面端请走插件市场。

2. npm(web profile)

dsh plugin add @ljwei-stak/dsh-fixed-port-bridge

3. 手工放置

把包目录放进 <profile>/node_modules/@ljwei-stak/dsh-fixed-port-bridge,在该 profile 的 package.json 里把包名追加进 dsh.profile.bundles,然后重启 DSH。

当前 package 版本为 1.1.1,许可证 MIT,要求 Node >= 22。

典型用法

验证固定端口

固定端口生效后,用 curl 访问你客户端关心的路径(示例默认端口 19387):

curl -s http://127.0.0.1:19387/<your-client-path>

在 Windows 上可对照 PID 是否等于 DSH 主进程(若固定端口上是独立的 node.exe,说明被其他进程占用,本插件会 warn 后让位,宿主不受影响):

netstat -ano | findstr :19387
tasklist | findstr "DeepSeek Harness"

仓库自测

克隆仓库后可在插件目录执行:

npm test

preflight.mjs 用桩宿主验证导入、监听、转发与换端口行为,不依赖真实 DSH。

适用场景与注意

适合谁: 需要在 DSH 重启后仍用同一 localhost 端口对接桌宠、脚本、书签或本地代理的开发者。

权限与安全: 插件在 DSH 进程内运行,权限与当前 DSH 一致;安装前建议阅读源码与 MIT 许可证。固定端口暴露的是整个 DSH web 面(含 GUI),只做整端口 TCP 直通,不做路径过滤。

已知边界:

  1. 依赖宿主 webServer 服务及其 listenedPort 等字段;DSH 大版本若改变该服务形状,固定端口可能无人监听。
  2. 目标端口被占用时不抢占,只记 warn,宿主照常运行。
  3. 设置里改过并落盘后,仅改 yml 不会生效,需按上文删除状态文件或走设置面板。

DSH 生态强调「一切皆插件」;SkillHub 等目录是社区站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-fixed-port-bridge 用进程内中继把「每次随机的 DSH web 端口」收敛成「一个可配置的固定本地端口」,并支持设置面板热切与状态落盘,减少外围客户端反复改地址的成本。

  • 社区目录页:https://www.skillhub.cn/plugins/Alice-Marx/dsh-fixed-port-bridge
  • 源码与文档:https://github.com/Alice-Marx/dsh-fixed-port-bridge
羽毛球分组比赛记分
小程序二维码

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

Xiaoye