drscrewdriver / dsh-input-traffic

已收录

打断并输入和下一轮插入不再二选一 支持红色打断插入 黄色下一自然轮插入和绿色待整个逻辑执行完成后输入 并支持邻近高峰期冻结会话在非工作高价时间再继续会话 traffic policy of woring session stream cut in slide in inputs

main会话 查看源代码

安装

npx -y @deepseek-ai/dsh plugin --profile web add github:drscrewdriver/dsh-input-traffic

此安装命令根据 GitHub 仓库地址生成,是未经验证的安装起点。

README

维护者编写的文档快照。

在 GitHub 查看 ↗
提交版本 2c02ee9同步于 2026年8月18日

给 DeepSeek Harness Web GUI 一个三档输入交通管制

中文 · English

MIT License Public beta

dsh-input-traffic

智能体忙碌时不再只有"打断"或"排队"二选一:红色打断立即输入、黄色下一轮插入、绿色排队到最后,三档并存;邻近 DeepSeek 高峰收费时段可一键冻结会话,错峰再恢复继续。

无需修改 dsh 源码、无需提 PR:dsh plugin 命令组装 + bundle patch 装配的 cordis client 插件。

它能做什么

  • 三档插入并存:智能体忙碌时,每一条输入都先进入等待区,再按需选择何时进入对话——不再只有一个"打断"或只有一个"排队":
    • 🔴 红色(now):打断当前轮次并立即输入——当前生成停止,消息作为新输入被 agent 立刻处理并回复;
    • 🟡 黄色(next):下一自然轮插入——不打断当前执行,当前正在进行的动作(工具调用 / 本轮生成)结束后插入;
    • 🟢 绿色(later):待整个逻辑执行完成后输入——排队等待,上一轮输入的所有动作都结束后再处理(默认状态)。
  • 黄色可逆:对已插话(黄色)的消息点绿色按钮,可撤销插入、收回排队状态。
  • 排队内容可再编辑:已经排在队列中的消息可以直接在队列里编辑——多行编辑区随内容自动扩展,长消息也能完整查看与修改(Enter 保存 / Shift+Enter 换行 / Esc 取消);也可打回输入框再编辑(回填 composer 修改后重新发送)。
  • 队列管理:等待区的消息可以上移 / 下移调整顺序、删除,以及队列级「取消并清空」。
  • 编辑不丢内容:编辑保存失败(消息已被 agent 认领)时,编辑内容自动退回主输入框,不会丢失;主输入框已有内容时不覆盖。
  • 高峰期冻结:输入框右侧「冻结会话」按钮——邻近 DeepSeek 高峰收费时段(9:00-12:00、14:00-18:00)时主动暂停 API 消耗:当前轮次自然完成后暂停,未发送队列冻结保存;「恢复会话」后在非高价时间继续处理。
  • 接管官方行为:插件生效时,官方设置面板的「繁忙时 Enter 键行为」设置行不再显示(Enter 行为固定为绿色排队)。

界面预览

等待区与冻结按钮在会话页面中的布局示意:

┌─ 输入区 ──────────────────────────────── 发送 ── [❄ 冻结会话] ─┐
└────────────────────────────────────────────────────────────────┘
┌─ 排队等待区(3 档规划 dock)────────────────────────────────────┐
│ ┌ 2 条排队消息                                     🗑 取消并清空 ┐ │
│ │ 🟢 排队   第一条消息内容预览…          ↑ ↓ 打回 编辑 删除      │ │
│ │ 🟢 排队   第二条消息内容预览…          ↑ ↓ 打回 编辑 删除      │ │
│ │   编辑中:多行文本区随内容自动扩展(上限约 8 行)              │ │
│ │   Enter 保存 · Shift+Enter 换行 · Esc 取消                    │ │
│ └──────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘

三档语义

档位颜色语义底层机制(dsh 现有 RPC 组合)
later(默认)绿排队:上一轮输入的动作都结束后再处理;对已插话(黄色)的消息点绿 = 撤销插入,收回排队Enter 默认 queue → agent.followup()(next-turn);收回 = updateQueue(remove) + send(text)
next下一自然轮插入:当前正在执行的动作结束后插入updateQueue(id, { kind: 'steer' })agent.steer()(next-step 步骤边界)
now打断并输入:停止当前轮次,消息立即被处理cancel()updateQueue(remove)(避免 inbox 重复插入拒绝)→ send(text)(重新提交,唤醒 driver 立即处理)

