Skip to content

@kaiord/core


@kaiord/core / krdSchema

Variable: krdSchema

const krdSchema: 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

typescript
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: [] }
  }
});