Skip to content

dsh-lan-remote

Verified

dsh-lan-remote · v0.1.5 · MIT

在 DSH 0.2.1+ 中独立提供 0.0.0.0 局域网监听、固定端口、原生 30 天免密配对(兼容 dsh-pair)与移动端竖屏触控适配。

Install

dsh plugin add dsh-lan-remote

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Published to npm without a public repository. Inspect the package contents before installing.

Tags

Readme

dsh-lan-remote

为 DeepSeek Harness 桌面版(DSH Desktop 0.2.1+)提供完整局域网与移动端远程控制能力的主力插件。自用。

装上后直接闭环 局域网 0.0.0.0 通配监听、固定端口、30 天免密配对(兼容 dsh-pair)、手机热点反向代理兼容、明文 HTTP crypto.randomUUID 垫片,以及手机竖屏触控适配。


功能列表

1. 局域网 0.0.0.0 通配监听与固定端口保持

DSH 0.2.1+ 默认在配置校验中拒绝 0.0.0.0 与 :: 通配地址,且桌面端启动子进程时固定传入 --host 127.0.0.1 --port 0。本插件在启动期自动完成:

  • 放行通配地址:允许 cordis.patch.yml 中的 webserver 绑定 0.0.0.0 或 ::,同时监听本机回环、物理局域网网卡(en0)与虚拟网卡(utun)
  • 内部通告回环化:令 webServer.getOrigin() 在通配监听下返回 http://127.0.0.1:<port>,保证 Electron 主进程与本地子进程始终走 127.0.0.1 回环而不触发 ECONNREFUSED
  • 清除默认随机端口占位:自动移除 dsh-desktop-host 注入的 127.0.0.1:0 默认占位,使 cordis.patch.yml 配置的固定端口(如 19387)稳定生效

2. 局域网受信任主机(trustedHosts)动态同步

DSH 0.2.1+ 对 /api、/api/remote.mux WebSocket 与 dshmarket 启用了严格的 Origin / Host 同源守卫。本插件在通配监听下将本机所有非内部 IPv4 网卡地址动态并入 connection.trustedHosts:

  • 局域网电脑、手机浏览器或 VPN 隧道访问时不再报 403 untrusted origin
  • 运行期换网免重启:笔记本切换 Wi-Fi、开启手机热点或 DHCP 续租换 IP 后立即生效,无需重启 DSH

3. 一键签发 30 天跨重启免密配对链接(兼容 dsh-pair)

提供仅限本机回环调用的控制面接口 POST /api/pair/issue,直接复用 DSH 原生 BrowserAuth 机制:

dsh-pair                        # 生成局域网免密配对链接(默认优先挑选 en0 等物理网卡 IP)
dsh-pair --open-home            # 生成并通过 ssh home-mac 直接在家用 MacBook Chrome 中打开
dsh-pair --address 100.64.0.1   # 指定特定网卡(含 Tailscale/utun 虚拟网卡)生成链接
  • 局域网电脑或手机浏览器打开一次配对链接后,DSH 自动种下由 $DSH_HOME/.credentials.yaml 持久密钥签名的 30 天有效 dsh-auth-* Cookie,后续访问与 DSH 重启后均免密直连
  • 同时在 /remote/api/remote.mux 提供 403 WebSocket 升级探针,兼容手机热点反向代理脚本(android-phone/proxy/proxy test)的链路自检

4. 局域网明文 HTTP crypto.randomUUID 垫片

现代浏览器在非 HTTPS 的局域网明文地址(如 http://10.1.164.52:19387)下默认不暴露 crypto.randomUUID(),会导致 DSH 前端发送对话 RPC 时报错中断。本插件在 <head> 最前注入符合 RFC 4122 v4 的 crypto.randomUUID 垫片,明文局域网直连无需折腾自签名证书即可正常收发消息。

5. 手机竖屏触控适配

在手机等触屏竖屏窄视口(宽度 < 1100px)下自动激活移动端交互层(桌面端与横屏视口下零 DOM 改动):

  • 悬浮可拖拽鲸鱼按钮(#dshRemoteWhale):收起态完全隐藏左侧轨道以腾出全屏宽度,点击左上角悬浮鲸鱼按钮展开侧栏(支持拖拽换位并自动记忆坐标)
  • 右上角右侧栏按钮:选中会话后可直接打开右侧栏,无需先编辑或点击文件;手机窄屏自动全屏展示,点击原生收起按钮返回聊天
  • 左右滑动手势:对话区右滑展开侧栏,侧栏展开时左滑或点空白处自动收起(自动避开输入框、表格与横向滚动代码块)
  • 长按会话菜单:长按会话行 500ms 唤出重命名 / 分叉 / 归档菜单(震动反馈,松手不误触打开会话)
  • 底部弹出式选择器(Bottom Sheet):将原本在窄屏下飞出左边缘的模型与权限下拉菜单改为底部弹出抽屉(44px 触控行高)
  • 输入法与软键盘防误触:输入框 16px 字号防止 iOS Safari 聚焦自动放大;手机端按 Enter 仅插入换行(点右侧按钮发送);拦截切换会话时的程序化自动聚焦,避免切会话即弹出软键盘遮挡半屏
  • 与 dsh-desktop-enhance 自动协同:激活时在 <body> 维护 dsh-remote-portrait 与 dsh-remote-rail-hidden 类名,dsh-desktop-enhance 的「会话信息」看板据此自动切换为居中紧凑模态框并在展开左侧栏时隐藏避让

安装与配置

1. 安装插件

dsh plugin --profile desktop add dsh-lan-remote

⚠️ 如果 profile 里原本是 link: 指向本地仓库,必须先 remove 再 add(直接 add 会静默保留 link:):

dsh plugin --profile desktop remove dsh-lan-remote
dsh plugin --profile desktop add dsh-lan-remote

2. 在 cordis.patch.yml 开启 0.0.0.0 与固定端口

在 ~/.dsh/profiles/desktop/cordis.patch.yml 中配置 webserver:

- id: webserver
  name: '@deepseek-ai/dsh-host-webserver'
  config:
    host: '0.0.0.0'
    port: 19387
    compression: gzip
    compressionLevel: 1
    compressionThresholdBytes: 1024

修改后重启 DSH Desktop 生效。

3. 更新与卸载

# 更新到最新版本(更新后需重启 DSH Desktop)
dsh plugin --profile desktop update dsh-lan-remote

# 卸载(卸载前请先将 cordis.patch.yml 的 webserver.config.host 改回 127.0.0.1)
dsh plugin --profile desktop remove dsh-lan-remote

开发与文档

这个仓库根目录就是插件包(src/ 下 TypeScript 源码经 tsdown 编译为 lib/ 下的产物发布)。开发导航从 AGENTS.md 或 docs/index.md 进入:

你想… 去
接手项目、了解硬性契约与发版规程 AGENTS.md
查所有功能定义、设计细节与验证方式 docs/FEATURES.md
看深模块架构、接缝(Seam)与数据流 docs/ARCHITECTURE.md
看为什么这样设计、否决过哪些备选方案 docs/DECISIONS.md
看测试分层与功能树→测试矩阵映射 docs/TESTING.md
起 23387 隔离实例跑真机验收 tools/README.md