红色为什么是 cancel + remove + resend:harness 的 inbox 禁止重复插入同一条消息,打断后直接 steer 会被拒绝导致消息滞留(详见「常见问题」)。

会话冻结 / 恢复(高峰期暂停)

输入框右侧(发送按钮旁)的「冻结会话 / 恢复会话」按钮,用于即将进入 DeepSeek 高峰收费时段时暂停 API 消耗:

  • 冻结:当前轮次不打断、自然完成后暂停;未发送队列被冻结保存(从等待区移除);等待区显示「已冻结」横幅;
  • 恢复:冻结的排队消息重新入队,agent 按 FIFO 继续处理;
  • 引擎实现:冻结 = 逐条 updateQueue(remove) 分离队列(纯文本副本存于插件 store),当前轮次完成后 driver 因无 pending 自然停止;恢复 = 逐条 send(text) 重新提交并唤醒 driver;
  • 注意:含非文本内容(图片)的排队消息无法重发,冻结时会随队列释放(不会恢复)。

队列管理

等待区每条消息(未冻结时)提供:

操作说明
上移 / 下移调整 FIFO 顺序(整个队列按新顺序重建;含图片消息时禁用)
打回输入框编辑消息内容回填 composer 输入框并从队列移除,编辑后重新发送
编辑 / 删除多行文本区直接修改排队内容 / 取消该消息
红 / 黄 / 绿规划见「三档语义」
取消并清空停止当前执行并清空全部排队消息

编辑排队消息(行内编辑)时:

  • 自动扩展:编辑区随内容实时增高,长消息完整展开,上限约 8 行,超出后内部滚动;
  • 快捷键Enter 保存,Shift+Enter 换行,Esc 取消(中文输入法组合期间不会误保存);
  • 失败兜底:保存时若消息已被 agent 认领(如「已经开始发送」),编辑内容自动退回主输入框并提示,不会丢失;仅当主输入框为空时回填,已有草稿不被覆盖。

安装

# 方式一:从 npm 安装(推荐)
#   (profile 是 pnpm workspace root,add 需带 -w 参数)
dsh plugin --profile web add dsh-input-traffic -w

# 方式二:git 或本地路径组装
# dsh plugin --profile web add /absolute/path/to/dsh-input-traffic -w
#    (git 安装后需在 profile 的 node_modules 内现场构建:npm install --legacy-peer-deps && npm run build)

# 确认组合树包含新行
dsh web --dump-config | grep -B1 -A2 'input-traffic'

# 重启 dsh web —— 必做!运行中实例不热载 bundle 层
dsh web

本地构建与测试:

npm install --legacy-peer-deps   # @deepseek-ai client 包链在 npm 上不完整,仅装工具链
npm run build                    # tsc(lib/types)+ tsdown(lib/index.js + lib/client.js)
node examples/verify-assembly.mjs  # 12 项装配断言
npm test                         # 32 项 vitest 组件测试

使用方式

  1. 智能体忙碌时直接输入并发送,消息统一进入等待区(默认绿色排队);
  2. 在等待区对消息点规划按钮:
    • 🟡 黄色 = 插话——当前动作结束后插入;
    • 🔴 红色 = 打断——立即中断当前动作,消息随后被处理;
    • 🟢 绿色 = 保持排队(当前默认态);对已插话的消息点绿 = 收回排队;
  3. 需要调整顺序 / 修改内容:用上移下移、打回输入框编辑或多行编辑(Enter 保存、Shift+Enter 换行);
  4. 邻近高峰时段:点击输入框右侧「冻结会话」,当前轮次完成后自动暂停;非高价时间点「恢复会话」继续。

常见问题

打断后消息没有回复 / 对话停住

历史问题(已修复)。根因:harness 的 inbox 禁止重复插入同一条消息——打断后直接对原消息执行 steer 会被 "message is already pending" 拒绝,消息滞留在队列、agent 停摆。当前实现改为 cancel → remove → resend(新消息重新提交),打断消息会立即被 agent 处理并回复。若仍遇到,请确认插件为最新构建并重启 dsh web。

编辑保存失败后,内容去哪了?

不会丢。保存失败(消息已被 agent 认领)时,编辑内容会自动退回主输入框并弹出「编辑失败,内容已退回主输入框」提示;主输入框已有内容时不回填,仅提示编辑失败。

设置面板里找不到「繁忙时 Enter 键行为」

正常——插件接管后该设置行被隐藏,Enter 行为固定为绿色排队(旧偏好不会在隐藏的设置行背后继续生效)。

