dsh-pin-session:DSH 側欄置頂對話插件

DSH 側欄的渲染順序由瀏覽器本地排序表決定,且默認按活躍度排序。這意味着即使宿主端調整了會話順序,在界面上通常看不到變化。dsh-pin-session 插件通過“宿主端存事實 + 客戶端排序”的架構,允許用戶將重要對話釘在側欄分組頂部。

核心機制

插件不依賴複雜的運行時環境。宿主端只負責存儲“哪些會話被置頂”這一事實(使用原子寫 JSON 和信任柵欄內的 HTTP 接口),客戶端負責在 DOM 層完成排序。

由於側欄會話行沒有 session id 屬性,插件通過讀取 React fiber (__reactFiber$...) 往上查找 memoizedProps.node.id 來精確獲取標識;如果取不到,會退回到標題反查(僅限標題唯一的情況)。

  • 零運行時依賴:宿主端只用 node:fs/node:path,客戶端只 require("react")。
  • 壞了不影響 DSH:任何一步失敗只丟本插件自己的效果,側欄本體不受影響。

安裝與前置條件

安裝前請確保:
1. pnpm 在 PATH 上(DSH 自帶的即可)。
2. DSH 核心版本爲 0.1.5-rc.1。

# 從 GitHub 安裝
dsh plugin --profile web add github:BPTumbleweed/dsh-pin-session

# 或從 npm 安裝
dsh plugin --profile web add dsh-pin-session

安裝後,宿主端改動需重啓服務,客戶端改動需硬刷新頁面(Ctrl+Shift+R)。

配置

Profile Patch 覆蓋

可以通過 profile patch 調整存儲路徑、接口前綴、上限和熔斷閾值。

- id: dsh-pin-session
  config:
    storeRoot: /path/to/pin-data   # 默認 $DSH_HOME/dsh-pin-session
    routePrefix: /dsh-pin          # 接口與面板前綴
    maxPins: 100                   # 置頂上限
    breakerThreshold: 5            # 同一能力連續失敗幾次後熔斷
    allowUnfenced: false           # 柵欄不可用時是否放行(默認 false = fail-closed)

瀏覽器側開關

在瀏覽器 localStorage 中設置以下鍵值可免重啓地開關功能:

鍵 值 作用
dsh-pin:disable "1" 整個客戶端效果關掉(含按鈕與徽標)
dsh-pin:prefix "/dsh-pin" 改接口前綴(宿主端改了 routePrefix 時用)

使用方法

1. 命令行 (CLI)

CLI 工具直接讀寫同一份 JSON 數據,適用於沒有瀏覽器的場景(如 SSH、腳本)。

dsh-pin list                # 列出置頂會話
dsh-pin pin <sessionId>     # 置頂會話(可選傳入 title)
dsh-pin unpin <sessionId>   # 取消置頂
dsh-pin toggle <sessionId>  # 切換置頂狀態
dsh-pin move <sessionId> <top|bottom>  # 移動到頂部或底部
dsh-pin clear               # 清空置頂列表
dsh-pin path                # 查看數據文件路徑

2. HTTP 接口

接口默認走 DSH 的信任柵欄,依賴信任柵欄時默認 fail-closed。

方法 路徑 說明
GET /dsh-pin/api/list 獲取置頂集合(客戶端排序引擎的數據源)
GET /dsh-pin/api/status 自檢狀態(能力、計數、最近錯誤)
POST /dsh-pin/api/pin 置頂會話
POST /dsh-pin/api/unpin 取消置頂
POST /dsh-pin/api/toggle 切換置頂
POST /dsh-pin/api/reorder 重排序
GET /dsh-pin/panel 管理頁(純服務端渲染)

3. 界面操作

  • 會話頭部:在會話頭部出現 📌 按鈕,點擊可置頂/取消置頂。
  • 側欄會話行:鼠標懸停在側欄會話行上,行內出現 📌 按鈕,點擊可將該行移動到所在分組頂部。

注意事項

  • 只在瀏覽器裏生效:置頂是客戶端 DOM 排序,不會改變宿主端的會話順序。換個瀏覽器或清空本地狀態後,置頂集合還在(服務端),但效果需重新應用。
  • 只在同一個工作區分組內置頂:置頂行會被提到“它自己那個分組”的頂部。
  • 搜索態不干預:搜索結果的順序由查詢決定,此時插件不會動 DOM。
  • 重命名時不動 DOM:當焦點在會話行內的輸入框時,插件會跳過該輪排序(搬節點會導致輸入框失焦),焦點離開後會自動補上。
  • 標題可能缺失:通過 CLI 置頂且未傳入 title 的會話,列表中可能只顯示 sessionId。
  • 依賴 DSH 版本:需要 DSH 核心版本 0.1.5-rc.1。

許可

MIT © 2026 Kan Zheng

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

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

小夜