dsh-web-lan-access
LAN / remote access support for the DeepSeek Harness Web UI: all-interface binding through a replacement webserver row, remote Host settings, and automatic /api trust-fence widening.
一句话定位
LAN / remote access support for the DeepSeek Harness Web UI: all-interface binding through a replacement webserver row, remote Host settings, and automatic /api trust-fence widening.
安装方式
在 DSH 的 web profile 中执行下面的命令;装完刷新页面即可。
$ dsh plugin --profile web add dsh-web-lan-access@1.3.2
兼容的 DSH 版本
未声明
作者与热度
AcidGr · ★ 40 · 更新于 2026-11-05
关于这个插件
dsh-web-lan-access
English | 简体中文
LAN / remote access support for the DeepSeek Harness Web UI.
Bind every interface with one command, reach the GUI from a LAN IP, a Tailscale IP, or a VPN address, and keep Host-backed settings working on the remote page. Compatibility Version 1.4.0 is the release that tracks dsh 0.2.1's stricter webserver. See Why 1.4.0 had to change if you are upgrading from 1.3.x. The problem
Three separate things stand between a remote browser and a working GUI:
1. The listener binds loopback only. dsh web defaults to 127.0.0.1, and from 0.2.1 the CLI rejects a wildcard host outright:
2. The /api fence rejects unknown authorities. Every request must name a loopback host, the listener's own bind literal, or a declared trustedHosts entry. A wildcard bind has no literal of its own — 0.0.0.0 matches no request Host — so the page shell loads but every /api call returns 403 and sessions never appear.
3. Host-backed settings are gated on isLoopback. client-connection derives isLoopback: transport?.ownsHost === true, and client plugins consult that fact before reaching Host surfaces. A page served from a LAN or Tailscale address is not loopback by hostname, so the Models and plugin settings pages stay empty even after authentication succeeds. The fix
Two small pieces, both reversible. A replacement webserver row
lib/webserver.js subclasses @deepseek-ai/dsh-host-webserver and changes exactly two things: Config delegates to the shipped schema and rescues *only* the wildcard rejection. A non-literal host, a port out of range, or a missing port still fail exactly as before — the relaxation is one error message wide. getOrigin() never returns a wildcard origin. The parent builds its URL from the bind address, which would yield http://0.0.0.0:3080 — an address no browser can dial. A wildcard listener reports loopback instead, and --public-url still overrides the advertised root upstream.
Everything else — the service name, routes, index taps, TLS handling, gzip, listener lifecycle — is inherited untouched. A /api fence widened from the live interface list
The bundle patch derives trustedHosts from every non-internal IPv4 the host currently has, so LAN, Tailscale (100.x), and VPN addresses are all accepted without per-IP configuration. A bootstrap script for Host ownership
Injected as the first script in , before the boot manifest and shell entry, through the webserver's official index-tap extension point (webServer.tapIndex). It declares ownsHost: true while keeping the ordinary HTTP fetch transport, and leaves a transport supplied by another shell untouched. What 1.4.0 removed: the crypto.randomUUID polyfill. From 0.2.1 DSH mints UUIDs through @deepseek-ai/dsh-util-crypto, which is built on crypto.getRandomValues — available on insecure origins — so a plain-HTTP LAN page needs no patch to render. The old polyfill is gone because the bug it worked around no longer exists. Why 1.4.0 had to change
相似插件
open-design
Local-first design product: detects your installed code-agent CLI, runs design skills + design systems, streams artifact…
huashu-design
花叔Design:用HTML做高保真原型、幻灯片、动画与可视化,导出PDF和可编辑PPTX。
dsh-web
DeepSeek Harness Web GUI 插件全家桶。皮肤、宠物与社区插件索引已拆分为独立仓库(dsh-skins / dsh-pet / dsh-community-plugins),本仓通过 npm 包内置它们。