DeepSeek Harness Plugin Hub

Publish and manage complete Harness Profiles. Discover Plugins for your next setup.

Explore

PluginsPresetsDocsNews

Community

Publish a pluginContactReport an issue

Resources

Plugin Hub on GitHubDeepSeek HarnessSystem statusPrivacy notice
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

Independent and unofficial. Not affiliated with, authorized by, or endorsed by DeepSeek.

DeepSeek Harness Plugin Hub
ProfilesPluginsCategoriesNewsDocsSign inManage Profiles
ProfilesPluginsCategoriesNewsDocsSign in
← Plugins
P

dsh-proxy-port

Proxy Port

use "/proxy port" to route DeepSeek Harness network operations through a local HTTP proxy (127.0.0.1:port), configurable at runtime

The plugin will be installed here. Keep web if you are unsure.

npx -y @deepseek-ai/dsh plugin --profile web add github:Acr1mony/dsh-proxy-port#f3bdbf3e39f2229b3fc5946aa0263cd2fa122d32
READMECompatibilityVersions

Compatibility and provenance

Proxy Port is published as dsh-proxy-port and currently resolves to version 0.1.0. The Hub verifies its manifest and preserves the exact installation source for reproducible installs.

DSH compatibility
*
Runtime surfaces
any
Release source
github
Registry updated
10/24/2026

Versions

0.1.0stable
10/24/2026

Related plugins

Loading related plugins…

Latest
0.1.0
DSH
*
HMR
Process restart
Tree shaking
Safe tree shaking not declared
Unpacked size
Unavailable
Files
Unavailable
Surface
any
License
MIT
Source
github
GitHub
★ 0
Weekly downloads
0
Last push
10/24/2026
View source ↗
README badge

Click the badge to copy Markdown for your README.

Do you maintain this Plugin?Claim benefit · Priority security scan

Verify the GitHub repository declared in package.json to manage this listing. After you claim it, Hub will prioritize a security scan of the current version and publish the result when it passes.

Claim this Plugin →
Report an issue

Related plugins

More verified plugins in integrations-communication.

