peaklow
DeepSeek Harness (Cordis) 高峰/低峰自动调度插件:宿主 + 浏览器端 client 状态卡。dsh-plugin
- Stars
- 1
- Language
- JavaScript
- Created
- Aug 23, 2026
- Updated
- Aug 23, 2026
Introduction
高峰/低峰自动调度插件(Cordis / DeepSeek Harness)
@pi/peaklow 是一个运行在 DeepSeek Harness 宿主根作用域的 Cordis 插件,为 web
profile 提供「高峰自动停止、低峰自动开始」的会话级自动调度,并在浏览器端会话页
头部显示一张可交互的 peaklow 状态卡。
本包是一个【宿主 + client】双面包:宿主负责判定与调度,client 负责在浏览器里展示 和控制。
行为
自动启动(无弹窗):新会话开始时,插件不再询问任何是/否,直接用配置自动启用:
- 若该 workspace 已保存过配置(
$DSH_HOME/peaklow/<key>.json),用保存的script/intervalMs/notes启用。 - 若从未配置过,使用默认脚本
bash -c 'exit 101'兜底(始终判定为低峰/放行), 保证插件先能跑、任务不会被误挂起,并提示在配置里改脚本。
高峰/低峰判定:按轮询间隔运行用户脚本。
- 退出码
100= 高峰 →agent/pre-step返回{ kind: 'reject' }挂起用户步骤。 - 退出码
101= 低峰 → 放行;若脚本有输出,一并注入上下文。 - 其它退出码 = 错误 → 记录
lastError并放行(避免误挂起,保证低峰期能正常进行)。
挂起判定:仅当明确判为高峰(
mode === 'peak')且自动调度开启时才挂起;低峰、 未知、错误一律放行——确保「低峰自动开始」不被误挂。
全程自动(无需手动):高峰挂起的步骤会暂存,一旦判定转回低峰,插件自动把
被挂起的消息重新入队并唤醒该 agent 恢复执行(agent/steer + inject)。整个
「高峰自动停止 → 低峰自动开始」闭环无需你手动干预。
状态刷新与开关解耦:无论「自动调度」开/关,轮询都会持续运行并刷新状态 (mode / 上次判定 / 输出)。开关只影响「高峰是否挂起」:关掉后高峰不再挂起,但 状态卡仍会定时刷新。
配置热更新:每个轮询周期都会重新载入 $DSH_HOME/peaklow/<key>.json。即使直接
改了磁盘上的配置文件,下一个周期就会用上新脚本/间隔,避免「脚本是高峰但 mode
仍为低峰、挂起失效」。
启用后,插件向系统提示注入「已启用调度、执行阶段不要向用户提问」及当前判定/脚本/ 输出等上下文。
浏览器端状态卡(可交互)
client 插件把一张状态卡注册进会话 slot conversation.session.header.actions,通过
sessionId(宿主侧 agent.id === session.id,dsh-agent 强制相等)访问对应会话。
卡片包含:
- 状态点:高峰橙、低峰绿、错误红、判定中灰。
- 开关按钮:
自动调度·开(绿色)/自动调度·关(灰色)——点击即启用/停用 自动调度(高峰挂起、低峰运行)。 - 「编辑」按钮:展开统一表单,可一次改 判峰脚本、轮询间隔(秒,数字 填写而非下拉选择)、注释/备注,点「保存」即时生效并持久化。
- 每 1.5 秒自动轮询刷新;默认折叠为一行,点击卡头展开详情(模式/间隔/上次判定/ 脚本/备注/输出/错误)。
宿主 → 浏览器通道
宿主自己注册两个同源 HTTP 端点(最简单,不动框架与前端产物):
| 端点 | 方法 | 用途 |
|---|---|---|
/peaklow/state?session=<id> | GET | 读取当前会话的快照(mode/script/intervalMs/notes/lastStdout/lastError/lastCheckedAt/attempts/enabled),供前端轮询 |
/peaklow/control | POST | 接收 { session, enabled?, intervalMs?, script?, notes? },开/关、改间隔、改脚本/注释,并即时生效 + 持久化到 $DSH_HOME/peaklow/<key>.json |
说明:
@deepseek-ai/dsh-host-plugin-inventory只暴露「插件是否加载」这类通用 Loader 状态,不含 peaklow 的逐 agent 运行状态,故需自行用上述端点作为通道。若需授权围栏, 可改用ctx.connection.rpc.handle+ client 侧client-request/client-response。
文件
| 文件 | 说明 |
|---|---|
peaklow.mjs | 宿主插件源码(根作用域,inject: ['timer','webServer']),含 /peaklow/state 与 /peaklow/control 端点、自动启动与判峰逻辑 |
client.js | 浏览器端 client bundle(手写 window.__ModuleLoader__.load(...),零构建,用 React.createElement) |
client/index.tsx | 同功能的 TSX 源码(可选,供 esbuild 构建) |
build-client.mjs | 用 esbuild 把 TSX 打成 load({id,factory}) 格式的脚本 |
package.json | @pi/peaklow 包元信息 + dsh.host / dsh.client 声明 |
install.sh | 安装宿主 + client 插件进 web profile,并以包名注册 |
verify.sh | 语法 + 配置树校验 |
安装
./install.sh
它会:
- 把
@pi/peaklow软链进$DSH_HOME/profiles/web/node_modules/@pi/peaklow。 - 把
cordis.patch.yml里 peaklow 的入口由相对路径改为包名@pi/peaklow。 ——这很关键:dsh-client-modules只扫描已加载的加载器入口并按entry.options.name解析dsh.client。若仍写./peaklow.mjs,则无法解析到dsh.client,client 插件不会被下发到浏览器。
安装后重启 dsh web(无需重建前端)即可:宿主侧会把 @pi/peaklow 加入
window.__DSH_BOOT__ 并从 /plugins/@pi/peaklow/client.js 提供 bundle,打开任一会话页
头部即可看到并操作状态卡。
前端产物不需要重建。但请注意 client bundle 与宿主的加载方式不同:
/plugins/@pi/peaklow/client.js是从磁盘实时读取的(改动即生效),而宿主peaklow.mjs仅在dsh web启动时加载一次。因此改动宿主逻辑(如新增端点)后 必须重启dsh web才生效。
改用 esbuild 从 TSX 构建(可选)
pnpm add -D esbuild # 或 npm i -D esbuild(一次性)
node build-client.mjs # 生成 client.js