converk/dsh-ux-kit--plugins-prompt-history0

dsh-plugin-prompt-history

在会话输入框中用 ↑/↓ 方向键召回本会话已发送的历史提示词

包名
dsh-plugin-prompt-history
版本
0.1.0
最近更新
2026年9月10日

安装

此插件尚未提供可验证的 bundle,或兼容性检查未通过。请先阅读仓库说明。 阅读完整 README ↗

dsh-plugin-prompt-history

在 DSH Web GUI 的会话输入框中,用 ↑ / ↓ 方向键召回当前会话内已发送过的历史提示词——终端 shell 式的输入历史体验。

纯 client 侧(浏览器半区)插件,宿主半区为空壳。

行为

按键行为
↑(草稿为空时)进入浏览:回填最近一条已发送的提示词
↑(浏览中)向更早一条切换
↓(浏览中)向最近一条切换;越过最新一条时恢复进入浏览前的草稿
直接编辑 / 提交退出浏览(编辑保留在草稿上,即"回忆后直接改")
  • 历史来源:当前会话的持久用户消息(含运行中插入的 steering 消息),来自 useChat 会话快照,因此页面刷新后历史仍在,且只属于当前会话。
  • 无干扰原则:只在草稿为空时接管 ↑(避免抢斜杠 /、引用 @ 菜单的 ↑/↓ 与正常编辑);IME 组合期、带修饰键、提交进行中均不接管。
  • 作用域:按键只在自己所在的 composer 卡片(data-composer-card)内生效,不影响页面其他输入框。
  • 浏览时 composer 卡片右上角显示 ↑↓ 历史 n/N 角标。

构建

pnpm install
node build.mjs        # 产出 lib/index.js + lib/client.js(含 sourcemap trailer)
node node_modules/typescript/bin/tsc --noEmit   # 类型检查

说明:pnpm run build 会先跑 pnpm 的依赖状态预检;若 esbuild 的构建脚本未被批准导致预检失败,直接用 node build.mjs

lib/client.js 是经典脚本(非 ES Module),自注册到 window.__ModuleLoader__,工厂体内 react / react/jsx-runtime 由页面种子模块表解析——与官方 client-ui 插件包的产物协议一致。

安装到 DSH

本包是独立 npm 包,不依赖仓库内任何其他插件。装进 profile:

dsh plugin --profile  add D:\env\Projects\dsh-plugins\plugins\prompt-history

然后在 profile 的 cordis.patch.yml 里用 insert 形制挂载(裸 - name: 会被 applyEntryPatches 跳过并 warn patch: id is required for non-insert patches):

- insert:
    - id: prompt-history
      name: dsh-plugin-prompt-history

patchReload: live 下保存 patch 即可重新组合,浏览器再刷新一次才会取到新的 window.__DSH_BOOT__

client 侧改动在 pnpm run dev:web 构建监视运行时热重载;否则需要重启 dsh 进程并刷新页面。

实现要点(对接的真实 DSH 接口)

  • Slotconversation.input.overlay(composer 卡片内浮层列表,scope: session,replaceRisk: none)。通过 slots.inject 等待声明后 slots.register,条目 id 为 prompt-history
  • 标准 props:条目组件由 Slot 运行时注入 useChat(会话消息快照)、useInput(输入机状态)、inputActions.setDraft()(整体替换草稿)、sessionId
  • 历史提取ChatSnapshot.legacy.nodeskind === 'user' | 'steering' 节点的 content 文本块(type: 'text'),去重连续重复、上限 200 条。
  • 键盘拦截:document 捕获相 keydown,经 data-composer-card 包含判定 + isContentEditable 限定作用域;preventDefault + stopPropagation 阻断 Lexical 默认光标移动。

类型层面只对上述契约做结构性窄化投影src/client/types.ts),不 import 官方包——运行时零依赖,仅构建期依赖 esbuild / typescript / @types/react(白名单内工具链)。