standardbots 2.20250512.49__py3-none-any.whl → 2.20250801.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of standardbots might be problematic. Click here for more details.

@@ -327,6 +327,66 @@ def parse_brakes_state_enum(data: object) -> BrakesStateEnum:
327
327
  def serialize_brakes_state_enum(data: Union[BrakesStateEnum, str]) -> object:
328
328
  return BrakesStateEnum(data).value
329
329
 
330
+ @dataclass
331
+ class CameraConfiguration:
332
+ """Configuration settings for a camera."""
333
+ fps: Union[int, None] = None
334
+ width: Union[int, None] = None
335
+ height: Union[int, None] = None
336
+
337
+ def validate_fps(self, value: int) -> Tuple[bool, str]:
338
+ if value is None:
339
+ return [True, ""]
340
+
341
+ if not isinstance(value, int):
342
+ return [False, "fps must be of type int for CameraConfiguration, got " + type(value).__name__]
343
+
344
+ return [True, ""]
345
+
346
+ def validate_width(self, value: int) -> Tuple[bool, str]:
347
+ if value is None:
348
+ return [True, ""]
349
+
350
+ if not isinstance(value, int):
351
+ return [False, "width must be of type int for CameraConfiguration, got " + type(value).__name__]
352
+
353
+ return [True, ""]
354
+
355
+ def validate_height(self, value: int) -> Tuple[bool, str]:
356
+ if value is None:
357
+ return [True, ""]
358
+
359
+ if not isinstance(value, int):
360
+ return [False, "height must be of type int for CameraConfiguration, got " + type(value).__name__]
361
+
362
+ return [True, ""]
363
+
364
+ def __post_init__(self):
365
+ # Type check incoming model - raise error if invalid (required or wrong type)
366
+ is_valid, error_str = self.validate_fps(self.fps)
367
+ if not is_valid:
368
+ raise TypeError(error_str)
369
+ is_valid, error_str = self.validate_width(self.width)
370
+ if not is_valid:
371
+ raise TypeError(error_str)
372
+ is_valid, error_str = self.validate_height(self.height)
373
+ if not is_valid:
374
+ raise TypeError(error_str)
375
+
376
+ def parse_camera_configuration(data: object):
377
+ return CameraConfiguration(
378
+ fps=parse_u_32(data["fps"]) if "fps" in data and data.get("fps") is not None else None,
379
+ width=parse_u_32(data["width"]) if "width" in data and data.get("width") is not None else None,
380
+ height=parse_u_32(data["height"]) if "height" in data and data.get("height") is not None else None,
381
+ )
382
+
383
+ def serialize_camera_configuration(data: CameraConfiguration) -> object:
384
+ return {
385
+ "fps": None if data.fps is None else serialize_u_32(data.fps),
386
+ "width": None if data.width is None else serialize_u_32(data.width),
387
+ "height": None if data.height is None else serialize_u_32(data.height),
388
+ }
389
+
330
390
  @dataclass
331
391
  class CameraIntrinsics:
332
392
  """Intrinsic parameters of the camera."""
@@ -612,6 +672,20 @@ def serialize_camera_status(data: CameraStatus) -> object:
612
672
  "message": None if data.message is None else serialize_str(data.message),
613
673
  }
614
674
 
675
+ class CameraType(Enum):
676
+ UNKOWN = "UNKOWN"
677
+ """Enum UNKOWN = `UNKOWN`"""
678
+ REALSENSE = "REALSENSE"
679
+ """Enum REALSENSE = `REALSENSE`"""
680
+ LUXONIS = "LUXONIS"
681
+ """Enum LUXONIS = `LUXONIS`"""
682
+
683
+ def parse_camera_type(data: object) -> CameraType:
684
+ return CameraType(data)
685
+
686
+ def serialize_camera_type(data: Union[CameraType, str]) -> object:
687
+ return CameraType(data).value
688
+
615
689
  @dataclass
616
690
  class CartesianPose:
