dsh-rtk:給 DSH 加一層 rtk 命令改寫與輸出壓縮

前言

DSH 跑久了,token 消耗的大頭常在工具結果上:git status 打幾十行、編譯輸出淹沒在進度噪音裏、grep 重複的文件名和行號反覆出現。這些內容模型大多不需要,但都占上下文,而且每次調用都要重新讀一遍。

dsh-rtk 就是針對這一層的插件。它由 wings1848 維護,包名 @wingsbutterfly/dsh-rtk,當前版本 0.1.2,MIT 許可。它做的事有兩件:在命令派發前把它改寫成語義等價的 rtk 命令;在工具輸出進入模型上下文之前跑一條壓縮管線。它是上游 pi-rtk-optimizer 移植到 DSH 插件模型上的實現。

需要先說明一點:dsh-rtk 是包在 rtk 外面的插件,不是 rtk 的替代品。PATH 上沒有 rtk,插件就靜默停擺,命令原樣執行、輸出不壓縮。因此下文安裝部分先裝 rtk,再裝插件。

工作原理

README 裏給了一段最短的示例:

模型發出:  git status
實際執行:  rtk git status
模型看到:  Branch: main
            Modified: 2 files
              src/a.ts

改寫和壓縮分兩路進行,覆蓋面不完全一樣:命令改寫覆蓋 bash、pwsh、ops_bash 三類 shell 工具;輸出壓縮覆蓋 bash、read、grep、ops_bash、ops_grep 五類工具結果。

核心功能

命令改寫

幾個實現上的關鍵選擇,來自 README:

  • 插件自身不帶改寫表,改寫時調用 rtk rewrite 詢問已安裝的二進制。支持範圍因此跟隨你裝的 rtk 版本,而不是另一個容易過期的清單。
  • 三種模式:off 全關;rewrite 直接替換命令;suggest 原樣執行、只報告本可使用的等價命令。
  • 運行時守衛:無法確認 rtk 可用時按原命令執行,缺少優化器不會擋住工作。
  • 子進程環境脫敏:*_KEY、*_PASSWORD、*_SECRET、*_TOKEN 命名的變量與 DSH_* 一律不傳給 rtk 外呼進程,PATH、locale、代理設置保留。
  • 被改寫的命令默認不注入 RTK_DB_PATH,rtk 寫它自己的用戶級庫;可用 historyDbPath 釘到指定位置,相對路徑與目錄會被拒絕。

輸出壓縮

壓縮是一條多階段管線:

階段 作用
ANSI 剝離 去掉終端顏色與格式轉義序列
構建過濾 提取編譯錯誤與警告,丟棄進度噪音
測試聚合 摺疊爲 通過/失敗/跳過 計數加失敗摘錄
Git 壓縮 歸納 git status、git diff、git log
Linter 聚合 統計問題數並按規則與文件排序
搜索分組 把 grep 風格匹配按文件歸組
read 壓縮 readCompaction: minimal 刪普通註釋;aggressive 只留 import 與簽名(默認關)
硬截斷 最後兜底的字符預算

兩條是硬約束。其一,DSH 的結果契約會存活:尾部狀態標記 [exit code: N]、[stderr]、[timed out after …]、[sandbox: …] 先被摘出,正文重寫後原樣接回並保證在最後一行,Web UI 也解析同一行畫退出狀態。其二,壓縮絕不把結果變大:某個技術若不能真正縮短文本,就保留原文且不上報收益。

另外,掛載 dsh-spill-policy 時插件會關掉自己的硬截斷。原因是插件默認 12000 字符的閾值遠低於 spill 的 50000 字節閾值,自己截斷跑在 spill 前面,那份可恢復的落盤文件就永遠沒有機會生成。是否讓位只看服務在不在,沒有開關。

配置頁與收益面板

Web 宿主的插件頁上,rtk 行會有自己的配置控制。頁面畫日常字段、本地暫存編輯、通過宿主設置服務提交,被覆蓋的字段帶逐項恢復。表單下方是收益面板:20 格效率條、原始輸出 / rtk 處理後 / 省下及佔比、命令數與平均耗時,可在按天與按命令之間切換,並按工作區與時間窗切片。數據由宿主執行 rtk gain -d -f json 取得,經帶鑑權的精確 Fetch 路由 POST /api/dsh-rtk/gain 送到瀏覽器;沒有 Web connection 的部署會明確顯示臺賬不可用,而不是渲染壞頁面。

安裝與啓用

0. 前置:先裝 rtk 二進制

