haystack-contracts 1.0.1 → 1.0.4

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.
package/dist/index.d.mts CHANGED
@@ -90,7 +90,7 @@ declare const AnalyticsAggregateStatus: {
90
90
  type AnalyticsAggregateStatus = (typeof AnalyticsAggregateStatus)[keyof typeof AnalyticsAggregateStatus];
91
91
 
92
92
  interface paths {
93
- "/auth/login": {
93
+ '/auth/login': {
94
94
  parameters: {
95
95
  query?: never;
96
96
  header?: never;
@@ -112,7 +112,7 @@ interface paths {
112
112
  };
113
113
  requestBody: {
114
114
  content: {
115
- "application/json": components["schemas"]["LoginDto"];
115
+ 'application/json': components['schemas']['LoginDto'];
116
116
  };
117
117
  };
118
118
  responses: {
@@ -122,7 +122,7 @@ interface paths {
122
122
  [name: string]: unknown;
123
123
  };
124
124
  content: {
125
- "application/json": {
125
+ 'application/json': {
126
126
  /** @example true */
127
127
  success: boolean;
128
128
  /** @example 200 */
@@ -132,7 +132,7 @@ interface paths {
132
132
  * @example 2026-05-29T12:00:00.000Z
133
133
  */
134
134
  timestamp: string;
135
- data: components["schemas"]["AuthResponseDto"];
135
+ data: components['schemas']['AuthResponseDto'];
136
136
  };
137
137
  };
138
138
  };
@@ -146,11 +146,16 @@ interface paths {
146
146
  * @example {
147
147
  * "success": false,
148
148
  * "statusCode": 400,
149
- * "error": "Bad Request",
150
- * "message": "email must be an email"
149
+ * "data": null,
150
+ * "error": {
151
+ * "message": "email must be an email",
152
+ * "error": "Bad Request"
153
+ * },
154
+ * "timestamp": "2026-05-29T12:00:00.000Z",
155
+ * "path": "/api/v1/resource"
151
156
  * }
152
157
  */
153
- "application/json": unknown;
158
+ 'application/json': unknown;
154
159
  };
155
160
  };
156
161
  /** @description Authentication required. Provide a valid bearer token. */
@@ -163,11 +168,15 @@ interface paths {
163
168
  * @example {
164
169
  * "success": false,
165
170
  * "statusCode": 401,
166
- * "error": "Unauthorized",
167
- * "message": "Unauthorized"
171
+ * "data": null,
172
+ * "error": {
173
+ * "message": "Unauthorized"
174
+ * },
175
+ * "timestamp": "2026-05-29T12:00:00.000Z",
176
+ * "path": "/api/v1/resource"
168
177
  * }
169
178
  */
170
- "application/json": unknown;
179
+ 'application/json': unknown;
171
180
  };
172
181
  };
173
182
  };
@@ -178,7 +187,7 @@ interface paths {
178
187
  patch?: never;
179
188
  trace?: never;
180
189
  };
181
- "/robots": {
190
+ '/robots': {
182
191
  parameters: {
183
192
  query?: never;
184
193
  header?: never;
@@ -204,7 +213,7 @@ interface paths {
204
213
  [name: string]: unknown;
205
214
  };
206
215
  content: {
207
- "application/json": {
216
+ 'application/json': {
208
217
  /** @example true */
209
218
  success: boolean;
210
219
  /** @example 200 */
@@ -214,7 +223,7 @@ interface paths {
214
223
  * @example 2026-05-29T12:00:00.000Z
215
224
  */
216
225
  timestamp: string;
217
- data: components["schemas"]["RobotListItemDto"][];
226
+ data: components['schemas']['RobotListItemDto'][];
218
227
  };
219
228
  };
220
229
  };
@@ -228,11 +237,15 @@ interface paths {
228
237
  * @example {
229
238
  * "success": false,
230
239
  * "statusCode": 401,
231
- * "error": "Unauthorized",
232
- * "message": "Unauthorized"
240
+ * "data": null,
241
+ * "error": {
242
+ * "message": "Unauthorized"
243
+ * },
244
+ * "timestamp": "2026-05-29T12:00:00.000Z",
245
+ * "path": "/api/v1/resource"
233
246
  * }
234
247
  */
235
- "application/json": unknown;
248
+ 'application/json': unknown;
236
249
  };
237
250
  };
238
251
  };
@@ -245,7 +258,7 @@ interface paths {
245
258
  patch?: never;
246
259
  trace?: never;
247
260
  };
248
- "/robots/{id}": {
261
+ '/robots/{id}': {
249
262
  parameters: {
250
263
  query?: never;
251
264
  header?: never;
@@ -274,7 +287,7 @@ interface paths {
274
287
  [name: string]: unknown;
275
288
  };
276
289
  content: {
277
- "application/json": {
290
+ 'application/json': {
278
291
  /** @example true */
279
292
  success: boolean;
280
293
  /** @example 200 */
@@ -284,7 +297,7 @@ interface paths {
284
297
  * @example 2026-05-29T12:00:00.000Z
285
298
  */
286
299
  timestamp: string;
287
- data: components["schemas"]["RobotListItemDto"];
300
+ data: components['schemas']['RobotListItemDto'];
288
301
  };
289
302
  };
290
303
  };
@@ -298,11 +311,16 @@ interface paths {
298
311
  * @example {
299
312
  * "success": false,
300
313
  * "statusCode": 400,
301
- * "error": "Bad Request",
302
- * "message": "email must be an email"
314
+ * "data": null,
315
+ * "error": {
316
+ * "message": "email must be an email",
317
+ * "error": "Bad Request"
318
+ * },
319
+ * "timestamp": "2026-05-29T12:00:00.000Z",
320
+ * "path": "/api/v1/resource"
303
321
  * }
304
322
  */
305
- "application/json": unknown;
323
+ 'application/json': unknown;
306
324
  };
307
325
  };
308
326
  /** @description Authentication required. Provide a valid bearer token. */
@@ -315,11 +333,15 @@ interface paths {
315
333
  * @example {
316
334
  * "success": false,
317
335
  * "statusCode": 401,
318
- * "error": "Unauthorized",
319
- * "message": "Unauthorized"
336
+ * "data": null,
337
+ * "error": {
338
+ * "message": "Unauthorized"
339
+ * },
340
+ * "timestamp": "2026-05-29T12:00:00.000Z",
341
+ * "path": "/api/v1/resource"
320
342
  * }
321
343
  */
322
- "application/json": unknown;
344
+ 'application/json': unknown;
323
345
  };
324
346
  };
325
347
  /** @description Robot not found in the current tenant. */
@@ -332,11 +354,16 @@ interface paths {
332
354
  * @example {
333
355
  * "success": false,
334
356
  * "statusCode": 404,
335
- * "error": "Not Found",
336
- * "message": "Robot not found"
357
+ * "data": null,
358
+ * "error": {
359
+ * "message": "Robot not found",
360
+ * "error": "Not Found"
361
+ * },
362
+ * "timestamp": "2026-05-29T12:00:00.000Z",
363
+ * "path": "/api/v1/resource"
337
364
  * }
338
365
  */
339
- "application/json": unknown;
366
+ 'application/json': unknown;
340
367
  };
341
368
  };
342
369
  };
@@ -349,7 +376,151 @@ interface paths {
349
376
  patch?: never;
350
377
  trace?: never;
351
378
  };
352
- "/metrics/types": {
379
+ '/robots/{id}/assign': {
380
+ parameters: {
381
+ query?: never;
382
+ header?: never;
383
+ path?: never;
384
+ cookie?: never;
385
+ };
386
+ get?: never;
387
+ put?: never;
388
+ post?: never;
389
+ delete?: never;
390
+ options?: never;
391
+ head?: never;
392
+ /**
393
+ * Assign a robot to a tenant and fleet
394
+ * @description Updates the robot tenant and optional fleet assignment. Use fleetId null to leave the robot unassigned.
395
+ */
396
+ patch: {
397
+ parameters: {
398
+ query?: never;
399
+ header?: never;
400
+ path: {
401
+ /** @description UUID of the robot to assign. */
402
+ id: string;
403
+ };
404
+ cookie?: never;
405
+ };
406
+ requestBody: {
407
+ content: {
408
+ 'application/json': components['schemas']['AssignRobotDto'];
409
+ };
410
+ };
411
+ responses: {
412
+ /** @description Robot assignment updated. */
413
+ 200: {
414
+ headers: {
415
+ [name: string]: unknown;
416
+ };
417
+ content: {
418
+ 'application/json': {
419
+ /** @example true */
420
+ success: boolean;
421
+ /** @example 200 */
422
+ statusCode: number;
423
+ /**
424
+ * Format: date-time
425
+ * @example 2026-05-29T12:00:00.000Z
426
+ */
427
+ timestamp: string;
428
+ data: components['schemas']['RobotListItemDto'];
429
+ };
430
+ };
431
+ };
432
+ /** @description Validation failed. Check that all required fields are present and correctly typed. */
433
+ 400: {
434
+ headers: {
435
+ [name: string]: unknown;
436
+ };
437
+ content: {
438
+ /**
439
+ * @example {
440
+ * "success": false,
441
+ * "statusCode": 400,
442
+ * "data": null,
443
+ * "error": {
444
+ * "message": "email must be an email",
445
+ * "error": "Bad Request"
446
+ * },
447
+ * "timestamp": "2026-05-29T12:00:00.000Z",
448
+ * "path": "/api/v1/resource"
449
+ * }
450
+ */
451
+ 'application/json': unknown;
452
+ };
453
+ };
454
+ /** @description Authentication required. Provide a valid bearer token. */
455
+ 401: {
456
+ headers: {
457
+ [name: string]: unknown;
458
+ };
459
+ content: {
460
+ /**
461
+ * @example {
462
+ * "success": false,
463
+ * "statusCode": 401,
464
+ * "data": null,
465
+ * "error": {
466
+ * "message": "Unauthorized"
467
+ * },
468
+ * "timestamp": "2026-05-29T12:00:00.000Z",
469
+ * "path": "/api/v1/resource"
470
+ * }
471
+ */
472
+ 'application/json': unknown;
473
+ };
474
+ };
475
+ /** @description Requires the `robots.manage` permission. */
476
+ 403: {
477
+ headers: {
478
+ [name: string]: unknown;
479
+ };
480
+ content: {
481
+ /**
482
+ * @example {
483
+ * "success": false,
484
+ * "statusCode": 403,
485
+ * "data": null,
486
+ * "error": {
487
+ * "message": "Insufficient permissions",
488
+ * "error": "Forbidden"
489
+ * },
490
+ * "timestamp": "2026-05-29T12:00:00.000Z",
491
+ * "path": "/api/v1/resource"
492
+ * }
493
+ */
494
+ 'application/json': unknown;
495
+ };
496
+ };
497
+ /** @description Robot, tenant, or fleet not found in the current tenant. */
498
+ 404: {
499
+ headers: {
500
+ [name: string]: unknown;
501
+ };
502
+ content: {
503
+ /**
504
+ * @example {
505
+ * "success": false,
506
+ * "statusCode": 404,
507
+ * "data": null,
508
+ * "error": {
509
+ * "message": "Robot, tenant, or fleet not found",
510
+ * "error": "Not Found"
511
+ * },
512
+ * "timestamp": "2026-05-29T12:00:00.000Z",
513
+ * "path": "/api/v1/resource"
514
+ * }
515
+ */
516
+ 'application/json': unknown;
517
+ };
518
+ };
519
+ };
520
+ };
521
+ trace?: never;
522
+ };
523
+ '/metrics/types': {
353
524
  parameters: {
354
525
  query?: never;
355
526
  header?: never;
@@ -375,7 +546,7 @@ interface paths {
375
546
  [name: string]: unknown;
376
547
  };
377
548
  content: {
378
- "application/json": {
549
+ 'application/json': {
379
550
  /** @example true */
380
551
  success: boolean;
381
552
  /** @example 200 */
@@ -385,7 +556,7 @@ interface paths {
385
556
  * @example 2026-05-29T12:00:00.000Z
386
557
  */
387
558
  timestamp: string;
388
- data: components["schemas"]["MetricTypeResponseDto"][];
559
+ data: components['schemas']['MetricTypeResponseDto'][];
389
560
  };
390
561
  };
391
562
  };
@@ -399,11 +570,15 @@ interface paths {
399
570
  * @example {
400
571
  * "success": false,
401
572
  * "statusCode": 401,
402
- * "error": "Unauthorized",
403
- * "message": "Unauthorized"
573
+ * "data": null,
574
+ * "error": {
575
+ * "message": "Unauthorized"
576
+ * },
577
+ * "timestamp": "2026-05-29T12:00:00.000Z",
578
+ * "path": "/api/v1/resource"
404
579
  * }
405
580
  */
406
- "application/json": unknown;
581
+ 'application/json': unknown;
407
582
  };
408
583
  };
409
584
  };
@@ -416,7 +591,7 @@ interface paths {
416
591
  patch?: never;
417
592
  trace?: never;
418
593
  };
419
- "/metrics/robot-values/{robotId}": {
594
+ '/metrics/robot-values/{robotId}': {
420
595
  parameters: {
421
596
  query?: never;
422
597
  header?: never;
@@ -448,7 +623,7 @@ interface paths {
448
623
  [name: string]: unknown;
449
624
  };
450
625
  content: {
451
- "application/json": {
626
+ 'application/json': {
452
627
  /** @example true */
453
628
  success: boolean;
454
629
  /** @example 200 */
@@ -458,7 +633,7 @@ interface paths {
458
633
  * @example 2026-05-29T12:00:00.000Z
459
634
  */
460
635
  timestamp: string;
461
- data: components["schemas"]["RobotMetricLiveDto"][];
636
+ data: components['schemas']['RobotMetricLiveDto'][];
462
637
  };
463
638
  };
464
639
  };
@@ -472,11 +647,16 @@ interface paths {
472
647
  * @example {
473
648
  * "success": false,
474
649
  * "statusCode": 400,
475
- * "error": "Bad Request",
476
- * "message": "email must be an email"
650
+ * "data": null,
651
+ * "error": {
652
+ * "message": "email must be an email",
653
+ * "error": "Bad Request"
654
+ * },
655
+ * "timestamp": "2026-05-29T12:00:00.000Z",
656
+ * "path": "/api/v1/resource"
477
657
  * }
478
658
  */
479
- "application/json": unknown;
659
+ 'application/json': unknown;
480
660
  };
481
661
  };
482
662
  /** @description Authentication required. Provide a valid bearer token. */
@@ -489,11 +669,15 @@ interface paths {
489
669
  * @example {
490
670
  * "success": false,
491
671
  * "statusCode": 401,
492
- * "error": "Unauthorized",
493
- * "message": "Unauthorized"
672
+ * "data": null,
673
+ * "error": {
674
+ * "message": "Unauthorized"
675
+ * },
676
+ * "timestamp": "2026-05-29T12:00:00.000Z",
677
+ * "path": "/api/v1/resource"
494
678
  * }
495
679
  */
496
- "application/json": unknown;
680
+ 'application/json': unknown;
497
681
  };
498
682
  };
499
683
  };
@@ -506,7 +690,7 @@ interface paths {
506
690
  patch?: never;
507
691
  trace?: never;
508
692
  };
509
- "/disinfection/robots": {
693
+ '/disinfection/robots': {
510
694
  parameters: {
511
695
  query?: never;
512
696
  header?: never;
@@ -532,7 +716,7 @@ interface paths {
532
716
  [name: string]: unknown;
533
717
  };
534
718
  content: {
535
- "application/json": {
719
+ 'application/json': {
536
720
  /** @example true */
537
721
  success: boolean;
538
722
  /** @example 200 */
@@ -542,7 +726,7 @@ interface paths {
542
726
  * @example 2026-05-29T12:00:00.000Z
543
727
  */
544
728
  timestamp: string;
545
- data: components["schemas"]["RobotDisinfectionStatsDto"][];
729
+ data: components['schemas']['RobotDisinfectionStatsDto'][];
546
730
  };
547
731
  };
548
732
  };
@@ -556,11 +740,15 @@ interface paths {
556
740
  * @example {
557
741
  * "success": false,
558
742
  * "statusCode": 401,
559
- * "error": "Unauthorized",
560
- * "message": "Unauthorized"
743
+ * "data": null,
744
+ * "error": {
745
+ * "message": "Unauthorized"
746
+ * },
747
+ * "timestamp": "2026-05-29T12:00:00.000Z",
748
+ * "path": "/api/v1/resource"
561
749
  * }
562
750
  */
563
- "application/json": unknown;
751
+ 'application/json': unknown;
564
752
  };
565
753
  };
566
754
  };
@@ -573,7 +761,7 @@ interface paths {
573
761
  patch?: never;
574
762
  trace?: never;
575
763
  };
576
- "/disinfection/ongoing-jobs": {
764
+ '/disinfection/ongoing-jobs': {
577
765
  parameters: {
578
766
  query?: never;
579
767
  header?: never;
@@ -599,7 +787,7 @@ interface paths {
599
787
  [name: string]: unknown;
600
788
  };
601
789
  content: {
602
- "application/json": {
790
+ 'application/json': {
603
791
  /** @example true */
604
792
  success: boolean;
605
793
  /** @example 200 */
@@ -609,7 +797,7 @@ interface paths {
609
797
  * @example 2026-05-29T12:00:00.000Z
610
798
  */
611
799
  timestamp: string;
612
- data: components["schemas"]["DisinfectionJobDto"][];
800
+ data: components['schemas']['DisinfectionJobDto'][];
613
801
  };
614
802
  };
615
803
  };
@@ -623,11 +811,15 @@ interface paths {
623
811
  * @example {
624
812
  * "success": false,
625
813
  * "statusCode": 401,
626
- * "error": "Unauthorized",
627
- * "message": "Unauthorized"
814
+ * "data": null,
815
+ * "error": {
816
+ * "message": "Unauthorized"
817
+ * },
818
+ * "timestamp": "2026-05-29T12:00:00.000Z",
819
+ * "path": "/api/v1/resource"
628
820
  * }
629
821
  */
630
- "application/json": unknown;
822
+ 'application/json': unknown;
631
823
  };
632
824
  };
633
825
  };
@@ -640,7 +832,7 @@ interface paths {
640
832
  patch?: never;
641
833
  trace?: never;
642
834
  };
643
- "/disinfection/jobs": {
835
+ '/disinfection/jobs': {
644
836
  parameters: {
645
837
  query?: never;
646
838
  header?: never;
@@ -655,7 +847,7 @@ interface paths {
655
847
  parameters: {
656
848
  query?: {
657
849
  /** @description Job outcome filter. Defaults to "all" (no status filtering) when omitted. */
658
- status?: "passed" | "partial" | "failed" | "all";
850
+ status?: 'passed' | 'partial' | 'failed' | 'all';
659
851
  /** @description UUID of a specific robot to filter by. */
660
852
  robotId?: string;
661
853
  };
@@ -671,7 +863,7 @@ interface paths {
671
863
  [name: string]: unknown;
672
864
  };
673
865
  content: {
674
- "application/json": {
866
+ 'application/json': {
675
867
  /** @example true */
676
868
  success: boolean;
677
869
  /** @example 200 */
@@ -681,7 +873,7 @@ interface paths {
681
873
  * @example 2026-05-29T12:00:00.000Z
682
874
  */
683
875
  timestamp: string;
684
- data: components["schemas"]["DisinfectionJobDto"][];
876
+ data: components['schemas']['DisinfectionJobDto'][];
685
877
  };
686
878
  };
687
879
  };
@@ -695,11 +887,16 @@ interface paths {
695
887
  * @example {
696
888
  * "success": false,
697
889
  * "statusCode": 400,
698
- * "error": "Bad Request",
699
- * "message": "email must be an email"
890
+ * "data": null,
891
+ * "error": {
892
+ * "message": "email must be an email",
893
+ * "error": "Bad Request"
894
+ * },
895
+ * "timestamp": "2026-05-29T12:00:00.000Z",
896
+ * "path": "/api/v1/resource"
700
897
  * }
701
898
  */
702
- "application/json": unknown;
899
+ 'application/json': unknown;
703
900
  };
704
901
  };
705
902
  /** @description Authentication required. Provide a valid bearer token. */
@@ -712,11 +909,15 @@ interface paths {
712
909
  * @example {
713
910
  * "success": false,
714
911
  * "statusCode": 401,
715
- * "error": "Unauthorized",
716
- * "message": "Unauthorized"
912
+ * "data": null,
913
+ * "error": {
914
+ * "message": "Unauthorized"
915
+ * },
916
+ * "timestamp": "2026-05-29T12:00:00.000Z",
917
+ * "path": "/api/v1/resource"
717
918
  * }
718
919
  */
719
- "application/json": unknown;
920
+ 'application/json': unknown;
720
921
  };
721
922
  };
722
923
  };
@@ -729,7 +930,7 @@ interface paths {
729
930
  patch?: never;
730
931
  trace?: never;
731
932
  };
732
- "/analytics-agg/robots-count": {
933
+ '/analytics-agg/robots-count': {
733
934
  parameters: {
734
935
  query?: never;
735
936
  header?: never;
@@ -755,7 +956,7 @@ interface paths {
755
956
  [name: string]: unknown;
756
957
  };
757
958
  content: {
758
- "application/json": {
959
+ 'application/json': {
759
960
  /** @example true */
760
961
  success: boolean;
761
962
  /** @example 200 */
@@ -765,7 +966,7 @@ interface paths {
765
966
  * @example 2026-05-29T12:00:00.000Z
766
967
  */
767
968
  timestamp: string;
768
- data: components["schemas"]["RobotsCountAnalyticsDataDto"];
969
+ data: components['schemas']['RobotsCountAnalyticsDataDto'];
769
970
  };
770
971
  };
771
972
  };
@@ -779,11 +980,15 @@ interface paths {
779
980
  * @example {
780
981
  * "success": false,
781
982
  * "statusCode": 401,
782
- * "error": "Unauthorized",
783
- * "message": "Unauthorized"
983
+ * "data": null,
984
+ * "error": {
985
+ * "message": "Unauthorized"
986
+ * },
987
+ * "timestamp": "2026-05-29T12:00:00.000Z",
988
+ * "path": "/api/v1/resource"
784
989
  * }
785
990
  */
786
- "application/json": unknown;
991
+ 'application/json': unknown;
787
992
  };
788
993
  };
789
994
  };
@@ -796,7 +1001,7 @@ interface paths {
796
1001
  patch?: never;
797
1002
  trace?: never;
798
1003
  };
799
- "/analytics-agg/disinfection-count": {
1004
+ '/analytics-agg/disinfection-count': {
800
1005
  parameters: {
801
1006
  query?: never;
802
1007
  header?: never;
@@ -822,7 +1027,7 @@ interface paths {
822
1027
  [name: string]: unknown;
823
1028
  };
824
1029
  content: {
825
- "application/json": {
1030
+ 'application/json': {
826
1031
  /** @example true */
827
1032
  success: boolean;
828
1033
  /** @example 200 */
@@ -832,7 +1037,7 @@ interface paths {
832
1037
  * @example 2026-05-29T12:00:00.000Z
833
1038
  */
834
1039
  timestamp: string;
835
- data: components["schemas"]["DisinfectionCountAnalyticsDataDto"];
1040
+ data: components['schemas']['DisinfectionCountAnalyticsDataDto'];
836
1041
  };
837
1042
  };
838
1043
  };
@@ -846,11 +1051,15 @@ interface paths {
846
1051
  * @example {
847
1052
  * "success": false,
848
1053
  * "statusCode": 401,
849
- * "error": "Unauthorized",
850
- * "message": "Unauthorized"
1054
+ * "data": null,
1055
+ * "error": {
1056
+ * "message": "Unauthorized"
1057
+ * },
1058
+ * "timestamp": "2026-05-29T12:00:00.000Z",
1059
+ * "path": "/api/v1/resource"
851
1060
  * }
852
1061
  */
853
- "application/json": unknown;
1062
+ 'application/json': unknown;
854
1063
  };
855
1064
  };
856
1065
  };
@@ -863,7 +1072,7 @@ interface paths {
863
1072
  patch?: never;
864
1073
  trace?: never;
865
1074
  };
866
- "/analytics-agg/disinfection-operator": {
1075
+ '/analytics-agg/disinfection-operator': {
867
1076
  parameters: {
868
1077
  query?: never;
869
1078
  header?: never;
@@ -889,7 +1098,7 @@ interface paths {
889
1098
  [name: string]: unknown;
890
1099
  };
891
1100
  content: {
892
- "application/json": {
1101
+ 'application/json': {
893
1102
  /** @example true */
894
1103
  success: boolean;
895
1104
  /** @example 200 */
@@ -899,7 +1108,7 @@ interface paths {
899
1108
  * @example 2026-05-29T12:00:00.000Z
900
1109
  */
901
1110
  timestamp: string;
902
- data: components["schemas"]["DisinfectionOperatorsAnalyticsDataDto"];
1111
+ data: components['schemas']['DisinfectionOperatorsAnalyticsDataDto'];
903
1112
  };
904
1113
  };
905
1114
  };
@@ -913,11 +1122,15 @@ interface paths {
913
1122
  * @example {
914
1123
  * "success": false,
915
1124
  * "statusCode": 401,
916
- * "error": "Unauthorized",
917
- * "message": "Unauthorized"
1125
+ * "data": null,
1126
+ * "error": {
1127
+ * "message": "Unauthorized"
1128
+ * },
1129
+ * "timestamp": "2026-05-29T12:00:00.000Z",
1130
+ * "path": "/api/v1/resource"
918
1131
  * }
919
1132
  */
920
- "application/json": unknown;
1133
+ 'application/json': unknown;
921
1134
  };
922
1135
  };
923
1136
  };
@@ -930,7 +1143,7 @@ interface paths {
930
1143
  patch?: never;
931
1144
  trace?: never;
932
1145
  };
933
- "/analytics-agg/disinfection-status": {
1146
+ '/analytics-agg/disinfection-status': {
934
1147
  parameters: {
935
1148
  query?: never;
936
1149
  header?: never;
@@ -956,7 +1169,7 @@ interface paths {
956
1169
  [name: string]: unknown;
957
1170
  };
958
1171
  content: {
959
- "application/json": {
1172
+ 'application/json': {
960
1173
  /** @example true */
961
1174
  success: boolean;
962
1175
  /** @example 200 */
@@ -966,7 +1179,7 @@ interface paths {
966
1179
  * @example 2026-05-29T12:00:00.000Z
967
1180
  */
968
1181
  timestamp: string;
969
- data: components["schemas"]["DisinfectionStatusAnalyticsDataDto"];
1182
+ data: components['schemas']['DisinfectionStatusAnalyticsDataDto'];
970
1183
  };
971
1184
  };
972
1185
  };
@@ -980,11 +1193,15 @@ interface paths {
980
1193
  * @example {
981
1194
  * "success": false,
982
1195
  * "statusCode": 401,
983
- * "error": "Unauthorized",
984
- * "message": "Unauthorized"
1196
+ * "data": null,
1197
+ * "error": {
1198
+ * "message": "Unauthorized"
1199
+ * },
1200
+ * "timestamp": "2026-05-29T12:00:00.000Z",
1201
+ * "path": "/api/v1/resource"
985
1202
  * }
986
1203
  */
987
- "application/json": unknown;
1204
+ 'application/json': unknown;
988
1205
  };
989
1206
  };
990
1207
  };
@@ -1000,6 +1217,17 @@ interface paths {
1000
1217
  }
1001
1218
  interface components {
1002
1219
  schemas: {
1220
+ AssignRobotDto: {
1221
+ /** @description Workspace UUID. Tenant admin may set any workspace; workspace admin may only set their own workspace(s). Lower roles must omit this field. */
1222
+ workspaceId?: string | null;
1223
+ /** @description Facility UUID. Null unassigns from facility (UNASSIGNED). */
1224
+ facilityId?: string | null;
1225
+ /** @description Fleet UUID. Null unassigns from fleet. */
1226
+ fleetId?: string | null;
1227
+ isSubscribed?: boolean;
1228
+ changedBy?: string;
1229
+ changeReason?: string;
1230
+ };
1003
1231
  AuthResponseDto: {
1004
1232
  /**
1005
1233
  * @description Short-lived JWT access token (15 min).
@@ -1017,17 +1245,17 @@ interface components {
1017
1245
  */
1018
1246
  expiresIn: number;
1019
1247
  /** @description Sanitized authenticated user snapshot returned with the token response. */
1020
- user: components["schemas"]["PublicUserDto"];
1248
+ user: components['schemas']['PublicUserDto'];
1021
1249
  };
1022
1250
  DisinfectionCountAnalyticsDataDto: {
1023
- data: components["schemas"]["DisinfectionCountResponseDto"];
1251
+ data: components['schemas']['DisinfectionCountResponseDto'];
1024
1252
  /** @example 2026-05-29T12:00:00.000Z */
1025
1253
  timestamp: string;
1026
1254
  /**
1027
1255
  * @example success
1028
1256
  * @enum {string}
1029
1257
  */
1030
- status: "success" | "error";
1258
+ status: 'success' | 'error';
1031
1259
  };
1032
1260
  DisinfectionCountResponseDto: {
1033
1261
  /** @example Warehouse Bot Alpha */
@@ -1068,24 +1296,24 @@ interface components {
1068
1296
  totalJobs: number;
1069
1297
  };
1070
1298
  DisinfectionOperatorsAnalyticsDataDto: {
1071
- data: components["schemas"]["DisinfectionOperatorResponseDto"][];
1299
+ data: components['schemas']['DisinfectionOperatorResponseDto'][];
1072
1300
  /** @example 2026-05-29T12:00:00.000Z */
1073
1301
  timestamp: string;
1074
1302
  /**
1075
1303
  * @example success
1076
1304
  * @enum {string}
1077
1305
  */
1078
- status: "success" | "error";
1306
+ status: 'success' | 'error';
1079
1307
  };
1080
1308
  DisinfectionStatusAnalyticsDataDto: {
1081
- data: components["schemas"]["DisinfectionStatusResponseDto"][];
1309
+ data: components['schemas']['DisinfectionStatusResponseDto'][];
1082
1310
  /** @example 2026-05-29T12:00:00.000Z */
1083
1311
  timestamp: string;
1084
1312
  /**
1085
1313
  * @example success
1086
1314
  * @enum {string}
1087
1315
  */
1088
- status: "success" | "error";
1316
+ status: 'success' | 'error';
1089
1317
  };
1090
1318
  DisinfectionStatusResponseDto: {
1091
1319
  /** @example COVERAGE_DONE */
@@ -1125,12 +1353,12 @@ interface components {
1125
1353
  * @example numeric
1126
1354
  * @enum {string}
1127
1355
  */
1128
- dataType: "numeric" | "string";
1356
+ dataType: 'numeric' | 'string';
1129
1357
  /**
1130
1358
  * @example stream
1131
1359
  * @enum {string}
1132
1360
  */
1133
- sourceType?: "non_stream" | "stream";
1361
+ sourceType?: 'non_stream' | 'stream';
1134
1362
  };
1135
1363
  PublicUserDto: {
1136
1364
  /** @example c3d4e5f6-a1b2-3456-abcd-789012345678 */
@@ -1149,10 +1377,14 @@ interface components {
1149
1377
  facilityId?: string | null;
1150
1378
  fleetId?: string | null;
1151
1379
  /** @enum {string|null} */
1152
- role?: "TENANT_ADMIN" | "WORKSPACE_ADMIN" | "FACILITY_ADMIN" | "FLEET_OPERATOR" | "FLEET_VIEWER" | null;
1380
+ role?: 'TENANT_ADMIN' | 'WORKSPACE_ADMIN' | 'FACILITY_ADMIN' | 'FLEET_OPERATOR' | 'FLEET_VIEWER' | null;
1153
1381
  /** @enum {string|null} */
1154
- scopeType?: "tenant" | "workspace" | "facility" | "fleet" | null;
1382
+ scopeType?: 'tenant' | 'workspace' | 'facility' | 'fleet' | null;
1155
1383
  scopeId?: string | null;
1384
+ /** @description UUID of user who created this record. */
1385
+ createdBy?: string | null;
1386
+ /** @description UUID of user who last updated this record. */
1387
+ updatedBy?: string | null;
1156
1388
  /**
1157
1389
  * Format: date-time
1158
1390
  * @example 2026-01-15T08:00:00.000Z
@@ -1203,6 +1435,26 @@ interface components {
1203
1435
  * @example Warehouse Bot Alpha
1204
1436
  */
1205
1437
  name: string;
1438
+ /**
1439
+ * @description UUID of the workspace this robot is assigned to.
1440
+ * @example b2000000-0000-4000-8000-000000000002
1441
+ */
1442
+ workspaceId?: string | null;
1443
+ /**
1444
+ * @description Name of the workspace this robot is assigned to.
1445
+ * @example North Hospital Cluster
1446
+ */
1447
+ workspaceName?: string | null;
1448
+ /**
1449
+ * @description UUID of the facility this robot is assigned to.
1450
+ * @example c3000000-0000-4000-8000-000000000003
1451
+ */
1452
+ facilityId?: string | null;
1453
+ /**
1454
+ * @description Name of the facility this robot is assigned to.
1455
+ * @example City General Hospital
1456
+ */
1457
+ facilityName?: string | null;
1206
1458
  /**
1207
1459
  * @description UUID of the fleet this robot is assigned to.
1208
1460
  * @example f1000000-0000-4000-8000-000000000001
@@ -1283,6 +1535,16 @@ interface components {
1283
1535
  * @example 2026-05-20T10:00:00.000Z
1284
1536
  */
1285
1537
  lastStreamed?: string | null;
1538
+ /**
1539
+ * @description Software version currently running on the robot, or null if not yet received.
1540
+ * @example 2.0.84
1541
+ */
1542
+ botVersion?: string | null;
1543
+ /**
1544
+ * @description Hardware model of the robot, or null if not yet identified.
1545
+ * @example Violet Gen 4 AI
1546
+ */
1547
+ botModel?: string | null;
1286
1548
  };
1287
1549
  RobotMetricLiveDto: {
1288
1550
  /**
@@ -1307,14 +1569,14 @@ interface components {
1307
1569
  lastSyncTime: Record<string, never>;
1308
1570
  };
1309
1571
  RobotsCountAnalyticsDataDto: {
1310
- data: components["schemas"]["RobotsCountResponseDto"];
1572
+ data: components['schemas']['RobotsCountResponseDto'];
1311
1573
  /** @example 2026-05-29T12:00:00.000Z */
1312
1574
  timestamp: string;
1313
1575
  /**
1314
1576
  * @example success
1315
1577
  * @enum {string}
1316
1578
  */
1317
- status: "success" | "error";
1579
+ status: 'success' | 'error';
1318
1580
  };
1319
1581
  RobotsCountResponseDto: {
1320
1582
  /** @example 24 */
@@ -1347,6 +1609,7 @@ type LoginPayload = Schemas['LoginDto'];
1347
1609
  type AuthResponse = Schemas['AuthResponseDto'];
1348
1610
  type PublicUser = Schemas['PublicUserDto'];
1349
1611
  type RobotListItem = Schemas['RobotListItemDto'];
1612
+ type AssignRobotPayload = Schemas['AssignRobotDto'];
1350
1613
  type MetricType = Schemas['MetricTypeResponseDto'];
1351
1614
  type RobotMetricLive = Schemas['RobotMetricLiveDto'];
1352
1615
  type RobotDisinfectionStats = Schemas['RobotDisinfectionStatsDto'];
@@ -1394,4 +1657,4 @@ interface PaginatedSuccessResponse<T> extends ApiSuccessResponse<T[]> {
1394
1657
  meta: PaginationMeta;
1395
1658
  }
1396
1659
 
1397
- export { AnalyticsAggregateStatus, type ApiData, type ApiErrorResponse, type ApiResult, type ApiSuccessResponse, type AuthResponse, type DisinfectionCountAggregate, type DisinfectionCountAnalyticsData, type DisinfectionJob, type DisinfectionOperatorAggregate, type DisinfectionOperatorsAnalyticsData, type DisinfectionStatusAggregate, type DisinfectionStatusAnalyticsData, HAYSTACK_API_BASE_PATH, HAYSTACK_API_VERSION, HAYSTACK_PRODUCTION_API_URL, type LoginPayload, MetricDataType, MetricSourceType, type MetricType, PUBLIC_API_META, PUBLIC_OPENAPI_JSON, type PaginatedSuccessResponse, type PaginationMeta, PublicApiPath, type PublicUser, type RobotDisinfectionStats, type RobotListItem, type RobotMetricLive, type RobotsCountAggregate, type RobotsCountAnalyticsData, Role, ScopeType, type components, type operations, type paths };
1660
+ export { AnalyticsAggregateStatus, type ApiData, type ApiErrorResponse, type ApiResult, type ApiSuccessResponse, type AssignRobotPayload, type AuthResponse, type DisinfectionCountAggregate, type DisinfectionCountAnalyticsData, type DisinfectionJob, type DisinfectionOperatorAggregate, type DisinfectionOperatorsAnalyticsData, type DisinfectionStatusAggregate, type DisinfectionStatusAnalyticsData, HAYSTACK_API_BASE_PATH, HAYSTACK_API_VERSION, HAYSTACK_PRODUCTION_API_URL, type LoginPayload, MetricDataType, MetricSourceType, type MetricType, PUBLIC_API_META, PUBLIC_OPENAPI_JSON, type PaginatedSuccessResponse, type PaginationMeta, PublicApiPath, type PublicUser, type RobotDisinfectionStats, type RobotListItem, type RobotMetricLive, type RobotsCountAggregate, type RobotsCountAnalyticsData, Role, ScopeType, type components, type operations, type paths };