617
691
  """Cartesian pose
@@ -1111,6 +1185,109 @@ def serialize_environment_variable(data: EnvironmentVariable) -> object:
1111
1185
  "value": None if data.value is None else serialize_str(data.value),
1112
1186
  }
1113
1187
 
1188
+ @dataclass
1189
+ class EquipmentConfig:
1190
+ """Equipment configuration
1191
+ """
1192
+ id: Union[str, None] = None
1193
+ name: Union[str, None] = None
1194
+ kind: Union[str, None] = None
1195
+ is_enabled: Union[bool, None] = None
1196
+ config: Union[str, None] = None
1197
+
1198
+ def validate_id(self, value: str) -> Tuple[bool, str]:
1199
+ if value is None:
1200
+ return [False, "id is required for EquipmentConfig"]
1201
+
1202
+ if not isinstance(value, str):
1203
+ return [False, "id must be of type str for EquipmentConfig, got " + type(value).__name__]
1204
+
1205
+ return [True, ""]
1206
+
1207
+ def validate_name(self, value: str) -> Tuple[bool, str]:
1208
+ if value is None:
1209
+ return [True, ""]
1210
+
1211
+ if not isinstance(value, str):
1212
+ return [False, "name must be of type str for EquipmentConfig, got " + type(value).__name__]
1213
+
1214
+ return [True, ""]
1215
+
1216
+ def validate_kind(self, value: str) -> Tuple[bool, str]:
1217
+ if value is None:
1218
+ return [False, "kind is required for EquipmentConfig"]
1219
+
1220
+ if not isinstance(value, str):
1221
+ return [False, "kind must be of type str for EquipmentConfig, got " + type(value).__name__]
1222
+
1223
+ return [True, ""]
1224
+
1225
+ def validate_is_enabled(self, value: bool) -> Tuple[bool, str]:
1226
+ if value is None:
1227
+ return [False, "is_enabled is required for EquipmentConfig"]
1228
+
1229
+ if not isinstance(value, bool):
1230
+ return [False, "is_enabled must be of type bool for EquipmentConfig, got " + type(value).__name__]
1231
+
1232
+ return [True, ""]
1233
+
1234
+ def validate_config(self, value: str) -> Tuple[bool, str]:
1235
+ if value is None:
1236
+ return [False, "config is required for EquipmentConfig"]
1237
+
1238
+ if not isinstance(value, str):
1239
+ return [False, "config must be of type str for EquipmentConfig, got " + type(value).__name__]
1240
+
1241
+ return [True, ""]
1242
+
1243
+ def __post_init__(self):
1244
+ # Type check incoming model - raise error if invalid (required or wrong type)
1245
+ is_valid, error_str = self.validate_id(self.id)
1246
+ if not is_valid:
1247
+ raise TypeError(error_str)
1248
+ is_valid, error_str = self.validate_name(self.name)
1249
+ if not is_valid:
1250
+ raise TypeError(error_str)
1251
+ is_valid, error_str = self.validate_kind(self.kind)
1252
+ if not is_valid:
1253
+ raise TypeError(error_str)
1254
+ is_valid, error_str = self.validate_is_enabled(self.is_enabled)
1255
+ if not is_valid:
1256
+ raise TypeError(error_str)
1257
+ is_valid, error_str = self.validate_config(self.config)
1258
+ if not is_valid:
1259
+ raise TypeError(error_str)
1260
+
1261
+ def parse_equipment_config(data: object):
1262
+ return EquipmentConfig(
1263
+ id=parse_str(data["id"]) if "id" in data and data.get("id") is not None else None,
1264
+ name=parse_str(data["name"]) if "name" in data and data.get("name") is not None else None,
1265
+ kind=parse_str(data["kind"]) if "kind" in data and data.get("kind") is not None else None,
1266
+ is_enabled=parse_bool(data["is_enabled"]) if "is_enabled" in data and data.get("is_enabled") is not None else None,
1267
+ config=parse_str(data["config"]) if "config" in data and data.get("config") is not None else None,
1268
+ )
1269
+
1270
+ def serialize_equipment_config(data: EquipmentConfig) -> object:
1271
+ return {
1272
+ "id": serialize_str(data.id),
1273
+ "name": None if data.name is None else serialize_str(data.name),
1274
+ "kind": serialize_str(data.kind),
1275
+ "is_enabled": serialize_bool(data.is_enabled),
1276
+ "config": serialize_str(data.config),
1277
+ }
1278
+
1279
+ EquipmentKeyAssignments = Dict[str, str]
1280
+
1281
+ def parse_equipment_key_assignments(data: object) -> EquipmentKeyAssignments:
1282
+ return {
1283
+ parse_str(key): parse_str(value) for key, value in data.items()
1284
+ }
1285
+
1286
+ def serialize_equipment_key_assignments(data: EquipmentKeyAssignments) -> object:
1287
+ return {
1288
+ serialize_str(key): serialize_str(value) for key, value in data.items()
1289
+ }
1290
+
1114
1291
  class ErrorEnum(Enum):
1115
1292
  AuthorizationRequired = "authorization_required"
1116
1293
  """Authorization required to access this resource"""
@@ -1946,6 +2123,81 @@ def serialize_payload_state_response(data: PayloadStateResponse) -> object:
1946
2123
  "mass": None if data.mass is None else serialize_f_64(data.mass),
1947
2124
  }
1948
2125
 
2126
+ @dataclass
2127
+ class Peer:
2128
+ """Information about a registered messenger peer"""
2129
+ id: Union[str, None] = None
2130
+ host: Union[str, None] = None
2131
+ requestPort: Union[int, None] = None
2132
+ topicPort: Union[int, None] = None
2133
+
2134
+ def validate_id(self, value: str) -> Tuple[bool, str]:
2135
+ if value is None:
2136
+ return [False, "id is required for Peer"]
2137
+
2138
+ if not isinstance(value, str):
2139
+ return [False, "id must be of type str for Peer, got " + type(value).__name__]
2140
+
2141
+ return [True, ""]
2142
+
2143
+ def validate_host(self, value: str) -> Tuple[bool, str]:
2144
+ if value is None:
2145
+ return [False, "host is required for Peer"]
2146
+
2147
+ if not isinstance(value, str):
2148
+ return [False, "host must be of type str for Peer, got " + type(value).__name__]
2149
+
2150
+ return [True, ""]
2151
+
2152
+ def validate_requestPort(self, value: int) -> Tuple[bool, str]:
2153
+ if value is None:
2154
+ return [False, "requestPort is required for Peer"]
2155
+
2156
+ if not isinstance(value, int):
2157
+ return [False, "requestPort must be of type int for Peer, got " + type(value).__name__]
2158
+
2159
+ return [True, ""]
2160
+
2161
+ def validate_topicPort(self, value: int) -> Tuple[bool, str]:
2162
+ if value is None:
2163
+ return [False, "topicPort is required for Peer"]
2164
+
2165
+ if not isinstance(value, int):
2166
+ return [False, "topicPort must be of type int for Peer, got " + type(value).__name__]
2167
+
2168
+ return [True, ""]
2169
+
2170
+ def __post_init__(self):
2171
+ # Type check incoming model - raise error if invalid (required or wrong type)
2172
+ is_valid, error_str = self.validate_id(self.id)
2173
+ if not is_valid:
2174
+ raise TypeError(error_str)
2175
+ is_valid, error_str = self.validate_host(self.host)
2176
+ if not is_valid:
2177
+ raise TypeError(error_str)
2178
+ is_valid, error_str = self.validate_requestPort(self.requestPort)
2179
+ if not is_valid:
2180
+ raise TypeError(error_str)
2181
+ is_valid, error_str = self.validate_topicPort(self.topicPort)
2182
+ if not is_valid:
2183
+ raise TypeError(error_str)
2184
+
2185
+ def parse_peer(data: object):
2186
+ return Peer(
2187
+ id=parse_str(data["id"]) if "id" in data and data.get("id") is not None else None,
2188
+ host=parse_str(data["host"]) if "host" in data and data.get("host") is not None else None,
2189
+ requestPort=parse_i_32(data["requestPort"]) if "requestPort" in data and data.get("requestPort") is not None else None,
2190
+ topicPort=parse_i_32(data["topicPort"]) if "topicPort" in data and data.get("topicPort") is not None else None,
2191
+ )
2192
+
2193
+ def serialize_peer(data: Peer) -> object:
2194
+ return {
2195
+ "id": serialize_str(data.id),
2196
+ "host": serialize_str(data.host),
2197
+ "requestPort": serialize_i_32(data.requestPort),
2198
+ "topicPort": serialize_i_32(data.topicPort),
2199
+ }
2200
+
1949
2201
  @dataclass
1950
2202
  class Plane:
1951
2203
  """Plane in 3D space"""
@@ -2226,6 +2478,8 @@ class RecorderStatus(Enum):
2226
2478
  """Enum Error = `error`"""
2227
2479
  Complete = "complete"
2228
2480
  """Enum Complete = `complete`"""
2481
+ Initializing = "initializing"
2482
+ """Enum Initializing = `initializing`"""
2229
2483
 
2230
2484
  def parse_recorder_status(data: object) -> RecorderStatus:
2231
2485
  return RecorderStatus(data)
@@ -2251,6 +2505,141 @@ def parse_recovery_type_enum(data: object) -> RecoveryTypeEnum:
2251
2505
  def serialize_recovery_type_enum(data: Union[RecoveryTypeEnum, str]) -> object:
2252
2506
  return RecoveryTypeEnum(data).value
2253
2507
 
2508
+ @dataclass
2509
+ class RegisterPeerRequest:
2510
+ """Request to register a new peer with the messenger system"""
2511
+ targetId: Union[str, None] = None
2512
+ senderId: Union[str, None] = None
2513
+ host: Union[str, None] = None
2514
+ requestPort: Union[int, None] = None
2515
+ topicPort: Union[int, None] = None
2516
+
2517
+ def validate_targetId(self, value: str) -> Tuple[bool, str]:
2518
+ if value is None:
2519
+ return [False, "targetId is required for RegisterPeerRequest"]
2520
+
2521
+ if not isinstance(value, str):
2522
+ return [False, "targetId must be of type str for RegisterPeerRequest, got " + type(value).__name__]
2523
+
2524
+ return [True, ""]
2525
+
2526
+ def validate_senderId(self, value: str) -> Tuple[bool, str]:
2527
+ if value is None:
2528
+ return [False, "senderId is required for RegisterPeerRequest"]
2529
+
2530
+ if not isinstance(value, str):
2531
+ return [False, "senderId must be of type str for RegisterPeerRequest, got " + type(value).__name__]
2532
+
2533
+ return [True, ""]
2534
+
2535
+ def validate_host(self, value: str) -> Tuple[bool, str]:
2536
+ if value is None:
2537
+ return [False, "host is required for RegisterPeerRequest"]
2538
+
2539
+ if not isinstance(value, str):
2540
+ return [False, "host must be of type str for RegisterPeerRequest, got " + type(value).__name__]
2541
+
2542
+ return [True, ""]
2543
+
2544
+ def validate_requestPort(self, value: int) -> Tuple[bool, str]:
2545
+ if value is None:
2546
+ return [False, "requestPort is required for RegisterPeerRequest"]
2547
+
2548
+ if not isinstance(value, int):
2549
+ return [False, "requestPort must be of type int for RegisterPeerRequest, got " + type(value).__name__]
2550
+
2551
+ return [True, ""]
2552
+
2553
+ def validate_topicPort(self, value: int) -> Tuple[bool, str]:
2554
+ if value is None:
2555
+ return [False, "topicPort is required for RegisterPeerRequest"]
2556
+
2557
+ if not isinstance(value, int):
2558
+ return [False, "topicPort must be of type int for RegisterPeerRequest, got " + type(value).__name__]
2559
+
2560
+ return [True, ""]
2561
+
2562
+ def __post_init__(self):
2563
+ # Type check incoming model - raise error if invalid (required or wrong type)
2564
+ is_valid, error_str = self.validate_targetId(self.targetId)
2565
+ if not is_valid:
2566
+ raise TypeError(error_str)
2567
+ is_valid, error_str = self.validate_senderId(self.senderId)
2568
+ if not is_valid:
2569
+ raise TypeError(error_str)
2570
+ is_valid, error_str = self.validate_host(self.host)
2571
+ if not is_valid:
2572
+ raise TypeError(error_str)
2573
+ is_valid, error_str = self.validate_requestPort(self.requestPort)
2574
+ if not is_valid:
2575
+ raise TypeError(error_str)
2576
+ is_valid, error_str = self.validate_topicPort(self.topicPort)
2577
+ if not is_valid:
2578
+ raise TypeError(error_str)
2579
+
2580
+ def parse_register_peer_request(data: object):
2581
+ return RegisterPeerRequest(
2582
+ targetId=parse_str(data["targetId"]) if "targetId" in data and data.get("targetId") is not None else None,
2583
+ senderId=parse_str(data["senderId"]) if "senderId" in data and data.get("senderId") is not None else None,
2584
+ host=parse_str(data["host"]) if "host" in data and data.get("host") is not None else None,
2585
+ requestPort=parse_i_32(data["requestPort"]) if "requestPort" in data and data.get("requestPort") is not None else None,
2586
+ topicPort=parse_i_32(data["topicPort"]) if "topicPort" in data and data.get("topicPort") is not None else None,
2587
+ )
2588
+
2589
+ def serialize_register_peer_request(data: RegisterPeerRequest) -> object:
2590
+ return {
2591
+ "targetId": serialize_str(data.targetId),
2592
+ "senderId": serialize_str(data.senderId),
2593
+ "host": serialize_str(data.host),
2594
+ "requestPort": serialize_i_32(data.requestPort),
2595
+ "topicPort": serialize_i_32(data.topicPort),
2596
+ }
2597
+
2598
+ @dataclass
2599
+ class RegisterPeerResponse:
2600
+ """Response after attempting to register a peer"""
2601
+ success: Union[bool, None] = None
2602
+ message: Union[str, None] = None
2603
+
2604
+ def validate_success(self, value: bool) -> Tuple[bool, str]:
2605
+ if value is None:
2606
+ return [False, "success is required for RegisterPeerResponse"]
2607
+
2608
+ if not isinstance(value, bool):
2609
+ return [False, "success must be of type bool for RegisterPeerResponse, got " + type(value).__name__]
2610
+
2611
+ return [True, ""]
2612
+
2613
+ def validate_message(self, value: str) -> Tuple[bool, str]:
2614
+ if value is None:
2615
+ return [True, ""]
2616
+
2617
+ if not isinstance(value, str):
2618
+ return [False, "message must be of type str for RegisterPeerResponse, got " + type(value).__name__]
2619
+
2620
+ return [True, ""]
2621
+
2622
+ def __post_init__(self):
2623
+ # Type check incoming model - raise error if invalid (required or wrong type)
2624
+ is_valid, error_str = self.validate_success(self.success)
2625
+ if not is_valid:
2626
+ raise TypeError(error_str)
2627
+ is_valid, error_str = self.validate_message(self.message)
2628
+ if not is_valid:
2629
+ raise TypeError(error_str)
2630
+
2631
+ def parse_register_peer_response(data: object):
2632
+ return RegisterPeerResponse(
2633
+ success=parse_bool(data["success"]) if "success" in data and data.get("success") is not None else None,
2634
+ message=parse_str(data["message"]) if "message" in data and data.get("message") is not None else None,
2635
+ )
2636
+
2637
+ def serialize_register_peer_response(data: RegisterPeerResponse) -> object:
2638
+ return {
2639
+ "success": serialize_bool(data.success),
2640
+ "message": None if data.message is None else serialize_str(data.message),
2641
+ }
2642
+
2254
2643
  class RobotControlModeEnum(Enum):
2255
2644
  Api = "api"
2256
2645
  """The robot is controlled via the Standard Bots Robot API (this API)"""
@@ -2659,11 +3048,116 @@ def serialize_sensor(data: Sensor) -> object:
2659
3048
  }
2660
3049
 
2661
3050
  @dataclass
2662
- class SetRatioControlRequest:
2663
- """Request to set ratio control parameters"""
2664
- enabled: Union[bool, None] = None
2665
- value: Union[float, None] = None
2666
-
3051
+ class SensorConfig:
3052
+ """Config of the sensor"""
3053
+ id: Union[str, None] = None
3054
+ equipmentName: Union[str, None] = None
3055
+ sensorType: Union[str, None] = None
3056
+ dataType: Union[str, None] = None
3057
+ isSecondary: Union[bool, None] = None
3058
+ metadata: Union[str, None] = None
3059
+
3060
+ def validate_id(self, value: str) -> Tuple[bool, str]:
3061
+ if value is None:
3062
+ return [True, ""]
3063
+
3064
+ if not isinstance(value, str):
3065
+ return [False, "id must be of type str for SensorConfig, got " + type(value).__name__]
3066
+
3067
+ return [True, ""]
3068
+
3069
+ def validate_equipmentName(self, value: str) -> Tuple[bool, str]:
3070
+ if value is None:
3071
+ return [True, ""]
3072
+
3073
+ if not isinstance(value, str):
3074
+ return [False, "equipmentName must be of type str for SensorConfig, got " + type(value).__name__]
3075
+
3076
+ return [True, ""]
3077
+
3078
+ def validate_sensorType(self, value: str) -> Tuple[bool, str]:
3079
+ if value is None:
3080
+ return [True, ""]
3081
+
3082
+ if not isinstance(value, str):
3083
+ return [False, "sensorType must be of type str for SensorConfig, got " + type(value).__name__]
3084
+
3085
+ return [True, ""]
3086
+
3087
+ def validate_dataType(self, value: str) -> Tuple[bool, str]:
3088
+ if value is None:
3089
+ return [True, ""]
3090
+
3091
+ if not isinstance(value, str):
3092
+ return [False, "dataType must be of type str for SensorConfig, got " + type(value).__name__]
3093
+
3094
+ return [True, ""]
3095
+
3096
+ def validate_isSecondary(self, value: bool) -> Tuple[bool, str]:
3097
+ if value is None:
3098
+ return [True, ""]
3099
+
3100
+ if not isinstance(value, bool):
3101
+ return [False, "isSecondary must be of type bool for SensorConfig, got " + type(value).__name__]
3102
+
3103
+ return [True, ""]
3104
+
3105
+ def validate_metadata(self, value: str) -> Tuple[bool, str]:
3106
+ if value is None:
3107
+ return [True, ""]
3108
+
3109
+ if not isinstance(value, str):
3110
+ return [False, "metadata must be of type str for SensorConfig, got " + type(value).__name__]
3111
+
3112
+ return [True, ""]
3113
+
3114
+ def __post_init__(self):
3115
+ # Type check incoming model - raise error if invalid (required or wrong type)
3116
+ is_valid, error_str = self.validate_id(self.id)
3117
+ if not is_valid:
3118
+ raise TypeError(error_str)
3119
+ is_valid, error_str = self.validate_equipmentName(self.equipmentName)
3120
+ if not is_valid:
3121
+ raise TypeError(error_str)
3122
+ is_valid, error_str = self.validate_sensorType(self.sensorType)
3123
+ if not is_valid:
3124
+ raise TypeError(error_str)
3125
+ is_valid, error_str = self.validate_dataType(self.dataType)
3126
+ if not is_valid:
3127
+ raise TypeError(error_str)
3128
+ is_valid, error_str = self.validate_isSecondary(self.isSecondary)
3129
+ if not is_valid:
3130
+ raise TypeError(error_str)
3131
+ is_valid, error_str = self.validate_metadata(self.metadata)
3132
+ if not is_valid:
3133
+ raise TypeError(error_str)
3134
+
3135
+ def parse_sensor_config(data: object):
3136
+ return SensorConfig(
3137
+ id=parse_str(data["id"]) if "id" in data and data.get("id") is not None else None,
3138
+ equipmentName=parse_str(data["equipmentName"]) if "equipmentName" in data and data.get("equipmentName") is not None else None,
3139
+ sensorType=parse_str(data["sensorType"]) if "sensorType" in data and data.get("sensorType") is not None else None,
3140
+ dataType=parse_str(data["dataType"]) if "dataType" in data and data.get("dataType") is not None else None,
3141
+ isSecondary=parse_bool(data["isSecondary"]) if "isSecondary" in data and data.get("isSecondary") is not None else None,
3142
+ metadata=parse_str(data["metadata"]) if "metadata" in data and data.get("metadata") is not None else None,
3143
+ )
3144
+
3145
+ def serialize_sensor_config(data: SensorConfig) -> object:
3146
+ return {
3147
+ "id": None if data.id is None else serialize_str(data.id),
3148
+ "equipmentName": None if data.equipmentName is None else serialize_str(data.equipmentName),
3149
+ "sensorType": None if data.sensorType is None else serialize_str(data.sensorType),
3150
+ "dataType": None if data.dataType is None else serialize_str(data.dataType),
3151
+ "isSecondary": None if data.isSecondary is None else serialize_bool(data.isSecondary),
3152
+ "metadata": None if data.metadata is None else serialize_str(data.metadata),
3153
+ }
3154
+
3155
+ @dataclass
3156
+ class SetRatioControlRequest:
3157
+ """Request to set ratio control parameters"""
3158
+ enabled: Union[bool, None] = None
3159
+ value: Union[float, None] = None
3160
+
2667
3161
  def validate_enabled(self, value: bool) -> Tuple[bool, str]:
2668
3162
  if value is None:
2669
3163
  return [True, ""]
@@ -2703,6 +3197,30 @@ def serialize_set_ratio_control_request(data: SetRatioControlRequest) -> object:
2703
3197
  "value": None if data.value is None else serialize_f_64(data.value),
2704
3198
  }
2705
3199
 
3200
+ class SignalMessageType(Enum):
3201
+ JoinRoom = "join-room"
3202
+ """Enum JoinRoom = `join-room`"""
3203
+ Connect = "connect"
3204
+ """Enum Connect = `connect`"""
3205
+ Join = "join"
3206
+ """Enum Join = `join`"""
3207
+ Leave = "leave"
3208
+ """Enum Leave = `leave`"""
3209
+ Offer = "offer"
3210
+ """Enum Offer = `offer`"""
3211
+ Answer = "answer"
3212
+ """Enum Answer = `answer`"""
3213
+ IceCandidate = "ice-candidate"
3214
+ """Enum IceCandidate = `ice-candidate`"""
3215
+ Heartbeat = "heartbeat"
3216
+ """Enum Heartbeat = `heartbeat`"""
3217
+
3218
+ def parse_signal_message_type(data: object) -> SignalMessageType:
3219
+ return SignalMessageType(data)
3220
+
3221
+ def serialize_signal_message_type(data: Union[SignalMessageType, str]) -> object:
3222
+ return SignalMessageType(data).value
3223
+
2706
3224
  SkillsList = List[str]
2707
3225
 
2708
3226
  def parse_skills_list(data: object) -> SkillsList:
@@ -2741,36 +3259,6 @@ def serialize_speech_to_text_request(data: SpeechToTextRequest) -> object:
2741
3259
  "encoded_audio_data": None if data.encoded_audio_data is None else serialize_str(data.encoded_audio_data),
2742
3260
  }
2743
3261
 
2744
- @dataclass
2745
- class StartRecordingRequest:
2746
- """Request to start recording movement and camera data"""
2747
- startTime: Union[str, None] = None
2748
-
2749
- def validate_startTime(self, value: str) -> Tuple[bool, str]:
2750
- if value is None:
2751
- return [True, ""]
2752
-
2753
- if not isinstance(value, str):
2754
- return [False, "startTime must be of type str for StartRecordingRequest, got " + type(value).__name__]
2755
-
2756
- return [True, ""]
2757
-
2758
- def __post_init__(self):
2759
- # Type check incoming model - raise error if invalid (required or wrong type)
2760
- is_valid, error_str = self.validate_startTime(self.startTime)
2761
- if not is_valid:
2762
- raise TypeError(error_str)
2763
-
2764
- def parse_start_recording_request(data: object):
2765
- return StartRecordingRequest(
2766
- startTime=parse_str(data["startTime"]) if "startTime" in data and data.get("startTime") is not None else None,
2767
- )
2768
-
2769
- def serialize_start_recording_request(data: StartRecordingRequest) -> object:
2770
- return {
2771
- "startTime": None if data.startTime is None else serialize_str(data.startTime),
2772
- }
2773
-
2774
3262
  class StatusHealthEnum(Enum):
2775
3263
  Ok = "ok"
2776
3264
  """Enum Ok = `ok`"""
@@ -3022,6 +3510,96 @@ def serialize_trigger_fault_request(data: TriggerFaultRequest) -> object:
3022
3510
  "isRecoverable": None if data.isRecoverable is None else serialize_bool(data.isRecoverable),
3023
3511
  }
3024
3512
 
3513
+ @dataclass
3514
+ class UnregisterPeerRequest:
3515
+ """Request to unregister an existing peer from the messenger system"""
3516
+ targetId: Union[str, None] = None
3517
+ senderId: Union[str, None] = None
3518
+
3519
+ def validate_targetId(self, value: str) -> Tuple[bool, str]:
3520
+ if value is None:
3521
+ return [False, "targetId is required for UnregisterPeerRequest"]
3522
+
3523
+ if not isinstance(value, str):
3524
+ return [False, "targetId must be of type str for UnregisterPeerRequest, got " + type(value).__name__]
3525
+
3526
+ return [True, ""]
3527
+
3528
+ def validate_senderId(self, value: str) -> Tuple[bool, str]:
3529
+ if value is None:
3530
+ return [False, "senderId is required for UnregisterPeerRequest"]
3531
+
3532
+ if not isinstance(value, str):
3533
+ return [False, "senderId must be of type str for UnregisterPeerRequest, got " + type(value).__name__]
3534
+
3535
+ return [True, ""]
3536
+
3537
+ def __post_init__(self):
3538
+ # Type check incoming model - raise error if invalid (required or wrong type)
3539
+ is_valid, error_str = self.validate_targetId(self.targetId)
3540
+ if not is_valid:
3541
+ raise TypeError(error_str)
3542
+ is_valid, error_str = self.validate_senderId(self.senderId)
3543
+ if not is_valid:
3544
+ raise TypeError(error_str)
3545
+
3546
+ def parse_unregister_peer_request(data: object):
3547
+ return UnregisterPeerRequest(
3548
+ targetId=parse_str(data["targetId"]) if "targetId" in data and data.get("targetId") is not None else None,
3549
+ senderId=parse_str(data["senderId"]) if "senderId" in data and data.get("senderId") is not None else None,
3550
+ )
3551
+
3552
+ def serialize_unregister_peer_request(data: UnregisterPeerRequest) -> object:
3553
+ return {
3554
+ "targetId": serialize_str(data.targetId),
3555
+ "senderId": serialize_str(data.senderId),
3556
+ }
3557
+
3558
+ @dataclass
3559
+ class UnregisterPeerResponse:
3560
+ """Response after attempting to unregister a peer"""
3561
+ success: Union[bool, None] = None
3562
+ message: Union[str, None] = None
3563
+
3564
+ def validate_success(self, value: bool) -> Tuple[bool, str]:
3565
+ if value is None:
3566
+ return [False, "success is required for UnregisterPeerResponse"]
3567
+
3568
+ if not isinstance(value, bool):
3569
+ return [False, "success must be of type bool for UnregisterPeerResponse, got " + type(value).__name__]
3570
+
3571
+ return [True, ""]
3572
+
3573
+ def validate_message(self, value: str) -> Tuple[bool, str]:
3574
+ if value is None:
3575
+ return [True, ""]
3576
+
3577
+ if not isinstance(value, str):
3578
+ return [False, "message must be of type str for UnregisterPeerResponse, got " + type(value).__name__]
3579
+
3580
+ return [True, ""]
3581
+
3582
+ def __post_init__(self):
3583
+ # Type check incoming model - raise error if invalid (required or wrong type)
3584
+ is_valid, error_str = self.validate_success(self.success)
3585
+ if not is_valid:
3586
+ raise TypeError(error_str)
3587
+ is_valid, error_str = self.validate_message(self.message)
3588
+ if not is_valid:
3589
+ raise TypeError(error_str)
3590
+
3591
+ def parse_unregister_peer_response(data: object):
3592
+ return UnregisterPeerResponse(
3593
+ success=parse_bool(data["success"]) if "success" in data and data.get("success") is not None else None,
3594
+ message=parse_str(data["message"]) if "message" in data and data.get("message") is not None else None,
3595
+ )
3596
+
3597
+ def serialize_unregister_peer_response(data: UnregisterPeerResponse) -> object:
3598
+ return {
3599
+ "success": serialize_bool(data.success),
3600
+ "message": None if data.message is None else serialize_str(data.message),
3601
+ }
3602
+
3025
3603
  @dataclass
3026
3604
  class ArmPositionUpdateFailureEvent:
3027
3605
  """Move robot event when movement failed"""
@@ -3151,6 +3729,141 @@ def serialize_camera_frame_request(data: CameraFrameRequest) -> object:
3151
3729
  "camera_settings": None if data.camera_settings is None else serialize_camera_settings(data.camera_settings),
3152
3730
  }
3153
3731
 
3732
+ @dataclass
3733
+ class CameraDevice:
3734
+ """Information about a camera device."""
3735
+ id: Union[str, None] = None
3736
+ name: Union[str, None] = None
3737
+ label: Union[str, None] = None
3738
+ type: Union[CameraType, None] = None
3739
+ model_name: Union[str, None] = None
3740
+ enabled: Union[bool, None] = None
3741
+ ip_address: Union[str, None] = None
3742
+ config: Union[CameraConfiguration, None] = None
3743
+
3744
+ def validate_id(self, value: str) -> Tuple[bool, str]:
3745
+ if value is None:
3746
+ return [True, ""]
3747
+
3748
+ if not isinstance(value, str):
3749
+ return [False, "id must be of type str for CameraDevice, got " + type(value).__name__]
3750
+
3751
+ return [True, ""]
3752
+
3753
+ def validate_name(self, value: str) -> Tuple[bool, str]:
3754
+ if value is None:
3755
+ return [True, ""]
3756
+
3757
+ if not isinstance(value, str):
3758
+ return [False, "name must be of type str for CameraDevice, got " + type(value).__name__]
3759
+
3760
+ return [True, ""]
3761
+
3762
+ def validate_label(self, value: str) -> Tuple[bool, str]:
3763
+ if value is None:
3764
+ return [True, ""]
3765
+
3766
+ if not isinstance(value, str):
3767
+ return [False, "label must be of type str for CameraDevice, got " + type(value).__name__]
3768
+
3769
+ return [True, ""]
3770
+
3771
+ def validate_type(self, value: CameraType) -> Tuple[bool, str]:
3772
+ if value is None:
3773
+ return [True, ""]
3774
+
3775
+ if not ((isinstance(value, str) and CameraType in ['UNKOWN', 'REALSENSE', 'LUXONIS']) or isinstance(value, CameraType)):
3776
+ return [False, "type must be of type CameraType for CameraDevice, got " + type(value).__name__]
3777
+
3778
+ return [True, ""]
3779
+
3780
+ def validate_model_name(self, value: str) -> Tuple[bool, str]:
3781
+ if value is None:
3782
+ return [True, ""]
3783
+
3784
+ if not isinstance(value, str):
3785
+ return [False, "model_name must be of type str for CameraDevice, got " + type(value).__name__]
3786
+
3787
+ return [True, ""]
3788
+
3789
+ def validate_enabled(self, value: bool) -> Tuple[bool, str]:
3790
+ if value is None:
3791
+ return [True, ""]
3792
+
3793
+ if not isinstance(value, bool):
3794
+ return [False, "enabled must be of type bool for CameraDevice, got " + type(value).__name__]
3795
+
3796
+ return [True, ""]
3797
+
3798
+ def validate_ip_address(self, value: str) -> Tuple[bool, str]:
3799
+ if value is None:
3800
+ return [True, ""]
3801
+
3802
+ if not isinstance(value, str):
3803
+ return [False, "ip_address must be of type str for CameraDevice, got " + type(value).__name__]
3804
+
3805
+ return [True, ""]
3806
+
3807
+ def validate_config(self, value: CameraConfiguration) -> Tuple[bool, str]:
3808
+ if value is None:
3809
+ return [True, ""]
3810
+
3811
+ if not isinstance(value, CameraConfiguration):
3812
+ return [False, "config must be of type CameraConfiguration for CameraDevice, got " + type(value).__name__]
3813
+
3814
+ return [True, ""]
3815
+
3816
+ def __post_init__(self):
3817
+ # Type check incoming model - raise error if invalid (required or wrong type)
3818
+ is_valid, error_str = self.validate_id(self.id)
3819
+ if not is_valid:
3820
+ raise TypeError(error_str)
3821
+ is_valid, error_str = self.validate_name(self.name)
3822
+ if not is_valid:
3823
+ raise TypeError(error_str)
3824
+ is_valid, error_str = self.validate_label(self.label)
3825
+ if not is_valid:
3826
+ raise TypeError(error_str)
3827
+ is_valid, error_str = self.validate_type(self.type)
3828
+ if not is_valid:
3829
+ raise TypeError(error_str)
3830
+ is_valid, error_str = self.validate_model_name(self.model_name)
3831
+ if not is_valid:
3832
+ raise TypeError(error_str)
3833
+ is_valid, error_str = self.validate_enabled(self.enabled)
3834
+ if not is_valid:
3835
+ raise TypeError(error_str)
3836
+ is_valid, error_str = self.validate_ip_address(self.ip_address)
3837
+ if not is_valid:
3838
+ raise TypeError(error_str)
3839
+ is_valid, error_str = self.validate_config(self.config)
3840
+ if not is_valid:
3841
+ raise TypeError(error_str)
3842
+
3843
+ def parse_camera_device(data: object):
3844
+ return CameraDevice(
3845
+ id=parse_str(data["id"]) if "id" in data and data.get("id") is not None else None,
3846
+ name=parse_str(data["name"]) if "name" in data and data.get("name") is not None else None,
3847
+ label=parse_str(data["label"]) if "label" in data and data.get("label") is not None else None,
3848
+ type=parse_camera_type(data["type"]) if "type" in data and data.get("type") is not None else None,
3849
+ model_name=parse_str(data["model_name"]) if "model_name" in data and data.get("model_name") is not None else None,
3850
+ enabled=parse_bool(data["enabled"]) if "enabled" in data and data.get("enabled") is not None else None,
3851
+ ip_address=parse_str(data["ip_address"]) if "ip_address" in data and data.get("ip_address") is not None else None,
3852
+ config=parse_camera_configuration(data["config"]) if "config" in data and data.get("config") is not None else None,
3853
+ )
3854
+
3855
+ def serialize_camera_device(data: CameraDevice) -> object:
3856
+ return {
3857
+ "id": None if data.id is None else serialize_str(data.id),
3858
+ "name": None if data.name is None else serialize_str(data.name),
3859
+ "label": None if data.label is None else serialize_str(data.label),
3860
+ "type": None if data.type is None else serialize_camera_type(data.type),
3861
+ "model_name": None if data.model_name is None else serialize_str(data.model_name),
3862
+ "enabled": None if data.enabled is None else serialize_bool(data.enabled),
3863
+ "ip_address": None if data.ip_address is None else serialize_str(data.ip_address),
3864
+ "config": None if data.config is None else serialize_camera_configuration(data.config),
3865
+ }
3866
+
3154
3867
  @dataclass
3155
3868
  class CartesianOffsetResponse:
3156
3869
  """Response with the cartesian offset value
