import { Page } from 'playwright'; export interface ExecutionContext { page: Page; runId: string; strategyId: string; metadata: Record; } export interface Slot { date: string; time: string; location?: string; cupos?: number; } export interface AvailabilityResult { hasAvailability: boolean; slots: Slot[]; detectedAt: Date; metadata?: Record; } export interface BookResult { success: boolean; confirmation?: { serieNumero?: string; codigoCancelacion?: string; codigoTrazabilidad?: string; textoTicket?: string; }; error?: string; bookedAt: Date; slot: Slot; } export interface NotificationEvent { type: 'availability_detected' | 'booking_confirmed' | 'error_occurred' | 'no_slots_found'; data: any; timestamp: Date; runId: string; strategyId: string; } export interface QuestionAnswer { question: string; answer: string; } export interface SecurityQuestionSolver { answer(question: string, strategyId?: string): Promise; } export interface IStrategy { readonly id: string; readonly name: string; readonly version: string; bootstrap(ctx: ExecutionContext): Promise; fillForms(ctx: ExecutionContext, userData: Record): Promise; solveSecurityCheck(ctx: ExecutionContext, solver: SecurityQuestionSolver): Promise; reachCalendar(ctx: ExecutionContext): Promise; pollAvailability(ctx: ExecutionContext): Promise; book(ctx: ExecutionContext, slot: Slot, userData: Record): Promise; notify(ctx: ExecutionContext, event: NotificationEvent): Promise; validateUserData(userData: Record): Promise; getRequiredFields(): string[]; }