前言¶
DeepSeek Harness(命令名 dsh)是 DeepSeek AI 开源的智能体运行时,目前仍是开发者预览。它的核心理念是「一切皆插件」:模型、工具、技能、会话、沙箱和界面都可以用插件替换或组合。社区里还有一份独立的插件目录站点 deepseek-harness-plugin.com,它和 DeepSeek / 幻方没有官方从属关系,收录的是带 dsh-plugin 话题的社区仓库。
内测收官时,参与者往往想做一件很具体的事:证明「我当时在场」,再留下一句短留言。公开仓库不能把真实名单摊开,现役组织成员表也会随公开化和人员进出而变化。SenmuuuuW 维护的 dsh-group-photo 就是为这个场景做的拍立得合影墙:用零权限 GitHub OAuth 证明身份,用冻结白名单决定谁能入镜。
dsh-group-photo 是什么¶
dsh-group-photo 是一款面向 DeepSeek Harness 的趣味插件,由 SenmuuuuW 维护,仓库地址是 SenmuuuuW/dsh-group-photo。社区目录把它归在「趣味」分类,许可证为 MIT,主要语言是 HTML。仓库 package.json 里的版本号是 1.0.0,要求 Node.js ≥ 20。截至 2026-08-17,GitHub 显示 17 颗星;目录页当时仍标注 15 颗,以仓库页面为准。
它解决的问题很窄:给 dsh-external 内测成员做一面拍立得墙。成员用 GitHub 登录(授权页不申请任何 scope),只有命中冻结白名单的身份才能浏览合影、入镜并留下一句话。仓库自带的 skill/SKILL.md 写得很明确:本体是零依赖的独立 Node 站点,不是 Cordis 插件;目录页仍按 DSH 插件收录,并提供 dsh plugin add 安装命令,仓库里另有一份 DSH Skill 包装,方便智能体按文档启动、冻结白名单或导出纪念版。
核心功能¶
按仓库 README 与 skill/SKILL.md 交叉核对,已经落地的能力如下。
1、拍立得合影墙。前端是纯 HTML/CSS/JS(public/index.html):头像卡片、NO.xxx 编号、留言、入镜时间,带实时更新、彩带和移动端适配。留言上限 140 字,按 GitHub 用户 id 去重,作者可以改自己的那一句。
2、零权限 OAuth。授权 URL 不带 scope 参数,登录只用来证明「你是这个 GitHub 用户」,不申请仓库或组织权限。Skill 文档还写明不走 Device Flow。
3、冻结白名单。资格名单是内测私有期的快照(whitelist.json),运行时不会再去查现役组织成员。匹配顺序是 GitHub 用户 id 优先,用户名(大小写不敏感)其次。组织后来公开、成员进出,都不会改写这面墙的入场资格。
4、浏览同样上锁。GET /api/members 没有会话 cookie 就返回 401,未登录只能看到人数。会话令牌是 48 位随机十六进制,Cookie 带 HttpOnly。
5、Fail-closed。白名单缺失或读失败时,所有登录都被拒绝(gate_error),不会放行。
6、零 npm 依赖。服务端是 server.js,只用 Node 内置模块;启动命令是 npm start(等价于 node server.js),默认端口 8808。
7、静态纪念版。node export-archive.js 会生成单文件 archive/index.html,可双击打开,也可以放到 GitHub Pages 等静态托管。导出后不再依赖服务端登录。
8、代表作映射。成员卡会展示该用户在 dsh-external 组织里的代表作仓库,数据来自 works.json(按仓库首笔 commit 作者映射)。
公开仓库是「安全演示版」:members.json、whitelist.json、works.json 和 archive/index.html 都是虚构成员。真实名单和留言放在私有数据层(README 举例为 SenmuuuuW/dsh-group-photo-data),用文件挂载或环境变量注入,不进入公开 Git 历史。
安装与启用¶
社区目录页给出的安装命令如下,在 DeepSeek Harness 终端里运行即可:
dsh plugin add github:SenmuuuuW/dsh-group-photo
需要可复现安装时,按目录页说明固定 commit 哈希:
dsh plugin add github:SenmuuuuW/dsh-group-photo#commit
把 #commit 换成实际的 commit SHA。目录页同时提醒:插件以当前 dsh 进程的权限运行,安装时可能执行代码;安装前应检查源码仓库和许可证。
把合影墙真正跑起来,以仓库 README 为准。前置是 Node.js ≥ 20,没有 npm 依赖需要安装。README 的 clone 示例写的是 https://github.com/dsh-external/dsh-group-photo.git,目前会转到同一仓库 SenmuuuuW/dsh-group-photo。
git clone https://github.com/SenmuuuuW/dsh-group-photo.git
cd dsh-group-photo
# 1. 在 GitHub 创建 OAuth App,回调地址填:
# http://localhost:8808/auth/callback
# 2. 环境变量注入密钥(不要写进仓库)
export GH_CLIENT_ID=你的ClientID
export GH_CLIENT_SECRET=你的ClientSecret
export GH_ORG=dsh-external
# 3. 启动(等价于 node server.js)
npm start
浏览器打开 http://localhost:8808。/auth/login 会跳到 GitHub,/auth/callback 换 code、查白名单,命中后写入会话 cookie。
密钥也可以写进 config.json 的 clientId / clientSecret,仓库里这两项默认是空字符串。支持的环境变量还有 PORT,以及自定义数据路径:GH_DATA_FILE、GH_WHITELIST_FILE、GH_WORKS_FILE、GH_SOCIAL_FILE。
GitHub OAuth App 只允许注册一个回调地址,而且必须精确匹配:本地用 http://localhost:8808/auth/callback;走公网隧道则填 https://<隧道地址>/auth/callback,换地址就要改 OAuth App。
典型用法¶
本地入镜¶
完成上一节的 OAuth 配置并启动服务后,用白名单里的 GitHub 账号登录。不在快照里的账号过不了门;白名单文件本身不可用时,所有人都进不去。公开仓库自带的是演示名单,要用真实内测数据,需要维护者从私有数据层复制 whitelist.json、members.json、works.json、social.json。
临时公网访问¶
README 给出的隧道命令是:
cloudflared tunnel --protocol http2 --url http://localhost:8808
目录页和 README 在活动期间还写过一条 Cloudflare 临时地址:https://rio-palm-cfr-benz.trycloudflare.com/,并标明仅 dsh-external 内测成员可入镜。隧道地址会变,活动结束后应以仓库里的 archive/index.html 为准,不要把临时 URL 当成永久入口。
重新冻结白名单¶
运行时不读 PAT。只有重新生成快照时,才把带 read:org 的 classic PAT 写进 config.json 的 pat 字段(或环境变量 GH_PAT):
node freeze-whitelist.js
生成或更新 whitelist.json 后立刻 revoke 这个 PAT。服务端按文件 mtime 热加载白名单,不用重启。
导出静态纪念版¶
node export-archive.js
产物是 archive/index.html:单文件、无登录、可静态托管。Skill 文档提醒:members.json 和 sessions.json 写在 server.js 旁边,临时磁盘的部署平台在重新发布前要先备份。
交给 DSH Skill¶
skill/SKILL.md 的触发说明是:用户想启动合影墙、重新冻结白名单、导出纪念版,或解释这套安全模型时使用。它描述的是同一套 Node 站点,不会把合影墙变成 Cordis 里的界面插件。
适用场景与注意事项¶
适合这几类人:参加过 dsh-external 内测、想在收官之夜入镜的成员;活动维护者,需要把名单和留言与公开仓库拆开;想复用这套「零权限 OAuth + 冻结快照」门禁,给自己的社区做类似纪念页的人。
不适合指望它去增强 DSH 的编码能力。它不提供模型、工具或 Web UI 皮肤,也不会在 dsh web 里挂出一块合影面板。公开仓库里的演示数据不能当成真实内测名单。
使用前还要注意:
- 插件以当前
dsh进程权限运行,安装前应阅读源码和 MIT 许可证。 - 密钥只放环境变量或本机
config.json,不要提交进 Git。 - 资格只认冻结快照,不认现役组织成员;白名单坏了就全员拒绝。
- OAuth App 的回调地址只有一个,本地和隧道不能共用同一条配置凑合。
- 真实成员数据属于隐私,README 要求永不进入公开仓库。
小结¶
dsh-group-photo 把 DSH 内测收官收成一面拍立得墙:零权限登录证明身份,冻结白名单卡住入场资格,再把结果导出成一张可永久保存的静态页。它不是 Cordis 能力插件,而是带 DSH Skill 包装的独立站点;目录按趣味插件收录,源码和许可证都可以直接核对。
- 目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-group-photo/
- GitHub:https://github.com/SenmuuuuW/dsh-group-photo
- DeepSeek Harness:https://github.com/deepseek-ai/deepseek-harness