@@ -3435,6 +4148,59 @@ def parse_environment_variables_list(data: object) -> EnvironmentVariablesList:
3435
4148
  def serialize_environment_variables_list(data: EnvironmentVariablesList) -> List[object]:
3436
4149
  return [serialize_environment_variable(item) for item in data]
3437
4150
 
4151
+ EquipmentConfigList = List[EquipmentConfig]
4152
+
4153
+ def parse_equipment_config_list(data: object) -> EquipmentConfigList:
4154
+ return [parse_equipment_config(item) for item in data]
4155
+
4156
+ def serialize_equipment_config_list(data: EquipmentConfigList) -> List[object]:
4157
+ return [serialize_equipment_config(item) for item in data]
4158
+
4159
+ @dataclass
4160
+ class StartRecordingRequest:
4161
+ """Request to start recording movement and camera data"""
4162
+ startTime: Union[str, None] = None
4163
+ equipmentKeyAssignments: Union[EquipmentKeyAssignments, None] = None
4164
+
4165
+ def validate_startTime(self, value: str) -> Tuple[bool, str]:
4166
+ if value is None:
4167
+ return [True, ""]
4168
+
4169
+ if not isinstance(value, str):
4170
+ return [False, "startTime must be of type str for StartRecordingRequest, got " + type(value).__name__]
4171
+
4172
+ return [True, ""]
4173
+
4174
+ def validate_equipmentKeyAssignments(self, value: EquipmentKeyAssignments) -> Tuple[bool, str]:
4175
+ if value is None:
4176
+ return [True, ""]
4177
+
4178
+ if not (isinstance(value, dict) and all((isinstance(k, str) and isinstance(val, str)) for k, val in value.items())):
4179
+ return [False, "equipmentKeyAssignments must be of type EquipmentKeyAssignments for StartRecordingRequest, got " + type(value).__name__]
4180
+
4181
+ return [True, ""]
4182
+
4183
+ def __post_init__(self):
4184
+ # Type check incoming model - raise error if invalid (required or wrong type)
4185
+ is_valid, error_str = self.validate_startTime(self.startTime)
4186
+ if not is_valid:
4187
+ raise TypeError(error_str)
4188
+ is_valid, error_str = self.validate_equipmentKeyAssignments(self.equipmentKeyAssignments)
4189
+ if not is_valid:
4190
+ raise TypeError(error_str)
4191
+
4192
+ def parse_start_recording_request(data: object):
4193
+ return StartRecordingRequest(
4194
+ startTime=parse_str(data["startTime"]) if "startTime" in data and data.get("startTime") is not None else None,
4195
+ equipmentKeyAssignments=parse_equipment_key_assignments(data["equipmentKeyAssignments"]) if "equipmentKeyAssignments" in data and data.get("equipmentKeyAssignments") is not None else None,
4196
+ )
4197
+
4198
+ def serialize_start_recording_request(data: StartRecordingRequest) -> object:
4199
+ return {
4200
+ "startTime": None if data.startTime is None else serialize_str(data.startTime),
4201
+ "equipmentKeyAssignments": None if data.equipmentKeyAssignments is None else serialize_equipment_key_assignments(data.equipmentKeyAssignments),
4202
+ }
4203
+
3438
4204
  @dataclass
