aeroscis/dsh-workspace-manager:DSH Web 側欄的工作區排序、清理與路徑遷移工具

前言

用 DSH 跑多項目時,側欄裏的「工作區」列表會越堆越多:剛發過消息的項目混在十幾個工作區中間,要往下翻才能找到;隔一陣子又攢出一批沒有會話的空工作區。官方側欄提供了添加、搜索和視圖選項,但工作區之間的順序既不能拖動,也不能一鍵清理;想把某個工作區的目錄從 D 盤挪到 NAS 上,會話歸屬還得手動處理,容易掉進「未分組」。

下面介紹 Aeroscis 維護的客戶端插件 aeroscis/dsh-workspace-manager。它在側欄「工作區」標題行加一個圖標入口,把順序調整、置頂、空工作區清理和路徑遷移(可連文件夾、連對話一起搬)收進同一個面板,且改動寫入 Host 的註冊表,其他窗口看到同一順序。

這是什麼

一句話定位:DSH Web 側欄的工作區管理器,npm 包名 @aeroscis/dsh-workspace-manager,維護者 Aeroscis,許可 MIT。

安裝後它做三件事:調整工作區順序(活動自動上浮、置頂、拖拽、一鍵整理),清理工作區(刪除單個工作區、批量移除空工作區),遷移路徑(把工作區指到新路徑,可以連目錄與對話一起搬)。它在 DSH 0.2.1-rc.3 上開發並驗證,engines.dsh 聲明爲 ^0.2.1-rc.3。

插件同時提供 Host 端邏輯和 Web 客戶端:Host 負責順序寫入與遷移執行,客戶端只負責側欄裏的面板與交互。

核心功能

活動自動上浮

剛發送過消息的工作區自動升到「第一個非運行工作區」之上。只認用戶發出的新消息:打開或瀏覽會話、助手回覆都不觸發上浮;正在運行的工作區仍留在上浮後的位置之上。

「活動」取自 DSH 會話列表的 updatedAt(持久化的最後一條人類提示時間),不是當前打開的會話;空白新會話和子代理會話不計入。因此刷新頁面後,最近發過消息的工作區仍會被認作活動工作區。頂部開關可關閉此行爲,開關保存在瀏覽器 localStorage。

置頂

手動把工作區固定在列表最前,置頂順序按勾選順序排列。置頂的工作區在官方側欄行顯示一枚圖釘;點這枚圖釘即可取消置頂,不必打開面板。懸停時圖釘與側欄官方按鈕並排,不遮住它們。置頂列表也存在 localStorage。

拖拽排序

每行左側有漢堡把手,按住上下拖動放到任意位置:拖動時該行跟手抬起、其餘行實時讓位,鬆手後滑入新位置;滾輪或貼邊會自動滾動,Esc 取消。把手獲得焦點後可用 ↑ / ↓ 鍵微調一行。

一鍵整理與移除

「一鍵整理」按「置頂 → 運行中 → 最近發送消息 → 其餘(按最近會話時間)」重排一次,只在點擊時執行,不隨狀態變化反覆跳動。

移除工作區帶確認,顯示該工作區的會話數,有會話在運行時額外提示。批量「清理空工作區」一次性列出沒有會話的工作區,確認後移除。

打開目錄與路徑遷移

行懸停時右側出現文件夾按鈕,在系統文件管理器中打開該工作區目錄;宿主沒有桌面環境時這個按鈕不出現。

「修改路徑」對話框填完整新路徑:

  • 勾選「把文件夾一起搬過去」時由插件執行目錄搬移(rename,跨卷自動退化爲複製+刪除);不勾選則只改登記,目錄原地不動。原目錄已不存在的工作區(文件夾被手動挪走或改名)開關自動置灰,此時等於把工作區重綁到新位置的文件夾。
  • 舊會話的安頓:cwd 已在新路徑的直接掛回(會話 id 不變,日誌零複製);其餘按官方 fork 種子機制復刻歷史遷到新路徑,對話保持連續,不會掉進「未分組」;一條都沒安頓成功時開一條空會話佔位,剩餘舊會話歸檔。
  • 遷移前會先中止該工作區活着的會話當前回合;Windows 上目錄被終端或編輯器鎖住時報「被佔用」並提示先關會話/終端再試;搬移失敗會回滾目錄,不留下半狀態。

遷移成功後顯示結果卡,寫明搬移方式、會話去向、舊會話歸檔數、排序位是否保持。

面板入口與篩選

側欄「工作區」標題和搜索圖標之間多出一個圖標按鈕,它是標題行裏的普通元素,與搜索、視圖選項、添加工作區三個按鈕在同一條佈局裏:側欄滾動、收攏、拖動改寬時一起移動,官方三個按鈕的位置不變。標題行窄到放不下第三個按鈕時按鈕自動隱藏,欄寬變大後再出現。

