dsh-lan-access

DSH PLUGIN浏览器与联网

仓库 nonmean/dsh-lan-access · npm dsh-lan-access

浏览器与联网 L5 · 运行验证通过 安全审查:低风险 可信度:金 可安装插件
安装这个插件

DSH plugin 为 DeepSeek Harness 添加局域网访问开关,在设置中一键切换绑定地址,实现远程访问。

验证等级 L5 L5 · 运行验证通过
GitHub 星标 2 复刻 1 · 未关闭 issue 0
最近更新 2026-10-04 创建于 2026-08-16
README 12.5 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
dsh plugin --profile web add github:nonmean/dsh-lan-access
兼容 DSH 版本0.2.0-rc.2 等 9 个版本版本不匹配时安装会报错
Node.js 要求>=20来自仓库 package.json 的 engines 字段
前置依赖@deepseek-ai/cordis@^4.0.5-alpha.1、@deepseek-ai/dsh-client-connection@^0.2.1-alpha.1 等 9 个需要同时安装的同级依赖
npm 包名dsh-lan-access可用 npm view 查看包信息

能做什么

4 项功能
字段来自项目仓库与公开索引,中文说明由本站标注

dsh-lan-access:DeepSeek Harness 的局域网访问开关插件

  • 一键切换局域网访问
  • 实时更新信任边界
  • 显示可访问地址
  • 持久化设置

适用场景

联网搜索

上游标签

dshdsh-plugindsh-pluginslan-access

验证等级与安全审查

L5 · 运行验证通过
自动化流程结论,不是人工审核
验证等级L5 · 运行验证通过在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来
安全审查低风险静态分析结论,未标注不代表已通过审查
仓库健康度活跃按仓库活跃度与最近更新时间给出
可信度金综合仓库活跃度与验证结果

上面的结论来自上游最近一次自动化验证(2026-10-08): 同一套检查会在插件发新版后重跑,页面显示的是最新一次的逐项结果。

逐项检查结果

L1 · 已找到 ✓ 通过
  • L1.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L2 · 结构化 ✓ 通过
  • L2.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L3 · 安装规范 ✓ 通过
  • L3.1_INSTALL_COMMAND_PARSED 安装命令已解析 方式:安装规范解析
  • L3.2_DSH_VERSION_DECLARED DSH 版本已声明 方式:DSH 版本声明
L4 · 安装已测 ✓ 通过
  • L4.1_INSTALL_EXECUTED_CONFINED 受限沙盒内执行安装 方式:沙盒安装执行
  • L4.2_INSTALL_SUCCESS 沙盒安装成功 方式:沙盒安装执行
  • L4.3_ARTIFACT_CONFIRMED 安装产物已确认 方式:沙盒安装执行
L5 · 运行已测 ✓ 通过
  • L5.1_INSTALL_PASSED_SANDBOXED 沙盒安装通过 方式:沙盒安装执行
  • L5.2_WEB_BOOT_READY Web 启动就绪 方式:Web 启动
  • L5.3_HTTP_SERVED HTTP 服务响应 方式:HTTP 请求
  • L5.4_PLUGIN_INVENTORY_ACTIVE 插件清单中已激活 方式:插件清单查询
— · 其它检查项
  • L4_0_SANDBOX 沙盒安装判定 方式:沙盒安装执行

风险详情

  • 审查结论 通过
  • 结论说明 vet 静态分析未发现可疑行为,判定为干净(clean)。
  • 风险计数 严重 0 / 高 0 / 中 0
  • 风险详情 未发现严重或警告级问题。

仓库档案

浏览器与联网
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方nonmean仓库 dsh-lan-access · 默认分支 main
分类浏览器与联网search
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言TypeScript仓库主语言
许可证MIT商用或二次分发前请确认条款原文
星标 / 复刻 / issue2 / 1 / 0收录时的数值,非实时
创建 / 更新2026-08-16 · 2026-10-04最后推送 2026-10-04
本站收录2026-08-18首次进入本站目录的时间

README 全文

12.5 KB
作者原文,中文版优先;只做安全转义,不改内容

dsh-lan-access

A DeepSeek Harness web plugin that adds a LAN access toggle to the DSH
Settings shell (Settings → General). It replaces the manual cordis.patch.yml
webserver override:

> Tested with DeepSeek Harness v0.2.1-alpha.1 — this plugin is verified runnable against that harness version.

  • On — the web GUI binds 0.0.0.0, so other machines on the same network
    can open it at http://:3080/?token=…. dsh web prints the full
    URL (with the per-process ?token= launch token) for the LAN address when
    it starts — a fresh LAN browser needs that token in the URL to authenticate.
    The /api trust fence is updated live, so the browser on a LAN machine works
    fully (chat, tools, workspace).
  • Off — the GUI binds 127.0.0.1 again (loopback only — the safe default).

Screenshots

The DSH web GUI opened from another machine on the same network
(http://192.168.0.101:3080):

The LAN access toggle in Settings → General, showing the address other
devices can open:

How it works

Half File Role
Host src/index.ts Owns a plugin-local persisted flag ($DSH_HOME/lan-access.json), the fenced /lan-access JSON route (GET state / POST set), the bind controller, and the lanAccess bind-host service. The webserver row's composed host expression reads that service, so every webserver (re)start — boot, toggle, or a post-boot user-patch re-apply — converges to the persisted setting. A toggle restarts the webserver fiber only when the bind differs, using fiber.update(config, noSave): the no-save path keeps the composed tree out of cordis.yml, which would otherwise trigger an HMR subtree reload.
Client src/client/ Registers the General-settings row (settings.general.item, order 15) with a native checkbox switch, the LAN URLs (primary first, all live NIC addresses shown, copy button), zh/en copy, and restart-tolerant polling.

The route fence accepts loopback or the deployment's trusted authorities, read
live from the connection row's resolved config — the same boundary the /api
gateway uses. Cross-site requests are refused.

Install from GitHub

The built artifacts (lib/) are committed, so installation needs no build
step and no modification of the DeepSeek Harness checkout:

# From GitHub
dsh plugin --profile web add git+https://github.com/nonmean/dsh-lan-access.git

# ...or clone and install the local checkout (link: keeps your rebuilds live)
git clone https://github.com/nonmean/dsh-lan-access.git
dsh plugin --profile web add link:/path/to/dsh-lan-access

# Restart the GUI
dsh web

The install appends dsh-lan-access to dsh.profile.bundles; its
dsh.bundle.patch inserts the host row and overrides the webserver row's
host with the lanAccess service expression. The client half is picked up
by the client-modules scanner automatically. No harness change is required
for the core feature
— the toggle, the LAN bind, and the live /api trust
fence all ship inside the plugin.

> Local development — rebuild with pnpm build (or npm run build)
> after changing src/, then reinstall/restart. The repo's node_modules
> mirrors the DSH profile's package farm (TypeScript/tsdown come from the
> harness checkout).

> Migrating from a manual patch — remove any webserver host: 0.0.0.0
> override from the profile's cordis.patch.yml (and the bundle patch layers)
> so the plugin is the single owner of the bind host.

