dsh-gbk-text:在 DSH 文件系統層修復 GBK 文本預覽

前言

在 DeepSeek Harness(DSH)裏打開中文 Windows 常見的 GBK 編碼 .txt、日誌或舊項目裏的 Markdown,側欄往往只顯示「該格式文件暫時無法預覽」。問題不在擴展名或內置渲染器,而是宿主本地文件系統在解碼階段就拒絕了非 UTF-8 字節。若你希望在側欄一次性恢復純文本、Markdown、代碼和表格預覽,又不想讓模型讀寫工具的行爲被誤改,需要在 ctx.fs 這一層做有邊界的回退解碼。下面介紹社區插件 dsh-gbk-text(維護者 kirarikaryuu,分類:客戶端)的做法。

這是什麼

dsh-gbk-text 是 DSH 宿主側小插件:當 @deepseek-ai/dsh-fs-local 用嚴格 UTF-8 解碼並拋出 FS_NOT_TEXT 時,在 readText / streamText 上按 GB18030(GBK / GB2312 的超集)回退解碼,仍拒絕明顯二進制內容。修在文件系統縫上,側欄預覽、Markdown、代碼、CSV/TSV 等所有通過 ctx.fs 讀文本的路徑會一起恢復;不寫文件,也不改 app.asar。許可證 MIT;GitHub 倉庫 kirarikaryuu/dsh-gbk-text,目錄頁 skillhub.cn 爲社區收錄,與 DeepSeek / 幻方無官方從屬關係。

問題出在哪

DSH 合成文件系統「只認 UTF-8」:TextDecoder("utf-8", { fatal: true }) 遇到非法字節即拋 FS_NOT_TEXT。側欄文檔預覽走 workspaceFiles.read → fs.streamText,渲染尚未開始字節已被拒,界面只剩籠統的「該格式文件暫時無法預覽」。這與 .md / 源碼擴展名無關,純文本、Markdown、代碼表現一致。

核心功能

  1. 先 UTF-8,再 GB18030:先走原實現;僅當錯誤碼爲 FS_NOT_TEXT 時讀字節並按配置編碼解碼。UTF-8(含 BOM)與帶 BOM 的 UTF-16 行爲不變。
  2. 仍判二進制:解碼結果含 NUL 或控制字符過密時保持拒絕,壓縮包、圖片、可執行文件與原生一致。
  3. 一次註冊、多消費者:文件樹、側欄預覽及依賴 ctx.fs 的插件共用同一修復,無需按擴展名搶內置渲染器。
  4. 默認只啓用 GB18030:避免自動試 Big5 / Shift-JIS 把文件顯示成「像中文」的亂碼;需要時可顯式擴展 encodings。
  5. 與 dsh-fs-encoding 互補:後者管模型面向的 read / write / edit,本插件只管預覽用的 ctx.fs 讀取縫,同裝無衝突。

回退讀取上限 8 MiB;更大文件維持原生 UTF-8 拒絕。插件零運行時依賴,不發起網絡請求、不裝子進程依賴,不遮蔽模型工具。

安裝與啓用

桌面端可用自帶 CLI 對 desktop profile 安裝(路徑換成本機 DSH 安裝目錄與插件目錄絕對路徑):

& '<DSH 安裝目錄>\resources\runtime\cli\bin\dsh.cmd' plugin --profile desktop add 'C:/path/to/dsh-gbk-text'

確認 bundle 已登記:

(Get-Content "$env:USERPROFILE\.dsh\profiles\desktop\package.json" -Raw | ConvertFrom-Json).dsh.profile.bundles

界面方式:側欄 Plugins → 安裝第三方插件 → 粘貼本插件目錄的絕對路徑。README 說明新裝 bundle 可走 HMR 熱生效,改代碼後才需重啓。

插件以當前 DSH 進程權限運行;安裝前請自行查看倉庫源碼與 MIT 許可證。

配置

在 profile 的插件配置中可調整回退編碼清單(示例結構來自 README):

- id: dsh-gbk-text
  name: dsh-gbk-text
  config:
    encodings: [gb18030, big5, shift_jis]
    # excludeEncodings: [gb18030]
鍵 默認 作用
encodings [gb18030] 替換回退清單,順序即優先級
excludeEncodings [] 從默認清單去掉項;顯式設置 encodings 時本鍵被忽略

不認識的編碼名會被忽略;用 excludeEncodings: [gb18030] 可臨時關掉回退,或從 Plugins 頁卸載。

典型用法與預期效果

安裝後無需改前端:打開 GBK 的 .txt,側欄應能顯示正文(README 示例:第一行可見「這是一個 GBK 編碼的文本文件。」),而不再是「該格式文件暫時無法預覽」。寫回仍走原生字節路徑,GBK 文件不會被靜默轉成 UTF-8。

若仍無法預覽,按 README 排查:文件是否超過 8 MiB、是否非 GB18030(可試調整 encodings)、bundle 是否在 dsh.profile.bundles 中、裝完後是否需重啓。

適用場景與注意

  • 適合:在 Windows + DSH 上日常查看 GBK/GB18030 日誌、配置、舊文檔;希望在側欄用內置 Markdown / 代碼 / 表格渲染器,而不是退化成單獨預覽插件搶擴展名。
  • 不適合當作:寫入編碼轉換或「檢測編碼並展示在 UI」——本插件不修寫入,也不在標題欄顯示猜到的編碼。
  • 兼容性:README 在 Windows + DSH 0.2.1-rc.5(desktop profile)端到端驗證;CI 使用 Node 20。依賴宿主 TextDecoder 的 legacy 編碼支持;精簡 ICU 的運行時會跳過不支持的編碼而不會崩潰。
  • 已知取捨:短文件在多種舊編碼下字節都合法時可能猜錯;默認 GB18030 優先面向中文 Windows;Big5 / Shift-JIS 需顯式配置。

倉庫提供無依賴單測:node test/verify.mjs(19 項檢查)。

結尾

dsh-gbk-text 把 GB18030 回退放在 DSH 文件系統讀取縫,用最小侵入恢復 GBK 文本在側欄的預覽能力,且承諾只讀、不寫。進一步瞭解實現與 FAQ 見 GitHub:https://github.com/kirarikaryuu/dsh-gbk-text;社區目錄:https://www.skillhub.cn/plugins/kirarikaryuu/dsh-gbk-text。

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

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

小夜