aklnaaw/dsh-claude-theme--plugins-lan-access ↗★ 14

dsh-lan-access

同一局域网内用手机浏览器控制这台机器:侧栏底部的手机图标给出一个带凭证的网址二维码,扫码即用。 适合需要在同一Wi-Fi下,用手机免登录、免隧道直接操作电脑端智能体的用户。

パッケージ
dsh-lan-access
互換性
未検証
バージョン
0.1.0
ライセンス
NOASSERTION
最終更新
2026/10/07

同名パッケージの別リポジトリ

インストール

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:aklnaaw/dsh-claude-theme#20bfe795c57582a5c94bc288e0fa3b1be80efeb4&path:plugins/lan-access

ドキュメント

README 全文を読む ↗

DSH LAN Access

同一局域网内,用手机浏览器打开并控制这台机器上的 DSH。侧栏底部一个手机图标,里面是二维码;扫开就是完整的 Web GUI,没有第二个界面,没有隧道,不需要任何平台的账号。

它解决什么

dsh web 默认只绑 127.0.0.1,手机连不上。就算把端口露出去,手机也会拿到 401——原因是浏览器凭证绑定在访问时用的 host:port 上,用局域网 IP 访问时对不上。

官方为此留了 connection.authenticatedUrl(url):返回带进程启动令牌的同一个地址。带令牌的首次请求会换发 cookie 并重定向到干净路径——这正是桌面浏览器第一次打开时的流程。

所以这个插件不做代理,不转发 API,不维护设备会话。它只要一个带凭证的 URL,画成二维码。

装

dsh plugin --profile web add /plugins/lan-access

装完重启 dsh web(新插件的首次加载不走 HMR)。

用

  1. 侧栏底部点手机图标
  2. 打开「局域网访问」开关
  3. 重启 DSH(绑定改动下次启动生效)
  4. 再打开面板,出现二维码
  5. 手机扫码——手机需和本机在同一网络

关掉开关并重启,就回到仅本机。

安全边界

打开开关后,能连到该端口、并拿到这条链接的人就能控制这台机器上的 agent(可执行命令、读写文件)。

  • 这条链接本身就是凭证。别发出去,别截屏分享。
  • 只在可信网络里开(家里的 Wi-Fi,不要咖啡厅/公司公共网)。
  • 默认关闭。关掉即恢复 127.0.0.1。

插件会把开关状态写进 profile 的 cordis.patch.yml(带 dsh-lan-access 标记的托管块),开关关闭时逐字节移除,不留残留。

结构

lib/qr.js       手写的 QR 编码器(版本 1-6,纠错级别 L/M),零依赖
lib/index.js    宿主半边:配置绑定开关、生成带凭证的局域网 URL、提供二维码矩阵
lib/client.js   浏览器半边:侧栏入口 + 面板 + 二维码渲染
test/           两个测试套件

为什么 QR 编码器是手写的

仓库里的插件都通过 link: 安装,路径下没有 node_modules,装不了 npm 包;系统也未必有 qrencode。所以只能是一个无 import 的单文件。

手写 QR 最容易错的地方是格式信息的位序——15 位里最高位必须放在 (8,0)。放反了,码看起来完全正常(尺寸对、定位角对、数据区对),但每个解码器都会拒绝。这个 bug 在开发中真实出现过,也是 test/verify-qr.mjs 之所以用真解码器而不是查表的原因。

测试

node plugins/lan-access/test/verify-qr.mjs     # 需要 zbarimg
node plugins/lan-access/test/verify-host.mjs
  • verify-qr.mjs:把每个矩阵渲染成 PNG,交给 zbarimg 解码,比对原文;并回读两份格式信息,确认都存在且一致(只对比对无法发现第一份写错——解码器会从第二份回答)。
  • verify-host.mjs:绑定块的幂等性与逐字节回滚;状态路由产出的 URL 必须带令牌且指向局域网地址而非 loopback;loopback 绑定时不出二维码。