deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:drscrewdriver/dsh-input-traffic
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
给 DeepSeek Harness Web GUI 一个三档输入交通管制
中文 · English
智能体忙碌时不再只有"打断"或"排队"二选一:红色打断立即输入、黄色下一轮插入、绿色排队到最后,三档并存;邻近 DeepSeek 高峰收费时段可一键冻结会话,错峰再恢复继续。
无需修改 dsh 源码、无需提 PR:dsh plugin 命令组装 + bundle patch 装配的 cordis client 插件。
等待区与冻结按钮在会话页面中的布局示意:
┌─ 输入区 ──────────────────────────────── 发送 ── [❄ 冻结会话] ─┐
└────────────────────────────────────────────────────────────────┘
┌─ 排队等待区(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 消耗:
updateQueue(remove) 分离队列(纯文本副本存于插件 store),当前轮次完成后 driver 因无 pending 自然停止;恢复 = 逐条 send(text) 重新提交并唤醒 driver;等待区每条消息(未冻结时)提供:
| 操作 | 说明 |
|---|---|
| 上移 / 下移 | 调整 FIFO 顺序(整个队列按新顺序重建;含图片消息时禁用) |
| 打回输入框编辑 | 消息内容回填 composer 输入框并从队列移除,编辑后重新发送 |
| 编辑 / 删除 | 多行文本区直接修改排队内容 / 取消该消息 |
| 红 / 黄 / 绿规划 | 见「三档语义」 |
| 取消并清空 | 停止当前执行并清空全部排队消息 |
编辑排队消息(行内编辑)时:
Enter 保存,Shift+Enter 换行,Esc 取消(中文输入法组合期间不会误保存);# 方式一:从 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 组件测试
历史问题(已修复)。根因:harness 的 inbox 禁止重复插入同一条消息——打断后直接对原消息执行 steer 会被 "message is already pending" 拒绝,消息滞留在队列、agent 停摆。当前实现改为 cancel → remove → resend(新消息重新提交),打断消息会立即被 agent 处理并回复。若仍遇到,请确认插件为最新构建并重启 dsh web。
不会丢。保存失败(消息已被 agent 认领)时,编辑内容会自动退回主输入框并弹出「编辑失败,内容已退回主输入框」提示;主输入框已有内容时不回填,仅提示编辑失败。
正常——插件接管后该设置行被隐藏,Enter 行为固定为绿色排队(旧偏好不会在隐藏的设置行背后继续生效)。
正常——冻结会把队列保存到插件内存(从等待区移除),恢复后重新出现。刷新页面会丢失冻结队列,请避免冻结后刷新。
队列中含图片等非文本消息时,排序会禁用(图片消息无法重发)。打回输入框编辑同理。
智能体空闲(未运行)时红黄两档禁用——空闲时消息本来就会被立即处理,无需规划。
dsh plugin --profile web remove dsh-input-traffic
卸载后重启 dsh web,即恢复官方 queue dock 与「繁忙时 Enter 键行为」设置行。
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
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 封顶后内部滚动。dsh web 真实启动后浏览器端到端验证,全程控制台零应用错误:
| 验证项 | 结果 |
|---|---|
| 插件装配 | 组合树含 input-traffic 行;插件页签「已挂载已启用」;/plugins/dsh-input-traffic/client.js 200 |
| 设置行隐藏 | 设置面板「繁忙时 Enter 键行为」行不存在(DOM 全量搜索零匹配) |
| 红色 now | 打断后消息立即被处理:agent 明确回复被打断消息并继续;无滞留中间态 |
| 黄色 next + 绿色撤回 | 插话后点绿收回排队,消息回到等待区 |
| 冻结 / 恢复 | 当前轮次自然完成不打断、队列冻结保存、横幅提示;恢复后 FIFO 全部处理完成 |
| 队列编辑(多行 / 失败退回) | 组件测试覆盖(32 项全绿);真实环境复核待做 |
packages/client/AGENTS.md、packages/client/tsdown.client.ts、packages/client/web/src/platform.ts、packages/bundle/web-app/cordis.patch.yml、packages/client/ui-conversation/src/client/queue/QueueDock.tsx、packages/host/apiproxy/src/api-proxy.tsMIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。