import type { AgentSignalAttributes, AgentSignalType } from '../../../agent/signals.js';
import type { ScheduleIfActive, ScheduleIfIdle } from '../../../schedules/types.js';
import { StorageDomain } from '../base.js';
/**
 * Discriminated union describing what a schedule fires.
 *
 * `workflow` targets publish a `workflow.start` event on the `workflows`
 * pubsub topic and are processed by the orchestration worker. `agent`
 * targets publish an `agent-schedule.fire` event on the `agent-schedules`
 * pubsub topic and are processed by the {@link AgentScheduleWorker}, which
 * runs the referenced agent directly (no workflow indirection).
 */
export type ScheduleTarget = WorkflowScheduleTarget | AgentScheduleTarget;
export type WorkflowScheduleTarget = {
    type: 'workflow';
    workflowId: string;
    inputData?: unknown;
    initialState?: unknown;
    requestContext?: Record<string, unknown>;
};
export type { ScheduleIfActive, ScheduleIfIdle } from '../../../schedules/types.js';
/**
 * Schedule target that fires an agent run on a cron. The agent-schedule
 * worker reads these fields and runs the referenced agent directly —
 * either via `sendSignal` (when `threadId` is set) or `agent.generate`
 * (threadless). The agent's `runId` is recorded on the trigger row for
 * UI linkability into chat / observability traces.
 */
export type AgentScheduleTarget = {
    type: 'agent';
    agentId: string;
    prompt: string;
    /**
     * Free-form label for distinguishing multiple schedules on the same
     * agent/thread (e.g. `'morning-checkin'`). Optional; filterable via
     * `mastra.schedules.list({ name })`.
     */
    name?: string;
    /** Threaded agent schedules send a signal into this thread. */
    threadId?: string;
    /** Required when `threadId` is set. */
    resourceId?: string;
    /** Signal type used by threaded agent schedules. Defaults to `'notification'`. */
    signalType?: AgentSignalType;
    /** XML tag the signal renders as. Defaults to `'schedule'`. */
    tagName?: string;
    /** Signal attributes rendered onto the XML tag. */
    attributes?: AgentSignalAttributes;
    /** Provider options merged into the schedule signal payload on every fire. JSON-safe. */
    providerOptions?: Record<string, unknown>;
    /** Options applied when the target thread is actively streaming. Threaded only. */
    ifActive?: ScheduleIfActive;
    /** Options applied when the target thread is idle (incl. serializable streamOptions). Threaded only. */
    ifIdle?: ScheduleIfIdle;
    /** Arbitrary metadata stored alongside the schedule row. */
    metadata?: Record<string, unknown>;
    requestContext?: Record<string, unknown>;
};
/**
 * Read-shim for schedule rows persisted before the heartbeat → schedules
 * rename: maps a legacy `target.type: 'heartbeat'` discriminator to the
 * current `'agent'` value. Every {@link SchedulesStorage} implementation
 * MUST run row targets through this at deserialization time so legacy rows
 * keep dispatching. Never used on the write path — new rows always persist
 * `'agent'`.
 */
export declare function normalizeScheduleTarget(target: ScheduleTarget): ScheduleTarget;
/** Lifecycle status of a schedule row. */
export type ScheduleStatus = 'active' | 'paused';
/**
 * Polymorphic owner of a schedule. Workflow schedules created via
 * `createWorkflow({ schedule })` leave both fields null. Agent
 * schedules created via `mastra.schedules.create(...)` set
 * `ownerType: 'agent'` and `ownerId` to the agent id. Future schedule
 * types (tenant-owned, workflow-owned, etc.) can use the same shape
 * without a migration.
 */
export type ScheduleOwnerType = 'agent' | (string & {});
/**
 * A persisted schedule.
 *
 * `nextFireAt` is advanced atomically by the scheduler before publishing
 * a trigger event, providing CAS-style dedup across multiple instances
 * polling the same storage.
 */
export type Schedule = {
    id: string;
    target: ScheduleTarget;
    cron: string;
    timezone?: string;
    status: ScheduleStatus;
    nextFireAt: number;
    lastFireAt?: number;
    lastRunId?: string;
    createdAt: number;
    updatedAt: number;
    metadata?: Record<string, unknown>;
    /** Optional owner classification (e.g. 'agent' for agent schedules). */
    ownerType?: ScheduleOwnerType;
    /** Optional owner identifier paired with `ownerType`. */
    ownerId?: string;
};
/**
 * Outcome of an individual schedule trigger attempt.
 *
 * Shared across all schedule target types (workflows, agents, …).
 *
 * Workflow outcomes:
 * - `published`  — workflow run was successfully dispatched to the workflow
 *                  engine. Write-once at dispatch time; the trigger row is
 *                  not updated when the run later completes.
 * - `failed`     — dispatch threw (workflow or agent schedule).
 *
 * Agent-schedule outcomes (terminal — written after the run/signal resolves):
 * - `succeeded`  — the scheduled agent run finished without error.
 * - `delivered`  — the schedule signal joined an active run on the target
 *                  thread instead of starting a new one (`ifActive: 'deliver'`).
 * - `persisted`  — the signal was saved to memory without triggering a run
 *                  (`ifActive: 'persist'` or `ifIdle: 'persist'`).
 * - `discarded`  — the signal was dropped without effect
 *                  (`ifActive: 'discard'` or `ifIdle: 'discard'`).
 * - `skipped`    — the user `prepare` hook returned `null`, asking the worker
 *                  to skip this fire entirely.
 * - `aborted`    — the agent run was aborted mid-stream.
 *
 * Legacy outcomes (no longer written, kept readable for rows persisted by
 * older builds so that listing/exhaustive handling does not break):
 * - `acked`, `alerted`, `deferred`, `appended-from-queue`, `dropped-stale`,
 *   `dropped-superseded`, `dropped-busy`.
 */