Use

  1. Open the GUI, go to Settings (sidebar footer) → General.
  2. Flip 局域网访问 / LAN access.
    - Enabling shows the ONE address other devices can open — the IPv4 of the
    interface that owns the default route (http://192.168.x.x:3080) —
    with a copy button.
    - That address must include the browser-session ?token=… when opened
    from another machine. dsh web prints the full URL (with the token)
    for both the loopback and the LAN address on startup — copy the LAN one,
    e.g. http://192.168.0.101:3080/?token=ICKD2317KYP…. The token is a
    per-process launch token that exchanges for a session cookie; a fresh LAN
    browser cannot authenticate without it.
    - The web server restarts to rebind; the row waits for it and re-reads the
    state (a network error mid-restart is not reported as failure).
    - The plugin also installs a crypto.randomUUID polyfill on plain-HTTP
    LAN origins (that Web API only exists in secure contexts, and the DSH
    API client mints every RPC id with it — without the polyfill a remote
    browser fails with "crypto.randomUUID is not a function").
  3. The choice is persisted by the plugin in $DSH_HOME/lan-access.json
    (~/.dsh/lan-access.json by default):
{
"enabled": true
}

Upgrading from 0.1.x

Version 0.3.0 targets DeepSeek Harness v0.2.1-alpha.1 (peers
^0.2.1-alpha.1). The harness now gates each bundle by its declared DSH peer
range, so this release is skipped on 0.1.x harnesses — install the plugin
version that matches the harness you run (0.2.0 was the v0.1.7-rc.2 line).
On v0.2.1+, upgrade in place:

A full upgrade needs both halves (host + client) and a dsh web restart. The
host half now owns its persistence, so the harness settings namespace is no
longer used:

  • The toggle value moved to $DSH_HOME/lan-access.json. The old
    lan-access: section in ~/.dsh/settings.yaml.imported is not read; flip
    the switch once after upgrading.
  • Reinstall (or rebuild lib/) so the host and client halves match; the
    client bundle is cached until the next dsh web.

Remote Settings pages and workspace — no harness change needed

Everything the plugin serves works from a LAN browser with zero
modification of the DSH checkout
:

  • The current /api gateway trusts the served LAN authority, so the
    configuration plane (settings.*, credentials.*) reaches the host
    directly — the Host/Origin fence admits the LAN host and the ordinary
    browser-session auth authenticates it. The Models page provider directory,
    the Plugins configuration cards, and the Language/Appearance rows therefore
    work remotely with no extra hop.
  • On non-loopback origins the client settings persistence degrades to
    memory mode
    (surfaces render empty). The browser bundle widens
    connection.isLoopback to "loopback OR served LAN authority" at runtime.
    The client entry injects connection and is marked
    dsh.client.immediately, so its bundle is prefetched and its apply
    runs right after the connection row provides the handle — before any
    settings surface (which waits on remote) reads
    remote.$host.isLoopback. That inject-ordered widening is what keeps
    the scope in host mode on a LAN page: without it, a surface that binds early
    sees the unpatched isLoopback and its persistence stays memory-mode — the
    plugin configuration cards render nothing.
  • crypto.randomUUID does not exist on plain-HTTP LAN origins. The
    bundle installs a getRandomValues-based polyfill (same CSPRNG).

Harness compatibility (v0.2.1-alpha.1)

v0.2.1-alpha.1 added a plugin admission gate: before a profile imports a
bundle, DSH checks that bundle's peerDependencies on @deepseek-ai/dsh and
@deepseek-ai/dsh-* against the single runtime version and skips the bundle
when any declared range does not match (prereleases participate in range
matching). A plugin that declares only the previous harness line is therefore
silently dropped at startup with a skipping profile bundle line. This
release targets the current runtime line — every DSH peer is
^0.2.1-alpha.1 — so the bundle is admitted again. The host and client
service contracts it consumes (webServer, settings, credentials,
loader, connection, slots, locale, and the
settings.general.item slot) are unchanged in this version, so this port is
a peer-range/version bump, not a rewrite. Rebuild lib/ after upgrading.

Harness API changes this plugin tracks

The harness replaced its standalone, file-backed settings provider with
profile-backed Config forms in v0.1.7-alpha.1:

  • @deepseek-ai/dsh-settings dropped settings.register(ns, schema) /
    SettingsScope (and the dsh-settings-file package) in favour of
    SettingsForms, which projects each plugin entry's volatile Config. A
    settings write runs inside an HMR transaction (configEditor.edit →
    hmr.runExclusive) that reconciles the whole profile. Because this plugin
    must restart the web server to change the bind, routing the toggle through
    that plane would restart the server inside the transaction and taint its
    async context. The plugin therefore persists its own flag
    ($DSH_HOME/lan-access.json) and restarts the web server fiber directly
    (fiber.update(config, true)), staying off the harness settings plane.

Earlier, the harness evolved the settings/connection APIs between
0.1.0-rc.5 and 0.1.5-alpha.1; the plugin was updated accordingly:

  • @deepseek-ai/dsh-settings dropped the settingsNamespace(ns) helper —
    settings.register / .update / .replace / .mutate now take the raw
    namespace string (validated at runtime and by a compile-time guard).
  • The client ConnectionHandle no longer carries an api member — remote
    methods go through connection.rpc.call('/api', '/', …) — so
    the plugin no longer patches connection.api.settings.* /
    connection.api.credentials.*.
  • The /api gateway stopped pinning the configuration plane to loopback: it
    now trusts the served LAN authority, so the settings/credentials RPCs reach
    the host directly. The plugin therefore widens connection.isLoopback early
    (via inject: ['connection'] plus a synchronous patch) to keep the client
    settings persistence in host mode on a LAN page; the fenced /lan-access/rpc
    proxy is no longer required for the remote Settings surfaces.

Remaining loopback-only (hardcoded in the harness, not patchable from a
plugin): host.pickDirectory / host.openPath (native dialogs and host
file opens) and llm.discoverModels (the Models page "discover" button).
The workspace's own add/browse flow does not need them, and chat file
opens route into the sidebar editor.

Debug aids

The host exposes GET /lan-access/diag (fenced like the other routes) with
the latest browser boot reports: slot-registration counts, whether the
connection patch is active, and the plugin-item slot ledger. During the first
minute after boot the browser also posts a
2-second poll of the Plugins cards' own injected snapshots (available
flags), the slot ledger view, and the declared spec — the exact data that
separates "cards gone", "cards abdicated", and "cards present but rendering
null" when a Settings page misbehaves on a remote machine.