3439
4205
  class ErrorResponse:
3440
4206
  """Error Response"""
@@ -5029,6 +5795,14 @@ def serialize_on_robot_3_fg_15_gripper_configuration(data: OnRobot3FG15GripperCo
5029
5795
  "finger_offset": None if data.finger_offset is None else serialize_f_64(data.finger_offset),
5030
5796
  }
5031
5797
 
5798
+ PeerList = List[Peer]
5799
+
5800
+ def parse_peer_list(data: object) -> PeerList:
5801
+ return [parse_peer(item) for item in data]
5802
+
5803
+ def serialize_peer_list(data: PeerList) -> List[object]:
5804
+ return [serialize_peer(item) for item in data]
5805
+
5032
5806
  PlanesList = List[Plane]
5033
5807
 
5034
5808
  def parse_planes_list(data: object) -> PlanesList:
@@ -5127,96 +5901,6 @@ def serialize_orientation(data: Orientation) -> object:
5127
5901
  "quaternion": None if data.quaternion is None else serialize_quaternion(data.quaternion),
5128
5902
  }
5129
5903
 
5130
- @dataclass
5131
- class RecorderBotDetails:
5132
- """Details of the bot"""
5133
- botId: Union[str, None] = None
5134
- alias: Union[str, None] = None
5135
- isSecondary: Union[bool, None] = None
5136
- isEnabled: Union[bool, None] = None
5137
- status: Union[RecorderStatus, None] = None
5138
-
5139
- def validate_botId(self, value: str) -> Tuple[bool, str]:
5140
- if value is None:
5141
- return [True, ""]
5142
-
5143
- if not isinstance(value, str):
5144
- return [False, "botId must be of type str for RecorderBotDetails, got " + type(value).__name__]
5145
-
5146
- return [True, ""]
5147
-
5148
- def validate_alias(self, value: str) -> Tuple[bool, str]:
5149
- if value is None:
5150
- return [True, ""]
5151
-
5152
- if not isinstance(value, str):
5153
- return [False, "alias must be of type str for RecorderBotDetails, got " + type(value).__name__]
5154
-
5155
- return [True, ""]
5156
-
5157
- def validate_isSecondary(self, value: bool) -> Tuple[bool, str]:
5158
- if value is None:
5159
- return [True, ""]
5160
-
5161
- if not isinstance(value, bool):
5162
- return [False, "isSecondary must be of type bool for RecorderBotDetails, got " + type(value).__name__]
5163
-
5164
- return [True, ""]
5165
-
5166
- def validate_isEnabled(self, value: bool) -> Tuple[bool, str]:
5167
- if value is None:
5168
- return [True, ""]
5169
-
5170
- if not isinstance(value, bool):
5171
- return [False, "isEnabled must be of type bool for RecorderBotDetails, got " + type(value).__name__]
5172
-
5173
- return [True, ""]
5174
-
5175
- def validate_status(self, value: RecorderStatus) -> Tuple[bool, str]:
5176
- if value is None:
5177
- return [True, ""]
5178
-
5179
- if not ((isinstance(value, str) and RecorderStatus in ['not_recording', 'recording', 'error', 'complete']) or isinstance(value, RecorderStatus)):
5180
- return [False, "status must be of type RecorderStatus for RecorderBotDetails, got " + type(value).__name__]
5181
-
5182
- return [True, ""]
5183
-
5184
- def __post_init__(self):
5185
- # Type check incoming model - raise error if invalid (required or wrong type)
5186
- is_valid, error_str = self.validate_botId(self.botId)
5187
- if not is_valid:
5188
- raise TypeError(error_str)
5189
- is_valid, error_str = self.validate_alias(self.alias)
5190
- if not is_valid:
5191
- raise TypeError(error_str)
5192
- is_valid, error_str = self.validate_isSecondary(self.isSecondary)
5193
- if not is_valid:
5194
- raise TypeError(error_str)
5195
- is_valid, error_str = self.validate_isEnabled(self.isEnabled)
5196
- if not is_valid:
5197
- raise TypeError(error_str)
5198
- is_valid, error_str = self.validate_status(self.status)
5199
- if not is_valid:
5200
- raise TypeError(error_str)
5201
-
5202
- def parse_recorder_bot_details(data: object):
5203
- return RecorderBotDetails(
5204
- botId=parse_str(data["botId"]) if "botId" in data and data.get("botId") is not None else None,
5205
- alias=parse_str(data["alias"]) if "alias" in data and data.get("alias") is not None else None,
5206
- isSecondary=parse_bool(data["isSecondary"]) if "isSecondary" in data and data.get("isSecondary") is not None else None,
5207
- isEnabled=parse_bool(data["isEnabled"]) if "isEnabled" in data and data.get("isEnabled") is not None else None,
5208
- status=parse_recorder_status(data["status"]) if "status" in data and data.get("status") is not None else None,
5209
- )
5210
-
5211
- def serialize_recorder_bot_details(data: RecorderBotDetails) -> object:
5212
- return {
5213
- "botId": None if data.botId is None else serialize_str(data.botId),
5214
- "alias": None if data.alias is None else serialize_str(data.alias),
5215
- "isSecondary": None if data.isSecondary is None else serialize_bool(data.isSecondary),
5216
- "isEnabled": None if data.isEnabled is None else serialize_bool(data.isEnabled),
5217
- "status": None if data.status is None else serialize_recorder_status(data.status),
5218
- }
5219
-
5220
5904
  @dataclass
