dsh-question-timeout-protection
A plugin for dsh: once ask_user_question times out, the content you entered will remain in the UI or model context.
- Stars
- 0
- Language
- TypeScript
- Created
- Oct 24, 2026
- Updated
- Oct 25, 2026
Introduction
一旦 ask_user_question 超时, 您输入的内容将保留在界面的提问气泡或模型上下文中。
功能
- 右上角倒计时: 问答对话框右上角显示本次问答的剩余等待时间,并随剩余时间递减
- 临近超时警示: 剩余时间进入警示秒数(默认 5 秒)时红字闪烁
- 无限等待: 正在进行的问答在倒计时右侧显示「无限等待」按钮, 点击后倒计时冻结并显示「已暂停」, 直到用户提交才结束; 历史提问与已结算回答的只读卡片不显示倒计时与这个按钮
- 选中底色: 单选题选中后, 选项前的方形按钮填充底色
- 提问标识气泡: 只在超时并把草稿记入内存后, 于提问工具调用处出现一个气泡按钮, 点开在气泡旁弹出只读悬浮卡片查看该次草稿; 未超时或已正常作答的问答不出现该气泡, 查看问题与回答用宿主自带的入口
- 超时草稿保存: 问答超时后把已选选项与已输入内容保存到内存
- 上下文注入: 默认开启,按题结构化地把超时草稿送进模型上下文,每题带自己的已选与补充;超时语义由工具的 pending 结果说明,模型须在回复末尾告知用户出现过提问超时以及对该草稿的处理与决策
- 草稿记入气泡: 超时后把草稿记入对应提问工具处的气泡按钮,点击在气泡旁弹出只读悬浮卡片,该次提问不再提供作答入口
- 超时收尾: 注入开启时提交草稿后卡片随结算消失,未开启注入时直接收起卡片,都不再留下一个被禁用的问答框
- 不做兜底继续回答: 已超时的问答不提供继续回答的兜底
功能立场
本插件只做一件事: 让提问的等待过程可见、可暂停,并且超时不丢内容。以下列出边界,便于判断某个需求是否属于本插件。
做什么
- 让等待时长可见: 在问答对话框右上角显示本次问答的倒计时,临近超时红字闪烁
- 让等待可暂停: 在倒计时右侧提供「无限等待」按钮,点击后本次问答的倒计时暂停,直到用户提交才结束
- 让提问可辨识: 给单选选中态加方形底色,在对话界面的提问工具位置加提问标识气泡
- 让超时不丢内容: 把已选选项与已输入内容保存到内存,并记入该次提问的气泡供只读查看
- 按配置把超时草稿送进上下文: 以正常问答提交的方式注入,并在末尾声明这是用户超时时的草稿、用户并没有正式提交,由模型自行决定是否重新提问
不做什么
- 不接管宿主卡片的渲染与文案: 只在其 DOM 上做增强,隐藏宿主自带的倒计时与收起/展开控件,不改写宿主文案
- 不修改用户的预设: 通过在 agent 作用域注册同名工具就近遮蔽,用户无须改预设
- 不替用户作答: 超时不会自动勾选任何选项,也不会把草稿当成正式回答提交
- 不替模型决策: 是否重新提问、如何处理草稿由模型决定,插件只负责把信息送到位
- 不兜底继续回答: 超时后收起问答卡片并隐藏宿主的「回答」入口,不再提供作答入口
- 不做持久化: 草稿只保存在客户端内存里,刷新页面或重开会话即失效
- 不新增自定义 RPC 或存储: 注入复用宿主既有的晚回复通道,状态同步只用回环 HTTP 端点
机制
- 宿主默认使用阻塞式提问,提问不会超时;本插件在 agent 作用域注册同名的
ask_user_question,以就近遮蔽接管提问等待,不需要改动你的预设 - 超时由插件自己计时: 宿主卡片在客户端接管或开始编辑回答时会暂停自己的定时器,插件用同一时长再赛跑一次,保证到期一定返回 pending 并进入兜底流程
- 工具走宿主的 timed 等待: 卡片与选项由宿主界面提供;倒计时由插件自绘在卡片右上角,按插件自己的截止时间渲染,聚焦或编辑都不会让它暂停
- 客户端适配器只增强宿主卡片的 DOM: 插入自绘倒计时与「无限等待」按钮、给单选选中态加底色、在提问工具行插入气泡按钮;超时后把草稿存在内存里,注入开启时经
userQuestions.answer提交草稿(附超时说明),卡片随结算由宿主移除;注入关闭时驱动宿主收起卡片,不做任何提交 - 配置由客户端经宿主
configForms服务实时读取,因此在插件详情页改动勾选立即影响行为,不需要保存或刷新
兼容性
- dsh:
>=0.2.1-rc.1 <=0.2.1-rc.3 - 运行时: Node.js >= 20
安装
尚未发布到 npm;可从本仓库构建后以包目录或 tarball 安装:
pnpm pack
dsh plugin --profile <profile> add release/dsh-question-timeout-protection-<版本>.tgz
pnpm pack 会先构建,打包完成后 tarball 自动移入 release/ 目录。
配置
配置页位于插件详情页顶部的插件级配置区块,不在「包含的组件」里;其中只有「注入到上下文」一个勾选可以调整,其余能力随插件启用状态固定生效,列表中只做说明。
| 配置项 | 取值 | 默认值 | 界面 | 说明 |
|---|---|---|---|---|
fallback | ui / context / both | both | 可改一项 | 超时兜底;界面只给「注入到上下文」勾选,默认勾选,勾上写 both,不勾写 ui。界面保留草稿恒定开启,所以不会再出现 context。勾选变化即写入,无需保存 |
cardEnhancements | 布尔 | true | 固定特性 | 卡片增强: 右上角倒计时与警示闪烁、单选选中底色、提问标识气泡、超时后锁定输入 |
infiniteWait | 布尔 | true | 固定特性 | 提供倒计时右侧的「无限等待」按钮, 点击后本次问答倒计时暂停, 直到用户提交 |
draftFallback | 布尔 | true | 固定特性 | 超时后把草稿保存到内存, 记入提问气泡, 并按兜底范围处理 |
warningSeconds | 数字 | 5 | 不暴露 | 进入红字闪烁警示的剩余秒数 |
timeoutSeconds | 数字 | 120 | 不暴露 | 提问等待时长(秒),由模型调用工具时的 timeout 参数决定;此处只是未传参时的默认值 |
界面保留草稿是必选行为: 超时后草稿总留在内存里,并记入该次提问工具处的气泡按钮,点击气泡会在其旁边弹出只读悬浮卡片。勾选「注入到上下文」(默认开启)时,超时草稿会按题结构化地以正常晚回复提交给模型,提交后问答卡片随结算消失;取消勾选时插件只收起卡片,不提交任何内容。超时说明只出现在工具的 pending 结果里,提示该轮提问已超时、用户没有正式提交但草稿保留,并要求模型在最后告知用户超时与对该草稿的处理决策。已超时的问答不再提供继续回答的入口。
开发
pnpm install
pnpm build
pnpm typecheck
许可证
本项目采用 Apache License 2.0 授权,版权声明见 COPYRIGHT。
Copyright (c) 2026 JularDepick