dsh-composer-input-history:为 DSH Web 输入框补上 Shell 式历史

前言

在 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 行。

典型用法

  1. 在已打开的 Session 中,向 composer 发送若干条用户消息。
  2. 输入框为空时按 ↑,应出现最近一条已发送的纯文本内容。
  3. 连续按 ↑ 向更早消息浏览;按 ↓ 向更新方向走,越过最新一条后应回到你按 ↑ 之前未发送的草稿。
  4. 草稿恢复后再按 ↓,composer 应被清空。
  5. 若输入框里已有多行文字且光标不在第一行,↑ 应仍由编辑器处理行内移动,而非抢历史。

首页未打开 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 为准。

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

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

Xiaoye