/** * Training Plan JSON Schema * * Designed to be comprehensive enough for export to: * - Zwift (.zwo workouts) * - Garmin Connect (.fit workouts) * - TrainingPeaks * - Other training platforms */ export type Sport = "swim" | "bike" | "run" | "strength" | "brick" | "race" | "rest"; export type WorkoutType = "rest" | "recovery" | "endurance" | "tempo" | "threshold" | "intervals" | "vo2max" | "sprint" | "race" | "brick" | "technique" | "openwater" | "hills" | "long"; export type IntensityUnit = "percent_ftp" | "percent_lthr" | "hr_zone" | "pace_zone" | "rpe" | "css_offset"; export type DurationUnit = "seconds" | "minutes" | "hours" | "meters" | "kilometers" | "miles" | "yards" | "laps"; export type StepType = "warmup" | "work" | "recovery" | "rest" | "cooldown" | "interval_set"; export type SwimDistanceUnit = "meters" | "yards"; export type LandDistanceUnit = "kilometers" | "miles"; export type FirstDayOfWeek = "monday" | "sunday"; export interface UnitPreferences { swim: SwimDistanceUnit; bike: LandDistanceUnit; run: LandDistanceUnit; firstDayOfWeek: FirstDayOfWeek; } export declare const defaultPreferences: UnitPreferences; export interface IntensityTarget { unit: IntensityUnit; value: number; valueLow?: number; valueHigh?: number; description?: string; } export interface DurationTarget { unit: DurationUnit; value: number; } export interface WorkoutStep { type: StepType; name?: string; duration: DurationTarget; intensity: IntensityTarget; cadence?: { low: number; high: number; }; notes?: string; } export interface IntervalSet { type: "interval_set"; name?: string; repeats: number; steps: WorkoutStep[]; } /** * Structured workout with object-based properties for device export. * This is the converted form of TemplateStructure where all string-based * properties have been parsed into proper objects. */ export interface StructuredWorkout { warmup?: WorkoutStep[]; main: (WorkoutStep | IntervalSet)[]; cooldown?: WorkoutStep[]; totalDuration?: DurationTarget; estimatedTSS?: number; estimatedIF?: number; } export interface Workout { id: string; sport: Sport; type: WorkoutType; category?: string; name: string; description: string; coachingNotes?: string; durationMinutes?: number; distanceMeters?: number; primaryZone?: string; targetHR?: { low: number; high: number; }; targetPower?: { low: number; high: number; }; targetPace?: { low: string; high: string; }; rpe?: number; structure?: StructuredWorkout; humanReadable?: string; completed: boolean; completedAt?: string; actualDuration?: number; actualDistance?: number; notes?: string; } export interface TrainingDay { date: string; dayOfWeek: string; workouts: Workout[]; } export interface WeekSummary { totalHours: number; totalTSS?: number; bySport: { [key in Sport]?: { sessions: number; hours: number; km?: number; }; }; } export interface TrainingWeek { weekNumber: number; startDate: string; endDate: string; phase: string; focus: string; targetHours: number; days: TrainingDay[]; summary: WeekSummary; isRecoveryWeek: boolean; } export interface HeartRateZones { lthr: number; zones: { zone: number; name: string; percentLow: number; percentHigh: number; hrLow: number; hrHigh: number; }[]; } export interface PowerZones { ftp: number; zones: { zone: number; name: string; percentLow: number; percentHigh: number; wattsLow: number; wattsHigh: number; }[]; } export interface SwimZones { css: string; cssSeconds: number; zones: { zone: number; name: string; paceOffset: number; pace: string; }[]; } export interface PaceZones { thresholdPace: string; thresholdPaceSeconds: number; zones: { zone: string; name: string; pace: string; paceSeconds: number; }[]; } export interface AthleteZones { run?: { hr?: HeartRateZones; pace?: PaceZones; }; bike?: { hr?: HeartRateZones; power?: PowerZones; }; swim?: SwimZones; maxHR?: number; restingHR?: number; weight?: number; } export interface AthleteAssessment { foundation: { raceHistory: string[]; peakTrainingLoad: number; foundationLevel: "beginner" | "intermediate" | "advanced" | "elite"; yearsInSport: number; }; currentForm: { weeklyVolume: { total: number; swim?: number; bike?: number; run?: number; }; longestSessions: { swim?: number; bike?: number; run?: number; }; consistency: number; timeSincePeakFitness?: string; reasonForTimeOff?: string; }; strengths: { sport: Sport; evidence: string; }[]; limiters: { sport: Sport; evidence: string; }[]; constraints: string[]; } export interface TrainingPhase { name: string; startWeek: number; endWeek: number; focus: string; weeklyHoursRange: { low: number; high: number; }; keyWorkouts: string[]; physiologicalGoals: string[]; } export interface RaceStrategy { event: { name: string; date: string; type: string; distances?: { swim?: number; bike?: number; run?: number; }; }; pacing: { swim?: { target: string; notes: string; }; bike?: { targetPower: string; targetHR: string; notes: string; }; run?: { targetPace: string; targetHR: string; notes: string; }; }; nutrition: { preRace: string; during: { carbsPerHour: number; fluidPerHour: string; products: string[]; }; notes: string; }; taper: { startDate: string; volumeReduction: number; notes: string; }; raceDay: { wakeUpTime?: string; preRaceMeal?: string; warmUp?: string; mentalCues?: string[]; }; } /** * Athlete notes from constraints configuration. */ export interface AthleteNotes { daysPerWeek?: number | string; preferredDays?: string[]; maxLongRunHours?: number; maxLongBikeHours?: number; notes?: string[]; } /** * Athlete training paces for reference display. */ export interface AthletePacesDisplay { easy?: string; long?: string; tempo?: string; threshold?: string; marathon?: string; halfMarathon?: string; interval?: string; r200?: string; r400?: string; r800?: string; r1k?: string; rMile?: string; bikeFtp?: number; bikeEasy?: string; bikeTempo?: string; bikeThreshold?: string; swimCss?: string; swimEasy?: string; swimTempo?: string; } export interface TrainingPlan { version: "1.0"; meta: { id: string; athlete: string; event: string; eventDate: string; planStartDate: string; planEndDate: string; createdAt: string; updatedAt: string; totalWeeks: number; generatedBy: string; }; preferences: UnitPreferences; assessment?: AthleteAssessment; zones: AthleteZones; phases: TrainingPhase[]; weeks: TrainingWeek[]; raceStrategy?: RaceStrategy; athleteNotes?: AthleteNotes; athletePaces?: AthletePacesDisplay; } export declare const exampleWorkout: Workout;