import type { ParsedSchedule, ScheduleExecutionPosition } from '../../types.js'; import type { ProviderReconciler } from '../shared/provider-reconciler.js'; import type { SideEffectingExecutor } from './types.js'; export type ScheduleInput = { name: string; schedule: string; /** Pre-resolved schedule (parser output). Host preparation derives it when * omitted; the frozen sidecar always contains it so recovery never reparses * relative schedules (`30m`, `2h`, `明天9:00`). */ parsed: ParsedSchedule; prompt: string; workingDir: string; chatId: string; chatType: 'group' | 'p2p'; rootMessageId?: string; scope?: 'thread' | 'chat'; executionPosition?: ScheduleExecutionPosition; topicTitle?: string; larkAppId?: string; /** `repeat.completed` is intentionally absent — it's a runtime counter * and must not be part of canonical input. See schedule-store * canonicalScheduleInput. */ repeat?: { times: number | null; }; deliver?: 'origin' | 'local' | 'new-topic'; /** Silent fires: no "task started" banner; the spawned turn suppresses * daemon-initiated group output and the model decides whether to send. */ silent?: boolean; }; export type ScheduleOutput = { taskId: string; }; export declare function parseScheduleInput(input: unknown): ScheduleInput; /** * `botmux-schedule` hostExecutor. Calls `schedule-store.createTask` * passing the runtime-derived `idempotencyKey` as the deterministic * task id; schedule-store applies create-or-return-identical semantics * (Step 5). * * Provider TTL is effectively infinite for schedule (the task entry * lives until removed), so dangling effectAttempted reconcile uses * readOnlyLookup (`getTask(idempotencyKey)`) — no TTL boundary. */ export declare const botmuxScheduleExecutor: SideEffectingExecutor; export declare const botmuxScheduleReconciler: ProviderReconciler; //# sourceMappingURL=botmux-schedule.d.ts.map