dsh-cookie-cleaner:清理桌面客戶端 cookie 庫裏堆積的 dsh-auth-*

前言

DSH(DeepSeek Harness)桌面客戶端用久了,可能在啓動時報一句有點嚇人的錯:desktop welcome: Web authentication failed。重裝客戶端也沒用。這個錯的根因不在賬號,而在本地 cookie 庫:每次啓動宿主都挑一個隨機端口,認證 cookie 的名字裏包含 host:port,端口一變就多一條,條目越積越多,最終擠爆 HTTP 請求頭上限,服務端返回 431,客戶端把它歸因成認證失敗。

下面介紹的插件 dsh-cookie-cleaner(維護者 drscrewdriver,分類 admin-security)就是用來處理這件事的:它能只讀播報本地 dsh-auth-* 條目的堆積情況,並在客戶端完全退出後用一個獨立命令把它們清掉。和”每次問一遍 AI 怎麼清”相比,它把因果鏈、各平臺庫位置、安全邊界都固化在工具裏了。

這是什麼

一句話定位:一個 DSH 插件 + 一個隨包分發的獨立清理命令,目標是解決桌面客戶端「約 70 次隨機端口啓動後必現 HTTP 431」的啓動失敗問題。

  • 維護者:drscrewdriver
  • 版本:0.2.1(來自 package.json)
  • 許可證:MIT
  • 運行環境:Node ≥ 22.19(用到 node:sqlite;Electron 44 內置的 Node 24 亦可)

插件本身永不寫庫:清理動作只能發生在客戶端已完全退出的時間窗裏,而那個時刻宿主插件自己並不存在。所以插件半隻做只讀播報和命令指引,真正的執行體是包裏的 src/cli.js。兩者分開設計,這是理解它用法的前提。

核心功能

先說一條設計上的取捨:讀數和清理是兩條獨立的路徑。面板與命令面會先嚐試只讀打開 cookie 庫(readOnly),打開成功就給實時值——條數、請求頭佔用字節、佔用百分比、距 431 還剩多少;打不開才明說”讀不到”,不會把”沒讀到”洗成”0 條”。清理則是必須等到客戶端退出後由獨立腳本執行。

具體能力有四塊:

  1. 運行時讀數。客戶端在跑時,Windows 下可以借宿主進程自己已打開的句柄做快照讀數(僅 Windows,非 win32 直接走 busy 檔);借來的結果帶 snapshot:true,面板會單獨標註”非實時”。快照有預算限制:每個 PID 只 OpenProcess 一次,默認上限 2 萬次嘗試 / 1200ms,超了報 scan-budget。
  2. 只讀播報命令 /cookie-cleaner(status 或 clean),輸出當前統計,並給出可直接複製執行的清理命令。
  3. profile patch 體檢與修復 /cookie-cleaner patch(check / fix / revert / plan),用機器判定代替人工檢查 profile 的 cordis.patch.yml 是否寫對,並提供一鍵修復(寫前經 Config schema 校驗,失敗自動回滾)。
  4. 獨立清理 CLI,支持全刪、僅刪已過期、dry-run 三種模式,寫盤前先備份,刪除語句只由 host_key 白名單 + 名稱前綴構成。

清理時安全上做了這幾件事,值得單獨列出來:

  • 寫盤前先拷 .bak-<時間戳>,主庫副本失敗即整單放棄(全有或全無);
  • -wal / -shm / -journal sidecar 一併帶走,sidecar 拷不上只記爲跳過;
  • 拿不到 BEGIN IMMEDIATE 獨佔寫鎖就拒絕執行並給出對應檔位的處置文案;
  • 庫裏沒有 cookies 表或缺關鍵列一律拒絕,絕不對未知庫執行寫語句。

這些 cookie 不影響登錄、也不涉及賬號憑據:主窗口請求走內存態憑據不經 cookie jar,每次啓動都用 launch token 重新換髮。刪掉的只是本地歷史殘留。

安裝

作爲 DSH 插件安裝,同時把清理工具全局裝好:

# 作爲 DSH 插件(提供 /cookie-cleaner 只讀播報)
dsh --profile desktop plugin add dsh-cookie-cleaner

# 清理工具隨包分發;裝完即可用 profile 裏的別名,或全局安裝後直接敲命令
npm i -g dsh-cookie-cleaner

需要注意一點:desktop profile 由客戶端自己管理,命令行 dsh plugin add 可能被拒,報 profile "desktop" is managed exclusively by the Electron application。那種情況下在客戶端的插件管理界面裏裝即可。清理腳本本身是獨立的,全局 npm 安裝或 node <包目錄>/src/cli.js 都能跑,不依賴宿主裝載。

裝進 profile 後的別名路徑:

# Windows
%USERPROFILE%\.dsh\profiles\desktop\node_modules\.bin\dsh-cookie-cleaner.cmd
# macOS / Linux
~/.dsh/profiles/desktop/node_modules/.bin/dsh-cookie-cleaner

典型用法

清理動作的兩步順序是固定的:先確認客戶端已完全退出,再跑清理。先看通用參數:

