Skip to content
dsh.fish
Bundle

dsh-proxy-switch

DSH 网络代理开关:直连失败自动回退到 HTTP/SOCKS5 代理,设置面板可配置代理地址

Source
sg88
stars
1 stars
License
MIT
Updated
Updated 13 days ago

Readme

# dsh-proxy-switch

DSH(DeepSeek Harness)网络代理开关插件:**直连网络不通时,自动改用配置的 HTTP/SOCKS5 代理重试**,代理地址可在 DSH 设置面板中随时修改。

## 功能

- 🔌 **直连失败自动回退**:LLM 请求、网络搜索、web_fetch 等所有对外请求(均走 host 全局 `fetch`)直连失败(连接拒绝 / DNS 失败 / 超时 / 连接重置)时,自动用配置的代理重发一次。
- 🎛️ **设置面板分区**:DSH Web 设置弹窗新增「代理」分区,可配置:
  - 总开关(启用 / 停用代理回退)
  - HTTP(S) 代理地址(默认 `http://192.168.31.2:7890`)
  - SOCKS5 代理地址(默认 `socks5://192.168.31.2:7891`)
  - 代理选择模式(自动 / 始终 HTTP / 始终 SOCKS5)
- 💾 **持久化**:设置写入 `~/.dsh/settings.yaml`,修改后**立即生效**,无需重启 DSH。
- 🧹 **零第三方依赖**:CONNECT 隧道与 SOCKS5 握手均自实现,不引入任何外部包。

## 安装

```bash
dsh plugin --profile web add link:<本目录绝对路径>
# 例如:
dsh plugin --profile web add link:D:\deepseek\dsh-proxy-switch
```

安装后 **重启 dsh web** 生效(`dsh web`),然后打开 Web 设置 → 代理。

## 使用

1. 重启后在设置面板找到「代理」分区。
2. 打开「启用代理回退」开关。
3. 按需修改代理地址(HTTP 与 SOCKS5 可同时保留,模式选「自动」时 https 目标优先 HTTP 代理)。
4. 保存即生效:此后任何对外请求直连不通时会自动走代理。

## 配置项

| 字段 | 类型 | 默认值 | 说明 |
| --- | --- | --- | --- |
| `enabled` | boolean | `false` | 总开关,关闭时所有请求保持直连 |
| `httpProxy` | string | `http://192.168.31.2:7890` | HTTP(S) 代理地址 |
| `socksProxy` | string | `socks5://192.168.31.2:7891` | SOCKS5 代理地址 |
| `mode` | string | `auto` | `auto` 自动(https 优先 HTTP)/ `http` 始终 HTTP / `socks5` 始终 SOCKS5 |

对应 `~/.dsh/settings.yaml` 中的 `proxy:` 段。

## 工作原理

- host 端(`lib/index.js`)注册 `proxy` 设置命名空间,并包装 `globalThis.fetch`。
- 包装逻辑:先直连 → 抛网络层错误且 `enabled=true` 时 → 用配置的代理重发(`lib/proxy-fetch.js`)。
- 代理通道自实现:HTTP 代理走 CONNECT 隧道(RFC 7230),SOCKS5 走 RFC 1928 握手;TLS 由 Node `tls` 处理,响应保持流式(SSE 正常)。
- client 端(`lib/client.js`)通过设置面板 slot(`settings.section`)注册「代理」分区 UI。

## 开发

```bash
# 本地改动后(host 端 / client 端均无需构建,直接生效)
# host 端改动需要重启 dsh web;client 端 bundle 内容变更会被 HMR 热载
```

## 许可

MIT

Install

dsh plugin --profile web add github:sg88/dsh-proxy-switch

Profile: web

  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source