import type { TraceWriter } from '../trace/index.js'; import type { AgentSession } from '../session/agent-session.js'; import type { AgentConfig } from '../types.js'; import type { Telegraf } from 'telegraf'; import { ScheduledTask } from './triggers.js'; export { resolveWorktreePruneRoot } from './worktree-prune-task.js'; export { daemonTraceLabel } from './session-spawn.js'; import { type SessionStartSkipReason } from './gates.js'; export interface SchedulerOptions { sessionConfig?: Partial; telemetryPath?: string; sessionFactory?: (config: AgentConfig, ownedTraceWriter?: TraceWriter) => AgentSession; cooldownMs?: number; now?: () => number; onTaskComplete?: (record: TelemetryRecord, details?: TaskCompletionDetails) => void | Promise; pullPollIntervalMs?: number; queueDir?: string; doneUnverifiedProbe?: (args: { responseText: string; successfulToolNames: readonly string[]; }) => boolean; bot?: Telegraf; primaryChatId?: number; primaryThreadId?: number; } export type TelemetryTrigger = 'cron' | 'sessionstart' | 'pull'; export type TelemetryStatus = 'success' | 'error' | 'skipped'; export interface TelemetryRecord { taskId: string; command: string; trigger: TelemetryTrigger; cronExpression?: string; triggeredAt: string; durationMs: number; status: TelemetryStatus; errorMessage?: string; responseExcerpt?: string; skipReason?: SessionStartSkipReason; name?: string; } export interface TaskCompletionDetails { responseText?: string; doneUnverified?: boolean; notifyChat?: number | string; } export declare class CronScheduler { private readonly registry; private readonly options; private readonly defaultCooldownMs; private readonly now; private readonly idleDetector; private pullPollTimer; private isDequeuing; private readonly queueDir; constructor(options?: SchedulerOptions); register(task: ScheduledTask): void; unregister(taskId: string): void; list(): ScheduledTask[]; tick(taskId: string): Promise; fireOnStart(): Promise; stop(): Promise; startPullLoop(): void; private pullTick; private runOnce; private recordSkip; private spawnSession; private telemetryPath; private ensureTelemetrySink; private writeTelemetry; }