面板從按鈕左邊緣向下展開(會蓋住一段對話區),按鈕保持可見並顯示激活態,再點一次、點面板外或按 Esc 收起。面板默認按最長的工作區名定寬,拖右邊界可調寬,雙擊邊界恢復默認。頂部篩選框按鍵實時篩選,只匹配行上顯示的名稱,不匹配路徑;Esc 清空篩選詞。每行顯示標題、會話數、運行中的會話數。重命名不在面板裏,官方側欄行的「⋮」菜單已有。

安裝與啓用

裝進某個 profile:

dsh plugin --profile <name> add @aeroscis/dsh-workspace-manager

改插件本身時可以直接裝當前目錄,profile 以鏈接方式引用,改完刷新頁面即可:

dsh plugin --profile <name> add ./

安裝後刷新 Web 頁面加載客戶端部分。如果按鈕沒出現,先看宿主版本是否在 ^0.2.1-rc.3 範圍內,或標題行寬度是否已放下第三個按鈕。

典型用法

日常用的順序大致是:裝好、刷新頁面 → 打開面板 → 按需置頂或拖動 → 清理空工作區。

想把目錄搬到別處。先點行上的「修改路徑」,在對話框裏填完整的新路徑;要連目錄一起搬就勾選「把文件夾一起搬過去」,此時插件會中止該工作區正在跑的會話當前回合,再執行搬移並把舊會話復刻到新路徑;不想搬目錄只改登記,就不勾選。等結果卡出現,確認搬移方式和會話去向。

只想整理當前列表。直接點「一鍵整理」,它會按置頂優先、運行中次之、最近發過消息的再次之、其餘按最近會話時間重排。若某個項目剛發過消息又想保持手動位置,把頂部「活動自動上浮」開關關掉即可。

開發側跑測試與發佈自檢:

npm test        # 活動判定、自動上浮的收斂、拖動幾何、遷移核心(校驗/搬移/種子)
npm run check   # 發佈形態自檢 + 測試 + 打包預覽

實現細節(面板入口、順序寫入、自動上浮的兩趟規則、拖動幾何、測試切塊方式)在 docs/DESIGN.md,屬內部設計文檔,不影響使用。

數據與副作用

順序寫入 Host 註冊表

順序修改寫入 Host 的工作區註冊表($DSH_HOME/storages/workspace.json 的 global.workspaceIds),不是隻改當前頁面,其他窗口看到同一順序。

偏好留在瀏覽器本地

活動自動上浮開關、置頂列表存在瀏覽器 localStorage,鍵爲 dsh-workspace-manager:prefs:v1。換瀏覽器或清緩存後偏好回到默認值(活動自動上浮開啓、無置頂)。

移除工作區不刪會話

移除只刪除註冊表中的這一項:會話不會被刪除,會出現在「未分組」下。重新註冊同一路徑不會把舊會話接回新工作區,因爲會話歸屬記錄在新的工作區 id 上。移除操作沒有撤銷入口。

路徑遷移會換 id

路徑遷移會讓工作區的註冊表 id 變化(記錄以 realpath 爲鍵,官方沒有 setPath)。置頂偏好會在遷移成功後自動把舊 id 換成新 id;遷移後側邊欄出現的纔是新節點。遷移依賴宿主的 workspaceRegistry / sessionQuery / agents 等可選服務,宿主缺失時遷移面板會顯式報缺失原因,其餘功能不受影響。

適用場景與注意

適合在 DSH Web 客戶端裏同時開多個工作區、需要頻繁調整列表順序或整理空目錄的使用者;也適合想把工作區目錄遷移到別的盤或 NAS、又希望歷史對話不中斷的場景。

幾點注意:

  • 插件以當前 dsh 進程的權限運行,會讀寫工作區註冊表、執行目錄搬移並中止會話當前回合。安裝前應檢查源碼與 LICENSE(MIT),按需確認目標路徑與備份。
  • 按鈕靠 CSS Modules 生成的類名(sectionHeader、searchSlot)定位,DSH 改側欄結構後按鈕可能不再出現;engines.dsh 聲明爲 ^0.2.1-rc.3 就是這條限制的體現。
  • 只支持當前這版側欄的分組方式;「按工作區樹」分組下,順序仍按同級工作區的 Host 順序解釋。
  • 官方「視圖選項 → 最近更新」排的是每個工作區內部的會話,不排工作區本身;工作區順序始終由 Host 保存的手動順序決定,所以該選項看起來「沒生效」。
  • 生態背景:DSH 理念是「一切皆插件」,社區目錄是獨立站點,與 DeepSeek / 幻方無官方從屬關係。

結尾

這個插件的價值在於把側欄裏零散的工作區操作集中成一處:順序有規則可依,空工作區可以批量清掉,目錄搬家時對話還能跟着走。如果你在 Web 端同時維護多個工作區,值得裝一個試一下。

  • 目錄頁:https://www.skillhub.cn/plugins/Aeroscis/dsh-workspace-manager
  • GitHub:https://github.com/Aeroscis/dsh-workspace-manager
羽毛球分组比赛记分
小程序二维码

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

小夜