dsh-code-explainer:把 Agent 執行的代碼翻譯成行尾中文說明

前言

在 DeepSeek Harness(DSH)裏看 agent 跑工具時,工具卡里往往是一整段命令、腳本或 API 調用。懂開發的人能順着讀,不熟悉編程的人只能猜「它在改什麼」。會話裏若再疊一層說明面板,又會和代碼塊搶版面、重複解釋同一件事。

下面介紹的 dsh-code-explainer 走另一條路:在工具卡的輸入代碼和輸出區上,用行尾註釋把「這行在做什麼」和必要的「爲什麼這麼寫」寫進同一句中文,不單獨佔一塊教學區域。複製代碼時拿到的仍是原始文本,註釋不參與 DOM 正文。

這是什麼

dsh-code-explainer 是 DSH 的客戶端插件,維護者爲 xiaoluoli45。它針對 agent 實際執行的代碼、命令和工具輸出做逐行(或按輸出類型分級)的中文解釋,面向「不想先學語法也想跟上 agent 在幹什麼」的讀者。

插件分兩半:瀏覽器端(client.js)負責在會話 DOM 裏掛註釋、處理輸出區版式;宿主端(index.js)用本地規則先給說明,規則覆蓋不了的行再通過可配置的 LLM 補一句。說明通過 POST /line-notes 等本地 HTTP 接口下發,前綴爲 /dsh-code-explainer/api,僅接受迴環地址。

當前倉庫版本爲 0.4.1(見 package.json),許可證 MIT。

核心功能

輸入代碼塊:灰色行尾 // 註釋

工具卡里的輸入代碼按行解析(依賴 DSH 代碼塊 DOM:pre > code > span.line)。每一行末尾用 CSS 僞元素掛上中文說明,樣式比代碼略淡,與語法高亮並存。

  • 空行、純括號行、純註釋行不強行加說明。
  • 同一種寫法在同一代碼塊內只在第一次出現時完整解釋,後續可標「(同上)」。
  • 術語首次出現可帶簡短中文對照(例如 await(等待異步完成))。
  • 代碼塊標題欄有 「註釋:開 / 註釋:關」 總開關,狀態記在瀏覽器 localStorage;關掉後恢復純代碼視圖。

註釋寫在僞元素裏,不會進入 textContent,因此複製按鈕和手動選中都不會帶上說明。

輸出區:按類型區分

輸出類型 處理方式
代碼(源碼、腳本片段、diff) 逐行行尾說明,前綴用藍色 →,與輸入區的灰色 // 區分
普通文本(目錄清單、日誌、純數據) 塊首加一句總述(「這段輸出是……」),僅對關鍵行(報錯、退出碼、找不到文件等)加說明,不逐行硬湊

輸出若爲代碼,會先去掉類似 1: 的行號再按行說明。總述節點插在宿主 ioSection 外側,避免破壞其兩列 grid 佈局(插件內用 test/output-card.mjs 迴歸這一條)。

解釋覆蓋面

本地規則覆蓋命令行、常見工具調用(如 tools.ops_bash)、參數行、賦值與 await、console.log、import / require、fs、path、process.env 等。規則表列不出的複雜行,在 llm 爲 auto 時由模型按行號補一句;llm: off 則只用規則,不調模型。

工具卡仍在 data-state="running" 時,前端只展示規則結果,狀態結束後再異步請求模型補充,避免半截代碼反覆觸發 LLM。

隱私、成本與降級

展示、落盤和發給模型前,會對 sk-...、ghp_...、Bearer ... 等憑據樣式做掩碼。模型請求按代碼內容哈希緩存,同一段代碼不重複調用。模型不可用、超時或 JSON 解析失敗時,頁面保留規則說明,不阻塞工具執行,也不改寫用戶當前會話的模型選擇。輔助調用不向會話日誌追加事件。

安裝與啓用

環境要求:DSH >= 0.2.0,Node >= 20。

