Bundle
dsh-global-proxy
DSH plugin: route every fetch/http/https request of the DSH process (model endpoints, web search, MCP) through an HTTP proxy. Follows *_proxy environment variables or manual settings; configured from the Web UI (设置 → 网络代理).
- Source
- TTsdzb
- License
- MIT
- Updated
- Updated 6 days ago
Readme
# 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 自带启动开关,与本插件是同一套内建机制: ```sh 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)、`http`、`https`(CONNECT 隧道)。WebSocket 不受影响。 ## 安装 ```sh # 从 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 更新 ```sh 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(四种模式 + 路由 + 逃逸验证) ``` ## 开发 ```sh pnpm install pnpm build # 产出 lib/index.js + lib/client.js pnpm typecheck # tsc --noEmit ``` `prepare` 脚本会在 git 安装时自动构建,因此从 GitHub 安装无需预构建产物;npm 发布则在发布时携带 `lib/`。
Install
dsh plugin --profile web add github:TTsdzb/dsh-global-proxy
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-global-proxy from the hub
- This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.