Back to home@TTsdzb

dsh-global-proxy

更好的代理支持。

Stars
0
Language
TypeScript
Created
Aug 21, 2026
Updated
Aug 21, 2026
GitHub repo

Introduction

dsh-global-proxy

让 DSH(DeepSeek Harness)进程的所有网络请求走 HTTP 代理的可安装插件:模型端点、联网搜索、MCP 等全部 fetch / http / https 流量。

Node.js 默认不跟随系统的 *_proxy 环境变量,DSH 又禁止在 .env 中设置代理类变量,因此开箱时所有请求都是直连。本插件在进程内开启 Node.js 内建代理支持(http.setGlobalProxyFromEnv,Node.js ≥ 24),并把配置接入 DSH 设置服务与 WebUI。

零插件替代:NODE_USE_ENV_PROXY(Node.js ≥ 24)

如果你的需求只是"跟随 shell 环境变量",不需要安装本插件——Node 自带启动开关,与本插件是同一套内建机制:

NODE_USE_ENV_PROXY=1 https_proxy=http://127.0.0.1:7890 dsh web

实测(Node v26.7)官方路径的行为:

  • 支持 http_proxy / https_proxy / no_proxy 及大写形式(大小写都认,小写不是插件的差异点);
  • 只设 HTTP_PROXY 时 HTTPS 请求会回退走它;
  • NO_PROXY 命中即直连;
  • 不支持 ALL_PROXY / all_proxy——完全不认;
  • 开关与变量都必须在启动 DSH 的 shell 里 export:Node 在进程引导早期解析该开关,DSH 的 .env 分层加载发生在那之后,写进 .env 来不及生效(代理变量本身也被 DSH 列入 .env 黑名单)。

本插件额外解决什么

对照官方路径,本插件的增量是:

  • all_proxy / ALL_PROXY 兜底:Clash 等工具习惯只导 all_proxy 的环境,官方路径会静默直连;插件将其作为 http/https 的兜底来源。
  • 手动模式:在 WebUI 里直接填代理地址(可细分 HTTP/HTTPS、no_proxy 列表),不需要 export、不需要重启;配置写入 DSH 设置文档,持久化,重启自动生效
  • 热切换:跟随环境变量 / 手动 / 关闭三种模式保存即生效,一键恢复直连,不用为改代理重启进程。
  • 状态面板:「设置 → 网络代理」展示当前生效组合、检测到的环境变量(密码脱敏)、Node 版本,并内置连通性测试(任意 HTTP 状态码即链路通)。
  • 与官方开关不冲突:插件的运行时设置覆盖启动值,停止/卸载时还原回启动状态。

功能

  • 跟随环境变量(默认):读取 http_proxy / https_proxy / all_proxy / no_proxy 及全部大写形式;all_proxy 兜底,HTTPS 缺省时回退到 HTTP 代理。
  • 手动设置:统一代理地址 + 可选的 HTTP/HTTPS 细分 + no_proxy 例外列表。写入 DSH 设置文档,重启后自动生效
  • 关闭:一键恢复全直连。
  • WebUI 设置页:「设置 → 网络代理」,含当前生效状态、环境变量检测(密码脱敏)、连通性测试。
  • 作用域:进程内全局 fetch(undici)、httphttps(CONNECT 隧道)。WebSocket 不受影响。

安装

# 从 npm(若已发布)
dsh plugin --profile <name> add dsh-global-proxy

# 或从 GitHub:pnpm ≥10 需要先在 profile 的 pnpm-workspace.yaml 中允许构建
# allowBuilds:
#   dsh-global-proxy: true
dsh plugin --profile <name> add github:<you>/dsh-global-proxy

# 本地检出
dsh plugin --profile <name> add ./dsh-global-proxy

安装/更新后重启 DSH,打开 WebUI →「设置 → 网络代理」。(Host 半在启动时加载;若设置页提示"命名空间未提供",说明 Host 半未激活——先重启,仍异常则查看启动日志中 dsh-global-proxy 的加载错误。)

从 GitHub 更新

dsh plugin --profile <name> update dsh-global-proxy   # 重新拉取 git 分支头部并触发 prepare 构建
# 更新失败时:remove 后重新 add(allowBuilds 允许保留)

要求

  • Node.js ≥ 24(插件探测不到 setGlobalProxyFromEnv 时会在设置页显示"不支持",请求保持直连)。
  • 环境变量模式下,代理变量必须在启动 DSH 的 shell 中 export(DSH 禁止 .env 设置此类变量)。

注意

  • 仅支持 http:// / https:// 代理地址(Node 内建限制,socks5 不受支持)。
  • Node 内建代理不会自动绕过 localhost / 127.0.0.1:本地服务(Ollama、本地 MCP 等)需要直连时,请把 localhost,127.0.0.1 加入 no_proxy
  • 代理地址中的账号密码会以明文存入 DSH 设置文档(与 npm 配置代理的惯例一致);状态展示时会脱敏。

结构

├── cordis.patch.yml      # bundle 层:插入 Host 插件行
├── src/
│   ├── index.ts          # Host 半:settings 命名空间 + setGlobalProxyFromEnv + 状态/测试路由
│   ├── shared.ts         # 两半共享的类型与常量
│   └── client/index.tsx  # Client 半:settings.section 设置页
├── tsdown.config.ts      # 构建 lib/index.js(ESM)与 lib/client.js(__ModuleLoader__ 闭包格式)
└── smoke-test.mjs        # Host 半冒烟测试:node smoke-test.mjs(四种模式 + 路由 + 逃逸验证)

开发

pnpm install
pnpm build        # 产出 lib/index.js + lib/client.js
pnpm typecheck    # tsc --noEmit

prepare 脚本会在 git 安装时自动构建,因此从 GitHub 安装无需预构建产物;npm 发布则在发布时携带 lib/