🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI
广告☁️ 云服务器特惠阿里云首购 8 折 · 腾讯云合作特惠
DeepSeek Harness Hub
← 返回列表

Juntiantan/dsh-permission-gate

DeepSeek Harnessspec-screened扫描:中风险在 GitHub 查看 ↗
✓ 可直接安装

DeepSeek Harnessdsh的

自动检查通过:npm 包已发布且 engines 声明满足基线(声明 Node >=20);该结论来自程序自动检查,未经人工实机验证。 · 最近上游提交 2026/9/23 · 已提供中文文档

DeepSeek Harness (dsh) 的 UI 级访问门禁 + 进程级 agent 工具刹车。共享 60 分钟空闲锁定。并非身份验证——请将其与真正的边界配合使用。

综合分
30.8
GitHub 分
30.8
用户评分
—
★ Stars
1
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add dsh-permission-gate
npm 包 dsh-permission-gate 已校验归属本仓库,走 npm 安装最省事
信任档位:已验证本站已于 2 天前真实安装成功(L4 · 真实安装)
是什么
dsh 原生插件 · ui
装得上吗
本站已真实安装成功(L4 · 真实安装,非静态推断)
安全吗
本站尚未对该插件做风险分级(暂未覆盖,不等同于无风险)
还在维护吗
活跃:最近一次提交在 2 天前

档位由下列信号合成:本站实装验证(真实安装,当前最高到 L4)· 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。下方各区块是它的证据明细。 验证判据与等级说明 →

