前言¶
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,屬於剛發佈的早期項目。
它解決的問題分三塊:
- 找回說過的 prompt:
↑/↓在歷史裏前後翻,不用翻聊天記錄。 - 補全輸入:草稿有文字且能匹配到歷史時,
Tab直接補全。 - 生成下一步:草稿爲空時按
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 纔會觸發,流程如下:
- 輸入框獲得焦點時,客戶端後臺調用
GET /codex-composer/history(純讀,不調用模型);首次按 Tab 也會兜底拉一次。 - 宿主讀取當前 Session 最近的 user/assistant 消息(最多 14 條、總量約 20k 字符),用當前會話實際使用的模型路由生成一條「下一步用戶 prompt」。
- 生成期間輸入框底部出現
正在生成下一步建議…,結果寫入輸入框,不會自動發送。 - 只請求一次,重複按 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:
- 在
~/.dsh/profiles/desktop/package.json的dependencies里加"dsh-codex-composer": "file:/absolute/path/to/dsh-codex-composer"; - 把
"dsh-codex-composer"追加到dsh.profile.bundles; - 在 profile 目錄執行
pnpm install; - 重啓 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。
典型用法¶
裝好之後不需要額外配置,直接在輸入框裏操作即可:
- 連續問了幾輪之後,光標回到輸入框首行按
↑,上一條 prompt 回到輸入框;按Esc退出召回。 - 打幾個字後按
Tab,如果能匹配到歷史 prompt 中前綴相同的內容,會補全;匹配不到就當普通 Tab 用,焦點跳到下一個可聚焦元素。 - 新建一個空輸入框,按
Tab,觸發上下文建議;結果出現在輸入框裏,再自行修改或發送。 - 重啓 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