///|
pub(all) struct RobotCatalogBundle {
  bundle_id : String
  models : Array[@robot_data.RobotModelRef]
  episodes : Array[@robot_data.RobotEpisodeManifest]
  telemetry_streams : Array[@robot_data.RobotTelemetryStreamManifest]
  gait_clips : Array[@robot_data.RobotGaitClipManifest]
  gait_annotations : Array[@robot_data.RobotGaitAnnotationManifest]
  gait_alignments : Array[@robot_data.RobotGaitAlignmentManifest]
  task_labels : Array[@robot_data.RobotTaskLabelManifest]
  rollouts : Array[@robot_data.RobotRolloutManifest]
  quality_reports : Array[@robot_data.RobotQualityReport]
} derive(Debug, Eq, ToJson, FromJson)

///|
pub(all) struct RobotCatalogMaterialization {
  root : String
  catalog_path : String
  validation_report_path : String
  source_count : Int
  dataset_count : Int
  version_count : Int
  lineage_count : Int
  telemetry_stream_count : Int
  gait_clip_count : Int
  gait_annotation_count : Int
  gait_alignment_count : Int
  task_label_count : Int
  rollout_count : Int
  quality_report_count : Int
  catalog_entry_count : Int
  validation_status : @data_core.ValidationStatus
  blocker_count : Int
  warning_count : Int
} derive(Debug, Eq, ToJson, FromJson)

///|
pub fn robot_catalog_bundle(
  bundle_id : String,
  models : Array[@robot_data.RobotModelRef],
  episodes : Array[@robot_data.RobotEpisodeManifest],
  telemetry_streams? : Array[@robot_data.RobotTelemetryStreamManifest] = [],
  gait_clips? : Array[@robot_data.RobotGaitClipManifest] = [],
  gait_annotations? : Array[@robot_data.RobotGaitAnnotationManifest] = [],
  gait_alignments? : Array[@robot_data.RobotGaitAlignmentManifest] = [],
  task_labels? : Array[@robot_data.RobotTaskLabelManifest] = [],
  rollouts? : Array[@robot_data.RobotRolloutManifest] = [],
  quality_reports? : Array[@robot_data.RobotQualityReport] = [],
) -> RobotCatalogBundle {
  {
    bundle_id,
    models,
    episodes,
    telemetry_streams,
    gait_clips,
    gait_annotations,
    gait_alignments,
    task_labels,
    rollouts,
    quality_reports,
  }
}