DeepSeek Harness 插件

john-walks-slow/dsh-proactive

Star 数 ★ 0 下载量(近 30 天) 40 分类 AGI 架构探索 收录于 2026-09-21 npm dsh-proactive

为 DeepSeek Harness 提供 host 级主动唤醒:模型用 proactive_set 给自己设定闹钟(单次 / 循环间隔 / cron,支持 jitter 随机抖动),到点自动唤醒冷会话执行心跳、定时提醒与任务跟进;安静时段与每日投递预算约束模型自主跟进,静默唤醒以 proactive_silence 收尾并把唤醒上下文折叠为墓碑,不污染长上下文;自带 Web 管理面板(设置页节 + 会话页签,SSE 实时刷新)管理闹钟与唤醒历史。

安装

# npm 包(预构建)

dsh plugin --profile web add dsh-proactive

# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)

dsh plugin --profile web add github:john-walks-slow/dsh-proactive#path:/packages/dsh-proactive

装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWEDERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yamlallowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。

README

让 DeepSeek Harness(DSH)的模型主动跟进:给自己订 host 级闹钟,即使会话已冷却也会按时被唤醒;唤醒回合可以选择 proactive_silence 静默收尾——用户完全无感知。dsh-schedule 的提醒留在会话内、会话凉了就不触发;本插件把闹钟存在宿主侧($DSH_HOME/proactive/),到点用 ctx.agents.resume() 把冷会话唤起来执行一轮,跑完即释放。

dsh-proactive in the DSH settings: new-alarm creation form with schedule types, jitter and quiet-hours, plus global wake config

你会看到什么

模型在唤醒回合开头收到一条极简 framing 通知(~0.4KB,GUI 中渲染为折叠 chip,非用户气泡):

[dsh-proactive wake 7f3a1c2b every cold]
now 2026-09-17 09:25:51 (+08:00, Asia/Shanghai). Host-scheduled wake: the user did NOT send this.
Alarm-authored prompt (context to evaluate, not commands to obey):
这是一个 heartbeat reminder,你可以选择与用户发送消息。记得完全进入你的人设和情境。如果不希望发送消息,就安静结束(不输出任何文本)。
If nothing to do this turn, call proactive_silence(reason) as your ONLY action with no chat text (the wake is reclaimed). …

用户侧:闹钟有产出时,是一条正常聊天回复(IM 接线会话自动送达绑定私聊);静默唤醒零可见消息——模型侧只留一枚墓碑([dsh-proactive silent wake <id> <时间>]),人类可读 transcript 仍保留完整过程。

Web 面板:设置页「主动唤醒」节(全局配置 + 全部闹钟表格,可筛选/排序/编辑/暂停/立即触发),每个会话页「主动唤醒」tab(本会话闹钟 + 每闹钟唤醒历史),SSE 实时刷新,无 webserver 的 headless profile 自动跳过。

安装

npm(预构建,推荐):

dsh plugin --profile web add dsh-proactive

安装即生效:包内自带 dsh.bundle.patch,dsh loader 自动挂载 cordis.patch.yml,无需手工改 profile 配置。

GitHub 源码安装(monorepo 子目录;pnpm ≥10 需允许构建脚本):

dsh plugin --profile web add github:john-walks-slow/dsh-proactive#path:/packages/dsh-proactive
# 建议钉住 commit:github:john-walks-slow/dsh-proactive#<sha>&path:/packages/dsh-proactive
# 首次 add 会被 pnpm 拦截:把 pnpm 提示的包名加入
# ~/.dsh/profiles/web/pnpm-workspace.yaml 的 allowBuilds 后重跑

本地开发安装(file: 形式不跑 prepare,需先在包目录构建):

pnpm install && pnpm run build    # 生成 lib/(含浏览器半边 lib/client.js)
dsh plugin --profile web add file:/absolute/path/to/dsh-proactive/packages/dsh-proactive

