- dsh-scheduler: shell 请求无 args 字段,改 stdin 传脚本 + JS 字面量持久化(Unicode 安全) - dsh-usage: 余额查询同样改 stdin 机制 - 记录 CollectedOutput.text / sandboxPolicy danger-full-access / exitCode / workdir 等关键经验
dsh-scheduler — 定时任务插件
Host 侧定时任务调度器。给 DeepSeek Harness 补上缺失的定时任务能力。
能力
- 调度表达式
- cron 5 字段:
分 时 日 月 周,支持*、*/n、a-b、a,b,c(如*/10 * * * *每 10 分钟) - 间隔简写:
every:30s/every:5m/every:1h
- cron 5 字段:
- 动作:任意 cmd 命令行(可指定工作目录、超时)
- 持久化:任务存于
%DSH_HOME%\storages\dsh-scheduler.json,重启不丢 - 工具(注册给 agent 调用):
| 工具 | 作用 |
|---|---|
sched_add |
添加任务(名称/调度/命令) |
sched_list |
列出任务与运行状态 |
sched_remove |
按 id 删除 |
sched_run_now |
立即执行一次 |
sched_toggle |
启用/停用 |
sched_diag |
诊断 shell 执行环境与持久化 |
实现要点(踩坑记录)
- 宿主插件环境没有
fs/process全局 → 文件读写走shell服务 + node 子进程 - ShellExecRequest 没有
args字段:node 脚本必须用stdin传入(command:'node'+stdin:脚本), 传args会被静默忽略,导致"裸跑 node"零输出 res.stdout是CollectedOutput对象({text, truncated, spillPath}),用.text取值,String()会得到"[object Object]"- 宿主
ctx.shell默认按workspace-write沙箱执行,本机无可用沙箱后端会被拒绝 → 必须显式传sandboxPolicy: sandboxPolicyService.resolve({mode:'danger-full-access'}) - 结果字段是
res.exitCode(不是res.code);工作目录字段是workdir - 数据持久化用 JS 字符串字面量直接嵌入脚本(
JSON.stringify(JSON.stringify(data))), Unicode 安全(btoabase64 曾引发中文乱码) - 任务执行用完整命令行字符串
cmd /c <command> - 每秒 tick(
ctx.timer.interval),ticking标志防重入 - cron 的
nextRun预计算:从当前时间起逐分钟扫描(最多 7 天)
文件
host.js— 完整宿主插件源码- 部署方式:动态 Cordis 插件(
cordis_define+cordis_run),或归档到 presets/
示例
sched_add name="每30秒打点" schedule="every:30s" command="echo tick >> C:\Users\a1703\.dsh\logs\sched-demo.log"
sched_add name="每整点提醒" schedule="0 * * * *" command="msg * 整点提醒"
sched_list