Optional: dsh-better-sidebar compatibility patch

dsh-better-sidebar's trust fence matched the connection row by the wrong
name and read the raw !!js config, so its panels (explorer / editor /
terminal / git) only ever accepted loopback. The repo ships the fix as a
profile-level pnpm patch (no harness change):

./scripts/install-patches.sh web

This copies patches/dsh-better-sidebar.patch into the profile's
patches/ directory, registers it under patchedDependencies in
pnpm-workspace.yaml, and runs pnpm install.

Security notes

  • Default is off (loopback). The DSH launcher itself refuses
    --host 0.0.0.0 for the same reason: binding all interfaces exposes the
    agent's tools to the network. Only enable it on a trusted network.
  • The toggle is only reachable through the fenced route, and disabling from a
    remote machine cuts that machine off (expected — re-enable locally).
  • The bind survives plugin reloads and patch re-applies; a full process
    restart re-applies the persisted value at boot.

Development

pnpm build        # tsdown: lib/index.js (host) + lib/client.js (browser bundle)
pnpm typecheck    # tsc --noEmit

The client bundle is a __ModuleLoader__.load closure-factory artifact (same
format as the DSH monorepo's tsdown client preset); only the frozen
platform-module table words stay external. After changing client code, rebuild
and restart dsh web (the client-modules package metadata cache expires only
on restart).

常见问题

8 问
答案由本站依据条目字段整理,不引用上游原文
dsh-lan-access 怎么安装?

在 DSH 里执行 `dsh plugin --profile web add github:nonmean/dsh-lan-access` 即可。对应的 npm 包名是 `dsh-lan-access`。

dsh-lan-access 的验证等级是什么意思?

L5 · 运行验证通过。在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来

dsh-lan-access 安全吗?

低风险。vet 静态分析未发现可疑行为,判定为干净(clean)。

dsh-lan-access 支持哪些 DSH 版本?

上游记录的兼容版本包括 0.2.0-rc.2、0.2.0-rc.1、0.1.7-rc.2、0.1.7-alpha.2、0.1.6-alpha.2、0.1.6-alpha.1、0.1.5-rc.2、0.1.2-alpha.1。版本较多,只列出前 8 个。

dsh-lan-access 需要什么运行环境?

Node.js >=20;需要同时安装 @deepseek-ai/cordis@^4.0.5-alpha.1、@deepseek-ai/dsh-client-connection@^0.2.1-alpha.1、@deepseek-ai/dsh-client-locale@^0.2.1-alpha.1、@deepseek-ai/dsh-client-ui-slots@^0.2.1-alpha.1、@deepseek-ai/dsh-credentials@^0.2.1-alpha.1。环境不满足时安装会失败,建议先确认本机版本。

dsh-lan-access 用的是什么许可证?

上游标注为 MIT。商用或二次分发前请到仓库确认许可证原文。

dsh-lan-access 有哪些功能?

一键切换局域网访问、实时更新信任边界、显示可访问地址、持久化设置。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

同名或近似条目

4 条
不同作者的仓库分开列,请确认你要装的是哪一个
浏览器与联网
按星标排序,可作替代方案

dsh-our-free-model

dsh-our-free-model

在 DeepSeek Harness 中装上这个 DSH plugin,无需登录、注册或填 API Key,即可直接调用 DeepSeek

L3 · 安装规范通过 8,796 星

dsh-web

dsh-web

侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。

L3 · 安装规范通过 8,549 星

BrowserSkill

BrowserSkill

BrowserSkill 的 DeepSeek Harness 浏览器自动化桥接插件,通过原生浏览器工具控制可见的 Chrome 和 Edg

L4 · 沙盒安装通过 8,456 星

dsh-pocket

dsh-pocket

DSH Pocket 让 DeepSeek Harness 装进口袋:电脑跑 dsh web,手机扫码即实时同步访问(局域网+公网),人在外

L5 · 运行验证通过 1,656 星

Browser4

Browser4

L4 · 沙盒安装通过 1,152 星

agentrq

agentrq

L4 · 沙盒安装通过 1,140 星

nonmean 的其它插件

3 个

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 2026-10-08。