export type ScheduleTriggerOutcome = 'published' | 'succeeded' | 'delivered' | 'persisted' | 'discarded' | 'skipped' | 'aborted' | 'failed' | 'acked' | 'alerted' | 'deferred' | 'appended-from-queue' | 'dropped-stale' | 'dropped-superseded' | 'dropped-busy';
/**
 * Distinguishes a tick-loop schedule fire from a deferred drain event or a
 * manual ("fire now") invocation. Drain rows reference the original fire
 * via `parentTriggerId`.
 */
export type ScheduleTriggerKind = 'schedule-fire' | 'queue-drain' | 'manual';
/** Audit record produced for each trigger attempt. */
export type ScheduleTrigger = {
    /** Stable trigger row id. Generated by storage when omitted on write. */
    id?: string;
    scheduleId: string;
    /**
     * Identifier of the downstream run produced by this fire.
     *
     * For workflow targets this is the workflow run id (`sched_<scheduleId>_<ts>`).
     * For agent targets this is the agent run id recorded by the
     * {@link AgentScheduleWorker} after the agent run starts. May be null for
     * drain rows or fires that failed before producing a run id.
     */
    runId: string | null;
    scheduledFireAt: number;
    actualFireAt: number;
    outcome: ScheduleTriggerOutcome;
    error?: string;
    /** Defaults to `'schedule-fire'` when omitted. */
    triggerKind?: ScheduleTriggerKind;
    /** Pointer back to the originating fire row when `triggerKind === 'queue-drain'`. */
    parentTriggerId?: string;
    /** Outcome-specific context (alert text, append message id, queue age, etc.). */
    metadata?: Record<string, unknown>;
};
/** Filter options for listing schedules. */
export type ScheduleFilter = {
    status?: ScheduleStatus;
    workflowId?: string;
    /** `null` matches schedules with no owner (e.g. workflow-only schedules). */
    ownerType?: ScheduleOwnerType | null;
    /** `null` matches schedules with no owner id. */
    ownerId?: string | null;
};
/** Filter / pagination options for listing trigger history. */
export type ScheduleTriggerListOptions = {
    limit?: number;
    /** Inclusive lower bound on actualFireAt (ms epoch). */
    fromActualFireAt?: number;
    /** Exclusive upper bound on actualFireAt (ms epoch). */
    toActualFireAt?: number;
};
/** Fields that can be patched via {@link SchedulesStorage.updateSchedule}. */
export type ScheduleUpdate = Partial<Pick<Schedule, 'cron' | 'timezone' | 'status' | 'nextFireAt' | 'metadata' | 'target' | 'ownerType' | 'ownerId'>>;
/**
 * Abstract storage domain for workflow schedules.
 *
 * Powers the {@link Scheduler}: the scheduler's tick loop polls
 * `listDueSchedules`, atomically advances `nextFireAt` via
 * `updateScheduleNextFire` (CAS), publishes a `workflow.start` event on
 * the `workflows` pubsub topic, and records the trigger via `recordTrigger`.
 */
export declare abstract class SchedulesStorage extends StorageDomain {
    constructor();
    dangerouslyClearAll(): Promise<void>;
    /** Insert a new schedule row. Throws if a row with the same id already exists. Returns the stored row. */
    abstract createSchedule(schedule: Schedule): Promise<Schedule>;
    /** Get a single schedule by id. Returns null if not found. */
    abstract getSchedule(id: string): Promise<Schedule | null>;
    /** List schedules matching the filter (no pagination — schedule counts are expected to stay small). */
    abstract listSchedules(filter?: ScheduleFilter): Promise<Schedule[]>;
    /**
     * List schedules whose `nextFireAt <= now` and whose `status === 'active'`.
     * Used by the scheduler tick loop.
     */
    abstract listDueSchedules(now: number, limit?: number): Promise<Schedule[]>;
    /** Partial update of a schedule row. */
    abstract updateSchedule(id: string, patch: ScheduleUpdate): Promise<Schedule>;
    /**
     * Compare-and-swap update of `nextFireAt`. Used by the scheduler to claim
     * a fire before publishing — only one tick across many processes will succeed.
     *
     * Returns true if the row's `nextFireAt` matched `expectedNextFireAt` and
     * was advanced to `newNextFireAt`. Returns false if another instance
     * already advanced it (meaning the caller should skip publishing).
     */
    abstract updateScheduleNextFire(id: string, expectedNextFireAt: number, newNextFireAt: number, lastFireAt: number, lastRunId: string): Promise<boolean>;
    /** Delete a schedule and its trigger history. */
    abstract deleteSchedule(id: string): Promise<void>;
    /** Append an entry to a schedule's trigger history. */
    abstract recordTrigger(trigger: ScheduleTrigger): Promise<void>;
    /** List trigger history for a schedule, newest first. */
    abstract listTriggers(scheduleId: string, opts?: ScheduleTriggerListOptions): Promise<ScheduleTrigger[]>;
}
//# sourceMappingURL=base.d.ts.map