dsh-session-bundle:一條命令把會話連同產出文件打成 ZIP

前言

在 DSH 裏做一個有產出的任務,比如改完一批文件、生成幾張圖,結束時往往要交代”這次幹了什麼、留下了什麼”。核心自帶的 /export 只能拿到原始 session.vN.jsonl 和日誌裏引用的附件,丟掉了可讀的對話,也不復制工作目錄裏被寫入、修改、通過 present 提交的文件。社區裏常見的可讀轉錄插件則反過來,只管對話,不管產出文件。

zhyunran/dsh-session-bundle 補的就是這一格:一條 /bundle 命令,把可讀對話、原始日誌、附件和本會話產出/改動的文件寫進一個 ZIP,落到宿主機磁盤。

這是什麼

維護者 zhyunran 的 DSH 客戶端插件,分類歸在客戶端。當前 GitHub 1 星,另有 22 個單元測試在倉庫裏跑通(node --test test/*.test.mjs)。README 明確標註:無需構建步驟,無運行時依賴,要求 DSH 0.2.x。

它解決的是”導出不完整”:/export 拿不到 conversation.md,也拿不到工作目錄裏 session 自己寫出來的東西;而後者恰恰是判斷一次 Agent 運行結果的依據。

導出包裏有什麼

ZIP 落盤後的目錄結構,來自 README 的 “What’s inside”:

README.txt
conversation.md        readable transcript
session.v4.jsonl       raw durable event log (JSON Lines)
manifest.json          machine-readable file index, counts, skips
files/
  attachments/         bytes of every file/image attachment
  produced/            files from present/write/edit/str_replace_editor
  external/            changed files outside the working directory
workspace/             copies of files changed in working directory

conversation.md 的結構是:頭部寫出 session id、工作目錄、創建/導出時間、模型、turns、消息與工具調用計數;每個 turn 用 ## Turn N 分開;用戶消息帶來源標註(user、agent message from <session>、schedule 等);工具調用與結果放在可摺疊塊裏, arguments 完整,輸出做截斷;附件指向 files/attachments/;present 過的文件和每個 turn 的改動文件帶指向 bundle 內部的鏈接;最後有一張完整文件清單表。

系統提示、developer 消息、請求頭、reasoning 和注入的運行時上下文默認從 conversation.md 中省略(兩項都可配置打開)。session.v4.jsonl 纔是原始事實來源。

如何判斷”本會話產出”的文件

採集器按下面順序取並集,按絕對路徑去重,來自 README “How files produced by this session are found”:

  1. 附件:user、assistant 和 tool-result 內容裏所有 file/image 塊,字節來自附件存儲。
  2. present 過的文件:deliverables/presented 事件,present 工具調用作爲兜底。
  3. 文件工具寫入:write、edit、str_replace_editor 調用,相對會話工作目錄解析。
  4. 工作區變更摘要:workspace/changes 事件加 ctx.workspaceChanges.summary(),即宿主機 git-worktree/文件工具按 turn 記錄的變更快照。這一步能覆蓋 shell 命令產出的文件。注意這些摘要只存在於宿主內存,重啓後可能丟失。
  5. 修改文件掃描:includeWorkspace: auto 且沒有摘要時觸發(always 則始終觸發),掃描工作目錄下 mtime 晚於會話開始時間的文件,跳過 .git、node_modules、緩存和虛擬環境等。

被刪除的文件只記在 manifest.json 的 skipped 列表裏(missing (deleted or moved)),內容無法從磁盤恢復,只有變更摘要裏的名稱和計數。所有內容都有大小上限並計算 SHA-256 寫進 manifest。

安裝與啓用

安裝命令來自 README 原文,npm 方式標註爲”if published”,不要憑插件名拼接 dsh plugin add github:owner/repo。

# local tarball (absolute path)
dsh plugin --profile <profile> add C:\path\to\dsh-session-bundle-0.1.2.tgz

# or GitHub tarball (git not required)
dsh plugin --profile <profile> add https://codeload.github.com/<owner>/dsh-session-bundle/tar.gz/<40-char-commit>

# or npm, if published
dsh plugin --profile <profile> add dsh-session-bundle

裝完重啓一次 DSH,然後輸入 /,bundle 應該出現在命令列表裏。倉庫 package.json 裏版本號是 0.1.2,license 是 MIT,對 @deepseek-ai/dsh-tools 的 peer 依賴區間是 >=0.2.0-rc.1 <0.3.0,engines.node 要求 >=22.19.0。

兩種用法

由人觸發:在要導出的會話裏直接輸入 /bundle,無參數。

/bundle

不帶參數時 ZIP 寫到 Windows 下的 Desktop/DSH-Exports/,其他平臺寫到 <home>/DSH-Exports/,命令結果會回顯確切路徑,不彈瀏覽器、不彈文件選擇框。

由 Agent 觸發:讓 Agent 調用 export_session_bundle 工具,例如說”把這個對話和它產出的文件導出成一個包”。

{
  "include_workspace": true,   // optional: force a modified-file scan
  "include_raw_log": true,     // optional
  "output_dir": "D:/exports"   // optional
}

三個字段都是可選的,輸出目錄和包含範圍也可通過 profile 層配置固定下來。

配置

配置寫在 <DSH_HOME>/profiles/<profile>/cordis.patch.yml,README 給出的示例:

- id: dsh-session-bundle
  config:
    outputDir: 'D:/exports'     # default: Desktop/DSH-Exports or <home>/DSH-Exports
    includeWorkspace: auto      # auto | always | never
    includeAttachments: true
    includeRawLog: true
    includeReasoning: false
    includeInjectedContext: false
    maxFileBytes: 52428800          # 50 MiB per file
    maxTotalBytes: 314572800        # 300 MiB per bundle
    maxWorkspaceFiles: 300
    maxWorkspaceBytes: 209715200    # 200 MiB for workspace copies
    maxToolChars: 4000              # per tool call/result in conversation.md
    maxMessageChars: 20000          # per message in conversation.md
    maxRawLogBytes: 52428800
    ignoreNames: ['.git', 'node_modules', '__pycache__', '.venv', 'venv', '.next', '.cache']

字段含義按 README 的表格:includeWorkspace 爲 auto 時有摘要用摘要、沒有就掃描,always 兩者都做,never 不做工作區快照(顯式產出文件仍保留);includeReasoning 和 includeInjectedContext 控制 conversation.md 裏是否帶 reasoning 塊和注入的用戶角色上下文。配置非法時會回退默認值並記一條日誌,不會阻止 DSH 啓動。

適用場景與注意事項

適合需要在任務結束後做歸檔、交接或復現的人:一份 ZIP 同時有可讀對話、機器可讀索引和產物本身,比手工複製工作目錄信息完整。也適合拿它對比會話實際改動是否與 workspace/changes 摘要一致的場景,README 稱已在 DSH 0.2.0-rc.2 上做過端到端驗證。

需要注意幾點。第一,插件以當前 DSH 進程的權限運行,能讀到工作目錄裏的文件;安裝前建議先審一遍源碼和 MIT 許可證,從 skillhub 目錄頁或 GitHub 倉庫獲取。第二,導出依賴宿主內存裏的變更摘要,進程重啓後摘要丟失,includeWorkspace 會退化爲 mtime 掃描,期間磁盤上的變化不區分來源。第三,有大小預算:單文件 50 MiB、附件加產出共 300 MiB、工作區副本 300 個文件 / 200 MiB、原始日誌 50 MiB,超限的部分只會記進 manifest.json。第四,當前星標只有 1,屬於剛起步的項目,README 中”端到端驗證”的表述也限於作者自己的環境。

小結

dsh-session-bundle 做的事其實很小:把會話對話、原始日誌、附件和本會話產出文件合併成一個 ZIP,落到宿主機磁盤。相比核心 /export 它多了可讀轉錄和工作目錄產物,相比只做轉錄的插件它多了產出文件,方向上正好補上中間那塊缺口。目錄頁在 https://www.skillhub.cn/plugins/zhyunran/dsh-session-bundle ,源碼在 https://github.com/zhyunran/dsh-session-bundle 。

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

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

小夜