dsh-codex-composer:給 DSH Web GUI 補上 Codex 風格的輸入手感

前言

DSH 的 Web GUI 裏,輸入框就是工作臺。長期調試同一類問題時,人會自然養成一套鍵盤習慣:↑ 招回上一句說過的話,Tab 把說過一半的 prompt 補完。原生 Web 界面默認不提供這兩套手感,每次都要重敲或翻歷史記錄。

下面介紹的 dsh-codex-composer 就是做這件事的。它由 sakura-hly 維護,是一個客戶端插件,爲 DSH Web GUI 的輸入框加上 prompt 歷史召回、歷史補全和「下一步建議」生成。

這是什麼

一句話定位:給 DSH Web GUI 的輸入框補上 Codex 風格的鍵盤操作,不改 app.asar,不註冊全局快捷鍵,只接管主 composer 的焦點和按鍵。

作者:sakura-hly。許可證:MIT。當前版本:0.1.0,GitHub 星標爲 0,屬於剛發佈的早期項目。

它解決的問題分三塊:

  1. 找回說過的 prompt:↑/↓ 在歷史裏前後翻,不用翻聊天記錄。
  2. 補全輸入:草稿有文字且能匹配到歷史時,Tab 直接補全。
  3. 生成下一步:草稿爲空時按 Tab,調用模型給一條當前會話的後續建議。

核心功能

鍵盤行爲

鍵 行爲
↑ 光標在首行(或草稿爲空)時,召回上一條 prompt
↓ 在召回歷史中前進;走到底恢復召回前的草稿
Tab 草稿爲空:生成下一步建議;有文字且有歷史匹配:補全;有文字但無匹配:原生 Tab(焦點跳轉)
Esc 取消召回或取消正在生成的建議,恢復召回前的草稿

需要留意的邊界:

  • 只有不帶修飾鍵的 Tab 會被接管,Shift+Tab 仍做焦點遍歷。
  • /、@ 補全菜單打開時,方向鍵和 Tab 留給菜單,插件不搶。
  • 多行編輯、中文輸入法、Shift+Enter 換行都不受影響。
  • 只處理主 composer(data-composer-input),隊列編輯框和側欄編輯器不接管。

歷史記錄

  • 按 Session 隔離,依據 data-conversation-session;每個會話一份歷史。
  • 首次使用時從會話事件流的 user/message 裏讀出已有 prompt,老會話也能直接 ↑。
  • Enter 發送和點擊發送按鈕後追加記錄,最多保留 100 條。
  • 持久化到瀏覽器 localStorage,key 爲 dsh-codex-composer.history.v1:<sessionId>。清空該 key 即可重置對應會話歷史。

上下文建議(Tab)

只在草稿爲空時按 Tab 纔會觸發,流程如下:

  1. 輸入框獲得焦點時,客戶端後臺調用 GET /codex-composer/history(純讀,不調用模型);首次按 Tab 也會兜底拉一次。
  2. 宿主讀取當前 Session 最近的 user/assistant 消息(最多 14 條、總量約 20k 字符),用當前會話實際使用的模型路由生成一條「下一步用戶 prompt」。
  3. 生成期間輸入框底部出現 正在生成下一步建議…,結果寫入輸入框,不會自動發送。
  4. 只請求一次,重複按 Tab 不會併發;輸入、切換會話、按 Esc 或停用插件都會取消。

這條建議走的是宿主的 POST /codex-composer/suggest 路由,屬於輔助模型調用:不 spawn agent、不寫入會話事件、不進入對話歷史,但會消耗對應 provider 的 token。

安全與隱私

  • prompt 歷史只存在瀏覽器 localStorage,帶 Session id,不上傳第三方。
  • 上下文建議會把當前 Session 的消息發給會話正在使用的模型 provider;不發送憑據、環境變量或工作區文件內容。
  • 兩個宿主路由都經過 DSH 的 origin fence 和 Web 登錄態。

兼容性

  • 目標:DeepSeek Harness >= 0.2.1-rc.3,Web profile。
  • 依賴宿主已有的 conversation、sessions、llm、webServer 服務。
  • Node >= 20,peer 依賴 @deepseek-ai/dsh-llm ^0.2.1-rc.1。

安裝與啓用

標準 bundle 安裝(需要能運行 dsh plugin add 的環境):

dsh plugin --profile desktop add /absolute/path/to/dsh-codex-composer

或手工裝進 profile:

  1. 在 ~/.dsh/profiles/desktop/package.json 的 dependencies 里加 "dsh-codex-composer": "file:/absolute/path/to/dsh-codex-composer";
  2. 把 "dsh-codex-composer" 追加到 dsh.profile.bundles;
  3. 在 profile 目錄執行 pnpm install;
  4. 重啓 DSH(Host 需要重新掃描 client bundle)。

從 dsh.pub 安裝(README 中標註爲「發佈後」可用):

npx dshpub add sakura-hly/dsh-codex-composer --ref <commit>

也可以在 Settings → Plugins → Discover 裏搜索 dsh-codex-composer。

安裝後在 Settings → Plugins 裏能看到 codex-composer 條目。停用即完全移除鍵盤接管,不需要改文件。

卸載:從 profile 的 dsh.profile.bundles 和 dependencies 裏移除 dsh-codex-composer,重新 pnpm install,再重啓 DSH。

典型用法

裝好之後不需要額外配置,直接在輸入框裏操作即可:

  1. 連續問了幾輪之後,光標回到輸入框首行按 ↑,上一條 prompt 回到輸入框;按 Esc 退出召回。
  2. 打幾個字後按 Tab,如果能匹配到歷史 prompt 中前綴相同的內容,會補全;匹配不到就當普通 Tab 用,焦點跳到下一個可聚焦元素。
  3. 新建一個空輸入框,按 Tab,觸發上下文建議;結果出現在輸入框裏,再自行修改或發送。
  4. 重啓 DSH 後按 ↑,歷史仍在,因爲已經持久化到 localStorage。

建議的回退方式:如果只是想試一下,裝好之後在 Settings → Plugins 停用即可,輸入框立刻回到原生行爲。

適用場景與注意

適合這類人:

  • 在 DSH Web GUI 里長期做往返調試,prompt 重複度高,想省下重敲的時間。
  • 希望 ↑/↓ 的手感接近 Codex 那種純鍵盤操作模式。

使用前請知悉:

  • 插件以當前 dsh 進程的權限運行,安裝前應先讀一遍源碼與許可證(MIT)再決定是否使用。
  • 上下文建議是真實模型調用,走當前會話的 provider 路由,會按 provider 計費。每次 Tab 最多一次,低 reasoning effort。不想用就停用插件。
  • 歷史只覆蓋純文本 prompt;帶 @ 引用 chip 的草稿被召回時,以 chip 的文本投影出現。
  • 發送失敗後宿主恢復草稿的場景,歷史裏可能已記下這條,屬於可接受的重複。
  • 倉庫星標爲 0,可參考的外部使用反饋很少,功能邊界以 README 爲準。

結尾

這個插件的價值很具體:把輸入前和輸入中的重複手工操作交給鍵盤和模型,不碰會話歷史,不碰 DOM。屬於「裝完即用、停用即走」的輕量工具。

目錄頁:https://www.skillhub.cn/plugins/sakura-hly/dsh-codex-composer
GitHub:https://github.com/sakura-hly/dsh-codex-composer

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

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

小夜