Skip to content
dsh.fish
Bundle

dsh-proxy-control

在运行中控制 DeepSeek Harness 的出站代理:设置界面(内置/系统/手动三选一)+ 系统代理探测 + 连通性自测 + 如实状态上报,改动无需重启。系统代理仅桌面版提供

Source
Joker-Principal
License
MIT
Updated
Updated 7 days ago

Readme

# dsh-proxy-control

在运行中控制 DeepSeek Harness 的出站代理:三种来源三选一,改完立即生效,不用重启。

[English](README.en.md) | 中文

> 「系统代理」只在**桌面版**提供:它读的是运行 dsh 那台机器的 Windows 设置,Web 端(`dsh web`)会禁用这一项。

## 特性

- **三种来源**:内置(启动环境)/ 系统(Windows 代理设置)/ 手动,三选一。
- **立即生效**:改地址、改直连名单、切来源,下一次请求就走新配置。
- **如实上报**:显示此刻实际会怎么走,而不是"插件装了什么"。
- **覆盖面**:走 `fetch` 的(LLM 对话、web 搜索、HTTP MCP)、`web_fetch`、子进程;回环地址永远直连。
- **自测**按真实调用路径发一次请求,直连也算有效结果。
- **分流**用直连名单。

## 安装

需要 DSH 0.2 系列(Desktop 或 Web)与 Node.js 22+。

```sh
dsh plugin --profile desktop add "/绝对路径/dsh-proxy-control"
```

也可以在 **设置 → 插件 → 添加插件** 里选目录。装完**重启一次**(bundle 列表只在启动时读),之后所有代理改动都是实时的。

本包带 `cordis.patch.yml`,条目会自动插入 profile。想直接改配置就编辑 profile 的 `cordis.patch.yml`:

```yaml
- id: proxy-control
  name: dsh-proxy-control
  config:
    mode: env          # env 内置 / system 系统 / manual 手动
    proxy: ''          # 仅手动模式使用
    noProxy: ''        # 直连名单
    testUrl: ''        # 留空用默认自测地址
```

> 早期版本的 `enabled` 与 `autoDetect` 已删除;配置里还留着会被忽略,并在下次保存时清掉。

## 使用

设置页在 **设置 → 代理**。

- 三行来源常驻,未选中的只是置灰并标「未选中」;切来源会强制重读那一边。
- 标题旁的 `?` 放说明,行内只放结果。
- 三个动作是图标按钮,功能看悬停提示:重新读取(内置行)、重新探测(系统行)、测试(自测地址行)。
- 手打的三个字段**失焦即存**,回车也行 —— 没有保存按钮。
- 三处结果(内置的来源、生效中的代理、自测结果)都显示在各自那一行的下方。

「测试」按 Harness 自己的调用路径(全局 `fetch`)发一次请求,所以它回答的是"这份配置生效后会怎样"。测的是你眼前这份配置:点之前若有没落盘的改动,会先写下去。

## 配置项

| 配置项 | 说明 |
|---|---|
| 代理来源 | `内置` / `系统` / `手动` 三选一。默认 `内置`,是惰性的 —— 装上不会改变任何行为。 |
| 代理地址 | 仅手动模式。例如 `http://127.0.0.1:7890`,只接受 `http://` 与 `https://`。 |
| 直连名单 | 这里的主机不走代理。仅手动/系统模式;内置模式以环境里的 `NO_PROXY` 为准。 |
| 自测地址 | 「测试」访问的地址,留空用 `https://www.gstatic.com/generate_204`。 |

## 三种来源

| 界面上的名字 | 从哪读 | 什么时候用 |
|---|---|---|
| **手动** | 你填的地址 | 最常见 |
| **系统** | Windows 注册表 `Internet Settings`(仅桌面版;不解析 PAC) | 代理软件开了系统代理 |
| **内置** | `$DSH_HOME/.env` 或启动前导出的变量 | 已经在 `.env` 里配好,想让插件只读不干预 |

**内置 = 不插手**:插件什么都不装,路由交给 DSH 启动时构建的那一层。所以「生效中的代理」会点名是哪一层:

```
生效中的代理:http://127.0.0.1:7890(启动环境(.env 或已导出的变量))
```

括号里是「本插件的配置」就是在走插件的策略;是「启动环境…」就是启动器那层(选内置时的正常样子)。没有代理就写「生效中的代理:直连」。

两点:`.env` 只在启动时读一次,改它要重启;官方解析器在只设 `HTTPS_PROXY` 时 `http://` 目标仍直连,要两者都走就一起写。

## 已知限制

- **不支持 SOCKS**:策略只接受 `http:` / `https:`,填了会被明确拒绝并说明原因。
- **系统代理**只在桌面版提供(Web 端禁用),且只在选中它时读取、要手动点「重新探测」才跟上系统里的改动;不解析 PAC。
- **系统 bypass 列表被整份忽略**:`127.*`、`<local>` 这类通配写法本 Harness 的匹配器不支持;回环地址本来就被强制直连。
- **直连名单不支持 CIDR**(`10.0.0.0/8` 这类会被丢弃并提示)。
- **不做按类别开关**:LLM 对话与 web 搜索打的是同一个 URL,传输层分不开;更细的规则交给代理软件。
- **自定义 CA**:做 TLS 拦截的代理需要在启动前设 `NODE_EXTRA_CA_CERTS`。
- **Electron 自身流量**(自动更新、登录页)在另一个进程的网络栈里,插件管不到。
- 子进程跟随策略;但 `.env` 里也配了代理时,子进程会跟随 `.env` 那份值。界面与日志会提示这个分叉。

## 安全性

设置页接口能改流量走向,所以只接受本机请求(403)、要求 `Host` 是回环地址(挡 DNS 重绑定,403),并拒绝可免预检跨站发送的请求体形态(415)。DSH 的 Web 服务器自身不带认证或来源策略,第三方路由必须自己设防。

## 排错

「生效中的代理」那一行是权威读数。想知道子进程拿到了什么:

```powershell
$env:HTTPS_PROXY; $env:NODE_USE_ENV_PROXY
```

这两个只在策略安装后才会发布给子进程。日志里:

```
proxy-control:出站请求经由 http://127.0.0.1:7890(手动指定),直连名单 api.deepseek.com
proxy-control:不干预路由(启动环境里没有代理设置(查过 C:\Users\Joker\.dsh\.env),按直连处理)
proxy-control:不干预路由(启动环境里有 http://127.0.0.1:7890,插件不插手(那就是启动器那层在生效))
proxy-control:无法使用 <地址>(<原因>),出站请求保持直连
```

用不了的代理不会弄死 agent:记一行警告并保持直连。卸载插件会还原启动器自己的策略。

## 许可

[MIT](LICENSE)

Install

dsh plugin --profile web add github:Joker-Principal/dsh-proxy-control

Profile: web

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