前言¶
在 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 为准。