DSH HUB
HomePlugin StorePlugin PacksCommunityRankingsResourcesPublish Guide
Plugin source
Back to catalog

JularDepick /

JularDepick/dsh-question-timeout-protection

Verified

A plugin for dsh: once ask_user_question times out, the content you entered will remain in the UI or model context.

★ 2 Stars0 Forks0 IssuesN/A Community rating0 Confirmed installs
View on GitHub
READMESource: main@a075e6a2

dsh-question-timeout-protection

Version Copyright License

English | 简体中文

dsh提问超时保护插件: 一旦模型提问超时,将你的回答草稿保留在UI或上下文中,而不是直接丢弃.

为什么需要它

dsh 默认的提问是阻塞式的: 模型问完就一直等, 你离开一会儿, 整个对话就停在那里. 换成限时等待之后又出现另一个问题, 时间一到, 你已经选好, 已经写了一半的内容会被直接丢掉, 模型只知道「超时了」, 不知道你想说什么.

这个插件补上三件事: 让你看见还要等多久, 让你能暂停等待, 让超时那一刻的内容不丢.

它能带来什么

能力 你会看到什么
倒计时 问答卡片右上角显示还剩多少秒, 逐秒递减
临期预警 最后几秒数字变红闪烁, 提醒你尽快作答
无限等待 倒计时旁的按钮, 点一下就没有截止时间, 直到你提交或页面与会话结束
自动无限等待 工具栏上的常开开关, 开启后每条提问都自动进入无限等待
选中视觉 单选题选中后, 选项前的方形标号填充底色
超时草稿 超时那一刻的已选选项与已输入内容被保存下来
草稿回看 超时后提问行出现气泡按钮, 点开只读查看当时写了什么
注入上下文 开启后草稿随工具结果回到模型上下文, 模型能接着处理

安装

前置条件

  • dsh 版本在 >=0.2.1-rc.1 <=0.2.2-rc.1 之内, 不满足会被安装与启动阶段拒绝
  • Node.js >= 20

方式一: 从 npm 安装

dsh 原生支持从 npm 安装插件, 但 npm 上的同名包目前只是一个发布占位, 里面没有插件代码, 不能安装: 按下面的命令会装到占位包, dsh 只会打一条警告并跳过该插件, 界面上不会出现任何本插件的功能.

真正可用的前提是本项目发布到 npm 且 latest 指向正式版本. 到那时一条命令即可:

dsh plugin --profile <profile> add dsh-question-timeout-protection

在此之前请用下面的方式二至方式四.

方式二: 从源码构建后安装

适合从这个仓库直接使用:

pnpm install
pnpm pack
dsh plugin --profile <profile> add <tarball>

pnpm pack 会先构建, 完成后把 tarball 放进打包输出目录, 文件名形如 dsh-question-timeout-protection-0.1.1.tgz. 按文件名定位后换成实际路径即可.

方式三: 直接从 GitHub 源码安装

把包名换成 github:JularDepick/dsh-question-timeout-protection#<提交>, 由 prepare 负责构建.

pnpm 10 及以上默认拦截依赖的构建脚本, 因此首次 add 会失败并打印一个包键. 把该包键写进这个 profile 的 pnpm-workspace.yaml 里:

allowBuilds:
  dsh-question-timeout-protection: true

然后重新执行 add. 跳过这一步装上去没有构建产物, 插件不会工作.

方式四: 从 Release 的 tarball 安装

下载对应版本的 tarball 后直接:

dsh plugin --profile <profile> add <tarball>

这种方式不需要构建, 也不受 pnpm 构建脚本拦截影响.

快速开始

  1. 按上面任一方式把插件装进你的 profile
  2. 重启 dsh
  3. 让模型问你一个问题, 卡片右上角会出现倒计时; 想暂停就点旁边的「无限等待」

使用说明

倒计时与临期预警

倒计时只在正在进行的提问上出现, 按插件自己的截止时间走, 你聚焦输入框或开始打字都不会让它暂停. 剩余时间进入警示秒数时数字变红闪烁; 到了截止时间, 插件撤下自己的倒计时与故障提示, 把卡片还原成宿主自己的等待状态, 等结算回执到达后再决定锁定收起还是交还宿主.

历史提问与已结算回答的只读卡片上不会出现倒计时.

无限等待

倒计时右侧的「无限等待」按钮, 点击后本次提问不再有截止时间, 倒计时冻结为「已暂停」, 直到你提交才结束.

这个动作需要服务端确认登记成功才会生效, 因此点击后要等回执. 如果状态通道不可用, 按钮不会生效, 卡片会回到计时状态并在倒计时位置显示「无法无限等待」.

自动无限等待

工具栏模型选择控件左侧有一个常开开关「问答自动无限等待」. 开启后, 每一条新提问都自动进入无限等待, 正在等待的那条也会立刻冻结, 效果与手动点一次「无限等待」相同.

