dsh-proxy-on-demand
Start a local mihomo proxy core on demand and shut it down when idle — no always-on port, no leftover process, no change to the Windows system proxy. Routes through an existing proxy when one is already running. Needs a Clash/mihomo config (subscription, imported FlClash config, or pasted in); the f
Install
dsh plugin --profile web add dsh-proxy-on-demand
Sandbox test
This plugin has not been tested yet. Submit a test →
README
dsh-proxy-on-demand
需要时才拉起代理内核,用完自动关。平时不占端口、不留后台进程、不碰你的系统代理。
给 Agent 用的工具,不是给人用的客户端 —— 内核用 7899(避开 FlClash 的 7890),
本机已有代理在跑时直接借道,一个进程都不起。
[English](README.en.md) | 中文
dsh-proxy-on-demand — 按需代理,用完自动关(本仓库)
dsh-hot-reloader — 改完插件源码不用重启
dsh-session-clock — 按会话授时与空闲间隔
dsh-second-opinion — 卡住时把问题交给另一个独立会话,要一份第二意见
dsh-onebot-companion — QQ 通道一体化:出站沉默守卫 / 行为规则 / 对话节奏 / 人设 / 语音
[!IMPORTANT]
首次运行会自动联网下载内核。 本插件不含内核二进制,第一次要用时会从
mihomo 的官方 GitHub Release 自动下载
mihomo-windows-amd64(约 61MB)到插件目录下的runtime/,之后离线可用。
不需要你手动装任何东西;删掉 runtime/ 即可完全清除,磁盘上不留残余。
不想自动下载就在配置里设 autoDownload: false 并自行放好内核。
细节见[下载说明](#下载说明)。
[!WARNING]
自用工具,请自行评估风险。 本插件按「原样」提供,不附带任何明示或默示担保。
代理内核、节点与订阅的来源及合法性由使用者自行负责;请遵守你所在地的法律法规
与所使用服务的条款。作者不对使用本软件造成的任何直接或间接后果承担责任。
目录
- [这是什么](#这是什么)
- [它到底解决了什么问题](#它到底解决了什么问题)
- [环境要求](#环境要求)
- [安装](#安装)
- [使用](#使用)
- [设置界面](#设置界面)
- [借道已有代理](#借道已有代理)
- [配置](#配置)
- [HTTP 接口](#http-接口)
- [它是怎么做到的](#它是怎么做到的)
- [下载说明](#下载说明)
- [上游程序](#上游程序)
- [已知限制](#已知限制)
- [免责声明](#免责声明)
- [License](#license)
这是什么
dsh-proxy-on-demand 是一个 DeepSeek Harness(DSH)插件,给 Agent 一个随叫随到、用完就走的代理。
定位是「给 Agent 用的工具」,不是「给人用的客户端」。 它没有托盘图标、不抢系统代理、不替你做「现在该不该上网」的决定。设置页存在,是因为你要往里填节点(订阅 / 从 FlClash 导入 / 手动粘贴)—— 填完就可以忘了它。
它把 mihomo(Clash Meta 内核)包进插件里:
- 需要时自动拉起 —— 第一次要用的时候自己下载内核、准备配置、启动进程。
- 空闲后自动关闭 —— 默认 2 分钟没人用就杀掉内核、清掉状态文件。
- 不跟 FlClash 抢端口 —— 内核用 7899,故意避开 FlClash/Clash 系默认的
7890;管理 API 从 19090 起、DNS 从 15353 起,再各自找空闲端口(也避开了 FlClashCore 惯例的9090和它会占的1053)。所以你那边 FlClash 该开就开,不受影响。 - 永不碰系统代理 —— 插件只把内核绑在
127.0.0.1上,一个字节都不写 Windows 系统代理注册表。要不要让流量走代理,由你自己(HTTP_PROXY、或你自己的代理软件)决定。 - 本机已有代理就直接借道 —— 你已经开着 FlClash 之类的时候,插件复用它的出口,自己一个进程都不起(见[借道已有代理](#借道已有代理))。
- 自带节点面板 —— 内核是自己起的时候,可以在设置页列分组、列节点、切节点(切完回读确认)、一键测延迟。
它到底解决了什么问题
用 Clash 系客户端(Clash Verge、FlClash、ClashX…)的人都有这个体验:
要用一下代理 → 打开客户端 → 等它起内核、拉订阅 → 用完 → 忘了关 → 它一直挂在托盘里,占着 7890,开着系统代理
对脚本、CI、爬虫、偶尔抓一次墙外数据这类场景,这个模型是反的:代理只在几秒钟里被需要,却要一直养着一个常驻进程。
这个插件把模型倒过来:代理是函数的调用栈,不是常驻服务。
dsh-proxy -- curl.exe -sS https://api.github.com/repos/MetaCubeX/mihomo # 内核按需启动 → 命令跑完 → 空闲超时后内核自动退出
在 DSH 里,Agent 需要抓墙外内容时直接调 POST /dsh-proxy/fetch,插件会顺手准备出口(本机已有代理就借道,否则起内核)、抓完续一次租约,用完自己关。
留下的是:HTTP 接口、CLI、内核按需起停,以及配置来源那一小块设置页(订阅 / 从 FlClash 导入 / 手动粘贴)—— 没有它你就没法往里填节点。
为什么不用 FlClash 的内核
FlClash 自带的 FlClashCore.exe 不是标准 mihomo,而是 GUI 专用的 IPC 从属进程。它的 main() 长这样:
func main() {
args := os.Args
if len(args) <= 1 { os.Exit(1) }
go exitOnTermination()
startServer(args[1]) // args[1] 是管道名
}
func startServer(arg string) {
dialed, err := dial(arg) // 连不上就 panic
if err != nil { panic(err.Error()) }
}
配置全部由界面经 IPC 下发,无法脱离 GUI 独立启动(实测 FlClashCore.exe -v 会 panic: dial unix -v,因为它把 -v 当成了管道名)。所以本插件用上游标准内核。
环境要求
- Node.js ≥ 22
- DeepSeek Harness 0.2.0-rc.2(Electron 44.0.0)—— 开发与验证所用的版本;
作为插件运行需要它。命令行部分(dsh-proxy)可脱离宿主独立使用。
- 一份 Clash/mihomo 配置,来源三选一:
- 订阅链接
- 本机 FlClash 的
config.yaml(自动导入并修正路径) - 手动粘贴
安装
dsh plugin --profile <你的profile> add link:<本目录绝对路径>
例如:
dsh plugin --profile desktop add link:D:/path/to/plugins/dsh-proxy-on-demand
从 npm 安装(如果你是用发布版):
dsh plugin --profile <你的profile> add dsh-proxy-on-demand
装完之后,profile 清单(dsh.profile.bundles)会被自动更新。
⚠ 对「宿主正在运行时才装的新插件」:光改清单不够,需要再关开一次这个 bundle。
宿主不会为运行中新加入的 bundle 自动挂载 —— HMR 只 reconcile 已经存在于
loader 树里的 entry。实测:清单写好了、node_modules 链接也建了,但
plugin_manager list_plugins 里就是没有这个包,HTTP 端点 404。此时把它关掉再打开
(plugin_manager set_bundle {target, enabled:false}→ 再enabled:true,两次都会返回
{"changed":true,"application":"applied"}),宿主侧端点立刻 200、客户端界面同时注册进
slot 树。不需要重启宿主。
反过来,如果插件目录/链接在宿主启动之前就存在,宿主启动时会一并加载,就不必这一步。
手工安装(不走 CLI)也可以:在 profile 的 package.json 里加
"dsh-proxy-on-demand": "link:D:/path/to/plugins/dsh-proxy-on-demand",
并在dsh.profile.bundles数组里补上"dsh-proxy-on-demand";
然后在 profile 的node_modules下建一个指向插件目录的链接(mklink /J或符号链接均可)。
使用
在 DSH 里
装上之后,设置 → 按需代理(设置侧栏里独立的一页,不是「设置 → 插件」里的卡片)会出现完整界面(见下节)。也可以用 HTTP 接口:
curl -X POST http://127.0.0.1:19387/dsh-proxy/fetch \
-H 'content-type: application/json' \
-d '{"url":"https://api.github.com/repos/MetaCubeX/mihomo/releases/latest"}'
命令行
插件自带 dsh-proxy 命令,不依赖宿主进程,宿主没起来也能用:
dsh-proxy status # 看状态(含出口端口、有没有在借道) dsh-proxy prepare # 下载内核 + 准备配置(顺手把 7890 / 1053 挪开) dsh-proxy import-flclash # 从本机 FlClash 导入配置 dsh-proxy peers # 看本机有没有可借道的代理 dsh-proxy start # 启动内核(或借道),守着直到空闲自动关 dsh-proxy stop # 立刻关掉(只关自己起的) dsh-proxy -- <命令> [参数...] # 带着代理跑一条命令
status 长这样(本机 FlClash 开着的时候):
运行时目录 : D:\Plugins\dsh-proxy-on-demand\runtime 端口 : 7899 空闲自动关 : 120 秒 内核状态 : 未运行 剩余计时 : - 借道探测 : 可以借 127.0.0.1:7890(自己的内核不必起) 配置 : 143 个节点,482 条规则
端口 是插件自己内核的端口,借道探测 是「真要用的时候能不能借到」。
status 只探端口、不起内核(约 2ms)—— 看一眼状态不该顺手拉起一个进程。
内核真跑起来时还会多一行 出口端口,那才是 -- <cmd> 实际会用到的那个。
常用的是最后一种:
dsh-proxy -- git clone https://github.com/some/repo dsh-proxy --idle 0 -- curl.exe -sS https://api.ipify.org # 跑完立刻关 dsh-proxy --idle 600 -- npm install # 空闲 10 …(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::2,最后更新 2026-11-01