dsh-file-context:爲 DSH 提供不可變的文件與 diff 上下文快照

前言

在 DSH 裏讓模型讀本地源碼時,常見做法是每次對話都重新讀文件,或在提示裏粘貼片段。文件一旦被編輯,更早輪次裏模型「看過」的內容就和磁盤不一致,討論行號、對比 HEAD 的 diff 時也容易混用新舊文本。

下面介紹的 dsh-file-context(維護者 LIghtJUNction,社區分類爲「記憶」)做的是另一件事:在主機本地工作區內截取文件片段或 Git diff,生成帶 id 與 revision 的不可變快照;之後源文件改了,仍可用 file_context_get 取回當初捕獲的字節。它不替代遠程沙箱,也不提供寫文件或 Pi 文件瀏覽器,只負責「記住某一時刻的只讀上下文」。

這是什麼

  • 定位:DSH 0.2.1-rc.2 插件(npm 包名 @lightjunction/dsh-file-context,當前版本 0.1.0,MIT 許可證)。
  • 一句話:Immutable file and diff context snapshots for DSH。
  • 運行環境:Node >= 24;作者在本地用 Node 26 / TypeScript 5.9.3 開發與測試,Release CI 配置爲 Node 24。

插件以當前 DSH 進程權限訪問主機文件系統,路徑校驗有邊界,但不是對抗惡意併發進程的安全沙箱;安裝前宜自行查看 GitHub 倉庫 源碼與許可證。

核心功能

插件向 Agent 註冊三個工具(無 Pi 菜單、預覽或自動注入下一條 prompt):

  1. file_context_capture:捕獲文件片段快照。參數示例 path、startLine、endLine;省略行範圍時最多取文件前 500 行。返回不可變摘錄、id、全文件 revision、範圍與文本。若傳入 expectedRevision 且文件已變,調用會被拒絕。
  2. file_context_get:用捕獲時返回的 id 取回當時的摘錄原文,即使源文件之後已修改。快照按規範化的工作區與 Agent 身份隔離;無 Agent 的 host 調用使用獨立作用域。
  3. file_context_diff:捕獲真實的 Git 工作樹 diff 及解析後的 base commit。base 可爲 HEAD 或完整 40/64 字符 commit hash;expectedRevision 用於校驗結果 diff 的 SHA-256。

併發捕獲會各自保留不可變快照;Agent dispose 會清掉其快照;重啓 DSH 後內存中的快照全部丟失。內存中最多保留 64 個快照,無磁盤溢出或淘汰策略,觸頂時調用會明確失敗。

安裝與啓用

官方 README 說明:在 GitHub Release 發佈後,將構建好的歸檔安裝到 DSH profile。下列 URL 是 v0.1.0 資源預期位置,不代表該 Release 一定已發佈;實際安裝應使用同一 Release 附帶的歸檔與 SHA256SUMS。

dsh plugin --profile headless add https://github.com/LIghtJUNction/dsh-file-context/releases/download/v0.1.0/lightjunction-dsh-file-context-0.1.0.tgz
dsh headless --dump-config

包內含 DSH bundle patch 與編譯後的 JavaScript,不需要 Pi 依賴。安裝後需重啓 DSH。若你使用的不是 headless profile,把命令中的 profile 換成自己的即可。

默認 bundle 配置爲 {}:各工具使用調用方 Agent 的工作目錄。無 Agent 的 host 調用必須顯式配置 root。若要把工作區固定到本機某目錄,在 profile 的 cordis.patch.yml 中增加:

- id: dsh-file-context
  config:
    root: /absolute/local/project

root 必須已存在,在 DSH 主機上用 Node 文件系統 API 解析。遠程 DSH world 或 sandbox 不會重定向這些操作:僅應在主機本地項目上啓用,這不是 remote-world 適配器。

典型用法

README 給出的自然語言示例:向 DSH 說明——「Capture lines 1–30 of src/index.ts, then compare the current diff against HEAD.」模型會通過工具拿到結果;文件內容仍應視爲不可信數據,而非指令。

工具調用層面可對應爲:

file_context_capture({ path: "src/index.ts", startLine: 1, endLine: 30 })
file_context_diff({ path: "src/index.ts", base: "HEAD" })

捕獲成功後用返回的 id 調用 file_context_get({ id: "<returned id>" }) 可在文件變更後仍引用最初摘錄。

限制與行爲(選用時注意)

讀文件:拒絕路徑遍歷、絕對路徑、路徑中的 .git 段、符號鏈接文件或祖先、非常規文件、無效 UTF-8、二進制內容,以及超過 256 KiB 的文件。配置的 canonical root 本身可以解析爲 symlink。全文件 revision 對完整 UTF-8 原文(含 BOM)做哈希;摘錄會將 CRLF 歸一化。摘錄上限爲 500 行、50,000 UTF-8 字節。

Git diff:工作區目錄必須等於 Git 倉庫根,且目標文件須爲受約束的常規文本。外部 diff driver 與 textconv 被禁用,pathspec 按字面匹配;子進程帶取消、5 秒超時與有界輸出緩衝。不支持已刪除文件或未跟蹤文件的 diff。Diff 快照對 diff 文本哈希,而非工作樹文件。

其他:不提供任何寫文件。Linux/macOS 文件語義爲設計目標,Windows 未驗證。維護者倉庫中可用 npm run check 做類型檢查、行爲測試與構建(使用真實 Cordis、DSH ToolRuntime 等,無需 live 模型憑證)。

適用場景

  • 需要在多輪對話中固定某段源碼或某次 HEAD diff 的引用,避免「文件已改但上下文還在聊舊內容」時的混亂。
  • 希望用 expectedRevision 在捕獲前確認文件或 diff 未變。
  • 工作區在本機可信目錄,且 DSH 與 Git 根目錄佈局符合插件要求。

不適合:需要遠程 world 內讀文件、瀏覽 blame/歷史、自動把快照注入下一輪 prompt,或依賴未跟蹤/已刪除文件 diff 的流程。

結尾

dsh-file-context 把「某一時刻的文件摘錄與 Git diff」做成帶 revision 的可檢索快照,屬於 DSH 生態裏偏「記憶」的一類能力——插件化接入,不綁 Pi UI。社區目錄頁:https://www.skillhub.cn/plugins/LIghtJUNction/dsh-file-context(獨立社區站點,與 DeepSeek / 幻方無官方從屬關係)。源碼與安裝說明:https://github.com/LIghtJUNction/dsh-file-context。

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

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

小夜