5221
5905
  class FailureStateDetails:
5222
5906
  """Failure state details."""
@@ -5519,11 +6203,109 @@ def serialize_play_routine_request(data: PlayRoutineRequest) -> object:
5519
6203
 
5520
6204
  SensorsList = List[Sensor]
5521
6205
 
5522
- def parse_sensors_list(data: object) -> SensorsList:
5523
- return [parse_sensor(item) for item in data]
6206
+ def parse_sensors_list(data: object) -> SensorsList:
6207
+ return [parse_sensor(item) for item in data]
6208
+
6209
+ def serialize_sensors_list(data: SensorsList) -> List[object]:
6210
+ return [serialize_sensor(item) for item in data]
6211
+
6212
+ SensorConfigList = List[SensorConfig]
6213
+
6214
+ def parse_sensor_config_list(data: object) -> SensorConfigList:
6215
+ return [parse_sensor_config(item) for item in data]
6216
+
6217
+ def serialize_sensor_config_list(data: SensorConfigList) -> List[object]:
6218
+ return [serialize_sensor_config(item) for item in data]
6219
+
6220
+ @dataclass
6221
+ class SignalMessage:
6222
+ """WebRTC signaling message"""
6223
+ type: Union[SignalMessageType, None] = None
6224
+ senderId: Union[str, None] = None
6225
+ receiverId: Union[str, None] = None
6226
+ roomId: Union[str, None] = None
6227
+ data: Union[str, None] = None
6228
+
6229
+ def validate_type(self, value: SignalMessageType) -> Tuple[bool, str]:
6230
+ if value is None:
6231
+ return [True, ""]
6232
+
6233
+ if not ((isinstance(value, str) and SignalMessageType in ['join-room', 'connect', 'join', 'leave', 'offer', 'answer', 'ice-candidate', 'heartbeat']) or isinstance(value, SignalMessageType)):
6234
+ return [False, "type must be of type SignalMessageType for SignalMessage, got " + type(value).__name__]
6235
+
6236
+ return [True, ""]
6237
+
6238
+ def validate_senderId(self, value: str) -> Tuple[bool, str]:
6239
+ if value is None:
6240
+ return [True, ""]
6241
+
6242
+ if not isinstance(value, str):
6243
+ return [False, "senderId must be of type str for SignalMessage, got " + type(value).__name__]
6244
+
6245
+ return [True, ""]
6246
+
6247
+ def validate_receiverId(self, value: str) -> Tuple[bool, str]:
6248
+ if value is None:
6249
+ return [True, ""]
6250
+
6251
+ if not isinstance(value, str):
6252
+ return [False, "receiverId must be of type str for SignalMessage, got " + type(value).__name__]
6253
+
6254
+ return [True, ""]
6255
+
6256
+ def validate_roomId(self, value: str) -> Tuple[bool, str]:
6257
+ if value is None:
6258
+ return [True, ""]
6259
+
6260
+ if not isinstance(value, str):
6261
+ return [False, "roomId must be of type str for SignalMessage, got " + type(value).__name__]
6262
+
6263
+ return [True, ""]
6264
+
6265
+ def validate_data(self, value: str) -> Tuple[bool, str]:
6266
+ if value is None:
6267
+ return [True, ""]
6268
+
6269
+ if not isinstance(value, str):
6270
+ return [False, "data must be of type str for SignalMessage, got " + type(value).__name__]
6271
+
6272
+ return [True, ""]
6273
+
6274
+ def __post_init__(self):
6275
+ # Type check incoming model - raise error if invalid (required or wrong type)
6276
+ is_valid, error_str = self.validate_type(self.type)
6277
+ if not is_valid:
6278
+ raise TypeError(error_str)
6279
+ is_valid, error_str = self.validate_senderId(self.senderId)
6280
+ if not is_valid:
6281
+ raise TypeError(error_str)
6282
+ is_valid, error_str = self.validate_receiverId(self.receiverId)
6283
+ if not is_valid:
6284
+ raise TypeError(error_str)
6285
+ is_valid, error_str = self.validate_roomId(self.roomId)
6286
+ if not is_valid:
6287
+ raise TypeError(error_str)
6288
+ is_valid, error_str = self.validate_data(self.data)
6289
+ if not is_valid:
6290
+ raise TypeError(error_str)
6291
+
6292
+ def parse_signal_message(data: object):
6293
+ return SignalMessage(
6294
+ type=parse_signal_message_type(data["type"]) if "type" in data and data.get("type") is not None else None,
6295
+ senderId=parse_str(data["senderId"]) if "senderId" in data and data.get("senderId") is not None else None,
6296
+ receiverId=parse_str(data["receiverId"]) if "receiverId" in data and data.get("receiverId") is not None else None,
6297
+ roomId=parse_str(data["roomId"]) if "roomId" in data and data.get("roomId") is not None else None,
6298
+ data=parse_str(data["data"]) if "data" in data and data.get("data") is not None else None,
6299
+ )
5524
6300
 
