/**
 * Schedule registry — distills each installed pack's
 * `triggers: [{kind: schedule, cron: ...}]` declarations into a flat list of
 * cron entries the daemon can register with node-cron.
 *
 * Authoritative source: `docs/tasks/scheduling.md` SCHED.1.
 *
 * Validation contract (load-time, not run-time):
 *
 *   - `cron` is REQUIRED on every schedule trigger. A schedule trigger
 *     without a cron expression is a YAML mistake; we refuse to start the
 *     daemon rather than silently never firing.
 *   - 5-field POSIX cron only. node-cron silently accepts 6-field
 *     (seconds-first) expressions; we reject them at load time with a clear
 *     error citing pack + skill + trigger index, so a pack author can't
 *     accidentally schedule something to fire 60× more often than they
 *     intended on a runtime upgrade that flipped the default.
 *   - `node-cron.validate()` runs on the 5-field shape. Anything that fails
 *     validation throws `ScheduleRegistryError` with the same provenance
 *     fields so the operator can find the bad pack quickly.
 *
 * Timezone defaults to UTC (locked, per spec risk callout). Per-trigger
 * `timezone:` lives under `triggerPayload` on the runtime view today; that
 * field is open-ended (`z.record(z.unknown())`) so the daemon reads it
 * defensively. The YAML schema for the `timezone:` per-trigger field lands
 * in a follow-up task — for SCHED.1 the entries default to UTC and the
 * registry exposes `entry.timezone` as a hook for that future YAML field.
 *
 * Engine-vocabulary discipline: returns `(pack, skill, cron, timezone)`
 * tuples. No consumer-product names leak into this module.
 *
 * Imports from: node-cron, ./types.js.
 * Imported by: src/runtime/daemon.ts.
 */
import type { Pack } from './types.js';
/**
 * One scheduled trigger source. The daemon registers a node-cron task per
 * entry and stores the handle on its `tasks` Map keyed by `entry.id`.
 *
 * `id` format: `${pack}::${skill}::${triggerIndex}` — stable identifier the
 * audit log uses to attribute a fire to its declaration site.
 */
export interface ScheduleEntry {
    id: string;
    pack: string;
    skill: string;
    cron: string;
    /** Defaults to `'UTC'` when the trigger omits an explicit timezone. */
    timezone: string;
}
export declare class ScheduleRegistryError extends Error {
    readonly pack: string;
    readonly skill: string;
    readonly triggerIndex: number;
    constructor(message: string, pack: string, skill: string, triggerIndex: number);
}
/**
 * Walk `packs[].skills[].triggers[]` and emit one `ScheduleEntry` per
 * schedule trigger. Throws on the first malformed cron expression — the
 * operator gets one error per daemon-start attempt so a misconfigured pack
 * surfaces as soon as it's installed.
 */
export declare function buildScheduleRegistry(packs: readonly Pack[]): ScheduleEntry[];
//# sourceMappingURL=schedule_registry.d.ts.map