把 Host 进程的 undici 请求统一路由到本地 HTTP(S) 代理,同时保持 localhost 与国内可达 API 直连。
安装
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:w4xxx/dsh-xia-plugins#path:/packages/global-proxy
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
English | 中文
dsh-global-proxy 是一个 DSH Host 插件。它为当前 Node.js Host 进程安装全局 undici dispatcher,使该进程中使用 undici 全局调度器的 fetch 请求按代理与直连规则发送。Node/undici 不读 Windows 系统代理(WinINET),这会导致订阅类插件的 OAuth 换 token、模型目录、图片生成、x_search 等请求直连失败(典型报错 codex token endpoint error (HTTP 403))。
⚠️ 影响范围:进程级全局。装配后整个 Host 进程的所有 undici
fetch都受其影响;卸载插件不会恢复安装前的 dispatcher。
发布状态
当前尚未发布到 npm;本仓库为源码分发(含 TypeScript 源、构建与单元测试)。可通过源码 link、profile 装配或开发注入使用。
工作方式
插件加载时从环境变量解析代理和 DSH Home:
DSH_HTTPS_PROXY:HTTP(S) 代理 URL;未设置时使用http://127.0.0.1:7892。DSH_HOME:DSH Home;未设置时使用~/.dsh。
随后它固定从以下位置创建 require 解析基点,并加载 undici:
<DSH_HOME>/profiles/web/node_modules/.dsh-global-proxy-require.js
插件创建 EnvHttpProxyAgent,把同一个代理 URL 同时传给 httpProxy 和 httpsProxy,再调用 setGlobalDispatcher(dispatcher)。这是进程级全局变更,不只影响本插件;同一 Host 进程中依赖 undici 全局 dispatcher 的其他插件和 fetch 调用也会受到影响。
浏览器、Git、curl 或其他独立进程不会读取这个 Node 进程内的 dispatcher。它也不会自动读取 Windows WinINET 代理设置。
代理与直连规则
当前实现的 noProxy 是固定字符串:
localhost,127.0.0.1,[::1],::1,deepseek.com,registry.npmmirror.com
这些主机及 undici 按其规则匹配的子域保持直连;其他匹配请求走 DSH_HTTPS_PROXY 或默认的 127.0.0.1:7892。noProxy 当前不是插件配置项,也不能通过环境变量单独覆盖。
如果本地代理没有监听默认端口,且目标不在 noProxy 中,相关请求会失败。设置 DSH_HTTPS_PROXY 时应使用 undici 接受的完整 URL,例如:
$env:DSH_HTTPS_PROXY = 'http://127.0.0.1:7892'
启动自检(默认关闭)
自检默认关闭,不会产生任何外部请求。显式启用:
$env:DSH_PROXY_SELFTEST = '1'
启用后,插件安装 dispatcher 后异步请求(15 秒超时):
https://chatgpt.com/backend-api/codex/models # 可用 DSH_PROXY_SELFTEST_URL 覆盖
任何 HTTP 响应都会在日志中记录状态码;网络或超时错误会记录 warning。自检不会阻止 apply() 返回,因此自检成功或失败都不等同于插件加载成功或失败,也不验证所有目标站点。
安全与运维影响
- 进程级作用域:
setGlobalDispatcher替换当前 Node 进程的全局 dispatcher。插件没有保存旧 dispatcher,也没有在卸载时恢复它;热卸载不等于网络行为立即还原。 - 代理可见数据:走代理的请求目标、请求内容和凭据按所用协议与代理能力暴露给代理运营方。只使用可信代理,并评估 OAuth、模型调用、搜索和上传数据的处理风险。
- 凭据 URL 日志风险:启动日志会原样打印解析后的代理 URL。若
DSH_HTTPS_PROXY使用http://user:password@host:port形式,用户名和密码会进入 DSH 日志。不要在 URL 中嵌入凭据,除非日志系统已做可靠脱敏。 - 自检默认不发起外部请求:只有显式设置
DSH_PROXY_SELFTEST=1才会访问自检端点。
源码 link 安装
这是 Host 插件,不是独立应用。一个源码 link 的 profile 装配示例如下,其中路径应替换为本机实际目录:
{
"dependencies": {
"dsh-global-proxy": "link:D:/path/to/dsh-xia-plugins/packages/global-proxy"
},
"bundles": [
"dsh-global-proxy"
]
}
如果使用 profile patch 直接插入插件行:
- insert:
- id: dsh-global-proxy
name: dsh-global-proxy
当前实现依赖 DSH_HOME/profiles/web/node_modules 中可解析的 undici,所以 link 到其他 profile 并不足以消除固定 web profile 假设。应通过受支持的 dsh --profile web 启动路径装配,而不是直接执行 lib/index.js。
开发注入
在装有 dsh-super-injector 的开发环境中,可以把已包含 package.json 与 lib/ 的源码目录运行时注入:
dev_inject_plugin({ dir: "D:\\path\\to\\dsh-xia-plugins\\packages\\global-proxy" })
注入后可用 dev_plugin_status 检查状态。因为该插件修改进程级全局 dispatcher,卸载插件不会恢复安装前的 dispatcher;需要确定性回滚网络行为时,应移除装配并重启 DSH Host。
lib/client.js 只是满足双端注入流程的无界面 client 占位:它注册一个返回 null 的设置项,不提供代理控制 UI。
构建与测试
pnpm install # 独立安装(undici 仅用于类型与测试)
pnpm run bundle # tsdown 构建 -> lib/index.js
pnpm test # vitest 单元测试(纯配置逻辑,不发网络请求)
node --check lib/index.js lib/client.js
源码结构:
src/config.ts— 纯配置解析(buildProxyConfig,可独立测试)src/index.ts— 插件入口(安装 dispatcher、可选自检)lib/client.js— 无界面 client 占位(手写,不动)
实际组合验证必须在隔离的 DSH Host 进程中完成:检查启动日志、自检结果、noProxy 直连目标和代理目标,并在验证结束后重启进程以恢复可预测的全局 dispatcher 状态。
Known Limitations and Deferred Work
- 固定 Web profile 解析假设——
undici总是从<DSH_HOME>/profiles/web/node_modules解析;非 Web profile、改变后的目录结构或缺少该依赖会导致加载失败。 - 没有可逆生命周期——插件没有保存或恢复之前的全局 dispatcher,卸载和热重载可能留下进程级网络状态。
- 代理和
noProxy配置不完整——只有代理 URL 可通过DSH_HTTPS_PROXY覆盖;noProxy目前为固定字符串(未来可配置化)。 - 日志可能泄露代理凭据——包含用户名或密码的代理 URL 会被完整写入日志。
- 启动自检不是健康检查体系——它只访问一个固定 URL,异步失败不会阻止插件启动,也没有重试或状态接口。
- 缺少组合测试——已有单元测试覆盖配置解析,但没有在真实 DSH Host 进程中的组合测试。
链接
同类插件
Tencent/WeKnora#dsh-weknora★ 34236
把 WeKnora 知识库接入 dsh 的四个只读工具:列出知识库、混合检索原文片段、按顺序还原单篇文档,以及直接取用 WeKnora 自己带引用的 RAG 或 ReAct agent 回答(含可续聊的 session id)。
superdesigndev/treg★ 5325
给 Agent 的工具目录:按「要做的事」检索约 2,600 个外部接口(SEO 与 SERP、外链、社交、人物与公司信息补全、广告库、抓取),查看参数与单次调用价格后直接调用,凭据由服务端注入。附带技能,MCP 行在未设置 TREG_TOKEN 前保持禁用。
TencentCloudBase/CloudBase-AI-Toolkit#dsh-plugin★ 1137
把腾讯云 CloudBase 后端接入 DeepSeek Harness——在对话里搭好并部署全栈应用,查询结果渲染为表格卡片(分页、排序、导出 CSV),部署后可预览真实域名,并提供 CloudBase MCP 工具集(`mcp__cloudbase__*`),登录走 device-code 流程。
gitroomhq/postiz-agent#dsh-postiz★ 518
通过 MCP 将 DeepSeek Harness 连接到 Postiz:列出已连接的社交媒体渠道、获取各平台发帖规则,并向 X、LinkedIn、Instagram、Facebook、Threads、TikTok、YouTube、Reddit、Bluesky、Mastodon、Discord、Slack、Telegram 等平台排期、存草稿或发布帖子;附带 postiz 工作流技能。
EthanYoQ/Invoice-Downloader#dsh-invoice-downloader★ 508
面向 DeepSeek Harness 的本地 IMAP 发票下载、OCR 识别、归档与 Excel 报销汇总。
anysearch-team/anysearch-dsh★ 490
基于 AnySearch 的实时网页与垂直搜索插件,为 DeepSeek Harness 提供搜索工具。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。