dsh-proxy-on-demand

toolsnpmMIT

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

下载量 / Downloads
328

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

Links

GitHub · Homepage · npm

Same category