import type { ChannelId } from "../channels/plugins/types.js"; export type CronSchedule = | { kind: "at"; atMs: number } | { kind: "every"; everyMs: number; anchorMs?: number } | { kind: "cron"; expr: string; tz?: string }; export type CronSessionTarget = "main" | "isolated"; export type CronWakeMode = "next-heartbeat" | "now"; export type CronMessageChannel = ChannelId | "last"; export type CronPayload = | { kind: "systemEvent"; text: string } | { kind: "agentTurn"; message: string; /** Optional model override (provider/model or alias). */ model?: string; thinking?: string; timeoutSeconds?: number; allowUnsafeExternalContent?: boolean; deliver?: boolean; channel?: CronMessageChannel; to?: string; bestEffortDeliver?: boolean; }; export type CronPayloadPatch = | { kind: "systemEvent"; text?: string } | { kind: "agentTurn"; message?: string; model?: string; thinking?: string; timeoutSeconds?: number; allowUnsafeExternalContent?: boolean; deliver?: boolean; channel?: CronMessageChannel; to?: string; bestEffortDeliver?: boolean; }; export type CronIsolation = { postToMainPrefix?: string; /** * What to post back into the main session after an isolated run. * - summary: small status/summary line (default) * - full: the agent's final text output (optionally truncated) */ postToMainMode?: "summary" | "full"; /** Max chars when postToMainMode="full". Default: 8000. */ postToMainMaxChars?: number; }; export type CronJobState = { nextRunAtMs?: number; runningAtMs?: number; lastRunAtMs?: number; lastStatus?: "ok" | "error" | "skipped"; lastError?: string; lastDurationMs?: number; }; export type CronJob = { id: string; agentId?: string; name: string; description?: string; enabled: boolean; deleteAfterRun?: boolean; createdAtMs: number; updatedAtMs: number; schedule: CronSchedule; sessionTarget: CronSessionTarget; wakeMode: CronWakeMode; payload: CronPayload; isolation?: CronIsolation; state: CronJobState; }; export type CronStoreFile = { version: 1; jobs: CronJob[]; }; export type CronJobCreate = Omit & { state?: Partial; }; export type CronJobPatch = Partial> & { payload?: CronPayloadPatch; state?: Partial; };