long-draft-input:在 DSH 長草稿上顯示附件式摘要卡片

前言

使用 DeepSeek Harness(DSH)時,輸入框草稿可能變得很長。long-draft-input 是一個面向 DSH 0.1.0-rc.5 的獨立插件。它解決的問題是:當輸入框草稿超過閾值時,將發送框向上擴展並顯示附件式摘要卡片,同時不改變 DSH 原有的草稿狀態、消息格式或發送路徑。

這是什麼

下面介紹這個插件的定位和邊界。

它由 Heyflyingpig 維護,許可爲 MIT。插件用於處理 DSH 輸入框中的長草稿:超過閾值後把草稿摺疊爲摘要卡片;未超過閾值時保持原輸入框行爲。插件不定義附件協議,也不修改服務端消息格式。

核心功能

未超過閾值的小文本不渲染插件 UI,保持原行爲。

當輸入框草稿超過閾值後:

  1. 長文本仍完整保存在 DSH 的 input.draft 中。
  2. 摘要卡片展示首行預覽、字符數和行數。
  3. 摘要卡片作爲原發送框內部佈局子項,像附件一樣將發送框向上撐高。
  4. 摺疊態隱藏原 textarea 的完整文本,保留原工具欄和發送按鈕。
  5. 卡片下方保留獨立補充輸入區,補充文字會追加到完整長文本後,繼續通過原發送按鈕提交。
  6. 點擊“在文本框中顯示”後恢復原 textarea,並將焦點交還給它。
  7. 點擊 × 移除聚合的長文本;如果卡片下方已經輸入補充正文,只保留這部分正文。
  8. 原 InputBar 的發送按鈕仍調用原有 inputActions.submit()。

實現上使用公開的 conversation.input.dock 擴展點承載生命週期,再通過 React Portal 把摘要卡片放入原 [data-composer-card]。

安裝與啓用

安裝到 DSH profile

先按倉庫資料給出的命令安裝,再運行指定 profile。

dsh plugin --profile demo add github: Heyflyingpig/long-draft-input
dsh --profile web

安裝前需要注意 package.json 聲明 node >= 22.19.0。GitHub 安裝會執行 prepare 構建 TypeScript 和瀏覽器 bundle。pnpm 10+ 可能要求 profile 的 pnpm-workspace.yaml 顯式允許該包的構建腳本。也可以發佈 npm 包或 pnpm pack tarball,直接攜帶已構建的 lib/,減少安裝時的構建權限。

在源碼 checkout 中本地驗證

如果是在 DSH 項目源碼 checkout 中驗證,下面三條命令分別用於添加本地路徑插件、查看配置和啓動。

pnpm dsh plugin --profile demo add /absolute/path/to/long-draft-input
pnpm dsh --profile demo --dump-config
pnpm dsh --profile demo

典型用法

默認閾值

默認閾值爲 2000 個 JavaScript 字符,首行預覽爲 120 個 Unicode code point。

覆蓋配置

可在 profile 的後續 patch 層覆蓋配置。由於 patch 會替換整行配置,覆蓋時請同時寫出 threshold 和 previewChars 兩個字段:

- id: long-draft-input
  config:
    threshold: 20000
    previewChars: 160

開發與驗證

開發與驗證命令如下:

pnpm install
pnpm test
pnpm run test:unit
pnpm pack:check

真實 Web 組合測試需要先在一個已安裝本插件的 DSH profile 中啓動 Web,然後執行:

DSH_WEB_URL=http://127.0.0.1:3080 pnpm run test:web

適用場景與注意

適合在 DSH 輸入框中經常產生較長草稿、希望摺疊展示但不改變提交路徑的場景。

使用時注意:

  1. 插件以當前 dsh 進程權限運行,安裝前應檢查源碼與許可證。
  2. 插件不改變草稿狀態、消息格式或發送路徑;未超過閾值的短文本不會觸發插件 UI。
  3. 公開擴展點無法控制 InputBar.tsx 內部的私有 React 渲染邏輯,因此不能阻止原組件繼續構造 backdrop 和 mirror 節點。
  4. 真實 Web 組合測試依賴一個已安裝本插件的 DSH profile 啓動 Web。

結尾

long-draft-input 的價值在於:長文本仍然保存在 input.draft 中,發送按鈕仍走原有 inputActions.submit(),只是把超過閾值的草稿摺疊成附件式摘要卡片。

GitHub:Heyflyingpig/long-draft-input

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

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

小夜