converk/dsh-ux-kit--plugins-prompt-history ↗★ 0
dsh-plugin-prompt-history
在会话输入框中用 ↑/↓ 方向键召回本会话已发送的历史提示词
安装
此插件尚未提供可验证的 bundle,或兼容性检查未通过。请先阅读仓库说明。 阅读完整 README ↗
说明文档
阅读完整 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 接口)
- Slot:
conversation.input.overlay(composer 卡片内浮层列表,scope: session,replaceRisk: none)。通过slots.inject等待声明后slots.register,条目 id 为prompt-history。 - 标准 props:条目组件由 Slot 运行时注入
useChat(会话消息快照)、useInput(输入机状态)、inputActions.setDraft()(整体替换草稿)、sessionId。 - 历史提取:
ChatSnapshot.legacy.nodes中kind === 'user' | 'steering'节点的content文本块(type: 'text'),去重连续重复、上限 200 条。 - 键盘拦截:document 捕获相
keydown,经data-composer-card包含判定 +isContentEditable限定作用域;preventDefault + stopPropagation阻断 Lexical 默认光标移动。
类型层面只对上述契约做结构性窄化投影(src/client/types.ts),不 import 官方包——运行时零依赖,仅构建期依赖 esbuild / typescript / @types/react(白名单内工具链)。