开关状态存在浏览器本地, 刷新后保留. 关闭开关只影响之后的新提问, 已经冻结的提问不会恢复倒计时, 仍由你提交结束.

这个开关只在卡片增强与无限等待都开启时出现.

超时草稿与只读回看

超时那一刻, 插件会把你已经选中的选项与已经输入的内容保存到内存. 之后该提问的工具调用行会出现一个气泡按钮, 点开就在气泡旁边弹出只读悬浮卡片, 按题展示当时的已选与补充, 不提供任何作答入口.

草稿为空, 也就是你什么都没选也没写时, 这次超时由插件直接关闭卡片, 不产生气泡.

草稿只存在内存里, 刷新页面后气泡与记录都会消失.

注入到上下文

这一项默认开启. 开启后, 插件在你作答期间就把草稿快照持续上报给服务端, 工具到期时取用最新一份, 按题随工具的 pending 结果带回模型上下文, 每道题带自己的已选与补充.

超时说明与草稿放在同一个结果里, 并明确要求模型在回复末尾告知你这次超时; 如果带回了草稿, 还要说明准备怎么处理它.

关闭这一项后, 插件只收起卡片, 不把草稿交给模型.

配置项

配置页在插件详情页顶部的插件级配置区块, 不在「包含的组件」里. 其中只有「注入到上下文」一个勾选可以调整, 勾选变化立即写入, 不需要保存或刷新.

配置项 取值 默认值 界面 说明
fallback ui / context / both both 可改一项 超时兜底. 界面只给「注入到上下文」勾选, 勾上写 both, 不勾写 ui. 界面保留草稿恒定开启, 所以不会出现 context
cardEnhancements 布尔 true 固定特性 只管装饰: 倒计时与闪烁, 单选底色, 提问气泡, 隐藏宿主自带的收起控件与等待文案. 关闭后装饰都不出现, 但超时收尾照常: 该收的卡片仍会被收起与锁定, 草稿仍会按配置上报
infiniteWait 布尔 true 固定特性 提供「无限等待」按钮与工具栏常开开关, 关闭后两者一并移除
draftFallback 布尔 true 固定特性 超时收尾开关. 关闭后客户端不再收尾卡片也不再上报草稿, 这一轮交还宿主; 提问仍由插件按时结算
warningSeconds 数字 5 不暴露 进入红字闪烁的剩余秒数, 取值 1 至 60
timeoutSeconds 数字 120 不暴露 模型没有显式传等待秒数时用的时长, 取值 1 至 2147483

兼容性

项目 版本
dsh >=0.2.1-rc.1 <=0.2.2-rc.1
Node.js >= 20

宿主 dsh 自身的 Node.js 要求以对应版本的发行说明为准.

常见问题

超时后我已经输入的内容会丢吗

不会丢在本页. 插件会在超时那一刻把已选与已输入内容保存到内存, 并记入该提问的气泡按钮, 你可以随时点开只读查看. 但刷新页面后这份记录会消失.

模型能看到我写了什么吗

看你有没有勾选「注入到上下文」. 勾选时草稿随工具结果进入模型上下文; 取消勾选时只留在界面, 模型拿不到.

卡片为什么突然消失了

因为这次提问超时并被插件接管. 插件会收起卡片并锁定, 避免留下一个点也点不动的对话框. 想回看当时的内容, 点提问行的气泡按钮; 超时那一刻没有任何选择与输入时不会产生气泡.

为什么我的界面上没有倒计时

常见原因包括: 卡片增强被关掉; 这次提问是必须回答的阻塞提问, 模型传了 -1; 界面语言不是中文或英文. 另外刷新页面时如果卡片已经处于编辑或等待状态, 插件无法还原截止时间, 在卡片回到计时状态之前也不会显示.

点了「无限等待」之后会怎样

本次提问不再有截止时间, 模型会一直等, 直到你提交, 或页面与会话结束. 如果状态通道不可用, 按钮不会生效, 卡片回到计时状态并显示「无法无限等待」.

刷新页面后气泡不见了

草稿只保存在内存里, 不做持久化, 所以刷新后本页记录的气泡与草稿都会丢. 仍在等待的提问会按宿主持久化的草稿重新评估.

需要改我的预设吗

不需要. 插件在每个 agent 作用域注册同名提问工具, 就近遮蔽宿主的阻塞式提问.

会自动替我提交答案吗

不会. 超时不会自动勾选任何选项, 也不会把草稿当成正式回答提交.

已知限制

依赖宿主界面

卡片与工具行靠宿主的类名后缀, data-question-key, data-chat-call-id, aria-checked 等特征定位, 宿主控件按中英文标签识别; 工具栏开关优先按模型选择控件的无障碍标签定位, 标签不匹配时退回工具栏容器内按结构定位, 再退回全文档查找, 定位失败时按原因各留一条 console.warn 而不是静默消失. 宿主改动这些结构或文案时对应增强会失效, 识别标签与选择器集中在源码的常量文件里.

