dsh-web-search-ddg
aooyoo
Zero-token DuckDuckGo search provider for the DeepSeek Harness (DSH) web seam — local headless browser, no API key, no m…
PROJECT TOPICS
PROJECT README
Leave your desk, not your agent.
A secure, zero-app mobile cockpit for DeepSeek Harness. Monitor running agents, handle approvals, review what changed while you were away, and continue the same session from your phone.
This project does not replace the Harness UI. It turns Harness itself into a remote work environment: the phone opens the real DeepSeek Harness web UI over Tailscale (or your LAN), and a persistent plugin bridges the gaps a browser can't close remotely — starting/resuming an agent in any folder, reading and writing files, and (v0.3) supervising running agents from a mobile cockpit.
English | 中文 · Architecture · Security · Contributing
127.0.0.1 — a deliberate, sane default. The Harness process
itself stays loopback-bound; only the opt-in forwarders (Tailscale IP and,
when enabled, the LAN IP) expose selected interfaces.flowchart LR
P[Phone / remote browser] -->|Tailscale HTTPS| S[tailscale serve]
P -->|Tailscale IP| T[TCP forwarder]
P -->|same Wi-Fi: LAN IP| L[LAN forwarder]
S --> H[DeepSeek Harness Web<br/>127.0.0.1:3080]
T --> H
L --> H
H --> R[/remfs RPC channel<br/>trusted-host fence/]
R --> A[Device authentication<br/>pairing + per-device credential]
A --> F[Filesystem capability layer<br/>allowlist + protected paths + realpath]
F --> W[(Approved workspace)]
Three independent layers:
trusted-host and the tailnet are transport trusts. They are not
authentication. Pairing and the filesystem capability layer are.
install.ps1 validates
the Node version (^22.19 || >=24), installs missing Node.js / Tailscale
(winget), guides the one-time Tailscale sign-in (re-reads the real MagicDNS
name — never a fabricated one), writes the launcher, enables HTTPS Serve,
installs the plugin, registers auto-start on login.%USERPROFILE%\.dsh\lan-on
(or set DSH_REMFS_LAN=1) to trust the LAN IP and start the LAN forwarder;
on the same Wi-Fi the phone can then skip Tailscale (http://192.168.x.x:3080).
/remfs stays device-authenticated. Enabling it widens the network exposure,
so it is an explicit choice..credentials.yaml, .ssh, .aws, .gnupg, .env, id_rsa, *.pem …)
and private data dirs (WeChat/WPS) are blocked regardless of the allowlist./remfs only, not the native Harness /api. The GUI's
own API surface has no user login; keep the network boundary (tailnet / LAN)
tight and review which devices can reach it.C:\, new drives) requires editing
.remfs-roots.json on the PC.../UNC are rejected, and
the canonical realpath must stay inside the allowlist (symlink/junction
escapes fail).This project is a secure remote workspace & filesystem bridge for DeepSeek Harness: it keeps the native web UI and adds authenticated remote access plus a capability-bounded file/workspace layer. It is not a UI replacement, skin, or alternative frontend — the ecosystem has other community projects for those directions, and they are complementary rather than competing.
Advanced users (npm):
dsh plugin --profile web add @zetaluolang/remfs-persistent
# append to %USERPROFILE%\.dsh\profiles\web\cordis.patch.yml:
# - insert:
# - id: remfs-persistent
# name: '@zetaluolang/remfs-persistent'
# inject: [connection, fs]
# restart dsh web
Windows users (one-click): double-click 一键部署.cmd — it validates
the Node version (^22.19 || >=24), auto-installs Node.js + Tailscale, guides the
Tailscale sign-in, writes the launcher, enables HTTPS Serve, installs the plugin
and prints the phone URLs (HTTPS, Tailscale IP, and the LAN IP when
walk-on-LAN is enabled).
https://<pc-name>.<tailnet>.ts.net, or the LAN URL when
walk-on-LAN is enabled and you are on the same Wi-Fi).%USERPROFILE%\.dsh\remfs-pairing.txt (or the harness log).We defend against: unauthenticated RPC, remote allowlist widening, path escape, credential theft at rest, accidental LAN/public exposure of the GUI.
We do not (yet) defend against: the harness GUI /api itself having no user
login (pairing protects /remfs, not the GUI — keep the network boundary
tight), a compromised host, or a compromised Tailscale account. Details in
SECURITY.md.
| Symptom | Fix |
|---|---|
| Phone shows the pairing screen forever | Read the code from %USERPROFILE%\.dsh\remfs-pairing.txt; codes expire after 10 min — restart the harness to generate a new one |
| Device revoked / re-pairing fails | Pairing codes are single-use; restart the harness for a fresh code |
| Phone gets 403 | Use the printed HTTPS/Tailscale/LAN URL; the GUI must run with those hosts trusted (one-click deploy does it) |
| LAN URL unreachable | Phone must be on the same Wi-Fi; re-run the launcher so the current LAN IP is detected |
npm.ps1 blocked by execution policy |
Use npm.cmd, or Set-ExecutionPolicy -Scope CurrentUser RemoteSigned |
npm view 404s right after a publish |
CDN edge cache — wait a minute or query with Cache-Control: no-cache |
Plugin never appears after dsh plugin add |
You must also append the loader row and restart dsh web |
| PC sleeps | keep_awake + power plan are handled by the deploy; see keep_awake.ps1 |
docs/device-tests/.MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。