dsh-web
zhu1090093659
DeepSeek Harness (DSH) Web 插件聚合生态 · 万物皆插件,通过创意工坊分发||DeepSeek Harness (DSH) Web Plugin Aggregation Ecosystem · Everything is a plugin, distributed via the Creative Workshop
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:donoteatme/dsh-local-link
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
Use the same DeepSeek Harness Web session from a phone, tablet, or another computer on your trusted private network. dsh-local-link adds one-time QR pairing and a responsive Mobile View to the stock DSH client—without a hosted relay, cloud account, native app, replacement chat UI, or second workspace picker.
Open Local access, scan the QR code, and the paired browser arrives at the desktop's currently selected Harness session with the same live conversation, permissions, workspaces, and plugin surfaces.
The 1.2.x line supports DeepSeek Harness 0.1.5-rc.2 and keeps the stock Web client usable on narrow touch screens. It reorganizes the existing Harness interface into responsive drawers, compact session controls, and touch-friendly actions while keeping the same client, session, plugin slots, permissions, and live agent stream.
Security boundary: the gateway uses plain HTTP and is intended only for a trusted private network. Do not expose its port to the internet or use it on public Wi-Fi.
One Harness session, paired directly across the trusted LAN.
Local Link is intentionally a small LAN companion for the existing Harness Web client, not a general remote-access platform. Its purpose is to make one path dependable: open the Harness instance already running on a computer from another trusted device on the same private network, then use the same sessions and interface in a browser.
Development stays focused on:
The following are deliberate non-goals:
This does not mean the plugin is finished or frozen. It means future changes should make the local browser path simpler, safer, more compatible, or easier to diagnose instead of widening the product into a different class of system.
Stop a running dsh web process, install the plugin into the Web profile, then start Harness again:
dsh plugin --profile web add dsh-local-link
dsh web
Requirements: Git, Node.js 22.19+ or 24+, Corepack, and a global dsh installation compatible with the package's declared engines.dsh range.
git clone https://github.com/donoteatme/dsh-local-link.git
cd dsh-local-link
corepack pnpm install --frozen-lockfile
npm run verify
dsh plugin --profile web add .
dsh web
The profile points at the checkout, so rebuild after changing client code and restart dsh web after Host-side changes.
The installable DeepSeek Harness range is declared in package.json through engines.dsh. Compatibility is checked against exact releases—not inferred from a successful installation or a moving dist-tag.
Local access at the bottom of the Harness sidebar.The invitation is one-use, expires after five minutes by default, and is replaced immediately when Generate another code is selected.
Phone and tablet browsers automatically receive Mobile View when the viewport is at most 834 CSS pixels wide. The same responsive behavior can be previewed with browser device emulation; no URL parameter, user-agent switch, or second client is involved.
The stock Harness Web interface is difficult to operate on a phone: persistent desktop navigation consumes the viewport, session controls compete with the conversation title, several actions depend on hover or long press, and subagent information is too dense for a narrow screen. Mobile View makes that existing interface usable without introducing a second client or duplicating Harness business logic.
| Stock narrow-screen behavior | Mobile View in 1.2.x |
|---|---|
| Desktop navigation competes with the conversation | Workspace and session navigation opens as a dismissible left drawer |
| Session metadata crowds the header | Context, model, access, preset, activity, and export move into a compact right drawer |
| Subagent details are difficult to scan or reach | Total/active status stays near the composer and the native catalog opens as a bottom sheet |
| Hover-oriented session and workspace actions | Overflow actions remain visible and touch-accessible |
| Session changes can summon the software keyboard | Automatic composer focus is suppressed while intentional input focus still works |
| Desktop spacing ignores phone safe areas | Header, composer, tabs, media, overlays, and scrolling adapt to narrow viewports |
The implementation changes presentation, not Harness ownership or behavior:
Add workspace directory picker is omitted.These dark-theme previews are captured from a real Harness browser session at a 430 × 932 emulated viewport. The isolated screenshot profile uses synthetic product-demo data only; no local workspace, chat, path, prompt, model, or usage data appears in them.
| Navigation | Current session | Subagents | Conversation |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
The remote browser inherits the selected Harness session's Read only, Workspace write, or Full access authority. Mobile View displays that value but does not create or weaken a permission layer. This applies to ordinary session operations; Settings, credentials, native Host actions, and agent-preset authoring remain loopback-only. Hiding Add workspace is a usability constraint, not an authorization boundary.
The responsive enhancements target viewports from 360 through 834 CSS pixels wide. The release matrix defines checks at 360 × 800, 390 × 844, 430 × 932, and 768 × 1024; release acceptance also requires portrait and landscape checks on a real phone. See Mobile View for behavior, theme persistence, compatibility surfaces, and the complete acceptance checklist.
On the Harness computer, use Paired devices in the QR panel or open Settings → Local access. Each new browser starts as My device; its subtitle is detected automatically, for example Phone · Chrome, Tablet · Safari, or Computer · Edge.
Rename changes display metadata only.Revoke invalidates the browser credential and immediately closes its open Local Link WebSocket connections.Browsers do not reliably distinguish laptops from desktop computers, so both are shown as Computer.
Expand Diagnostics on the same Settings page to inspect the most recent local gateway events. Copy report produces issue-ready JSON and Clear removes the local history. The report contains event codes, timestamps, severity, and a small allowlisted context only; it never includes pairing tokens, cookies, IP addresses, device or session IDs, device names, request paths, prompts, conversations, or project files.
Desktop browser on 127.0.0.1:3080
└─ Local access → one-use invitation
│
Phone / tablet / computer on the private LAN
└─ 192.168.x.x:3088 → network + Host validation
→ pairing or device-cookie validation
→ HTTP / WebSocket proxy
→ 127.0.0.1:3080 (the same Harness Host)
The gateway does not create a second Harness session. During first connection it transfers the desktop browser's current session selection to the new browser origin; session data and ongoing conversation events still come from the same Host.
Authorization uses a 256-bit random cookie credential. Only its SHA-256 hash is stored. The editable name and detected device/browser text never grant access.
The LAN authority is declared through Harness's official connection trustedHosts contract. This enables authenticated session API and WebSocket traffic without pretending that the phone is loopback. Harness 0.1.2-rc.1 and the verified 0.1.5 builds authenticate the transport as a whole, so Local Link itself rejects the configuration, credential, native Host-action, and agent-preset-authoring RPCs that earlier supported Harness builds kept loopback-only.
The bundled profile patch installs conservative defaults:
| Option | Default | Purpose |
|---|---|---|
listenHost |
0.0.0.0 |
Listen on local interfaces; request validation still accepts only private/loopback sources. |
listenPort |
3088 |
LAN gateway port. |
upstreamOrigin |
http://127.0.0.1:3080 |
Existing loopback Harness Web server. |
accessMode |
pairing |
Require a one-use invitation and device cookie. |
pairingTtlSeconds |
300 |
Invitation lifetime. |
deviceTtlDays |
90 |
Remembered-browser lifetime. |
diagnosticsEnabled |
true |
Keep the bounded local diagnostic history. |
diagnosticsMaxEntries |
15 |
Maximum retained events (5–200). |
diagnosticsFile |
next to stateFile |
Local JSON event store; the bundled profile uses ~/.dsh/local-link/diagnostics.json. |
listenHost accepts only 0.0.0.0 or an explicit private/loopback IP literal. Public listener addresses are rejected during startup; this configuration guard complements, rather than replaces, the operating-system firewall.
trusted-lan disables per-device authorization and should be reserved for isolated development networks. pairing is the supported default because a connected Harness browser can read files, submit prompts, approve actions, and trigger commands.
The plugin never creates firewall rules. If Windows prompts for network access, allow only the Private network profile and never forward port 3088 on the router.
Diagnostics are a local, event-driven history of failures—not a request log. The plugin retains 15 events by default, shows the newest 12, coalesces identical five-second bursts, and records nothing for successful starts, requests, pairing, copies, renames, or revocations.
For support:
Settings → Local access → Diagnostics.Refresh if the panel was already open.Copy report, review the JSON, and attach it to an issue if needed.The report never includes secrets, addresses, IDs, names, URLs, paths, prompts, conversations, or project data and is never uploaded automatically. See the event reference and first checks for every tracked failure.
Harness's active language selects the plugin dictionary; the plugin has no separate language switch.
The minimal automatic pairing page loads before Harness locale services are available. It reuses the same dictionaries and selects English or Chinese from the connecting browser's language list; English is the fallback.
| Language | Dictionary | Status |
|---|---|---|
| English | src/locales/en.json |
Included |
| Chinese | src/locales/zh.json |
Included |
Dictionary keys are checked for parity in tests. To add a locale, copy en.json, translate values without changing keys, register the locale ID in src/client.tsx, extend the pre-client pairing-page language map in src/gateway/pair-page.ts, and run npm test.
corepack pnpm install --frozen-lockfile
npm run typecheck
npm test
npm run build
npm run verify
Project documentation:
system against the remote device.Button and Input primitives and their semantic variants. Harness 0.1.5-rc.2 still has no complete public responsive-shell, spacing, or radius contract, so mobile geometry, responsive compositions, and the few missing primitive icons remain documented design-system compatibility risks.The initial implementation and documentation were developed collaboratively with OpenAI Codex. Changes remain subject to maintainer review, automated tests, security review, and the same contribution requirements as human-authored changes. No runtime AI service, telemetry, or generated-code dependency is included in the package.
MIT © 2026 dsh-local-link contributors.
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: qr-code、web-ui。