前言¶
DSH(DeepSeek Harness)的输入框只承载当前这一句。在长会话里,你可能刚问过「把这段日志按错误重排」,过了几轮又想问「再按时间排序一次」。原生的做法是自己翻聊天窗口找旧提问、复制、粘贴;另一个常见做法是依赖模型补全,但要么等补全、要么怕它直接发出去。
下面介绍的插件把两件事做在同一个输入框里:往回翻——本会话发过的每一条提问都能翻回来重新编辑;往前猜——根据最近几轮对话给出你大概率要发的下一句话,用灰色幽灵文字显示,按 → 再采纳。任何按键都只改草稿,发送仍需自己按 Enter。
插件分类是客户端。仓库 Heeweelee/dsh-prompt-suggestions,包名 dsh-composer-suggestions,MIT 许可证,当前版本 v1.1.0,作者 Heeweelee。
这是什么¶
一句话定位:一个 DSH composer 插件,为输入框加上「历史回滚 + 下一句预测」,官方说法是「像 Claude Desktop 那样不用重复打字」。它不做自动发送,不新增面板到正文之外,所有操作都落在输入框和草稿上。
解决的是两个具体痛点:
- 旧提问重打成本高,长会话里早期轮次还可能被 compaction 从聊天界面上剪掉,翻页也未必能翻到第一句。
- 下一句要从头组织,而它往往只是对上一次结果的延续(「继续」「把第二段也切开」)。
核心功能¶
| 能力 | 用法 |
|---|---|
| 历史回滚 | 空输入框按 ↑ 逐条退回本会话发过的提问;↓ 逐条前进 |
| 草稿保护 | 越过最新一条时恢复原本未发送的草稿 |
| 历史搜索面板 | Ctrl+↑ 打开面板,关键词过滤,↑↓ 选择,Enter 填入,Esc 关闭 |
| 下一句预测 | Session 空闲时,灰色幽灵文字出现在输入框 |
| 一键采纳 | → 把预测变成普通可编辑文本,可改完再发 |
| 不自动发送 | 任何按键只改草稿,发送仍需 Enter |
回滚覆盖整场会话。判定依据是会话记录里 source.kind = user:手打的、粘贴的、从插件预测 → 采纳后发送的、排队插话发送的,在会话里都是同一条 user/message,因此全部覆盖。运行时注入的内容(时间上下文、技能目录、压缩存档、子任务通知)也是 user 角色消息,会被排除——这是区分「人发的」和「机器塞的」的唯一依据。
插件不劫持键盘:多行编辑、光标在中间、输入法组字时方向键照常工作。↑ 只在三种情况下接管:草稿为空,或草稿是单行(内容会被保存,↓ 可恢复),或草稿是多行但光标停在最开头。
安装与启用¶
推荐从 GitHub 直接装,不需要 registry:
dsh plugin --profile desktop add github:Heeweelee/dsh-prompt-suggestions
其他方式在仓库的 INSTALL.md 里:
# A. 从 npm 装
plugin_manager install_bundle dsh-composer-suggestions
# B. 用 Releases 里的 tarball,在 profile 的 package.json 里加
"dsh-composer-suggestions": "file:D:/path/dsh-composer-suggestions-1.1.0.tgz"
# C. 本地开发目录
plugin_manager install_bundle D:\Ai_Tool\dsh_tool\packages\prompt-suggestions
安装后在「插件 → 已安装插件」里可以开关。
包的 engines 要求 dsh >= 0.2.1-rc.5,安装前可以先确认当前 dsh 版本。
典型用法¶
在输入框里直接操作,不需要记额外命令:
1、长会话里想复用上一条提问:光标留在空输入框,按 ↑,一次退一条,可以一路翻到会话的第一句;按 ↓ 逐条往回走,翻过最新一条时恢复原本没发出去的草稿。
2、历史太多不知道翻到第几条:按 Ctrl+↑ 打开历史面板,面板里是独立输入框,输入关键词过滤,↑↓ 选择,Enter 填入,Esc 关闭。面板打开时键盘交给面板自己的 <input>,不与宿主输入框抢事件。
3、让插件猜下一句:发完一条之后保持输入框为空并等一会儿,灰色幽灵文字会出现;按 → 采纳成普通文本,改完再按 Enter 发送。
4、正在打字时输入框里出现灰色的后半句:说明你已经打出了预测的前缀,宿主会把剩余部分接在正文后面,按 → 后草稿等于完整预测,且走宿主自己的撤销栈。
预测的来源在界面上有明确标记,方便判断这次猜的是不是模型给的:
| 角标 | 含义 |
|---|---|
→ 采纳 |
模型预测,悬停显示耗时 |
→ 采纳 · 本地 |
服务端没响应,用的是本地规则 |
预测不可用 |
服务端没响应且本地规则也给不出有意义的建议,此时不显示幽灵文字,悬停显示失败原因 |
DevTools Console 每轮会输出一行 [prompt-suggestions] model 1832ms <文本> 或 local fallback <ms>,并附带失败原因和实际请求的 URL。
实现要点¶
插件是典型的两半结构,Host 与 Web Client 各管一半:
| 文件 | 平台 | 作用 |
|---|---|---|
index.js |
Host | 在 DSH Web 服务器上注册 POST /prompt-suggestions/suggest 与 POST /prompt-suggestions/history |
client.js |
Web Client | 注册 conversation.input.overlay 槽位:拦截方向键、回溯历史、绘制幽灵文字 |
1、历史回填的数据源有两层,Host 优先。Host 权威列表直接读该 Session 的完整事件日志,取所有 source.kind === 'user' 的消息,按时间正序返回最近 200 条,每条保留完整原文(含换行,上限 4000 字符)。因此不受聊天窗口分页限制,也不受 compaction 把早期轮次从 surface 剪掉的影响。Host 路由不可达时退回 useChat 的本地窗口作为兜底。
2、幽灵文字有两种绘制方式:草稿为空时在 overlay 里绝对定位一层灰色文本,位置对齐宿主占位符所在的盒子,字体行高从编辑器 getComputedStyle 复制,底色用 --dsw-specific-input-major 盖住占位符;草稿是预测前缀时写宿主自带的行内提示通道 --dsh-composer-hint,由宿主 CSS 的 p:last-child::after 把剩余部分接在正文后面,换行与字距与真实输入一致。
3、预测请求走 Host 路由:
POST /prompt-suggestions/suggest
x-prompt-suggestions: 1
{"sessionId": "session-..."} → {"suggestion": "...", "cached": false}
上下文取自 session.deriveMessages(),取最后 10 条,单条截断 700 字符,总长 4000 字符。模型路由取 ctx.agentDefaultModel.currentSelection(),reasoningEffort 强制降到该路由最省的一档,maxTokens: 700。结果按 sessionId + 消息数 缓存 5 分钟,避免刷新页面重复计费。接口按 document.baseURI 解析 URL,而非假设 http(s)——桌面版界面跑在自定义协议 dsh-app://app/ 上,用它判断 origin 会拿到 "null",请求永远发不出。
4、失败处理分两层。防空话:模型只回「继续 / 好的 / ok」这类内容时,会带更严格的提示词再要一次具体建议;两次都是空话就不出幽灵文字。请求失败按 0.6s / 1.2s / 2.4s 退避重试,四次都失败才降级到本地规则,窗口重新获得焦点或可见性恢复时会再试一次。加 x-prompt-suggestions-debug: 1 可返回 debug 字段(阶段、attempts、filler、原始输出、finish 原因、实际路由),调试请求绕过缓存读但仍写回。
适用场景与注意¶
适合以下情况:会话轮次多、经常复用旧提问、希望模型把「下一句」准备好但又不想让它替自己决定什么时候发的人。对输入框键盘行为敏感、希望方向键完全归自己控制的场景,需要留意插件只在上述三个条件下接管 ↑。
使用时注意几点:
- 插件以当前 dsh 进程的权限运行,涉及本机文件、会话数据与网络请求,安装前应检查源码与许可证。本仓库为 MIT,可在
INSTALL.md之外直接读index.js与client.js确认行为。 - 两个路由走 DSH Web 服务器,未经过浏览器 Cookie 认证,仅靠自定义请求头 + 监听回环地址保护;跨站请求无法带上该请求头。
- 预测只在 Session 空闲时请求,生成过程中没有幽灵文字。
- 空会话(还没有任何消息)不做预测,没有上下文可依据。
- 模型两次都只给空话时不出幽灵文字——「有时没预测」是设计上可接受的失败方式。
- 面板不做时间分组、不做跨会话搜索,只列当前会话的提问。
- Host 侧只保留最近 200 条、每条 4000 字符,更早的提问仍在会话里,只是不再进入回滚列表。
- Host 路由不可达时降级为本地已加载窗口,此时长会话里能翻到的深度取决于聊天视图加载了多少。
- 面板用
position: fixed定位,宿主未来若给输入卡片祖先加transform,浮层定位会变化。
小结¶
这个插件的价值不在复杂机制,在于把输入框缺的两块补上:一条能翻回整场会话的 ↑/↓,一句可在采纳前编辑的幽灵文字。全程不自动发送,改动都在草稿上,风险可控。安装方式是从 GitHub 直接装 dsh plugin --profile desktop add github:Heeweelee/dsh-prompt-suggestions,包名 dsh-composer-suggestions,MIT,v1.1.0。
- 目录页:https://www.skillhub.cn/plugins/Heeweelee/dsh-prompt-suggestions
- 仓库:https://github.com/Heeweelee/dsh-prompt-suggestions