dsh-cookie-cleaner                        查看現狀:庫在哪、多少條 dsh-auth-*、多少已過期
dsh-cookie-cleaner --clean                刪除迴環域(127.0.0.1/localhost/[::1])下全部 dsh-auth-*
dsh-cookie-cleaner --clean --expired-only 保守檔:只刪已過期的
dsh-cookie-cleaner --clean --dry-run      只看會刪幾條,不寫盤
dsh-cookie-cleaner --db=<完整路徑>         手動指定 cookie 庫
dsh-cookie-cleaner --lang=de              指定輸出語言(缺省跟隨系統 locale)

退出碼:0 成功;1 失敗(被佔用 / 無權限 / 找不到 / 參數非法)。建議先 dry-run 再實刪。

各平臺先退出客戶端的方式不同,cookie 庫默認位置也不同:

# Windows:托盤 → 退出;確認沒有殘留進程
Get-Process | Where-Object { $_.ProcessName -match 'DeepSeek|dsh' }
# 庫位置:%APPDATA%\@deepseek-ai\dsh-desktop\Network\Cookies

dsh-cookie-cleaner --clean --dry-run
dsh-cookie-cleaner --clean
# macOS:Cmd+Q;Dock 圖標消失不等於已退出
ps aux | grep -i '[D]eepSeek Harness'
# 庫位置:~/Library/Application Support/@deepseek-ai/dsh-desktop/Network/Cookies

dsh-cookie-cleaner --clean --dry-run
dsh-cookie-cleaner --clean
# Linux:關閉主窗口後確認
pgrep -af 'DeepSeek Harness|dsh-desktop'
# 庫位置:~/.config/@deepseek-ai/dsh-desktop/Network/Cookies(XDG_CONFIG_HOME 優先)

dsh-cookie-cleaner --clean --dry-run
dsh-cookie-cleaner --clean

# 只刪已過期的:
dsh-cookie-cleaner --clean --expired-only

macOS 上沒裝全局命令時,直接跑包內腳本:

node ~/.dsh/profiles/desktop/node_modules/dsh-cookie-cleaner/src/cli.js --clean

成功輸出長這樣,刪除條數、庫體積變化、備份位置都在裏面:

Deleted 3 dsh-auth-* entries (all)
  Database: ~/.config/@deepseek-ai/dsh-desktop/Network/Cookies  20480 B → 8192 B
  Backup: ~/.config/@deepseek-ai/dsh-desktop/Network/Cookies.bak-20261104-061512 (incl. -wal, -shm)
  Account credentials, sessions and plugin configuration were not touched; the local cookie is re-issued on next start.

關於堆積的根因:宿主每次啓動用隨機端口(apps/desktop-host/src/index.ts 裏 host 啓動參數是 --port 0),而認證 cookie 名是 dsh-auth- + base64url(sha256(authority)),http 下 authority 取 url.host(含端口);RFC 6265 裏 cookie 不按端口隔離,於是 127.0.0.1 下所有歷史端口的條目都會被一併發送。單條約 229 B,Node 默認 --max-http-header-size 16384,16384 / 229 ≈ 71.5,即約 70 次啓動後必然失敗。上游已有三份獨立 discussion 報告釘到同一條因果鏈(#11366、#11410、#11650)。調小 connection.cookieMaxAgeDays(縮短 cookie 壽命)是面板「修復」真正寫的那一項;固定 webserver.port 屬於啓動行爲面,只保留在命令面。

適用場景與注意

適合的人:使用 DSH 桌面客戶端的開發者,尤其是裝了 rc.2 以後版本、曾出現過 desktop welcome: Web authentication failed 的用戶;以及想從源頭減少堆積、願意改 profile 的 profile 維護者。插件側提供設置項 userDataRoot、expiredOnly、lang、guardDays、guardMode,瀏覽器卡片在設置頁頂級節「Cookie 清理器」與插件頁配置卡各一處,提供體檢 / 修復 / 回滾三個按鈕。輸出支持 9 種語言,跟隨系統 locale(LANG=C.UTF-8 / POSIX 這類中性 locale 判爲英文),認不出的語言落 zh。

幾點注意:

  • 插件以當前 dsh 進程權限運行,清理動作要求客戶端已完全退出,否則將被佔用拒絕執行(bundled 的 Windows 借句柄快照只讀能力不在此列,且僅 Windows)。
  • 社區目錄站是獨立站點,與 DeepSeek / 幻方無官方從屬關係,本插件是第三方維護的。安裝前建議檢查源碼與許可證(MIT),確認與你的環境兼容。
  • CLI 的體檢功能在離線檔只看得到文件層,運行態與 bundle 層的對比需要客戶端起來後由面板或 /cookie-cleaner patch check 來查;CLI 一律不寫 profile,寫配置只有宿主側那條帶校驗與回滾的路徑。
  • Linux 用戶注意 LANG=C.UTF-8 等中性 locale 會得到英文輸出,需要中文就顯式傳 --lang=zh。

小結

這個插件的價值不在於”多了一個清理腳本”,而在於它把一個很難自查的問題(隨機端口導致 cookie 名隨端口變化、越積越多、最終 431)做了定位、量化和安全的清理,同時不碰賬號憑據、會話和插件配置。對已經踩到 431 的用戶來說,先 dry-run 再實刪是一條成本很低的驗證路徑。

目錄頁:https://www.skillhub.cn/plugins/drscrewdriver/dsh-cookie-cleaner
GitHub:https://github.com/drscrewdriver/dsh-cookie-cleaner

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