冻结后排队消息消失了

正常——冻结会把队列保存到插件内存(从等待区移除),恢复后重新出现。刷新页面会丢失冻结队列,请避免冻结后刷新。

上移/下移按钮不可用

队列中含图片等非文本消息时,排序会禁用(图片消息无法重发)。打回输入框编辑同理。

打断/插话按钮不可用

智能体空闲(未运行)时红黄两档禁用——空闲时消息本来就会被立即处理,无需规划。

卸载

dsh plugin --profile web remove dsh-input-traffic

卸载后重启 dsh web,即恢复官方 queue dock 与「繁忙时 Enter 键行为」设置行。

兼容性与隐私

  • 需要已安装 DeepSeek Harness 并使用 web profile;在 Windows / macOS / Linux 的 dsh web 上验证。
  • 插件为纯浏览器侧(client)插件,所有操作均通过 dsh 现有 RPC(session.prompt / session.updateQueue / session.cancel)完成,不改动任何官方源码
  • 插件不读取、不上传任何会话内容以外的数据;冻结队列仅保存在本机浏览器内存。
  • 类型契约在 src/types/contracts.d.ts 本地声明(npm 上 dsh client 包链不完整),构建时以 harness 源码核实为准。

架构

src/
├── index.ts                  # node half(loader 行入口,空 apply)
├── invariant.ts              # 接管不变量说明
├── types/contracts.d.ts      # @deepseek-ai/* 平台面本地类型声明
└── client/
    ├── index.ts              # browser half apply:busyEnter 固定 queue + 三处 slot 注册
    ├── steer-queue-dock.tsx  # 三档规划等待区(shadowing conversation.input.dock id queue)
    ├── freeze-button.tsx     # 冻结/恢复按钮(conversation.input.right)
    ├── freeze-store.ts       # 冻结状态共享 store(composer 按钮 ↔ dock 横幅)
    ├── hide-enter-row.tsx    # 设置行隐藏(shadowing settings.general.item id composer-enter)
    ├── locales.ts            # steer 字典(zh/en)
    └── *.module.css
  • slot shadowing:list 型 slot 同 id + 更低 priority(-1)覆盖官方条目(QueueDock、EnterBehaviorRow)。
  • 构建链:tsdown 复制 harness packages/client/tsdown.client.ts 语义(__ModuleLoader__.load banner、CSS Modules lightningcss 内联、平台模块 external 表、bundle purity gate)。
  • 消费方契约conversation.updateQueue / cancel / send / input.for(actx).notify / actions.setDraft(官方 ui-conversation service,api-proxy.ts 核实)。
  • 编辑区自动扩展resizeEditor(steer-queue-dock.tsx 导出的纯函数)把 textarea 高度重置后按 scrollHeight 生长,CSS max-height 封顶后内部滚动。

真实环境验证(Windows,2026-08-17)

dsh web 真实启动后浏览器端到端验证,全程控制台零应用错误:

验证项结果
插件装配组合树含 input-traffic 行;插件页签「已挂载已启用」;/plugins/dsh-input-traffic/client.js 200
设置行隐藏设置面板「繁忙时 Enter 键行为」行不存在(DOM 全量搜索零匹配)
红色 now打断后消息立即被处理:agent 明确回复被打断消息并继续;无滞留中间态
黄色 next + 绿色撤回插话后点绿收回排队,消息回到等待区
冻结 / 恢复当前轮次自然完成不打断、队列冻结保存、横幅提示;恢复后 FIFO 全部处理完成
队列编辑(多行 / 失败退回)组件测试覆盖(32 项全绿);真实环境复核待做

参考

  • dsh-plugin-creation-convention.md(workspace 根部)——本插件遵循的 dsh 插件创建流程规约
  • 语义参考:dsh-traffic-light(Session 运行状态红绿灯提示)
  • harness 锚点:packages/client/AGENTS.mdpackages/client/tsdown.client.tspackages/client/web/src/platform.tspackages/bundle/web-app/cordis.patch.ymlpackages/client/ui-conversation/src/client/queue/QueueDock.tsxpackages/host/apiproxy/src/api-proxy.ts

License

MIT

项目文件与信号

以下项目是目录快照中检测到的公开仓库信号。

测试已检测
示例已检测

仓库信息

开发语言
TypeScript
许可证
MIT
最后更新
2026年8月17日 21:20

谨慎安装

请检查源代码、权限、生命周期脚本、依赖与网络访问;不受信任的插件应先在隔离环境中测试。