PATH 上找不到 rtk 時,插件靜默停擺,整個會話只多一行 [rtk] rtk not found; rewriting is off,夾在工具輸出裏很容易漏看。所以先裝 rtk:

brew install rtk                        # macOS / Linux(Homebrew,推薦)
winget install rtk-ai.rtk               # Windows
curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh | sh
cargo install --git https://github.com/rtk-ai/rtk

不要執行不帶 --git 的 cargo install rtk,crates.io 上同名的另一個 crate 不是這個工具。

裝完驗一下,必須能打印版本號:

rtk --version

1. 安裝插件包

dsh plugin --profile web add @wingsbutterfly/dsh-rtk

插件聲明瞭 dsh.bundle,所以這條命令既安裝又掛載,插件管理器把包名追加進 dsh.profile.bundles。裝完需重啓宿主,profile 行只在啓動時掛載。

版本要求:支持 dsh 0.1.5、0.1.7、0.2.0、0.2.1(逐條實測,證據見倉庫 docs/verification.md);Node ≥ 22.18。

2. 檢查配置

所有字段可選,以下是默認值:

- id: rtk
  name: '@wingsbutterfly/dsh-rtk'
  config:
    mode: rewrite                    # off | rewrite | suggest
    compact: true                    # 是否壓縮工具輸出
    maxChars: 12000                  # 字符預算(1000–200000)
    readCompaction: none             # none | budget | minimal | aggressive
    rtkExecutable: rtk               # 名字或絕對路徑,空串表示自動探測
    historyDbPath: ''                # '' = rtk 自己的庫;或絕對/~ 路徑,或 `isolated`

rtkExecutable 會自動探測:加載時先在 PATH 裏查,Windows 上還會查 WinGet、cargo、Scoop 的常見安裝目錄,每個候選都用 --version 驗一遍。手填過的值不會被覆蓋。

也可以在 DSH 設置文檔裏實時改,改完無需重啓:dsh 0.1.7 及以上是獨立的設置條目,名字取組合行的 id;0.1.5 是 dsh-rtk 命名空間。/rtk path 會報告插件實際看到的是哪一層配置。

注意行放在哪一層的約束:放在家目錄 patch(~/.dsh/cordis.patch.yml)裏的行是隻讀的,在線寫入會被拒絕,/rtk reset 會如實報告。要保留在線編輯,請把行放進某個 profile 的組合。

典型用法

會話內的幾條命令:

  • /rtk verify:檢查 rtk 是否可用,失敗時直接打印安裝方式。
  • /rtk stats:報告本次會話裏壓縮省下多少字符,按工具和按技術分別統計。
  • /rtk gain [flags]:顯示 rtk 爲插件改寫過的那些命令實際收回了多少。
  • /rtk path:報告插件實際讀到的配置與臺賬層。

運行時驗證過的一條現象(宿主 0.2.1-rc.2,記錄見 docs/verification.md):模型發出 ls,實際執行 rtk ls;cat 實際執行 rtk read,臺賬位置跟隨 rtk 自己的庫。

適用場景與注意事項

適合在 DSH 上跑大量 shell 工具調用、又被長輸出反覆佔用上下文的開發者。命令改寫和壓縮在 host 平面行上生效,覆蓋該 profile 下的每個 agent、preset、子智能體,不是隻作用於單個會話。要收窄範圍,用行自己的開關:mode: off 全關,mode: suggest 只報告不改寫。不希望覆蓋全 profile 時,README 另給了把包裝成普通依賴、手工把行加進目標 preset 插件列表的做法,此時不要在 bundle 裏重複掛載。

安裝前應當檢查源碼與許可證。插件以當前 dsh 進程的權限運行,會讀取環境變量並派生子進程;如前所述外呼做了脫敏處理,但這意味着它能看到你在這個宿主裏執行的命令,生產環境按你對待其他第三方插件的同一標準評估。

另外,readCompaction 默認是 none。README 給出的理由:過濾或截斷 read 結果會讓模型手裏的副本與磁盤文件不一致,而編輯正是對着那份副本寫的。需要可讀性上的壓縮時,用 minimal,並接受這個前提。

小結

dsh-rtk 的作用是把 rtk 的改寫和壓縮接進 DSH 的工具調用路徑,讓長輸出在進入模型之前就短一截,並保持 DSH 的結果標記不變。它是在 rtk 之上的薄層,收益取決於 rtk 本身的能力。

目錄頁:https://www.skillhub.cn/plugins/wings1848/dsh-rtk
GitHub:https://github.com/wings1848/dsh-rtk

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

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

小夜