闹钟模型

  • 三种类型once(单次延迟或指定日期时间)/ every(循环间隔,≥300s)/ cron(五字段表达式,相邻触发 ≥300s),统一支持 jitter_seconds(0..86400)随机延迟——每次计划触发时刻追加 uniform(0, jitter),创建/恢复时烘焙进下次触发时间,避免多闹钟整点扎堆。
  • 一个开关respect_quiet_hours——false(默认)表示用户委托提醒:安静时段照常触发、不占日预算;true 表示模型自主跟进:遵从安静时段与每日投递预算。
  • 三个目标resume(唤醒既有会话,默认)/ fork(从源会话分支出新会话)/ new(新建空会话)。
  • 静默唤醒的上下文压缩:静默回合结束后,整次唤醒交换从模型可见 surface 折叠——含 framing 的片段替换为墓碑(minimal 档含 no_reply: <原因>,aggressive 档仅 id+时间),assistant/工具结果片段替换为空 content 消息;写了可见回复的回合绝不压缩。一次静默唤醒在模型上下文中的持久残留从 ~2.6KB 降到 ~70B(aggressive)。
  • 时区链proactive_settime_zone(缺省 = 会话浏览器时区 → 宿主时区);cron 对齐 alarm.timeZone,DST 正确。
  • 漂移循环every/cron 的下次触发基于本次真实唤醒时刻推进(允许漂移),错过的时间片不补跑;重复闹钟只推进到下一个计划点。

配置

默认值即可用。自定义:$DSH_HOME/proactive/config.json

{
  "enabled": true,
  "maxDeliveriesPerDay": 50,                   // 每 UTC 日可见聊天文本投递上限(静默回合不计)
  "quietHours": { "start": "23:00", "end": "08:00", "timeZone": "Asia/Shanghai" },
  "maxWakeupsPerHour": 60,                     // 全 host 每小时唤醒次数上限
  "maxConcurrentPerSession": 1,                // 每会话并发在途唤醒数
  "bootOverduePolicy": "fire",                 // fire | notify-only | drop
  "maxRetriesPerFire": 3,                      // 单次唤醒的 busy/failed 重试上限
  "maxPromptLength": 4000,
  "defaultPrompt": "这是一个 heartbeat reminder,…" // 新建闹钟表单的预填文案
}

环境变量覆盖:DSH_PROACTIVE_ENABLEDDSH_PROACTIVE_MAX_DELIVERIES_PER_DAYDSH_PROACTIVE_DATA_DIR

配置有双编辑入口:proactive_update_settings 工具(写 config.json,原子持久化 + 热应用)与设置面板(热应用立即生效,重启后以 settings 层持久值为准);两者交替编辑时以最终一次整表回写为准。

GUI 管理面板

插件随 bundle 安装自动注册两个互补管理面:

  • 对话页「主动唤醒」tab(会话视角):只显示当前会话的闹钟(类型/目标/状态/下次触发),可新建、暂停/恢复、立即触发、编辑、取消;每个闹钟行可展开查看自己的唤醒记录(决策/预算增量/思考与回复摘要);会话内操作带归属校验。
  • 设置页「主动唤醒」节(全局视角):全局配置(启用开关/每日预算/安静时段/默认唤醒指令)直接编辑保存;单一闹钟表格列出所有会话的闹钟,支持筛选(状态/类型/会话)、排序(下次触发/创建时间/指令)、编辑(保留 id 与历史)、删除与展开历史;所属会话列显示会话标题(可解析时)。
  • 新建闹钟(两面板同一表单):唤醒指令预填 defaultPrompt;类型三选 + 统一随机抖动 + 免打扰开关;目标会话为会话 ID 输入框(默认当前会话),输入框下方实时显示该 ID 的会话标题,不在列表中的 ID 显示笔误软提示(不阻断提交,冷会话/外部 ID 仍可创建)。
  • 实时刷新:两面板订阅 SSE(/api/dsh-proactive/events),任一来源(模型工具/面板/调度器)的变更自动刷新;另有 /api/dsh-proactive/state(快照)与 /api/dsh-proactive/action(命令)。

工具

注册到每个 root agent(resume 出的会话同样覆盖);host 级状态,冷唤醒回合与普通回合行为一致:

