前言¶
DeepSeek Harness(DSH)通过本地 Host 提供 Web 界面,浏览器用 dsh-auth-* 会话 Cookie 完成鉴权。Host 每次启动若采用动态端口,浏览器仍按 127.0.0.1 共用同一 Cookie jar,旧启动留下的 Cookie 不会被自动删除;多次启动后 Cookie 请求头可逼近 Node 的 16 KiB 上限,请求在到达业务逻辑前即被拒绝,表现为 431 Request Header Fields Too Large,有时界面只显示 401 或「Web authentication failed」。删会话、重装往往无法恢复,因为 jar 里堆积的是历史端口对应的 Cookie。
下面介绍社区插件 dsh-auth-cookie-sweep(维护者 GuYou9799,分类 admin-security):在 Host 进程内对响应路径做包装,在合适阈值下过期不属于当前 authority 的陈旧 dsh-auth-*,避免长期反复启动把请求头撑爆。插件以 npm 包 dsh-auth-cookie-sweep 分发,当前版本 0.1.4,许可证 MIT。
这是什么¶
dsh-auth-cookie-sweep 是挂在 Host 进程里的 Cordis 小插件:依赖公开的 webServer 服务,包装 ServerResponse.writeHead,在发响应前根据请求的 authority 识别「其它启动」留下的 dsh-auth-*,并按策略追加 Max-Age=0 的 Set-Cookie,让浏览器从 jar 中删掉它们。
与改 app.asar、重打包 Electron 相比,它不改变 DSH 本体;README 说明其不存储数据、不附带前端 bundle、不联网。DSH 升级后仍可用,只要 webServer 行为保持兼容。
Cookie 为何会累积¶
理解插件前,先对齐 DSH 侧与浏览器侧的行为(README 中的归纳):
| 组件 | 行为 |
|---|---|
@deepseek-ai/dsh-desktop-host |
以 --port 0 等方式启动 Host,每次启动端口可能不同 |
@deepseek-ai/dsh-client-connection |
Cookie 名为 dsh-auth- + sha256(authority),与当次 Host 的 authority 绑定 |
| 浏览器 | Cookie 不按端口隔离,同一 host 下多条 dsh-auth-* 会随每次请求一并送出 |
| 有效期 | 约 30 天,且无登出流程删除旧 Cookie |
于是每启动一次常多出一条 Cookie,jar 只增不减;Cookie 头大约每次增长 200 字节量级。到约第 72 次启动附近可能越过 16 KiB,Node HTTP 解析器在任何 handler(含 DSH 自身)运行前就拒绝请求,故障表现为「永久性」无法打开。
核心功能¶
响应阶段的清理逻辑¶
对每个进入 Host 的请求,插件大致做三件事:
- 读取
Cookie头与当前请求的 authority(与 Host 归一化方式一致:HTTP 为host[:port],HTTPS 为scheme://host[:port]); - 找出属于其它 authority(旧启动)的
dsh-auth-*; - 在满足清理条件时,在 Host 原有响应头之外追加过期指令,例如:
set-cookie: dsh-auth-fkJh9Q9…=; Max-Age=0; Path=/; HttpOnly; SameSite=Strict
当前这次启动签发的 Cookie 不会被误删;Host 在 303 换取时仍可正常下发新 Cookie,并与清理指令出现在同一条响应里。
并发保护¶
单条「外来」dsh-auth-* 可能属于另一个正在运行的 DSH 实例(另一端口)。贸然删除会让该实例掉线并再生成 Cookie。因此仅在下列情况之一才清理:
- 外来会话 Cookie 数量 ≥
minStaleCookies(默认 3),或 - 整个
Cookie头已达到/超过maxCookieHeaderBytes(默认 4096 字节)。
多开一个实例通常只会多一条 Cookie,在默认阈值下不被清理;长期反复启动则不会在 jar 里无限堆积。
实现与依赖范围¶
- 入口
lib/index.js:inject: ["webServer"],在 HTTP 服务器创建后挂request监听,卸载时通过ctx.effect移除。 lib/purge.js:authority 与 cookie 名推导(与dsh-client-connection一致)、阈值策略、writeHead包装。- 除清理计数外基本不打日志;不读取、保存或打印 Cookie 值。
- 运行环境:
engines要求 Node^22.19.0 || >=24.0.0,DSH>=0.2.0-rc.2。
README 记载在 DSH 0.2.2-rc.1 上做过验证;集成测试模拟约 300 次启动,断言 jar 规模与请求头体积受控。
安装与启用¶
本插件是普通的 profile bundle(cordis.patch.yml 经 dsh.bundle.patch 注入)。web profile 可用 CLI 安装:
dsh plugin --profile web add dsh-auth-cookie-sweep
若使用本地目录,可用 file: 前缀指向绝对路径(README 示例):
dsh plugin --profile web add file:/插件的绝对路径/dsh-auth-cookie-sweep
dsh plugin add 只添加依赖;若你的插件管理器不会自动维护 bundle 列表,还需把包名写入 ~/.dsh/profiles/<profile>/package.json 的 dsh.profile.bundles,例如:
{
"dsh": {
"profile": {
"bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "dsh-auth-cookie-sweep"]
}
}
}
不启动 DSH 也可检查组合是否生效:
dsh --profile web --dump-config | grep -A2 auth-cookie-sweep
期望输出中包含 id: dsh-auth-cookie-sweep 等条目。
桌面版(desktop profile):CLI 会拒绝 dsh --profile desktop 一类操作,README 建议通过应用内插件管理器/插件市场安装,或自行修改 ~/.dsh/profiles/desktop/package.json 中的依赖与 bundles 后重启 DSH。
社区插件目录页:https://www.skillhub.cn/plugins/GuYou9799/dsh-auth-cookie-sweep(与 DeepSeek / 幻方无官方从属关系,仅为社区收录站点)。
配置项¶
在 bundle 的 insert 上可增加可选 config(非法或越界值会被收敛到安全范围):
- insert:
- id: dsh-auth-cookie-sweep
name: dsh-auth-cookie-sweep
config:
minStaleCookies: 3 # 1..256
maxCookieHeaderBytes: 4096 # 512..16384
maxDeletions: 64 # 1..512,单次响应最多过期指令条数
secure: false # 省略则跟随 Host 协议
已经打不开时怎么办¶
插件无法挽救已经超过 16 KiB、已被 Node 在解析阶段以 431 拒绝的请求——此时任何 Host 侧 JavaScript 都不会执行。需要先手工清空一次 jar,之后由插件长期抑制再堆积:
- 浏览器:开发者工具 → Application → Cookies → 对应
http://127.0.0.1:<端口>→ 删除所有dsh-auth-*,或清除该站点数据。 - 桌面版 Electron:退出 DSH 后删除
%APPDATA%\@deepseek-ai\dsh-desktop\Network\Cookies与Network\Cookies-journal(README 称 DSH 不依赖该存储中的其它 Cookie),再启动。
适用场景与注意¶
适合谁:长期在本地反复启动 DSH Web / 桌面 Host、且使用浏览器或 Electron 共用 127.0.0.1 Cookie jar 的开发者;希望用 Host 侧小改动避免「几十次启动后再也打不开」的场景。
局限(README 原文要点):
- 对已触发
431的 jar 必须先手工清理一次。 - 只处理到达本 Host 的 Cookie;其它 origin 或 profile 的 jar 各自管理。
- 浏览器对单域名 Cookie 数量也有上限;插件把数量压到足够低,避免该上限成为新症状。
安全与信任:插件随当前 DSH Host 进程权限运行,会介入 HTTP 响应头中的 Set-Cookie。安装前应阅读 GitHub 仓库 源码与 MIT 许可证,确认与自身环境策略一致。社区目录与 GitHub 为公开信息来源,不代表官方应用商店审核结论。
结尾¶
dsh-auth-cookie-sweep 针对 DSH 本地 Web 鉴权 Cookie 按启动累积、最终撑爆 Cookie 请求头的问题,在 Host 响应路径上按阈值过期陈旧 dsh-auth-*,并保留对并发多实例的保守策略。安装命令以 README 为准:dsh plugin --profile web add dsh-auth-cookie-sweep。