dsh-download-dashboard:跨會話的大文件下載懸浮看板

前言

在 DSH 裏跑大文件下載時,進度往往分散在不同地方:主會話裏一條命令、子代理另起一條、你自己在終端裏用腳本拉取。生態裏已有 dsh-download-progress、dsh-smart-dl、dsh-task-progress、dsh-job-progress 等插件,多數只覆蓋「本會話」或「當前工作區」,README 裏也會寫明這類範圍限制。主會話右側看不到子代理或外部終端裏的同一次下載,排查「到底下完沒有」就要來回切會話或查磁盤。

下面介紹維護者 LemRic1117 的 dsh-download-dashboard(GitHub:LemRic1117/dsh-download-dashboard)。它在對話區右側掛一塊浮窗,只展示 300MB 及以上 的下載,進度、速度、剩餘時間實時更新;數據來源是系統臨時目錄下的狀態快照,因此 不區分是誰發起的下載——主會話、子代理、本機終端裏只要有人按約定寫入狀態,都會出現在同一塊看板上。

這是什麼

dsh-download-dashboard 是 DSH 的本地插件包(private: true,未發佈到 npm),當前版本 1.0.1,許可證 MIT,要求 Node >=20。社區目錄 SkillHub 將其歸類爲「記憶」;功能上它解決的是 大文件下載進度的集中、跨上下文可見,而不是會話記憶存儲。

插件分 host 與 client 兩半:index.js 註冊只讀路由彙總狀態目錄;client.js 掛在框架的 shell.overlay 上繪製浮窗。前提是你使用的下載器會把機器可讀快照寫到約定路徑——倉庫自帶的 tools/dl.ps1 即其一;舊版不寫狀態的 dl.ps1 會導致「裝了但浮窗一直爲空」,這是 README 裏最常見的無反應原因。

界面與行爲

浮窗停在對話區 右側:不佔聊天寬度、不搶焦點、不擋輸入框。每一行對應一個下載項,包含文件名(懸停顯示完整保存路徑)、百分比與進度條、已下載/總量、速度、剩餘時間。

狀態用顏色區分:藍爲進行中,綠爲已完成,紅爲失敗(並顯示失敗原因)。若下載被 Ctrl+C、進程被殺或斷電等打斷,快照可能長期停在 running;規則是 90 秒無進度更新 則標爲「已中斷」(黃色),保留中斷時的字節數,再過 5 分鐘從面板消失;若只是短暫卡住又繼續,會自動回到進行中。

沒有符合閾值(默認 300MB)的下載時,整個浮窗不渲染,不佔位、不攔截鼠標。完成或失敗後條目保留 5 分鐘 再消失。窗口縮放時位置由 CSS 處理;右側欄打開時浮窗會自動向左讓位。

數據從哪來:狀態目錄與契約

配套下載器每次刷新進度,向系統臨時目錄寫入 JSON 快照:

%TEMP%\dsh-downloads\state\<id>.json           (Windows)
$TMPDIR/dsh-downloads/state/<id>.json          (macOS / Linux)

host 側路由 GET /dsh-downloads/state 彙總該目錄,跳過解析失敗與超過 24 小時的記錄。client 側在有下載進行時約 1.5 秒 拉取一次,空閒時 6 秒,頁面隱藏時暫停輪詢。

狀態文件主要字段如下(路由對外只返回白名單字段,不暴露 URL、會話 id、命令行等):

字段 說明
id 唯一標識
name 浮窗顯示的文件名
out 完整保存路徑(懸停提示)
totalBytes 總字節;無 Content-Length 時爲 null
doneBytes 已下載字節
speedBps 字節/秒
etaSec 剩餘秒數
status starting / running / retrying / done / failed
error 失敗原因
startedAt / updatedAt ISO 8601;updatedAt 影響何時從面板消失

安裝與啓用

本包未發佈到 npm,需先取得倉庫目錄,再在 DSH 桌面端或 Web 端側欄 Plugins 頁粘貼該目錄的 絕對路徑(例如 D:\plugins\dsh-download-dashboard),裝完後 刷新頁面(Ctrl+R)。

資料中的獲取方式:

git clone https://github.com/LemRic1117/dsh-download-dashboard

將 tools/dl.ps1 放到 ~/.dsh/tools/dl.ps1 或任意順手位置,大文件下載時用該腳本(PowerShell 5.1+,支持換行式進度、斷點續傳、重試,結束時校驗落盤字節與 Content-Length):

powershell -NoProfile -ExecutionPolicy Bypass -File tools\dl.ps1 -Url <url> -Out <path> -Resume

插件以當前 DSH 進程權限運行;安裝前建議通讀倉庫源碼並確認 MIT 許可證與上述只讀路由的安全模型是否符合你的環境。

可調參數

默認值在 client.js 頂部,改完後重新安裝或等待 HMR:

常量 默認 含義
MIN_BYTES 300 MB 顯示閾值
LINGER_MS 5 分鐘 完成/失敗後保留時長
ACTIVE_STALE_MS 90 秒 無更新則視爲已中斷
POLL_ACTIVE_MS 1500 ms 有下載時的輪詢間隔
POLL_IDLE_MS 6000 ms 空閒輪詢間隔
GAP_PX 12 與右邊緣、右側欄間距

若希望進度僅限單會話,可將 index.js 頂部的 STATE_DIR 改爲每會話目錄(README 說明爲一行改動)。

安全模型(簡要)

路由 只讀,無 POST/PUT/DELETE,也不能代爲下載或取消。訪問需通過迴環地址、Host/Origin 與 Sec-Fetch-Site 等柵欄;對外響應字段白名單,不返回可能帶簽名的下載 URL。狀態目錄位於當前用戶的系統臨時目錄,ACL 限本用戶;「跨會話可見」指的是 同一用戶、同一臺機器上誰往約定目錄寫誰就被展示,並非讀取其他會話私有數據。若 DSH Web 服務綁定到 0.0.0.0,應理解 README 中對 Host 僞造與真正邊界(socket 迴環)的說明。

適用場景與注意

適合:經常在 DSH 主會話、子代理和本機終端混用下載器拉 300MB 以上 文件,且希望在同一塊右側浮窗裏看全局進度,而不想依賴「只盯當前會話」的進度插件。

注意:

  1. 必須有用會寫狀態 JSON 的下載器;僅安裝插件、仍用舊腳本或不寫狀態的命令,看板會空。
  2. 小文件默認不顯示;要改閾值請改 MIN_BYTES。
  3. 卸載時在 Plugins 頁關閉或移除 bundle 即可,路由與浮層隨生命週期消失。
  4. README 標明部分 UI 層級(如 dockkit 浮動面板、皮膚中心)尚未在真機全部驗證。

與同生態插件的差異(據 README「相關項目」):dsh-download-progress 追蹤 shell 與工作區文件、閾值約 64KB 且偏本會話;dsh-smart-dl 狀態寫在會話 cwd 下;dsh-task-progress 刻意不做跨會話讀取。本插件用全局臨時目錄狀態,補的是 跨會話、跨子代理、跨終端 這一維。

結尾

dsh-download-dashboard 把「大文件下載進度」從分散的會話與工作區,收斂到對話區右側一塊只讀浮窗:約定目錄、白名單字段、配套 dl.ps1,主會話與子代理、終端裏的下載只要寫入同一套狀態,就能一起看見。

SkillHub 爲社區插件目錄站點,與 DeepSeek / 幻方無官方從屬關係;DSH 本身遵循「一切皆插件」,具體能力以你本地安裝的 bundle 與下載器爲準。

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

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

小夜