Ds Botds-botDS Bot: a team of long-lived Bots for DeepSeek Harness, with Main Bots, Bot-to-Bot messages and group chatsFree Searchdsh-free-searchFree web search for DeepSeek Harness: 27 engines (Bing/DuckDuckGo/AnySearch/SearXNG/Exa/Tavily/Keenable/Firecrawl/Parallel/You.com keyless; Zhihu global/site via MCP and Perplexity/SerpBase/DeepSeek (official + native tools/search)/Baidu/Kimi/Aliyun/DoubaDafeiyudsh-dafeiyuA desktop-native BigFish companion driven by DeepSeek Harness session events.Im Connect@michengai/dsh-im-connectDSH IM Connect — 将主流即时通讯平台接入本机 DeepSeek Harness · Connect major messaging platforms to local DeepSeek Harness agents

README

dsh-proxy-port

English | 中文

Route DeepSeek Harness's own network calls — web_fetch, fetch(), anything that goes through undici — through a local HTTP proxy, chosen from the composer instead of a config file.

you:    /proxy 7897
plugin: proxy http://127.0.0.1:7897
        web_fetch and fetch() both use it
        bypass: loopback only
        source: saved state (enabled, host, port, proxyUrl)

Why this needs a plugin

web_fetch does not decide about proxies itself. It asks @deepseek-ai/dsh-http-proxy's proxyRouteFor(url), which reads that module's process-wide state: an installed policy, or "direct + DNS pinning". Two consequences follow.

  • Installing a private undici dispatcher is not enough. web_fetch would still see "direct" and keep pinning DNS, while plain fetch() took another route. The two halves would disagree, and only one of them is the tool the model actually calls.
  • Setting HTTP_PROXY in the environment is not enough either. The module snapshots the launch environment, so a variable set after boot is not what it routes by.

So this plugin drives the real thing, in the copy of the module the host already imported:

  1. createRequire() against resources/app.asar resolves the true entry of @deepseek-ai/dsh-http-proxy; a profile plugin cannot resolve @deepseek-ai/* by name — see Install.
  2. import(pathToFileURL(entry)) loads that same file. ESM caches by URL, so this is the host's module instance, not a second copy.
  3. installProxyFromEnvironment(env, report) is called with a Map that answers env.get('http_proxy').value, the only shape that module reads.

The installed policy replaces the global undici dispatcher with a ProxyAgent factory and publishes http_proxy / https_proxy / all_proxy / no_proxy into process.env, so libraries that read the environment — and spawned children — agree with it.

Loopback addresses always bypass the proxy. SOCKS and PAC are rejected by that module: only http: / https: proxies are accepted.

Install

Requirements:

  • DeepSeek Harness desktop ^0.2.1-rc.2 — the Electron build; the plugin locates the application archive to reach the host's own modules.
  • A local HTTP proxy that speaks CONNECT (Clash, Clash Verge, v2ray, mitmproxy, …).

The package declares engines.dsh, so a host outside that range refuses it at install time instead of loading it into a silent direct route.

A. From GitHub (recommended)

The plugin page's install dialog and the plugin_manager tool both accept a pnpm git spec. The repository root is the package, so this is the entire install:

github:Acr1mony/dsh-proxy-port#<commit>
git@github.com:Acr1mony/dsh-proxy-port.git#<commit>

There is no npm release: the repository is the distribution channel.

Pin a commit rather than a branch: this plugin drives a process-wide policy, so "whatever main was that day" is a bad thing to have written down.

Before pnpm starts, the manager probes github.com with git ls-remote (5 s, credential helpers disabled). When the probe fails, the dialog reports failedAt: 'spec-host' and suggests a registry mirror, which cannot help a git dependency — use the SSH form instead, or a local checkout below.

Bulk fetches also need a working route to github.com. If a plain git clone of this repository dies partway through (invalid index-pack output, Connection was reset), point git at your local proxy first:

git config --global http.https://github.com.proxy http://127.0.0.1:7890

B. From a local checkout

file:/path/to/dsh-proxy-port

The checkout is linked rather than copied, so edits take effect on the next launch.

C. By hand, through profile files

A profile plugin is a bundle: the plugin page lists bundles, so a bare loader row never appears there. From a checkout at /path/to/dsh-proxy-port, edit ~/.dsh/profiles/<profile>/package.json (on the desktop build the profile is desktop):

{
  "dependencies": { "dsh-proxy-port": "file:/path/to/dsh-proxy-port" },
  "dsh": { "profile": { "bundles": ["…", "dsh-proxy-port"] } }
}

Add a row override in the same directory's cordis.patch.yml — the row itself comes from this package's cordis.patch.yml, the profile only overrides defaults:

- id: dsh-proxy-port
  name: dsh-proxy-port
  config:
    enabled: true
    host: 127.0.0.1
    port: 7890
    proxyUrl: ''
    noProxy: ''
    childNodes: true
    verifyUrl: https://example.com/

Then install the dependency with the pnpm that ships inside the app (resources/runtime/primary-runtime/dependencies/pnpm/bin/pnpm.cjs install) and restart.

dsh plugin --profile desktop add … is not an alternative here: the desktop profile is managed exclusively by the Electron application and the CLI refuses it.

Restart the application — without HMR the newly installed bundle is only loaded on the next start — then pick the port:

/proxy 7897

Usage

The port is a command, not a field. /proxy runs in the host, produces no model message, and costs no tokens.

InputEffect
/proxy 7897Use http://127.0.0.1:7897 now, and from the next start
/proxy · /proxy statusCurrent address, whether web_fetch really uses it, bypass list, source
/proxy off · /proxy onUninstall / reinstall the policy (off restores the route that was in force before it)
/proxy http://10.0.0.5:3128Full URL — also for an https: proxy or a non-loopback host
/proxy 10.0.0.5:3128host:port
anything elseUsage text; nothing changes

/proxy needs DSH's commands service (part of the base layer and of the Web client). The plugin asks for it optionally: a headless host without a command surface keeps the tool and skips the command instead of staying unmounted.

Where the value is stored

<profile>/local-proxy.json, written by the command:

{ "enabled": true, "host": "127.0.0.1", "port": 7897, "proxyUrl": "" }

Precedence: state file → row config → built-in defaults. The row config is what ships; the state file is what you chose. Nothing here has to be edited by hand.

Tool: local_proxy

The model-side view of the same state — for evidence, not convenience.

ActionWhat it answers
statusIs the policy installed? Which module file, which proxy URL, does proxyRouteFor(verifyUrl) say proxied, what is persisted
setSame effect as /proxy: change host/port/enabled/noProxy, persist, apply immediately
diagnoseTCP reachability of the proxy port plus the route for one URL — no business request
testA real request (global fetch, then optionally ctx.web.fetch) and which route it took

Configuration reference

Row config keys, all optional:

KeyDefaultMeaning
enabledtruefalse uninstalls the policy; every request goes direct
host / port127.0.0.1 / 7890Proxy address; a bad port falls back to 7890 with a warning instead of failing the plugin
proxyUrl''Full proxy URL such as http://127.0.0.1:7897; wins over host/port
noProxy''Comma-separated bypass hosts; loopback is always bypassed
childNodestruePublish the proxy variables plus NODE_USE_ENV_PROXY=1 for child processes
verifyUrlhttps://example.com/Target that status / diagnose / test use by default

Tests

node test/smoke.mjs     # real traffic traverses a proxy; dispose restores the previous route
node test/apply.mjs     # mount, tool + command registration, persisted toggle, unmount
node test/command.mjs   # /proxy parsing, persistence, remount keeps the chosen port
  • smoke.mjs starts a local proxy and asserts that the environment is published, proxyRouteFor says proxied, fetch() really traverses the proxy, loopback stays direct, and dispose restores both the route and the environment.
  • apply.mjs mounts with a fake host context: apply(ctx, config) must register the tool and /proxy, ctx.effect() must install the policy, a persisted change must toggle it, and the disposer must uninstall it.
  • command.mjs drives the command itself, including rejected input (abc, 70000, 0, host:99999), on / off / status, a full URL, and a remount that must still run on the persisted port.

The tests need a Node binary — no DSH installation — but one thing cannot come from this repository: an archive root to resolve the host's modules through. Plain Node cannot read a packed .asar, yet resolution is by path, so a directory with that name works. Copy @deepseek-ai/dsh-http-proxy and undici out of an installed DeepSeek Harness into <root>/resources/app.asar/dsh/node_modules/, then point DSH_LOCAL_PROXY_FIXTURE at <root> (the lookup also tries fixture/ in the repository and the author's private _probe tree). Without a HTTP proxy library present, apply.mjs still passes — the plugin warns and skips the install, which is the fallback it ships.

Limitations

  • In-process Node only. fetch, undici, and libraries that read http_proxy. A shell's curl or Python's requests follow their own environment, which childNodes only publishes — whether a child inherits it is the host's spawn policy.
  • HTTP CONNECT only. No SOCKS5, no PAC; both are refused by the host module, not by this plugin.
  • Electron archive layout. The module is located under resources/app.asar; DSH_APP_ASAR overrides the location for an unusual install.
  • One proxy per process. That is the granularity of the host's policy; a per-request proxy is not offered.

License

MIT