前言¶
DeepSeek Harness(DSH)Web 客戶端的會話行菜單裏,內置動作通常是重命名、分叉會話、歸檔會話。歸檔只會把會話從列表裏藏起來,日誌和投影緩存仍留在磁盤上;若你確實想從 Harness 裏移除某條會話、又希望數據還能從系統廢紙簍取回,就需要額外的客戶端能力。下面介紹社區插件 dsh-session-delete(npm 包名 @jerrrrrywang/dsh-session-delete),維護者爲 jerrywang21-debug,分類爲客戶端插件。
這是什麼¶
該插件在 DSH Web 界面的會話列表上註冊獨立的刪除入口:會話行 ⋯ 菜單中增加「刪除會話」,行尾懸停區增加垃圾桶按鈕。確認後,會話從 Harness 列表消失,會話日誌與投影緩存被移動到系統廢紙簍(macOS 默認爲 ~/.Trash),而不是在磁盤上做不可逆抹除。DSH 生態強調「一切皆插件」;插件目錄頁託管於 SkillHub 社區站點,與 DeepSeek / 幻方無官方從屬關係。
界面與交互¶
- 菜單項:「刪除會話」位於「歸檔會話」下方(
order: 500),紅色高亮。 - 懸停按鈕:垃圾桶圖標(
order: 300,在歸檔、釘住之後),帶 tooltip。 - 二次確認:危險操作確認框,須勾選確認項後才能點「永久刪除」;框內展示該會話在磁盤上的佔用大小。
- 刪除成功:說明框給出廢紙簍中的路徑,便於手動取回。
- 拒絕刪除:說明框展示宿主返回的原因(例如會話正在運行一個回合)。
- 若刪除的是當前打開的會話,主區域會先釋放選擇,避免繼續展示已不存在的會話。
刪除時實際改動的數據¶
插件按 DSH 存儲佈局逐會話處理:
| 目標 | 處理方式 |
|---|---|
<DSH_HOME>/sessions/<工程目錄鍵>/<會話 ID>/ 下的 session.v<N>.jsonl.zstd 及同目錄產物 |
移動到廢紙簍 |
<DSH_HOME>/storages/session_projcache/sessions/<會話 ID>.json |
移動到廢紙簍 |
<DSH_HOME>/storages/workspace.json 中的 pinnedSessionIds[]、archivedSessionIds[]、各 workspaces[*].sessionIds[] |
就地摘除(索引,非會話本體) |
<DSH_HOME>/attachments/v1/objects/ 內容尋址附件 |
不刪除(多會話可能共享) |
工程目錄鍵(projectKey)爲有損編碼,無法由會話 ID 反推;插件通過掃描 sessions/ 下各工程桶定位目錄。同卷移動使用 rename;跨卷(EXDEV)時先複製、確認後再刪原目錄。廢紙簍內文件名帶 YYYYMMDD-HHMMSS 時間戳,避免重複刪除互相覆蓋。
與內置能力的關係¶
內置歸檔保留數據且僅隱藏列表項;本插件的「刪除」是從 Harness 移除會話並將相關文件移入廢紙簍。插件爲獨立包:僅通過官方槽位 sidebar.workspaces.session.menu.item、sidebar.workspaces.session.row.action、shell.overlay 用 ctx.slots.inject() 註冊;HTTP 路由爲 /api2/session-delete-trash/{inspect,delete};id 均帶 session-delete-trash.* 前綴,不復用 pin / rename / fork / archive。宿主側僅依賴 node: 內建模塊,瀏覽器側使用 Module Loader 提供的 react 與官方 primitives,無需額外構建步驟。
安全與運行中會話¶
自建 JSON 接口有三重限制:僅接受 POST;僅接受 Content-Type: application/json;僅接受迴環 Host(可通過環境變量 DSH_SESSION_DELETE_TRUSTED_HOSTS 追加受信主機名,逗號分隔)。請求體上限 64 KiB;會話 ID 須匹配 ^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$,並做路徑轉義與「結果仍在 sessions 根目錄下」複覈。當 agents.get(id).status === 'running' 時拒絕刪除;已打開但未在運行的會話可以刪除。
安裝與啓用¶
一鍵安裝(推薦):在 DSH Web 插件市場搜索 dsh-session-delete,或在終端執行:
dsh plugin --profile <profile> add @jerrrrrywang/dsh-session-delete
本包爲 DSH bundle(package.json 中 dsh.bundle.patch 指向包內 cordis.patch.yml)。bundle 與手寫 cordis.patch.yml insert 二選一,勿同時使用,否則宿主側可能因路由重複註冊報錯。
A. 作爲 bundle 安裝(推薦):在 profile 的 package.json 中加入依賴並在 dsh.profile.bundles 中列出包名,例如:
{
"dependencies": {
"@jerrrrrywang/dsh-session-delete": "link:/Users/jerry/Desktop/DeepSeek工作區/dsh-session-delete"
},
"dsh": {
"profile": {
"bundles": ["...", "@jerrrrrywang/dsh-session-delete"]
}
}
}
然後執行 pnpm install(或經插件市場安裝/更新時會一併處理鏈接)。
B. 手寫 insert:在 profile 的 cordis.patch.yml 增加:
- insert:
- id: session-delete
name: '@jerrrrrywang/dsh-session-delete'
dsh.client.platform 已聲明爲 web。兩半在應用啓動時裝載;當前 DSH Desktop 構建無可用 HMR,安裝後需重啓 DSH,僅刷新頁面不夠。
版本與引擎(來自 package.json):包版本 0.1.0,Node >=22,DSH >=0.2.0-rc.2,許可證 MIT。
配置¶
| 環境變量 | 默認 | 作用 |
|---|---|---|
DSH_SESSION_DELETE_TRASH |
macOS ~/.Trash;其他平臺 <DSH_HOME>/trash |
自定義廢紙簍目錄 |
DSH_SESSION_DELETE_TRUSTED_HOSTS |
空 | 追加受信主機名(逗號分隔),用於非迴環部署 |
典型用法¶
- 安裝並重啓 DSH 後,在側邊欄找到目標會話。
- 點擊行尾
⋯選擇「刪除會話」,或懸停後點垃圾桶圖標。 - 在確認框中勾選確認項,查看展示的磁盤佔用,再點「永久刪除」。
- 根據完成提示中的廢紙簍路徑,需要時用系統文件管理器從廢紙簍恢復(macOS Finder 是否支持「放回原處」取決於 Finder 自身元數據,插件不寫該元數據)。
適用場景與注意¶
適合需要在 Web 界面清理會話、又希望日誌與投影緩存仍可從廢紙簍找回的 DSH 用戶。插件以當前 DSH 進程權限讀寫 <DSH_HOME> 與廢紙簍路徑,安裝前應自行查看 GitHub 源碼 與 MIT 許可證。
已知限制(README 原文):
- 正在運行的會話不能刪。
- 已裝載的空閒會話刪除後,進程內可能仍保留對象副本;磁盤與列表已清理,重啓 DSH 後徹底釋放。
- 工作區 registry 不可用時,對
workspace.json的修改可能被回滾,殘留爲指向不存在會話的 ID,分組視圖不會渲染它。 - 僅對 Web 界面生效;無頭 profile 下宿主半邊爲空操作。
上游測試命令爲 node --test(零依賴 node:test,覆蓋存儲、宿主路由與客戶端槽位流程)。
結尾¶
dsh-session-delete 用官方槽位與獨立 API 爲 DSH Web 補上「刪除會話」,把會話日誌與投影緩存移入可恢復的廢紙簍,並避開共享附件與運行中會話。目錄頁:https://www.skillhub.cn/plugins/jerrywang21-debug/dsh-session-delete;源碼與說明:https://github.com/jerrywang21-debug/dsh-session-delete。