在本地已有倉庫目錄的前提下,用 link 方式裝進 desktop profile(路徑換成你機器上的絕對路徑):

dsh plugin --profile desktop add "link:<本倉庫目錄的絕對路徑>"

安裝後刷新 DSH 頁面(Ctrl+R)或重啓宿主。package.json 聲明瞭 dsh.bundle.patch,宿主會把 cordis.patch.yml 掛到 profile 層,一般不需要改 DSH 安裝目錄本身。

卸載:

dsh plugin --profile desktop remove dsh-code-explainer

配置(cordis.patch.yml)

安裝時也可由 profile 傳入等價片段:

- insert:
    - id: dsh-code-explainer
      name: './index.js'
      config:
        llm: auto
        # provider: deepseek-official
        # model: deepseek-chat

常用配置項:

鍵 默認 含義
enabled true 插件總開關;false 時完全不工作
llm auto 規則不足時是否請模型補;off 僅本地規則
provider / model 空 顯式指定補充用模型;留空則儘量複用當前會話最近一次請求的模型路由
maxInputChars 8000 發給模型的輸入上限
maxOutputTokens 900 模型輸出 token 上限
timeoutMs 25000 單次模型調用超時
concurrency 2 模型補充併發上限

頁面上的「註釋:開/關」管展示;enabled 管插件是否啓動,兩者不是同一層開關。

典型用法與界面行爲

安裝並啓用後,在 DSH 會話裏讓 agent 執行帶代碼的工具卡即可,無需額外命令。插件通過 MutationObserver 跟蹤會話 DOM,React 重渲染後會補回行尾屬性,並每 3 秒兜底掃描一次。

README 中的效果示意:輸入區類似下面結構時,每行行尾會出現中文說明(此處僅作格式參考,實際註釋由插件生成):

const r = await tools.ops_bash({
  command: "Get-ChildItem -LiteralPath 'D:\\project'",
  description: "List directory contents",
  timeoutMs: 60000
});
console.log(JSON.stringify(r, null, 2));

維護者在 DSH 0.2.1-rc.5 上對 run_code 等路徑做過實測(插件 0.4.0 時段),驗證了動態 import("node:fs") 的解釋、try/catch 表述、長註釋換行不擠代碼、複製不含註釋等行爲。離線冒煙測試見倉庫 node test/smoke.mjs、node test/output-card.mjs。

需要只看規則、零模型成本時,把配置裏的 llm 設爲 off。需要排查插件狀態時,可調用本地 API,例如 GET /dsh-code-explainer/api/health、GET /state。

適用場景與注意

適合誰

  • 需要向非技術同事演示或共讀 DSH 會話、又不願在代碼外再維護一套說明的人。
  • 自己讀 agent 日誌時,希望命令行和常見 Node/API 寫法有即時中文對照的開發者。

邊界與依賴(摘自倉庫「已知邊界」)

  • 只處理會話裏工具卡內的代碼塊,不處理 Markdown 正文裏的圍欄代碼。
  • 依賴宿主代碼塊 DOM 契約;DSH 前端大改時需同步改選擇器。
  • 複雜嵌套表達式、鏈式調用、模板字符串等可能只得到一句通用說明或未識別標記。
  • 「註釋:開/關」存在瀏覽器本地,不隨賬號同步。

權限與安全

插件隨當前 DSH 進程運行,宿主端可調用你配置的 LLM 路由處理規則未覆蓋的代碼片段。安裝前應閱讀倉庫源碼與 MIT 許可;社區目錄 SkillHub 插件頁 與 GitHub 倉庫相互獨立,均不等同於 DeepSeek 或幻方的官方應用商店。

結尾

dsh-code-explainer 把「agent 寫了什麼」收成工具卡上的行尾中文:規則先出結果,必要時再由模型補洞,並可一鍵關掉註釋或關掉 LLM。若你在 DSH desktop 場景裏需要這種讀代碼方式,可按 link 安裝並在 cordis.patch.yml 裏調 llm 與限額。

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

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

小夜