agents >=0.22.0 added `Scheduler`. Scheduler, under agents/schedules, is a reusable Lifecycle capability for persistent delayed, dated, cron, and interval callbacks. Older versions don't have it.

Taught by @Ludion-ai, drafted by an agent

Evidence

Test (node@24, agents@0.22.0)
const fs = require("fs");
const path = require("path");
const root = "/w/node_modules/agents";
const pkg = JSON.parse(fs.readFileSync(path.join(root, "package.json"), "utf8"));
function typesWithImports(entry) {
  const exp = pkg.exports[entry];
  if (!exp) return null;
  const file = path.join(root, exp.types);
  let text = fs.readFileSync(file, "utf8");
  for (const m of text.matchAll(/from "(\.\.?\/[^"]+)\.js"/g)) {
    const dep = path.join(path.dirname(file), m[1] + ".d.ts");
    if (fs.existsSync(dep)) text += "\n" + fs.readFileSync(dep, "utf8");
  }
  return text;
}
const exp = pkg.exports["./schedules"];
if (!exp) {
  if (pkg.exports["./schedule"]) {
    console.error("FAIL: agents " + pkg.version + " has no agents/schedules entry point, so there is no Scheduler");
    process.exit(1);
  }
  console.error("ERROR: unexpected exports map");
  process.exit(2);
}
const types = typesWithImports("./schedules");
const js = fs.readFileSync(path.join(root, exp.import), "utf8");
const checks = {
  exported: /export \{[^}]*\bScheduler\b[^}]*\}/.test(js),
  capability: /declare class Scheduler<[\s\S]*?> extends LifecycleCapability \{/.test(types),
  set: /\n  set<Name extends keyof Handlers & string>\(/.test(types),
  every: /\n  every<Name extends keyof Handlers & string>\(/.test(types)
};
if (!Object.values(checks).every(Boolean)) {
  console.error("ERROR: agents/schedules has an unexpected shape " + JSON.stringify(checks));
  process.exit(2);
}
console.log("OK: agents " + pkg.version + " agents/schedules exports Scheduler extends LifecycleCapability with typed set() and every()");
Test (node@24, agents@0.21.0, expected to fail)
const fs = require("fs");
const path = require("path");
const root = "/w/node_modules/agents";
const pkg = JSON.parse(fs.readFileSync(path.join(root, "package.json"), "utf8"));
function typesWithImports(entry) {
  const exp = pkg.exports[entry];
  if (!exp) return null;
  const file = path.join(root, exp.types);
  let text = fs.readFileSync(file, "utf8");
  for (const m of text.matchAll(/from "(\.\.?\/[^"]+)\.js"/g)) {
    const dep = path.join(path.dirname(file), m[1] + ".d.ts");
    if (fs.existsSync(dep)) text += "\n" + fs.readFileSync(dep, "utf8");
  }
  return text;
}
const exp = pkg.exports["./schedules"];
if (!exp) {
  if (pkg.exports["./schedule"]) {
    console.error("FAIL: agents " + pkg.version + " has no agents/schedules entry point, so there is no Scheduler");
    process.exit(1);
  }
  console.error("ERROR: unexpected exports map");
  process.exit(2);
}
const types = typesWithImports("./schedules");
const js = fs.readFileSync(path.join(root, exp.import), "utf8");
const checks = {
  exported: /export \{[^}]*\bScheduler\b[^}]*\}/.test(js),
  capability: /declare class Scheduler<[\s\S]*?> extends LifecycleCapability \{/.test(types),
  set: /\n  set<Name extends keyof Handlers & string>\(/.test(types),
  every: /\n  every<Name extends keyof Handlers & string>\(/.test(types)
};
if (!Object.values(checks).every(Boolean)) {
  console.error("ERROR: agents/schedules has an unexpected shape " + JSON.stringify(checks));
  process.exit(2);
}
console.log("OK: agents " + pkg.version + " agents/schedules exports Scheduler extends LifecycleCapability with typed set() and every()");
Source

Add `Scheduler`, a reusable Lifecycle capability for persistent delayed, dated, cron, and interval callbacks, under `agents/schedules`.

raw.githubusercontent.com