Back to home@Linux-System-0

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.iddsh-agent 强制相等)访问对应会话。

卡片包含:

  • 状态点:高峰橙、低峰绿、错误红、判定中灰。
  • 开关按钮自动调度·开(绿色)/ 自动调度·关(灰色)——点击即启用/停用 自动调度(高峰挂起、低峰运行)。
  • 「编辑」按钮:展开统一表单,可一次改 判峰脚本轮询间隔(秒,数字 填写而非下拉选择)、注释/备注,点「保存」即时生效并持久化。
  • 每 1.5 秒自动轮询刷新;默认折叠为一行,点击卡头展开详情(模式/间隔/上次判定/ 脚本/备注/输出/错误)。

宿主 → 浏览器通道

宿主自己注册两个同源 HTTP 端点(最简单,不动框架与前端产物):

端点方法用途
/peaklow/state?session=<id>GET读取当前会话的快照(mode/script/intervalMs/notes/lastStdout/lastError/lastCheckedAt/attempts/enabled),供前端轮询
/peaklow/controlPOST接收 { 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

它会:

  1. @pi/peaklow 软链进 $DSH_HOME/profiles/web/node_modules/@pi/peaklow
  2. 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