ruiyuxuanyan/dsh-transcript-export:把一條回覆整理成能拿給人看的文檔

前言

和 Harness 調試一段時間,結論通常落在最後那條回覆裏——但支撐結論的命令、報錯、翻過的文件,散落在幾十個摺疊塊中間。直接 Ctrl+A 複製解決不了問題,運行時腳手架、審批提示、工具 JSON 會一起搬走;官方的 dsh-session-log-export 導出的是原始 zip 日誌,要變成能讀的文檔還得再挖一遍。

下面介紹的插件 ruiyuxuanyan/dsh-transcript-export 就是處理這件事的:維護者是 ruiyuxuanyan,屬於客戶端分類插件。它在每條助手回覆的操作欄里加一個下載按鈕,你挑格式、劃範圍,它把這段對話整理成乾淨的 Markdown、單文件 HTML 或 JSON。全程只讀會話日誌,不改動它。

它替你收拾的活

  1. 腳手架消息——運行時上下文、技能目錄、時間採樣、模型切換、審批提示——在渲染前就被濾掉,不是導出後再用正則擦。
  2. 工具調用收進一個可摺疊附錄,參數和輸出各自成塊;過長的輸出會截斷,並寫明截了多少字符。
  3. 正文按 Markdown 渲染出真正的結構(標題、表格、列表、引用、代碼塊、行內樣式),但先轉義後套結構,對話裏出現的標記只當文字顯示。
  4. 思考過程默認不導出,需要時勾選。
  5. 可以只導”正在看的這條回覆往前 N 輪”(滑桿 1…總輪數),不必搬整段對話。
  6. 密鑰默認脫敏,命中換成 [REDACTED]。

三種導出格式

格式 適合
Markdown 粘進筆記、Wiki、倉庫文檔,diff 友好
HTML 直接發給人看。單文件自包含:樣式、目錄、代碼高亮、可摺疊工具塊都在裏面,離線可開,打印時過程自動收起
JSON 交給腳本繼續處理,帶 schemaVersion、generator 和選項快照

內容開關管工具調用、工具結果、思考過程、時間戳。脫敏認得 OpenAI、Anthropic、GitHub、GitLab、AWS、Slack、Google、Stripe 的 key,也認 JWT、Bearer/Basic、Cookie、password= / api_key= 賦值、帶賬號密碼的 DSN 和 PEM 私鑰。

導出全程不聯網:Host 那一半在本機渲染、寫盤,瀏覽器那一半隻通過同源 POST /dsh-transcript-export/* 取內容,然後 Blob 下載或存進導出庫。導出庫在 $DSH_HOME/exports(默認 ~/.dsh/exports),按時間排列,可篩、可當場打開、可刪。

安裝

三條路,按情況挑一條:

# 從本地目錄裝 —— 改代碼的時候最順手
dsh plugin --profile <profile> add /absolute/path/to/dsh-transcript-export

# 從 npm 裝(發佈之後)
dsh plugin --profile <profile> add dsh-transcript-export

# 直接從 GitHub 裝 —— 釘到某個提交,npm 上還沒有時用
dsh plugin --profile <profile> add 'git+https://github.com/ruiyuxuanyan/dsh-transcript-export.git#<sha>'

圖形界面的插件管理器也行,裝法一樣(install_bundle + 上面的 spec)。裝完刷新頁面,助手回覆下面那排圖標會多一個下載按鈕,挨着複製和分支。

想讓它出現在插件市場裏:倉庫自帶 format 1 索引(market/index.json,用 npm run index 生成)。在 設置 → 插件 → 發現 → 索引源 裏把發佈後的 URL 加進去即可被搜到、被安裝。默認市場列表來自精選列表 awesome-dsh-plugin,去那邊提個 PR 加一行,站點和 dsh-market 會自動收錄,通常一天內生效。

典型用法

  1. 鼠標移到任意一條助手回覆上,點那排圖標裏的下載按鈕。
  2. 彈窗裏挑格式,拖回溯輪數,決定要不要工具輸出、思考過程、時間戳,要不要脫敏。
  3. 點導出就下載;勾了”同時留一份”,還會往 $DSH_HOME/exports 存一份。存盤不會覆蓋舊的——同名再導一次會變成 -2、-3。
  4. 想看之前導出的,點會話標題欄的導出庫(文件夾圖標)。

也可以在對話裏直接說:

把這個會話導出成 Markdown,只要最近 3 輪,不要工具結果

它會調 export_session,把文件寫進 $DSH_HOME/exports,然後把路徑告訴你。

配置

在 profile 的 cordis.patch.yml 裏覆蓋。config 是整塊替換,要用到的鍵一次寫全:

- id: session-share
  config:
    exportDir: D:/notes/dsh-exports   # 默認 $DSH_HOME/exports
    exposeTool: true                  # 是否註冊 export_session 工具
    redactByDefault: true             # 脫敏默認值
    language: zh                      # 導出文檔裏的固定標題(zh | en)
    theme: auto                       # HTML 主題 auto | light | dark

實現與安全

插件分兩半:lib/index.js 在 Host 側讀 sessionQuery.readSession(sessionId) 的會話事件,整理成文檔,並在 webServer 上掛 /dsh-transcript-export 前綴路由,可選註冊 export_session 工具;lib/client.js 提供兩個 Slot 入口(導出彈窗和導出庫),用 React 寫。渲染邏輯集中在 lib/core.js,無依賴、同步、無副作用,Host 進程、瀏覽器和 node --test 跑的是同一份。

安全上做了幾件事:

  • 路由只認同源 + 迴環的 POST,Host 頭必須是 127.0.0.1 / localhost / [::1],帶 Origin 時必須與 Host 一致,其它來源一律 403。
  • 導出庫的 read / delete 只接受導出目錄裏面的路徑,../ 之類的直接拒絕。
  • HTML 先轉義後套結構,鏈接只認 http(s)://。

適用場景與注意

適合想把一段對話留下來、發給別人或存進筆記的 DSH 使用者。插件以當前 dsh 進程的權限運行,能讀會話日誌、能寫導出目錄,安裝前應先檢查源碼與許可證(MIT,Node 要求 >=20)。

它現在還做不到:

  • 只導出文本層,上傳的圖片以路徑列出,不會內嵌進 HTML(內嵌會讓單文件變成幾 MB 的 base64)。
  • 整段導出長對話體積不小,幾百 KB 的 Markdown 屬正常;只是分享的話,選”最近 N 輪”更合適。
  • 會話從沒在 Host 上加載過時會回落到磁盤日誌;兩邊都讀不到會明確報錯,不給半截空文檔。

小結

這個插件的價值在於把”複製粘貼一段對話”變成”一次點擊導出一份結構完整、脫敏、自包含的文檔”。目錄頁在 https://www.skillhub.cn/plugins/ruiyuxuanyan/dsh-transcript-export ,源碼在 https://github.com/ruiyuxuanyan/dsh-transcript-export 。

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

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

小夜