🟢实装验证通过· 2026/9/23
由本站实装验证器在真实 dsh 环境安装成功,非静态推断。
数据截至 2026/9/23(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查✓ 自动检查通过

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-permission-gate @ 1.2.0
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/23 19:03:54

用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

由 DeepSeek 最新模型翻译生成
dsh-permission-gate

DeepSeek Harness(dsh)的
界面级访问闸门 + 全进程 agent 工具制动。

登录一次 → 所有打开的 DSH 页面解锁。没人登录 → 连 agent 自己都跑不动一个工具。

⚠️ 先读这一段:这不是身份认证

DSH 的 /api 表面本身没有认证 —— 这是 harness 的设计事实,不是本插件能修的东西。
harness 自己的源码是这么描述它那道请求围栏的:

trustedHosts is a DNS-rebinding fence, explicitly not authentication

任何能连上 DSH 端口的客户端,都可以直接调用 HTTP API 完全绕过本插件。 本插件只拦两件事:

- ✅ 浏览器页面(每次页面加载注入的全屏锁页)
- ✅ agent 的工具调用(tools.guard 全进程制动)

它不拦 HTTP 表面。它既不是反向代理,也不是会话层,更不是授权系统。

务必配合一道真实边界使用:

| 真实边界 | 它能给你什么 |
|---|---|
| 把 DSH 绑在回环(dsh web 的默认行为) | 网络上根本没有任何东西能碰到它 |
| VPN / overlay(WireGuard、Tailscale、ZeroTier) | 只有你自己的设备能路由到这个端口 |
| 带真实认证的 TLS 反向代理 | 真正的认证层只能落在这里 |

如果你把它丢在公网端口上,然后以为安全了 —— 那比什么都不装更糟,因为你不会再去找真正的问题。

它做什么

- 全屏锁页。 通过官方文档化的 webserver/index-inject 通道注入到每次页面加载 ——
不需要客户端插件包、不需要模块加载器、不需要跟 SPA 保持同步。
- 全局共享会话。 整个进程只有一个会话、一个空闲时钟。手机登录 → 电脑页面在下一次轮询时自动解锁;
时钟到期 → 所有页面一起回落登录页。
- 严格 60 分钟空闲锁。 没有宽限期,任务运行中也不例外。这是刻意的:闸门就是一道亡灵开关。
- 全进程工具制动。 无人登录期间,ctx.tools.guard 拒绝 agent 的每一个工具调用 ——
读不了文件、跑不了命令、上不了网、起不了子代理。
- 真实凭据。 scrypt + 随机盐,存于 ~/.dsh/permission-gate.json(权限 0600)。
会话只在内存,所以重启后必须重新登录 —— 但口令不会被重置。
- 服务端退路。 /gate 是宿主半边直出的纯 HTML 页面,即使注入脚本坏掉或被缓存住也一定能用。
- 原生设置模块。 DSH 设置里多出一个「权限闸门」页,可以关闭闸门 —— 而关闭需要输入口令。
- 可收起的悬浮胶囊。 角上的倒计时胶囊可以收起到右侧边缘变成一条窄把手,点一下就展开;
偏好记在 localStorage 里。

安装

本包声明了 dsh.bundle,所以它是一个 profile layer:装就是一行命令,
组合由 DSH 自动对账,没有需要你手改的补丁文件。

dsh plugin --profile web add dsh-permission-gate

重启 DSH 一次 —— 客户端名单只在启动时扫描

bundle 会自己插入这一行(见 cordis.patch.yml):

- insert:
- id: permission-gate
name: dsh-permission-gate

从手动安装迁移过来的? 请先把你自己的
~/.dsh/profiles/web/cordis.patch.yml 里同样那一行删掉 ——
现在由 bundle 插入,同一个 id 出现两次会冲突。

下一次页面加载就会出现锁页。首次访问让你设置口令,之后每次让你输入口令。

HTTP 接口

全部由宿主半边提供,与 DSH 同源。

| 方法 | 路径 | 用途 |
|---|---|---|
| GET | /gate | 服务端渲染的登录页,永远可用 |
| GET | /gate/ui.js | 注入浏览器的脚本(cache-control: no-store) |
| GET | /gate/status | { state, expires, remainingMs, idleMs, hasCredential, authenticated } |
| POST | /gate/login | { password, mode } —— 首次用 mode: "setup",成功后下发会话 cookie |
| POST | /gate/touch | 「有人在」—— 续期空闲时钟 |
| POST | /gate/lock | 丢弃会话并清除 cookie |
| POST | /gate/mode | { password, enable } —— 关闭/开启闸门,必须输入口令 |

state 取值:setup · locked · unlocked · disabled。

威胁模型

| 场景 | 挡得住吗 |
|---|---|
| 有人拿起你没锁屏的手机/电脑,打开浏览器 | ✅ 全屏锁页 |
| 你走开了,自治 agent 还在继续干活 | ✅ 严格空闲锁 + 工具制动 |
| 另一台设备上开着的页面 | ✅ 共享会话逻辑,所有页面镜像服务端状态 |
| 你 tailnet 里的人直接调 /api | ❌ 挡不住 —— 这正是真实边界的职责 |
| 有人能改 cordis.patch.yml 或插件目录 | ❌ 挡不住 —— 插件无法对抗加载它的 composition |
| 有人重启 DSH 进程 | ❌ 挡不住 —— 闸门活在进程里,重启同时清空会话 |

刻意保留的豁免

锁定时仍有三个工具可调用,因为它们碰不到任何文件、命令、会话内容或凭据:

get_goal · update_goal · todo_write

它们的存在是为了让被锁住的 agent 仍能汇报状态、收尾自己的记账。
想要零豁免闸门,删掉 lib/index.js 里 BOOKKEEPING_TOOLS 那一行即可。

出事怎么办

| 情况 | 做法 |
|---|---|
| 忘了口令 | 删掉 ~/.dsh/permission-gate.json → 下次访问会让你设一个新的 |
| 注入的界面坏了 / 被缓存 | 直接访问 /gate,它是服务端渲染的 |
| 彻底被锁在外面 | 把 cordis.patch.yml 里那一行改成 disabled: true,或删掉整块。该文件是热加载的,通常不用重启 |
| 想看当前状态 | curl http://127.0.0.1:3080/gate/status |

设计笔记

这个插件是在「用手机远程操控 DSH」的实战里长出来的。三个 bug 被我写进了注释和测试,
因为任何人给 DSH 写注入式界面都会踩到它们:

1. 静默的渲染崩溃比看得见的报错危险得多。 锁页曾经在最常见的路径上每次渲染都抛异常
(没有「确认口令」输入框时 appendChild(null))—— 宿主侧拦截照常工作,而界面上什么都没有,
表现为「没有权限,但还能聊天」。修法:永不 append null,并把整个渲染包进会显示错误的兜底。
2. 绝不要用定时器重绘表单。 一次 5 秒的状态轮询会重建登录表单、清空你正在输入的口令。
修法:只在状态真的变化时重绘,并且把已输入内容跨重绘带过去。
3. 全局会话不能要求按浏览器的 cookie。 /gate/touch 原本要求 cookie 与会话 token 匹配。
重启后只有登录过的那个浏览器持有有效 cookie,其它页面全部 401 —— 倒计时只减不增。
修法:touch 不授予任何权限,它只要求共享会话处于解锁状态。

开发

冒烟测试会把真实的 lib/ui.js 跑在一个最小 DOM 桩上 —— 那个桩的 appendChild
遇到 null 会像真实 DOM 一样抛错。不需要浏览器。

npm test

兼容性

针对 DSH 0.1.1-rc.2 / cordis 4.x 开发,依赖这些 harness 能力:

- 宿主:webServer.register · webserver/index-inject · tools.guard
- 客户端:settings.section 槽位 · slots 与 timer 服务

它们属于偏内部的 API,DSH 升级后可能需要同步更新本插件。

许可

MIT

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入社群

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

DPharness QQ 群二维码,QQ 扫码进群
QQ 扫码进群
DPharness 飞书群二维码,飞书扫码进群
飞书扫码进群