5525
- def serialize_sensors_list(data: SensorsList) -> List[object]:
5526
- return [serialize_sensor(item) for item in data]
6301
+ def serialize_signal_message(data: SignalMessage) -> object:
6302
+ return {
6303
+ "type": None if data.type is None else serialize_signal_message_type(data.type),
6304
+ "senderId": None if data.senderId is None else serialize_str(data.senderId),
6305
+ "receiverId": None if data.receiverId is None else serialize_str(data.receiverId),
6306
+ "roomId": None if data.roomId is None else serialize_str(data.roomId),
6307
+ "data": None if data.data is None else serialize_str(data.data),
6308
+ }
5527
6309
 
5528
6310
  @dataclass
5529
6311
  class TextToSkillRequest:
@@ -5615,6 +6397,111 @@ def serialize_status_health_response(data: StatusHealthResponse) -> object:
5615
6397
  "build": None if data.build is None else serialize_status_version_data(data.build),
5616
6398
  }
5617
6399
 
6400
+ @dataclass
6401
+ class RecorderBotDetails:
6402
+ """Details of the bot"""
6403
+ botId: Union[str, None] = None
6404
+ alias: Union[str, None] = None
6405
+ isSecondary: Union[bool, None] = None
6406
+ isEnabled: Union[bool, None] = None
6407
+ status: Union[RecorderStatus, None] = None
6408
+ errors: Union[StringArray, None] = None
6409
+
6410
+ def validate_botId(self, value: str) -> Tuple[bool, str]:
6411
+ if value is None:
6412
+ return [True, ""]
6413
+
6414
+ if not isinstance(value, str):
6415
+ return [False, "botId must be of type str for RecorderBotDetails, got " + type(value).__name__]
6416
+
6417
+ return [True, ""]
6418
+
6419
+ def validate_alias(self, value: str) -> Tuple[bool, str]:
6420
+ if value is None:
6421
+ return [True, ""]
6422
+
6423
+ if not isinstance(value, str):
6424
+ return [False, "alias must be of type str for RecorderBotDetails, got " + type(value).__name__]
6425
+
6426
+ return [True, ""]
6427
+
6428
+ def validate_isSecondary(self, value: bool) -> Tuple[bool, str]:
6429
+ if value is None:
6430
+ return [True, ""]
6431
+
6432
+ if not isinstance(value, bool):
6433
+ return [False, "isSecondary must be of type bool for RecorderBotDetails, got " + type(value).__name__]
6434
+
6435
+ return [True, ""]
6436
+
6437
+ def validate_isEnabled(self, value: bool) -> Tuple[bool, str]:
6438
+ if value is None:
6439
+ return [True, ""]
6440
+
6441
+ if not isinstance(value, bool):
6442
+ return [False, "isEnabled must be of type bool for RecorderBotDetails, got " + type(value).__name__]
6443
+
6444
+ return [True, ""]
6445
+
6446
+ def validate_status(self, value: RecorderStatus) -> Tuple[bool, str]:
6447
+ if value is None:
6448
+ return [True, ""]
6449
+
6450
+ if not ((isinstance(value, str) and RecorderStatus in ['not_recording', 'recording', 'error', 'complete', 'initializing']) or isinstance(value, RecorderStatus)):
6451
+ return [False, "status must be of type RecorderStatus for RecorderBotDetails, got " + type(value).__name__]
6452
+
6453
+ return [True, ""]
6454
+
6455
+ def validate_errors(self, value: StringArray) -> Tuple[bool, str]:
6456
+ if value is None:
6457
+ return [True, ""]
6458
+
6459
+ if not (isinstance(value, list) and all(isinstance(x, str) for x in value)):
6460
+ return [False, "errors must be of type StringArray for RecorderBotDetails, got " + type(value).__name__]
6461
+
6462
+ return [True, ""]
6463
+
6464
+ def __post_init__(self):
6465
+ # Type check incoming model - raise error if invalid (required or wrong type)
6466
+ is_valid, error_str = self.validate_botId(self.botId)
6467
+ if not is_valid:
6468
+ raise TypeError(error_str)
6469
+ is_valid, error_str = self.validate_alias(self.alias)
6470
+ if not is_valid:
6471
+ raise TypeError(error_str)
6472
+ is_valid, error_str = self.validate_isSecondary(self.isSecondary)
6473
+ if not is_valid:
6474
+ raise TypeError(error_str)
6475
+ is_valid, error_str = self.validate_isEnabled(self.isEnabled)
6476
+ if not is_valid:
6477
+ raise TypeError(error_str)
6478
+ is_valid, error_str = self.validate_status(self.status)
6479
+ if not is_valid:
6480
+ raise TypeError(error_str)
6481
+ is_valid, error_str = self.validate_errors(self.errors)
6482
+ if not is_valid:
6483
+ raise TypeError(error_str)
6484
+
6485
+ def parse_recorder_bot_details(data: object):
6486
+ return RecorderBotDetails(
6487
+ botId=parse_str(data["botId"]) if "botId" in data and data.get("botId") is not None else None,
6488
+ alias=parse_str(data["alias"]) if "alias" in data and data.get("alias") is not None else None,
6489
+ isSecondary=parse_bool(data["isSecondary"]) if "isSecondary" in data and data.get("isSecondary") is not None else None,
6490
+ isEnabled=parse_bool(data["isEnabled"]) if "isEnabled" in data and data.get("isEnabled") is not None else None,
6491
+ status=parse_recorder_status(data["status"]) if "status" in data and data.get("status") is not None else None,
6492
+ errors=parse_string_array(data["errors"]) if "errors" in data and data.get("errors") is not None else None,
6493
+ )
6494
+
6495
+ def serialize_recorder_bot_details(data: RecorderBotDetails) -> object:
6496
+ return {
6497
+ "botId": None if data.botId is None else serialize_str(data.botId),
6498
+ "alias": None if data.alias is None else serialize_str(data.alias),
6499
+ "isSecondary": None if data.isSecondary is None else serialize_bool(data.isSecondary),
6500
+ "isEnabled": None if data.isEnabled is None else serialize_bool(data.isEnabled),
6501
+ "status": None if data.status is None else serialize_recorder_status(data.status),
6502
+ "errors": None if data.errors is None else serialize_string_array(data.errors),
6503
+ }
6504
+
5618
6505
  @dataclass
