⌨️ dsh-prompt-history
DSH Web 输入框的「类 Linux shell」提示词历史 + 终端式复制粘贴插件。
像在终端里一样按 ↑ —— 历史、引用、粘贴,一个插件搞定。
English · 简体中文 · Español · Português
兼容性
| 表面 | 状态 |
|---|---|
| DSH 版本 | 一个版本同时兼容 0.1.x 与 0.2.x(无需按版本切换插件):0.1.1-rc.2 / 0.1.2-rc.1 / 0.1.5-rc.1 实测运行;0.2.0-rc.2 实测挂载运行,0.2.1-alpha.2 / alpha.3 通过官方安装器兼容预检。节点读取跨版本归一化(旧 session.nodes / 0.1.2+ legacy.nodes / 新版 order+store、data.content),桌面 2.0.x 一并兼容 |
| 版本对应 | ≥ 1.2.16 同时支持 0.1.x 与 0.2.x(1.2.16 修复 0.2.1+ 安装被拒;1.2.17 把类型/依赖迁移到 0.2.x 包布局并保留 0.1.x 兼容)。没有也不需要一个 1.3.x 破坏性分支 |
| 平台 | 仅 Web GUI(客户端插件;状态存于浏览器本地;无网络请求、无原生代码) |
| Node | >=20 |
| 模型 | 任意(仅可关闭的「上下文预测建议」会调用当前会话模型) |
| 界面语言 | 中文 / English(跟随 DSH 应用语言,设置页可切换) |
你能得到什么
dsh-prompt-history 把终端的输入历史搬进 DeepSeek Harness Web 输入框:
类 shell 的方向键召回 — 空输入时 ↑ 召回上一条发送过的消息(最新在前);输入前缀后按 ↑ 跳到最近一条以该前缀开头的消息(bash 的
history-search-backward行为),继续按 ↑ 往前翻匹配;↓ 向后翻(含前缀匹配的前向),翻到底时恢复你翻历史之前正在输入的那一行(readline 的 pending-line 行为)。编辑即退出 — 浏览历史时一旦动手编辑,自动回到当前行,不再继续翻。
Ctrl+R 反向搜索 — 增量搜索历史,输入时实时匹配最近条目(浮层显示
(reverse-i-search)查询`),再按 Ctrl+R 看更早匹配;Enter 采用、Esc 取消并恢复原输入。复制 + 引用(两种模式,设置里切换) — 页面里任何非空选区——输入框、聊天消息、代码块等——按所选模式处理:
- 工具栏(默认):选区上方出现「复制」「引用」按钮,侧聊开启时再多一个「侧聊追问」——复制点击才写剪贴板(不刷屏 Win+V);引用把选中文本的完整内容以简约的
>引用块插入输入框(标准 markdown 引用,发送时渲染为引用块);侧聊追问把这段引用直接送进侧聊(见第 10 条),并在需要时自动开启侧聊面板。 - 选中即自动复制:终端风格,选中直接写系统剪贴板。
- 工具栏(默认):选区上方出现「复制」「引用」按钮,侧聊开启时再多一个「侧聊追问」——复制点击才写剪贴板(不刷屏 Win+V);引用把选中文本的完整内容以简约的
鼠标右键直接粘贴 — 在输入框上右键即粘贴剪贴板内容(和 Linux 终端一致,不弹菜单);粘贴走与 Ctrl+V 完全一致的管线(图片与引用 chip 行为一致),execCommand 路径被限制时自动回退到 Clipboard API 手动插入。
跨会话历史记忆(设置里可开关,默认关)— 开启后 ↑/↓ 历史在会话间保持,存于浏览器本地(上限 200 条),刷新/切换会话不丢失。
提示词补全(Codex 风格,设置里可开关,默认开) — 打字时若当前输入是历史里某条提示词的前缀,就在光标后淡色显示剩余部分,按 Tab 或 → 一次补全(Esc 忽略);大小写不敏感匹配,
/、@开头的输入交给宿主自己的命令/引用菜单,不抢键。上下文预测建议(Codex 风格,设置里可开关,默认开) — 输入框为空时,插件把最近几轮对话交给当前会话模型,预测你接下来可能发的那句话,并在输入框里浅色整句显示 + 提示「按 Tab 键接受」;按 Tab 即填入(打字 / Esc / 新一轮即消失)。每轮回答结束后触发一次,输入框聚焦为空时补一次;请求期间输入框显示浅色「正在预测下一条…」(不再静默等待),结果到达即替换;Ctrl+Shift+Space 可随时手动预测一条(忽略过或等太久时用它);同一段上下文命中缓存不重复请求。
会话目录(Chat TOC) — 聊天内容多时,对话左侧边缘有一个半透明、可拖动的把手(悬停变亮),点击展开按时间顺序列出你发送过的所有消息,点击任意一条即可跳转到对应位置;条目多时可在目录内滚动查看全部;点击外部或按 Esc 关闭。可在设置里一键开关。
侧聊(设置里可开关,默认开) — 在右侧栏开第二条线程,与主会话并行干活(共享同一工作区、可写文件):
- 带全部上下文本线程:用宿主
fork从当前会话分叉,继承整段对话;或空白线程从零开始(可开多条,chip 上有未读徽标与运行中标记) - 面板复用主输入框的全部手感:↑/↓ 历史、历史补全、上下文预测、Enter 发送、运行时「停止」
- 窗口形态交给官方侧栏:⧉ 抽成浮动小窗、◫ 右栏再开一栏、⤓ 停靠回右栏、✕ 关标签页
- 双向桥接:主会话选中 →「侧聊追问」送引用进面板;面板 ⇧ 把这条线程的结论以引用块写回主会话草稿
- 并发写护栏(默认开,只提醒不阻止):从两侧工具行提取被触碰的文件路径,交集不为空时在面板列出「两侧都动过这些文件」
- 面板收起时,侧栏标签上显示聚合未读数;侧聊的标签类型同时注册进侧栏自己的"添加标签页"引导页
- 带全部上下文本线程:用宿主
纯 UI 行为:不产生会话事件、不改变 agent 循环。历史召回/引用/复制完全在浏览器内完成,不发起任何请求;唯一会调用模型的是「上下文预测建议」——它由你在设置里控制(默认开),开启时每轮最多向当前会话模型发一次极小的预测请求(约 512 tokens 预算),关闭后插件回到零网络。召回/引用/预测的文本都只进入输入框草稿,只有你按 Enter 才会作为你的消息发出。
快速开始
# 1. 把插件装进你的 profile
dsh plugin --profile web add dsh-prompt-history
# 2. 刷新页面即可使用(无需重启服务)
安装与卸载
- npm 渠道(已发布版本):
dsh plugin --profile web add dsh-prompt-history - 源码渠道(本地开发,最新
main):dsh plugin --profile web add "github:Xiaofei-fei/dsh-prompt-history#main"(源码检出需先pnpm run build—— 未构建的 bundle 会拒绝启动) - 卸载:
dsh plugin --profile web remove dsh-prompt-history
配置
打开 设置 → >_ 终端式输入(存于浏览器本地,修改立即生效):
| 选项 | 默认 | 说明 |
|---|---|---|
| 复制方式(选中文字时) | 工具栏复制 |
工具栏(推荐,点击才写剪贴板)/ 选中即自动复制(终端风格) |
| 跨会话历史记忆 | 关 | ↑/↓ 历史在会话间保持,存于浏览器本地,上限 200 条 |
| 上下文预测建议(Tab 接受) | 开 | 输入框为空时用当前会话模型预测下一句;浅色整句显示,Tab 或 → 接受;请求期间显示「正在预测下一条…」;Ctrl+Shift+Space 手动预测一条(每轮一次,消耗少量额度) |
| 提示词补全(Tab 接受) | 开 | 打字时淡色补全历史中匹配的提示词,Tab 或 → 接受,Esc 忽略 |
| 会话目录(Chat TOC) | 开 | 对话左侧显示可拖动的目录把手,可关闭 |
| 右键直接粘贴 | 开 | 关闭后右键恢复浏览器原生菜单 |
| 侧聊 | 开 | 右侧栏出现「侧聊」标签页:与主会话并行的第二条线程(共享工作区、可写文件)。关闭后,选区工具条里的「侧聊追问」按钮也随之消失(1.4.1 起) |
| 并行写冲突提醒 | 开 | 侧聊与主会话碰到同一文件时在面板提醒(仅提醒,不阻止写入;关闭侧聊时该项隐藏) |
键位速查:↑/↓ 历史(含前缀搜索)· Ctrl+R 反向搜索 · Tab / → 接受补全或预测 · Esc 忽略预测 · Ctrl+Shift+Space 立即预测一条 · Enter 发送(侧聊面板内同)
↑/↓ 历史始终开启,不随以上开关变化。补全与 ↑ 用的是同一份历史与同一套前缀匹配语义。
特性
- 历史来自会话自身的消息记录:直接读取会话快照中的用户消息节点(
user/steering),随消息落地实时追加——与聊天记录严格一致,随会话持久化,刷新页面后依然可用,不需要任何配置或额外存储。 - 连续重复自动合并,浏览状态跟随会话切换自动重置。
- 界面国际化:全部文案(设置、工具栏、提示 pill、会话目录、搜索浮层)跟随 DSH 应用语言(中文 / English)。
- client bundle 压缩后约 12 KB;依赖全部走官方
@deepseek-ai/*peer 依赖。
已知限制
- Ctrl+R:输入框聚焦时 Ctrl+R 被用作反向搜索,不再触发浏览器刷新(想刷新先点一下输入框外面)。
- 会话目录会自动向后加载更早的宿主历史(逐页拉取直至完整),因此可定位全部历史位置;↑/↓ 召回仍只针对当前已加载窗口内的消息。
- 纯文本召回:带图片/命令 chip 的消息不参与;召回内容为纯文本。
开发
自动化回归(E2E)
pnpm test:e2e # 或 pnpm test(typecheck + e2e)
真实起一个 DSH Web 实例(临时端口)+ 无头 Chromium,逐条校验已修复过的回归:
| 套件 | 固化内容 |
|---|---|
overlay |
浮层与输入框内容区对齐 · 布局变化后跟随 · 打字时预测立即消失(叠字) · 弹层覆盖时沉到其下(遮挡) · 弹层关闭后回到原层 · 隐藏时恢复占位符 |
composer |
↑ 召最新 · ↓ 还原待发送行 · 前缀搜索 · 补全 ghost + Tab · Ctrl+R 搜索 · 输入框有焦点时引用仍读对话选区 · 会话目录条目 |
sidechat |
侧聊默认开启 · 设置项与桥接状态 · 面板打开并 fork 线程 · 关闭功能后工具条按钮消失 |
细节与可配环境变量见 test/e2e/README.md。
pnpm install
pnpm run typecheck # tsc --noEmit
pnpm run build # tsc(lib/types)+ tsdown(lib/index.js / lib/invariant.js / lib/client.js)
浏览器半区(src/client/)注册在 conversation.input.right 槽位,构建产物为 DSH __ModuleLoader__ 闭包格式,外部依赖仅 react(其余由浏览器模块表提供)。文案字典在 src/client/locales.ts(zh 为准、en 键位对齐),通过 ctx.locale.register 注册。
原理
插件是一个不可见的 composer 槽位条目:挂一个 document 捕获期 keydown 监听,仅在目标为 composer 输入框、无修饰键、非输入法组合、菜单未打开、会话非忙碌时接管 ↑/↓,通过 inputActions.setDraft 写入历史文本。历史列表由会话快照的 user/steering 节点按 seq 去重追加,浏览位置(index + 待恢复的当前行)保存在组件 ref 中。