@kaiord/core / krdSchema
Variable: krdSchema
constkrdSchema:ZodObject<{events:ZodOptional<ZodArray<ZodObject<{data:ZodOptional<ZodNumber>;eventGroup:ZodOptional<ZodNumber>;eventType:ZodEnum<{event_activity_start:"event_activity_start";event_lap:"event_lap";event_marker:"event_marker";event_pause:"event_pause";event_resume:"event_resume";event_session_start:"event_session_start";event_start:"event_start";event_stop:"event_stop";event_timer:"event_timer";event_workout_step_change:"event_workout_step_change"; }>;message:ZodOptional<ZodString>;timestamp:ZodISODateTime; },$strip>>>;extensions:ZodOptional<ZodRecord<ZodString,ZodUnknown>>;laps:ZodOptional<ZodArray<ZodObject<{avgCadence:ZodOptional<ZodNumber>;avgHeartRate:ZodOptional<ZodNumber>;avgPower:ZodOptional<ZodNumber>;avgSpeed:ZodOptional<ZodNumber>;maxCadence:ZodOptional<ZodNumber>;maxHeartRate:ZodOptional<ZodNumber>;maxPower:ZodOptional<ZodNumber>;maxSpeed:ZodOptional<ZodNumber>;normalizedPower:ZodOptional<ZodNumber>;numLengths:ZodOptional<ZodNumber>;sport:ZodOptional<ZodEnum<{cycling:"cycling";generic:"generic";running:"running";swimming:"swimming"; }>>;startTime:ZodISODateTime;subSport:ZodOptional<ZodEnum<{all:"all";apnea_diving:"apnea_diving";apnea_hunting:"apnea_hunting";atv:"atv";backcountry:"backcountry";bike_to_run_transition:"bike_to_run_transition";bmx:"bmx";cardio_training:"cardio_training";casual_walking:"casual_walking";challenge:"challenge";commuting:"commuting";cyclocross:"cyclocross";downhill:"downhill";e_bike_fitness:"e_bike_fitness";e_bike_mountain:"e_bike_mountain";elliptical:"elliptical";exercise:"exercise";flexibility_training:"flexibility_training";gauge_diving:"gauge_diving";generic:"generic";gravel_cycling:"gravel_cycling";hand_cycling:"hand_cycling";indoor_cycling:"indoor_cycling";indoor_rowing:"indoor_rowing";indoor_running:"indoor_running";indoor_skiing:"indoor_skiing";indoor_walking:"indoor_walking";lap_swimming:"lap_swimming";map:"map";match:"match";mixed_surface:"mixed_surface";motocross:"motocross";mountain:"mountain";multi_gas_diving:"multi_gas_diving";navigate:"navigate";obstacle:"obstacle";open_water:"open_water";pilates:"pilates";rc_drone:"rc_drone";recumbent:"recumbent";resort:"resort";road:"road";run_to_bike_transition:"run_to_bike_transition";single_gas_diving:"single_gas_diving";skate_skiing:"skate_skiing";speed_walking:"speed_walking";spin:"spin";stair_climbing:"stair_climbing";street:"street";strength_training:"strength_training";swim_to_bike_transition:"swim_to_bike_transition";track:"track";track_cycling:"track_cycling";track_me:"track_me";trail:"trail";treadmill:"treadmill";virtual_activity:"virtual_activity";warm_up:"warm_up";whitewater:"whitewater";wingsuit:"wingsuit";yoga:"yoga"; }>>;swimStroke:ZodOptional<ZodEnum<{backstroke:"backstroke";breaststroke:"breaststroke";butterfly:"butterfly";drill:"drill";freestyle:"freestyle";im:"im";mixed:"mixed"; }>>;totalAscent:ZodOptional<ZodNumber>;totalCalories:ZodOptional<ZodNumber>;totalDescent:ZodOptional<ZodNumber>;totalDistance:ZodOptional<ZodNumber>;totalElapsedTime:ZodNumber;totalTimerTime:ZodOptional<ZodNumber>;trigger:ZodOptional<ZodEnum<{distance:"distance";fitness_equipment:"fitness_equipment";manual:"manual";position:"position";session_end:"session_end";time:"time"; }>>;workoutStepIndex:ZodOptional<ZodNumber>; },$strip>>>;metadata:ZodObject<{created:ZodISODateTime;manufacturer:ZodOptional<ZodString>;product:ZodOptional<ZodString>;serialNumber:ZodOptional<ZodString>;sport:ZodString;subSport:ZodOptional<ZodString>; },$strip>;records:ZodOptional<ZodArray<ZodObject<{altitude:ZodOptional<ZodNumber>;cadence:ZodOptional<ZodNumber>;distance:ZodOptional<ZodNumber>;heartRate:ZodOptional<ZodNumber>;position:ZodOptional<ZodObject<{lat:ZodNumber;lon:ZodNumber; },$strip>>;power:ZodOptional<ZodNumber>;speed:ZodOptional<ZodNumber>;stanceTime:ZodOptional<ZodNumber>;stepLength:ZodOptional<ZodNumber>;temperature:ZodOptional<ZodNumber>;timestamp:ZodISODateTime;verticalOscillation:ZodOptional<ZodNumber>; },$strip>>>;sessions:ZodOptional<ZodArray<ZodObject<{avgCadence:ZodOptional<ZodNumber>;avgHeartRate:ZodOptional<ZodNumber>;avgPower:ZodOptional<ZodNumber>;avgSpeed:ZodOptional<ZodNumber>;intensityFactor:ZodOptional<ZodNumber>;maxCadence:ZodOptional<ZodNumber>;maxHeartRate:ZodOptional<ZodNumber>;maxPower:ZodOptional<ZodNumber>;maxSpeed:ZodOptional<ZodNumber>;normalizedPower:ZodOptional<ZodNumber>;sport:ZodString;startTime:ZodISODateTime;subSport:ZodOptional<ZodString>;totalAscent:ZodOptional<ZodNumber>;totalCalories:ZodOptional<ZodNumber>;totalDescent:ZodOptional<ZodNumber>;totalDistance:ZodOptional<ZodNumber>;totalElapsedTime:ZodNumber;totalTimerTime:ZodOptional<ZodNumber>;trainingStressScore:ZodOptional<ZodNumber>; },$strip>>>;type:ZodEnum<{course:"course";recorded_activity:"recorded_activity";structured_workout:"structured_workout"; }>;version:ZodString; },$strip>
Defined in: packages/core/src/domain/schemas/krd/index.ts:39
Zod schema for the complete KRD (Kaiord Representation Definition) format.
KRD is a JSON-based canonical format for structured workout, recorded activity, and course data. Each KRD document has an explicit type field that determines its purpose:
"structured_workout"- Planned training with steps and targets"recorded_activity"- Completed training with GPS/sensor data"course"- Navigation route with waypoints
MIME type: application/vnd.kaiord+json
Example
import { krdSchema } from '@kaiord/core';
const krd = krdSchema.parse({
version: '1.0',
type: 'structured_workout',
metadata: {
created: '2025-01-15T10:30:00Z',
sport: 'cycling'
},
extensions: {
structured_workout: { name: 'FTP Test', sport: 'cycling', steps: [] }
}
});