5619
6506
  class SaveRecordingResponse:
5620
6507
  """Response to save recording to marvin app"""
@@ -5811,6 +6698,14 @@ def serialize_arm_position_update_request_response_event_stream_details(data: Ar
5811
6698
  "subscriptions": serialize_arm_position_update_request_response_event_stream_subscriptions_list(data.subscriptions),
5812
6699
  }
5813
6700
 
6701
+ CameraDeviceArray = List[CameraDevice]
6702
+
6703
+ def parse_camera_device_array(data: object) -> CameraDeviceArray:
6704
+ return [parse_camera_device(item) for item in data]
6705
+
6706
+ def serialize_camera_device_array(data: CameraDeviceArray) -> List[object]:
6707
+ return [serialize_camera_device(item) for item in data]
6708
+
5814
6709
  @dataclass
5815
6710
  class Routine:
5816
6711
  """Robot Routine containing steps to automate robot movement and operations"""
@@ -5871,6 +6766,37 @@ def serialize_routine(data: Routine) -> object:
5871
6766
  "environment_variables": None if data.environment_variables is None else serialize_environment_variables_list(data.environment_variables),
5872
6767
  }
5873
6768
 
6769
+ @dataclass
6770
+ class GetEquipmentConfigResponse:
6771
+ """Response to get the currently-configured equipment
6772
+ """
6773
+ equipment: Union[EquipmentConfigList, None] = None
6774
+
6775
+ def validate_equipment(self, value: EquipmentConfigList) -> Tuple[bool, str]:
6776
+ if value is None:
6777
+ return [True, ""]
6778
+
6779
+ if not (isinstance(value, list) and all(isinstance(x, EquipmentConfig) for x in value)):
6780
+ return [False, "equipment must be of type EquipmentConfigList for GetEquipmentConfigResponse, got " + type(value).__name__]
6781
+
6782
+ return [True, ""]
6783
+
6784
+ def __post_init__(self):
6785
+ # Type check incoming model - raise error if invalid (required or wrong type)
6786
+ is_valid, error_str = self.validate_equipment(self.equipment)
6787
+ if not is_valid:
6788
+ raise TypeError(error_str)
6789
+
6790
+ def parse_get_equipment_config_response(data: object):
6791
+ return GetEquipmentConfigResponse(
6792
+ equipment=parse_equipment_config_list(data["equipment"]) if "equipment" in data and data.get("equipment") is not None else None,
6793
+ )
6794
+
6795
+ def serialize_get_equipment_config_response(data: GetEquipmentConfigResponse) -> object:
6796
+ return {
6797
+ "equipment": None if data.equipment is None else serialize_equipment_config_list(data.equipment),
6798
+ }
6799
+
5874
6800
  @dataclass
5875
6801
  class CalibrationData:
5876
6802
  """The result of a calibration"""
@@ -6641,14 +7567,6 @@ def serialize_position_and_orientation(data: PositionAndOrientation) -> object:
6641
7567
  "orientation": serialize_orientation(data.orientation),
6642
7568
  }
6643
7569
 
6644
- RecorderBotDetailsList = List[RecorderBotDetails]
6645
-
6646
- def parse_recorder_bot_details_list(data: object) -> RecorderBotDetailsList:
6647
- return [parse_recorder_bot_details(item) for item in data]
6648
-
6649
- def serialize_recorder_bot_details_list(data: RecorderBotDetailsList) -> List[object]:
6650
- return [serialize_recorder_bot_details(item) for item in data]
6651
-
6652
7570
  @dataclass
6653
7571
  class FailureStateResponse:
6654
7572
  """Failure state response informs user of how and whether the robot may be recovered."""
@@ -6739,6 +7657,82 @@ def serialize_sensors_configuration(data: SensorsConfiguration) -> object:
6739
7657
  "sensors": None if data.sensors is None else serialize_sensors_list(data.sensors),
6740
7658
  }
6741
7659
 
7660
+ @dataclass
7661
+ class SendMessageRequest:
7662
+ """Request to send a WebRTC signaling message"""
7663
+ baseUrl: Union[str, None] = None
7664
+ clientId: Union[str, None] = None
7665
+ message: Union[SignalMessage, None] = None
7666
+
7667
+ def validate_baseUrl(self, value: str) -> Tuple[bool, str]:
7668
+ if value is None:
7669
+ return [True, ""]
7670
+
7671
+ if not isinstance(value, str):
7672
+ return [False, "baseUrl must be of type str for SendMessageRequest, got " + type(value).__name__]
7673
+
7674
+ return [True, ""]
7675
+
7676
+ def validate_clientId(self, value: str) -> Tuple[bool, str]:
7677
+ if value is None:
7678
+ return [True, ""]
7679
+
7680
+ if not isinstance(value, str):
7681
+ return [False, "clientId must be of type str for SendMessageRequest, got " + type(value).__name__]
7682
+
7683
+ return [True, ""]
7684
+
7685
+ def validate_message(self, value: SignalMessage) -> Tuple[bool, str]:
7686
+ if value is None:
7687
+ return [True, ""]
7688
+
7689
+ if not isinstance(value, SignalMessage):
7690
+ return [False, "message must be of type SignalMessage for SendMessageRequest, got " + type(value).__name__]
7691
+
7692
+ return [True, ""]
7693
+
7694
+ def __post_init__(self):
7695
+ # Type check incoming model - raise error if invalid (required or wrong type)
7696
+ is_valid, error_str = self.validate_baseUrl(self.baseUrl)
7697
+ if not is_valid:
7698
+ raise TypeError(error_str)
7699
+ is_valid, error_str = self.validate_clientId(self.clientId)
7700
+ if not is_valid:
7701
+ raise TypeError(error_str)
7702
+ is_valid, error_str = self.validate_message(self.message)
7703
+ if not is_valid:
7704
+ raise TypeError(error_str)
7705
+
7706
+ def parse_send_message_request(data: object):
7707
+ return SendMessageRequest(
7708
+ baseUrl=parse_str(data["baseUrl"]) if "baseUrl" in data and data.get("baseUrl") is not None else None,
7709
+ clientId=parse_str(data["clientId"]) if "clientId" in data and data.get("clientId") is not None else None,
7710
+ message=parse_signal_message(data["message"]) if "message" in data and data.get("message") is not None else None,
7711
+ )
7712
+
7713
+ def serialize_send_message_request(data: SendMessageRequest) -> object:
7714
+ return {
7715
+ "baseUrl": None if data.baseUrl is None else serialize_str(data.baseUrl),
7716
+ "clientId": None if data.clientId is None else serialize_str(data.clientId),
7717
+ "message": None if data.message is None else serialize_signal_message(data.message),
7718
+ }
7719
+
7720
+ SignalMessageList = List[SignalMessage]
7721
+
7722
+ def parse_signal_message_list(data: object) -> SignalMessageList:
7723
+ return [parse_signal_message(item) for item in data]
7724
+
7725
+ def serialize_signal_message_list(data: SignalMessageList) -> List[object]:
7726
+ return [serialize_signal_message(item) for item in data]
7727
+
7728
+ RecorderBotDetailsList = List[RecorderBotDetails]
7729
+
7730
+ def parse_recorder_bot_details_list(data: object) -> RecorderBotDetailsList:
7731
+ return [parse_recorder_bot_details(item) for item in data]
7732
+
7733
+ def serialize_recorder_bot_details_list(data: RecorderBotDetailsList) -> List[object]:
7734
+ return [serialize_recorder_bot_details(item) for item in data]
7735
+
6742
7736
  BotTeleopDetailsList = List[BotTeleopDetails]
6743
7737
 
6744
7738
  def parse_bot_teleop_details_list(data: object) -> BotTeleopDetailsList:
@@ -6793,6 +7787,36 @@ def serialize_arm_position_update_request_response_format(data: ArmPositionUpdat
6793
7787
  "event_stream": None if data.event_stream is None else serialize_arm_position_update_request_response_event_stream_details(data.event_stream),
6794
7788
  }
6795
7789
 
7790
+ @dataclass
7791
+ class CameraDeviceList:
7792
+ """Object containing list of available cameras."""
7793
+ cameras: Union[CameraDeviceArray, None] = None
7794
+
7795
+ def validate_cameras(self, value: CameraDeviceArray) -> Tuple[bool, str]:
7796
+ if value is None:
7797
+ return [True, ""]
7798
+
7799
+ if not (isinstance(value, list) and all(isinstance(x, CameraDevice) for x in value)):
7800
+ return [False, "cameras must be of type CameraDeviceArray for CameraDeviceList, got " + type(value).__name__]
7801
+
7802
+ return [True, ""]
7803
+
7804
+ def __post_init__(self):
7805
+ # Type check incoming model - raise error if invalid (required or wrong type)
7806
+ is_valid, error_str = self.validate_cameras(self.cameras)
7807
+ if not is_valid:
7808
+ raise TypeError(error_str)
7809
+
7810
+ def parse_camera_device_list(data: object):
7811
+ return CameraDeviceList(
7812
+ cameras=parse_camera_device_array(data["cameras"]) if "cameras" in data and data.get("cameras") is not None else None,
7813
+ )
7814
+
7815
+ def serialize_camera_device_list(data: CameraDeviceList) -> object:
7816
+ return {
7817
+ "cameras": None if data.cameras is None else serialize_camera_device_array(data.cameras),
7818
+ }
7819
+
6796
7820
  RoutinesList = List[Routine]
