前言¶
在 DeepSeek Harness(DSH)裏用 Web 端 composer 和智能體對話時,輸入框往往只保留當前草稿。想重發或微調上一條用戶消息,只能手動複製聊天記錄,或重新打一遍。終端裏的 opencode 等 agent 早已習慣用方向鍵在「已發送內容」和「未發送草稿」之間切換;Harness 的 Lexical 編輯器默認把 ↑/↓ 留給編輯器自身,不會自帶這套行爲。
下面介紹社區插件 dsh-composer-input-history:在 Session 內用 ↑ 回溯本會話已發送消息,用 ↓ 向前瀏覽並恢復你正在寫的草稿。維護者爲 liumorrisclaw,分類爲客戶端插件,源碼與說明見 GitHub 倉庫,社區目錄頁爲 SkillHub 條目。
這是什麼¶
dsh-composer-input-history 爲 DeepSeek Harness 的 Web composer 提供 Shell 風格的輸入歷史:↑ 拉回本 Session 裏已經發過的消息,↓ 在較新的消息之間前進,越過最新一條後回到你瀏覽前正在寫的草稿,再按一次 ↓ 會丟棄該草稿並清空輸入框。
插件不引入 Harness Client 包、不額外改樣式;通過 conversation.composer.dock 註冊不可見的 Session 級 occupant,用標準 useChat、useInput 與 inputActions.setDraft 讀寫草稿,並在 document 級 keydown 與 shortcuts 的 observeFixedInput 兩條路徑上仲裁按鍵(先處理者取消事件,避免與 slash 菜單、IME 搶鍵)。
核心功能¶
按鍵行爲¶
| 操作 | 行爲 |
|---|---|
| 草稿爲空時按 ↑ | 召回最新一條已發送消息 |
| 再次按 ↑ | 每次向更早的一條移動 |
| 單行草稿且光標在第一行時按 ↑ | 召回歷史,並記住當前草稿 |
| 多行草稿且光標不在第一行時按 ↑ | 交給編輯器(光標照常移動) |
| 瀏覽歷史時按 ↓ | 向更新的一條移動 |
| ↓ 越過最新已發送消息 | 恢復瀏覽前正在寫的草稿 |
| 草稿恢復後再按 ↓ | 丟棄草稿並清空 composer |
| 瀏覽過程中開始輸入 | 退出瀏覽模式,召回文本變爲當前草稿 |
歷史來源與範圍¶
歷史來自本 Session 聊天視圖已加載的 Chat 節點(snapshot.nodes,按 anchor 順序),並與會話級 localStorage 持久化記錄合併(上限 300 條),因此 compaction prune 掉的消息在重啓後仍可能召回。
納入:普通用戶消息、steering 消息、以及喚醒一輪的消息。
跳過:隱藏節點(compacted 或 interrupted)、僅附件消息、以及 Harness 代發內容(goal rounds、skill catalogs、runtime snapshots、job notices、model notices、approval answers、compaction checkpoints 等)。
與其它插件的差異¶
npm 上另有社區插件 dsh-input-history,同樣用 ↑/↓ 召回提示,但機制不同。README 中的對比如下:
| dsh-composer-input-history | dsh-input-history | |
|---|---|---|
| 歷史來源 | Chat 視圖已加載的 Session transcript | 獨立的本地已提交提示存儲 |
| 非空草稿 | 可召回並記住草稿,在最新消息之下恢復 | 僅空 composer 時召回 |
| 附件 | 召回爲純文本,不恢復附件 | 可持久化並重新附加 |
| 菜單 / IME | 對 slash/reference 菜單與 IME 組合讓出按鍵 | — |
若希望召回與界面上看到的對話一致,且正在輸入時也能 ↑ 回溯,選本插件更合適。
兼容與驗證¶
開發與驗證目標爲 @deepseek-ai/dsh 0.2.0-rc.2。插件聲明 dsh.client.inject 於 dsh-client-ui-conversation、dsh-client-ui-chat、dsh-client-shortcuts,bundle 在 web profile 下 immediately: true。README 記載 48 項測試(單元 + 模擬 composer 集成),並在真實 Web 實例與 Desktop composer 上做過手工確認。
當前 npm 包版本爲 0.1.2(見倉庫 package.json),許可證 MIT。
安裝與啓用¶
插件以 DSH 當前進程的 Web 客戶端權限運行;安裝前建議閱讀倉庫源碼與 LICENSE,確認符合你的安全策略。DSH 生態強調「一切皆插件」;SkillHub 等爲社區目錄,與 DeepSeek / 幻方無官方從屬關係。
在 web profile 下從 npm 安裝(短名):
dsh plugin --profile web add dsh-composer-input-history
或直接從 GitHub 添加:
dsh plugin --profile web add https://github.com/liumorrisclaw/dsh-composer-input-history
也可在 Web UI 的 Plugins 頁面添加,或通過插件管理器列出包目錄。bundle 默認關閉,需在 profile 中選中後生效。
本地 checkout 可按路徑安裝:
dsh plugin --profile web add /absolute/path/to/dsh-composer-input-history
可用 dsh --profile <name> --dump-config 檢查 composed profile 是否包含該 bundle 行。
典型用法¶
- 在已打開的 Session 中,向 composer 發送若干條用戶消息。
- 輸入框爲空時按 ↑,應出現最近一條已發送的純文本內容。
- 連續按 ↑ 向更早消息瀏覽;按 ↓ 向更新方向走,越過最新一條後應回到你按 ↑ 之前未發送的草稿。
- 草稿恢復後再按 ↓,composer 應被清空。
- 若輸入框裏已有多行文字且光標不在第一行,↑ 應仍由編輯器處理行內移動,而非搶歷史。
首頁未打開 Session 時沒有 composer dock,無法召回;歷史僅限當前 Session,不支持跨 Session。
適用場景與注意¶
適合: 經常在同一 Session 裏微調、重發上一條提示的 Web 用戶;希望行爲貼近終端 agent、且歷史與聊天窗口可見 transcript 一致的場景。
侷限(來自 README):
- 跨 Session 召回尚未實現。
- 插件未安裝期間發送的消息,不會進入其合併後的歷史。
- 召回僅爲純文本,reference chips 與附件不會恢復。
- 假定每個 Web 頁只有一個常駐 composer。
安裝命令與行爲說明以上述倉庫 README 爲準;衝突時以倉庫文檔爲準。
結尾¶
dsh-composer-input-history 用鍵盤觀察者的方式補上 Harness Web composer 刻意留出的 ↑/↓ seam,把 Session 內已發送消息與當前草稿串成可瀏覽的一條線。需要目錄簡介或一鍵跳轉時,可打開 SkillHub 插件頁;需要安裝命令、按鍵表與限制說明時,以 GitHub:liumorrisclaw/dsh-composer-input-history 爲準。