依赖宿主提问投影

客户端靠宿主 sessions 服务的 userQuestions 投影判断提问是否进入 continued 态, 草稿上报, 超时收尾与气泡都由它驱动. 该服务缺失或接口改名时插件按会话各打一条 console.warn: 倒计时与卡片装饰仍在, 但草稿不上报, 超时收尾不执行, 气泡不出现.

会话订阅上限

同时最多保持 8 个会话的投影订阅, 超出后最久未出现的会话降级为每秒轮询, 该会话的超时接管会延后; 轮询兜底也最多 8 个, 再超出时释放最久未出现的会话, 其超时兜底可能不再生效.

不做持久化

草稿只在客户端内存里, 刷新后气泡与记录都会丢. 仍在等待的提问会按宿主持久化的草稿重新评估并在满足条件时接管; 已结算的行不回显.

「无限等待」与草稿上报需要网页客户端

两者共用一条带令牌的通道, 挂在宿主自己的 HTTP 服务上, 与界面同源. 页面先取令牌再上报, 令牌取不到时两个能力都不生效. 通道还会核对请求的 Host 必须为本机回环地址, 因此宿主绑定到非回环地址或经反向代理以非回环域名访问时通道会被拒绝. 没有网页客户端的部署里服务端仍会按超时结算, 但草稿不会进入模型上下文, 「无限等待」也不生效.

界面语言

宿主 0.2.2-rc.1 起提供 8 种界面语言, 插件只识别中文与英文标签. 其他语言界面下倒计时, 无限等待按钮与工具栏开关不出现, 插件自绘的气泡与配置页文案回退英文. ja 的「回答」与中文同形会被隐藏, 但 ja 的等待文案仍会保留, 与被收起卡片的状态不一致; 其余语言下宿主的「回答」入口与等待文案大多仍然可见. ja 下空草稿超时不会出现插件气泡, 宿主的入口又已按文案隐藏, 因此这一轮没有可点的回看入口. 卡片关闭在这些语言下退化为隐藏类, 提交按钮不锁定.

其他

  • 插件自行计时, 到期后由插件按超时结算并释放宿主那边的前台等待; 你在超时那一刻之前真正提交的答案优先采用
  • 多标签页同时打开同一会话时, 服务端按调用标识只保留一份草稿快照, 后上报的标签页会覆盖先到的那份
  • 气泡里的草稿记录只保留最近 200 条, 更早的气泡不再可点开
  • 宿主 0.2.2-rc.1 打开卡片时会预选带推荐标记的选项, 插件按投影里的选项原文剥掉这些预选值; 多选时点过任一选项后, 其余预选项按宿主自己的提交口径一并保留
  • 只是点了「跳过」而没有选择与输入时, 草稿按空处理, 这次超时由插件关闭卡片
  • 草稿按题合并三处来源, 优先级为宿主持久化记录, 当前显示题的实时值, 插件自己的快照; 读实时值时已选标签取的是宿主给读屏用的文案, 其中的「(推荐)」这类后缀可能被省略
  • 注入给模型的超时说明目前只有中文, 英文界面下模型收到的仍是中文说明
  • 草稿超过单次上报上限 256 KiB 时界面显示「草稿过长, 未送达」, 这一条不计入连续失败次数; 连续失败三次后该轮判定通道不可用, 插件不再接管, 卡片交还宿主继续可作答

更新与卸载

升级时先移除旧版本再装新版本:

dsh plugin --profile <profile> remove dsh-question-timeout-protection
dsh plugin --profile <profile> add <新包或 tarball>

只想停用而不卸载时, 在该 profile 的 cordis.patch.yml 里按行 id 禁用:

- id: question-timeout-protection
  disabled: true

开发

pnpm install
pnpm build
pnpm typecheck
pnpm run check:translation

pnpm run check:translation 会核对三份翻译文件, 配置页字典与界面文案常量是否一致, 以及文案改动是否同步更新了维护时间.

src/translation/*.ini 是同一套措辞的镜像, 当前界面并不读取它: 界面文案的实际来源是 src/constants.ts 与 src/client/i18n.ts, 改可见文案要同时改这两处或其中之一与三份 ini.

许可证

本项目采用 Apache License 2.0 授权,版权声明见 COPYRIGHT.

Copyright (c) 2026 JularDepick

相关链接

  • dsh 官方仓库: https://github.com/deepseek-ai/deepseek-harness
  • dsh 插件开发文档: https://github.com/deepseek-ai/deepseek-harness/tree/master/docs/user/develop
—/ 5

No ratings yet

Verified DSH bundle

Commit a075e6a27079

Community comments

No comments yet. Be the first to write one.

DSH HUB

A community index for DSH plugins. Not an official GitHub or DeepSeek AI product.

CommunityResourcesAPIAbout