6797
7821
 
6798
7822
  def parse_routines_list(data: object) -> RoutinesList:
@@ -7125,6 +8149,36 @@ def parse_position_and_orientation_list(data: object) -> PositionAndOrientationL
7125
8149
  def serialize_position_and_orientation_list(data: PositionAndOrientationList) -> List[object]:
7126
8150
  return [serialize_position_and_orientation(item) for item in data]
7127
8151
 
8152
+ @dataclass
8153
+ class GetMessagesResponse:
8154
+ """Response containing pending messages for a client"""
8155
+ messages: Union[SignalMessageList, None] = None
8156
+
8157
+ def validate_messages(self, value: SignalMessageList) -> Tuple[bool, str]:
8158
+ if value is None:
8159
+ return [True, ""]
8160
+
8161
+ if not (isinstance(value, list) and all(isinstance(x, SignalMessage) for x in value)):
8162
+ return [False, "messages must be of type SignalMessageList for GetMessagesResponse, got " + type(value).__name__]
8163
+
8164
+ return [True, ""]
8165
+
8166
+ def __post_init__(self):
8167
+ # Type check incoming model - raise error if invalid (required or wrong type)
8168
+ is_valid, error_str = self.validate_messages(self.messages)
8169
+ if not is_valid:
8170
+ raise TypeError(error_str)
8171
+
8172
+ def parse_get_messages_response(data: object):
8173
+ return GetMessagesResponse(
8174
+ messages=parse_signal_message_list(data["messages"]) if "messages" in data and data.get("messages") is not None else None,
8175
+ )
8176
+
8177
+ def serialize_get_messages_response(data: GetMessagesResponse) -> object:
8178
+ return {
8179
+ "messages": None if data.messages is None else serialize_signal_message_list(data.messages),
8180
+ }
8181
+
7128
8182
  @dataclass
7129
8183
  class RecorderConfig:
7130
8184
  """Config of the recorder"""
@@ -7133,6 +8187,8 @@ class RecorderConfig:
7133
8187
  taskId: Union[str, None] = None
7134
8188
  bots: Union[RecorderBotDetailsList, None] = None
7135
8189
  offset: Union[OffsetConfig, None] = None
8190
+ sensors: Union[SensorConfigList, None] = None
8191
+ equipmentKeyAssignments: Union[EquipmentKeyAssignments, None] = None
7136
8192
 
7137
8193
  def validate_isSecondary(self, value: bool) -> Tuple[bool, str]:
7138
8194
  if value is None:
@@ -7179,6 +8235,24 @@ class RecorderConfig:
7179
8235
 
7180
8236
  return [True, ""]
7181
8237
 
8238
+ def validate_sensors(self, value: SensorConfigList) -> Tuple[bool, str]:
8239
+ if value is None:
8240
+ return [True, ""]
8241
+
8242
+ if not (isinstance(value, list) and all(isinstance(x, SensorConfig) for x in value)):
8243
+ return [False, "sensors must be of type SensorConfigList for RecorderConfig, got " + type(value).__name__]
8244
+
8245
+ return [True, ""]
8246
+
8247
+ def validate_equipmentKeyAssignments(self, value: EquipmentKeyAssignments) -> Tuple[bool, str]:
8248
+ if value is None:
8249
+ return [True, ""]
8250
+
8251
+ if not (isinstance(value, dict) and all((isinstance(k, str) and isinstance(val, str)) for k, val in value.items())):
8252
+ return [False, "equipmentKeyAssignments must be of type EquipmentKeyAssignments for RecorderConfig, got " + type(value).__name__]
8253
+
8254
+ return [True, ""]
8255
+
7182
8256
  def __post_init__(self):
7183
8257
  # Type check incoming model - raise error if invalid (required or wrong type)
7184
8258
  is_valid, error_str = self.validate_isSecondary(self.isSecondary)
@@ -7196,6 +8270,12 @@ class RecorderConfig:
7196
8270
  is_valid, error_str = self.validate_offset(self.offset)
7197
8271
  if not is_valid:
7198
8272
  raise TypeError(error_str)
8273
+ is_valid, error_str = self.validate_sensors(self.sensors)
8274
+ if not is_valid:
8275
+ raise TypeError(error_str)
8276
+ is_valid, error_str = self.validate_equipmentKeyAssignments(self.equipmentKeyAssignments)
8277
+ if not is_valid:
8278
+ raise TypeError(error_str)
7199
8279
 
7200
8280
  def parse_recorder_config(data: object):
7201
8281
  return RecorderConfig(
@@ -7204,6 +8284,8 @@ def parse_recorder_config(data: object):
7204
8284
  taskId=parse_str(data["taskId"]) if "taskId" in data and data.get("taskId") is not None else None,
7205
8285
  bots=parse_recorder_bot_details_list(data["bots"]) if "bots" in data and data.get("bots") is not None else None,
7206
8286
  offset=parse_offset_config(data["offset"]) if "offset" in data and data.get("offset") is not None else None,
8287
+ sensors=parse_sensor_config_list(data["sensors"]) if "sensors" in data and data.get("sensors") is not None else None,
8288
+ equipmentKeyAssignments=parse_equipment_key_assignments(data["equipmentKeyAssignments"]) if "equipmentKeyAssignments" in data and data.get("equipmentKeyAssignments") is not None else None,
7207
8289
  )
7208
8290
 
7209
8291
  def serialize_recorder_config(data: RecorderConfig) -> object:
@@ -7213,6 +8295,8 @@ def serialize_recorder_config(data: RecorderConfig) -> object:
7213
8295
  "taskId": None if data.taskId is None else serialize_str(data.taskId),
7214
8296
  "bots": None if data.bots is None else serialize_recorder_bot_details_list(data.bots),
7215
8297
  "offset": None if data.offset is None else serialize_offset_config(data.offset),
8298
+ "sensors": None if data.sensors is None else serialize_sensor_config_list(data.sensors),
8299
+ "equipmentKeyAssignments": None if data.equipmentKeyAssignments is None else serialize_equipment_key_assignments(data.equipmentKeyAssignments),
7216
8300
  }
7217
8301
 
7218
8302
  @dataclass
@@ -7665,6 +8749,7 @@ class RecorderState:
7665
8749
  startTime: Union[str, None] = None
7666
8750
  recordingTime: Union[int, None] = None
7667
8751
  status: Union[RecorderStatus, None] = None
8752
+ errors: Union[StringArray, None] = None
7668
8753
 
7669
8754
  def validate_config(self, value: RecorderConfig) -> Tuple[bool, str]:
7670
8755
  if value is None:
@@ -7697,11 +8782,20 @@ class RecorderState:
7697
8782
  if value is None:
7698
8783
  return [True, ""]
7699
8784
 
7700
- if not ((isinstance(value, str) and RecorderStatus in ['not_recording', 'recording', 'error', 'complete']) or isinstance(value, RecorderStatus)):
8785
+ if not ((isinstance(value, str) and RecorderStatus in ['not_recording', 'recording', 'error', 'complete', 'initializing']) or isinstance(value, RecorderStatus)):
7701
8786
  return [False, "status must be of type RecorderStatus for RecorderState, got " + type(value).__name__]
7702
8787
 
7703
8788
  return [True, ""]
7704
8789
 
8790
+ def validate_errors(self, value: StringArray) -> Tuple[bool, str]:
8791
+ if value is None:
8792
+ return [True, ""]
8793
+
8794
+ if not (isinstance(value, list) and all(isinstance(x, str) for x in value)):
8795
+ return [False, "errors must be of type StringArray for RecorderState, got " + type(value).__name__]
8796
+
8797
+ return [True, ""]
8798
+
7705
8799
  def __post_init__(self):
7706
8800
  # Type check incoming model - raise error if invalid (required or wrong type)
7707
8801
  is_valid, error_str = self.validate_config(self.config)
@@ -7716,6 +8810,9 @@ class RecorderState:
7716
8810
  is_valid, error_str = self.validate_status(self.status)
7717
8811
  if not is_valid:
7718
8812
  raise TypeError(error_str)
8813
+ is_valid, error_str = self.validate_errors(self.errors)
8814
+ if not is_valid:
8815
+ raise TypeError(error_str)
7719
8816
 
7720
8817
  def parse_recorder_state(data: object):
7721
8818
  return RecorderState(
@@ -7723,6 +8820,7 @@ def parse_recorder_state(data: object):
7723
8820
  startTime=parse_str(data["startTime"]) if "startTime" in data and data.get("startTime") is not None else None,
7724
8821
  recordingTime=parse_u_64(data["recordingTime"]) if "recordingTime" in data and data.get("recordingTime") is not None else None,
7725
8822
  status=parse_recorder_status(data["status"]) if "status" in data and data.get("status") is not None else None,
8823
+ errors=parse_string_array(data["errors"]) if "errors" in data and data.get("errors") is not None else None,
7726
8824
  )
7727
8825
 
7728
8826
  def serialize_recorder_state(data: RecorderState) -> object:
@@ -7731,6 +8829,7 @@ def serialize_recorder_state(data: RecorderState) -> object:
7731
8829
  "startTime": None if data.startTime is None else serialize_str(data.startTime),
7732
8830
  "recordingTime": None if data.recordingTime is None else serialize_u_64(data.recordingTime),
7733
8831
  "status": None if data.status is None else serialize_recorder_status(data.status),
8832
+ "errors": None if data.errors is None else serialize_string_array(data.errors),
7734
8833
  }
7735
8834
 
7736
8835
  @dataclass