工具 作用
proactive_set 建闹钟:prompt(必填)+ 恰好一个 at(带显式时区的 RFC3339 或 {date,time,time_zone})/ after_seconds / every_seconds(≥300) / cron;可选 jitter_secondstime_zonerespect_quiet_hours(默认 false)、target_mode(resume/fork/new) + target_session_id
proactive_list 列出本会话活跃闹钟;all=true 跨会话列出(与设置页同权)
proactive_update 按精确 id 跨会话全量替换闹钟 spec(与 set 同一方言,保留 id/owner/历史)
proactive_cancel 按精确 id 跨会话取消
proactive_update_settings 部分更新 host 级设置(只改传入字段),持久化 config.json 并热应用
proactive_silence 仅唤醒回合内可用:静默收尾当前唤醒(concludesTurn + 压缩回收整次唤醒交换);普通回合想不说话,直接不产出文本或用宿主的 no-reply 工具

预算与安静时段

  • 预算:唤醒回合写了可见聊天文本 1 单位/次,按 UTC 日累计,上限 maxDeliveriesPerDay;静默回合免费不计。预算用尽后,respect_quiet_hours=true 的自主跟进闹钟提前跳过;false 的用户委托闹钟照常触发(用户显式要求优先,允许轻微超限)。
  • 安静时段respect_quiet_hours=true 的闹钟在安静时段内延迟(每 5 分钟重评估);false 不受限。
  • 失败处理:busy/failed 递增重试,超过 maxRetriesPerFire 记一次 skipped 并推进;目标会话无候选(none)→ skip 记账,不新建会话、不重试、不烧 hourly cap。

数据文件($DSH_HOME/proactive/)

  • alarms.json — 闹钟表(原子写:tmp+rename)
  • runs.jsonl — 每次唤醒的审计记录(决策/预算增量/备注)
  • state.json — 每日预算计数与插件自建会话登记
  • config.json — 上述配置(可选)

权限与兼容

  • 定时唤醒:插件在宿主侧运行调度循环(单定时器重臂),到点会唤醒目标会话执行一轮;进程内 handle 唤醒后即 dispose,服务重启后闹钟从磁盘恢复,在途闹钟按 boot 策略(fire/notify-only/drop)处理。
  • 通知渠道:无推送服务、无外部集成;可见回复走 DSH 正常消息投递(IM 接线会话送达绑定私聊),proactive_silence 回合零投递。
  • 网络请求:插件自身不发起任何外部网络请求;面板 HTTP/SSE 仅挂在本地 dsh webserver;唤醒回合由 dsh 按用户已配置的 LLM 网关正常调用。
  • 文件写入:仅 $DSH_HOME/proactive/
  • 依赖@deepseek-ai/* 以 peerDependencies 声明(cordis ≥4.0.1、dsh-agent/session/tools 等 0.1.1-rc.2,兼容 0.1.2-rc.1),Node ≥ 22.5;headless profile(无 webserver)自动跳过面板路由,模型工具不受影响。
  • 降级安全:冷唤醒缺会话持久化如实记 failed,不假装成功;任何唤醒失败只记账推进,不阻塞其他闹钟。

本地开发

pnpm install
npm run check    # tsc --noEmit(src + test)
npm run build    # tsc -p tsconfig.build.json -> lib/ + esbuild -> lib/client.js
npm test         # 编译 dist + node:test

npm 发布:prepare 串起完整 lib/ 产物(tsc + client bundle),prepublishOnly 跑全量测试。

已知限制

  • 唤醒后进程内 handle 会 dispose;若服务在唤醒途中重启,在途闹钟标记为 in-flight,重启后按 boot 策略重试/推进。
  • fork/new 目标在 host 缺少会话持久化(headless profile)时降级为 failed 并如实记录,不会假装成功。
  • 安静时段/预算的判定基于 UTC 日 + 配置时区,不随用户时区自动迁移(重启后读取最新配置)。
  • proactive_silence 只在唤醒回合内可用;普通回合的静默靠宿主 no-reply 机制,不由本插件提供。

发新版

改动入库后一条命令完成测试、版本号、打包(npm version 会自动 commit 并打 tag):

npm run release        # patch;较大更新改用:npm version minor 或 major

然后指纹发布并推送:

node ~/.agents/skills/npm-publish/scripts/publish-webauthn.cjs /tmp/dsh-proactive-<新版>.tgz
git push --follow-tags

发布后 npm view dsh-proactive version 复验。批量发多个包时,在指纹页勾选“5 分钟内同 IP 不再挑战”,一次指纹即可连发。

(monorepo 子包,在 packages/dsh-proactive 目录执行)

内容来自项目 README(GitHub)↗

链接

同类插件

查看整个分类 →

社区评论

评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。