haystack-contracts 1.0.1 → 1.0.3

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/README.md CHANGED
@@ -10,14 +10,14 @@ Public API contracts for Haystack Robotics — TypeScript types, path constants,
10
10
  pnpm add haystack-contracts
11
11
  ```
12
12
 
13
- Pin a specific version in production apps (e.g. `"haystack-contracts": "1.0.0"`).
13
+ Pin a specific version in production apps (e.g. `"haystack-contracts": "1.0.2"`).
14
14
 
15
15
  ## What ships on npm
16
16
 
17
- | Import | Use |
18
- |--------|-----|
19
- | `haystack-contracts` | Types, `PublicApiPath`, enums, response envelopes |
20
- | `haystack-contracts/openapi.json` | OpenAPI 3 spec for API reference sites |
17
+ | Import | Use |
18
+ | --------------------------------- | ------------------------------------------------- |
19
+ | `haystack-contracts` | Types, `PublicApiPath`, enums, response envelopes |
20
+ | `haystack-contracts/openapi.json` | OpenAPI 3 spec for API reference sites |
21
21
 
22
22
  ## Docs frontend (React static API page)
23
23
 
@@ -30,7 +30,7 @@ import openApiSpec from 'haystack-contracts/openapi.json';
30
30
  Or load from CDN:
31
31
 
32
32
  ```text
33
- https://unpkg.com/haystack-contracts@1.0.0/openapi.json
33
+ https://unpkg.com/haystack-contracts@1.0.2/openapi.json
34
34
  ```
35
35
 
36
36
  Requires `resolveJsonModule: true` in `tsconfig.json` for the import pattern.
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
  };
@@ -150,7 +150,7 @@ interface paths {
150
150
  * "message": "email must be an email"
151
151
  * }
152
152
  */
153
- "application/json": unknown;
153
+ 'application/json': unknown;
154
154
  };
155
155
  };
156
156
  /** @description Authentication required. Provide a valid bearer token. */
@@ -167,7 +167,7 @@ interface paths {
167
167
  * "message": "Unauthorized"
168
168
  * }
169
169
  */
170
- "application/json": unknown;
170
+ 'application/json': unknown;
171
171
  };
172
172
  };
173
173
  };
@@ -178,7 +178,7 @@ interface paths {
178
178
  patch?: never;
179
179
  trace?: never;
180
180
  };
181
- "/robots": {
181
+ '/robots': {
182
182
  parameters: {
183
183
  query?: never;
184
184
  header?: never;
@@ -204,7 +204,7 @@ interface paths {
204
204
  [name: string]: unknown;
205
205
  };
206
206
  content: {
207
- "application/json": {
207
+ 'application/json': {
208
208
  /** @example true */
209
209
  success: boolean;
210
210
  /** @example 200 */
@@ -214,7 +214,7 @@ interface paths {
214
214
  * @example 2026-05-29T12:00:00.000Z
215
215
  */
216
216
  timestamp: string;
217
- data: components["schemas"]["RobotListItemDto"][];
217
+ data: components['schemas']['RobotListItemDto'][];
218
218
  };
219
219
  };
220
220
  };
@@ -232,7 +232,7 @@ interface paths {
232
232
  * "message": "Unauthorized"
233
233
  * }
234
234
  */
235
- "application/json": unknown;
235
+ 'application/json': unknown;
236
236
  };
237
237
  };
238
238
  };
@@ -245,7 +245,7 @@ interface paths {
245
245
  patch?: never;
246
246
  trace?: never;
247
247
  };
248
- "/robots/{id}": {
248
+ '/robots/{id}': {
249
249
  parameters: {
250
250
  query?: never;
251
251
  header?: never;
@@ -274,7 +274,7 @@ interface paths {
274
274
  [name: string]: unknown;
275
275
  };
276
276
  content: {
277
- "application/json": {
277
+ 'application/json': {
278
278
  /** @example true */
279
279
  success: boolean;
280
280
  /** @example 200 */
@@ -284,7 +284,7 @@ interface paths {
284
284
  * @example 2026-05-29T12:00:00.000Z
285
285
  */
286
286
  timestamp: string;
287
- data: components["schemas"]["RobotListItemDto"];
287
+ data: components['schemas']['RobotListItemDto'];
288
288
  };
289
289
  };
290
290
  };
@@ -302,7 +302,7 @@ interface paths {
302
302
  * "message": "email must be an email"
303
303
  * }
304
304
  */
305
- "application/json": unknown;
305
+ 'application/json': unknown;
306
306
  };
307
307
  };
308
308
  /** @description Authentication required. Provide a valid bearer token. */
@@ -319,7 +319,7 @@ interface paths {
319
319
  * "message": "Unauthorized"
320
320
  * }
321
321
  */
322
- "application/json": unknown;
322
+ 'application/json': unknown;
323
323
  };
324
324
  };
325
325
  /** @description Robot not found in the current tenant. */
@@ -336,7 +336,7 @@ interface paths {
336
336
  * "message": "Robot not found"
337
337
  * }
338
338
  */
339
- "application/json": unknown;
339
+ 'application/json': unknown;
340
340
  };
341
341
  };
342
342
  };
@@ -349,7 +349,7 @@ interface paths {
349
349
  patch?: never;
350
350
  trace?: never;
351
351
  };
352
- "/metrics/types": {
352
+ '/metrics/types': {
353
353
  parameters: {
354
354
  query?: never;
355
355
  header?: never;
@@ -375,7 +375,7 @@ interface paths {
375
375
  [name: string]: unknown;
376
376
  };
377
377
  content: {
378
- "application/json": {
378
+ 'application/json': {
379
379
  /** @example true */
380
380
  success: boolean;
381
381
  /** @example 200 */
@@ -385,7 +385,7 @@ interface paths {
385
385
  * @example 2026-05-29T12:00:00.000Z
386
386
  */
387
387
  timestamp: string;
388
- data: components["schemas"]["MetricTypeResponseDto"][];
388
+ data: components['schemas']['MetricTypeResponseDto'][];
389
389
  };
390
390
  };
391
391
  };
@@ -403,7 +403,7 @@ interface paths {
403
403
  * "message": "Unauthorized"
404
404
  * }
405
405
  */
406
- "application/json": unknown;
406
+ 'application/json': unknown;
407
407
  };
408
408
  };
409
409
  };
@@ -416,7 +416,7 @@ interface paths {
416
416
  patch?: never;
417
417
  trace?: never;
418
418
  };
419
- "/metrics/robot-values/{robotId}": {
419
+ '/metrics/robot-values/{robotId}': {
420
420
  parameters: {
421
421
  query?: never;
422
422
  header?: never;
@@ -448,7 +448,7 @@ interface paths {
448
448
  [name: string]: unknown;
449
449
  };
450
450
  content: {
451
- "application/json": {
451
+ 'application/json': {
452
452
  /** @example true */
453
453
  success: boolean;
454
454
  /** @example 200 */
@@ -458,7 +458,7 @@ interface paths {
458
458
  * @example 2026-05-29T12:00:00.000Z
459
459
  */
460
460
  timestamp: string;
461
- data: components["schemas"]["RobotMetricLiveDto"][];
461
+ data: components['schemas']['RobotMetricLiveDto'][];
462
462
  };
463
463
  };
464
464
  };
@@ -476,7 +476,7 @@ interface paths {
476
476
  * "message": "email must be an email"
477
477
  * }
478
478
  */
479
- "application/json": unknown;
479
+ 'application/json': unknown;
480
480
  };
481
481
  };
482
482
  /** @description Authentication required. Provide a valid bearer token. */
@@ -493,7 +493,7 @@ interface paths {
493
493
  * "message": "Unauthorized"
494
494
  * }
495
495
  */
496
- "application/json": unknown;
496
+ 'application/json': unknown;
497
497
  };
498
498
  };
499
499
  };
@@ -506,7 +506,7 @@ interface paths {
506
506
  patch?: never;
507
507
  trace?: never;
508
508
  };
509
- "/disinfection/robots": {
509
+ '/disinfection/robots': {
510
510
  parameters: {
511
511
  query?: never;
512
512
  header?: never;
@@ -532,7 +532,7 @@ interface paths {
532
532
  [name: string]: unknown;
533
533
  };
534
534
  content: {
535
- "application/json": {
535
+ 'application/json': {
536
536
  /** @example true */
537
537
  success: boolean;
538
538
  /** @example 200 */
@@ -542,7 +542,7 @@ interface paths {
542
542
  * @example 2026-05-29T12:00:00.000Z
543
543
  */
544
544
  timestamp: string;
545
- data: components["schemas"]["RobotDisinfectionStatsDto"][];
545
+ data: components['schemas']['RobotDisinfectionStatsDto'][];
546
546
  };
547
547
  };
548
548
  };
@@ -560,7 +560,7 @@ interface paths {
560
560
  * "message": "Unauthorized"
561
561
  * }
562
562
  */
563
- "application/json": unknown;
563
+ 'application/json': unknown;
564
564
  };
565
565
  };
566
566
  };
@@ -573,7 +573,7 @@ interface paths {
573
573
  patch?: never;
574
574
  trace?: never;
575
575
  };
576
- "/disinfection/ongoing-jobs": {
576
+ '/disinfection/ongoing-jobs': {
577
577
  parameters: {
578
578
  query?: never;
579
579
  header?: never;
@@ -599,7 +599,7 @@ interface paths {
599
599
  [name: string]: unknown;
600
600
  };
601
601
  content: {
602
- "application/json": {
602
+ 'application/json': {
603
603
  /** @example true */
604
604
  success: boolean;
605
605
  /** @example 200 */
@@ -609,7 +609,7 @@ interface paths {
609
609
  * @example 2026-05-29T12:00:00.000Z
610
610
  */
611
611
  timestamp: string;
612
- data: components["schemas"]["DisinfectionJobDto"][];
612
+ data: components['schemas']['DisinfectionJobDto'][];
613
613
  };
614
614
  };
615
615
  };
@@ -627,7 +627,7 @@ interface paths {
627
627
  * "message": "Unauthorized"
628
628
  * }
629
629
  */
630
- "application/json": unknown;
630
+ 'application/json': unknown;
631
631
  };
632
632
  };
633
633
  };
@@ -640,7 +640,7 @@ interface paths {
640
640
  patch?: never;
641
641
  trace?: never;
642
642
  };
643
- "/disinfection/jobs": {
643
+ '/disinfection/jobs': {
644
644
  parameters: {
645
645
  query?: never;
646
646
  header?: never;
@@ -655,7 +655,7 @@ interface paths {
655
655
  parameters: {
656
656
  query?: {
657
657
  /** @description Job outcome filter. Defaults to "all" (no status filtering) when omitted. */
658
- status?: "passed" | "partial" | "failed" | "all";
658
+ status?: 'passed' | 'partial' | 'failed' | 'all';
659
659
  /** @description UUID of a specific robot to filter by. */
660
660
  robotId?: string;
661
661
  };
@@ -671,7 +671,7 @@ interface paths {
671
671
  [name: string]: unknown;
672
672
  };
673
673
  content: {
674
- "application/json": {
674
+ 'application/json': {
675
675
  /** @example true */
676
676
  success: boolean;
677
677
  /** @example 200 */
@@ -681,7 +681,7 @@ interface paths {
681
681
  * @example 2026-05-29T12:00:00.000Z
682
682
  */
683
683
  timestamp: string;
684
- data: components["schemas"]["DisinfectionJobDto"][];
684
+ data: components['schemas']['DisinfectionJobDto'][];
685
685
  };
686
686
  };
687
687
  };
@@ -699,7 +699,7 @@ interface paths {
699
699
  * "message": "email must be an email"
700
700
  * }
701
701
  */
702
- "application/json": unknown;
702
+ 'application/json': unknown;
703
703
  };
704
704
  };
705
705
  /** @description Authentication required. Provide a valid bearer token. */
@@ -716,7 +716,7 @@ interface paths {
716
716
  * "message": "Unauthorized"
717
717
  * }
718
718
  */
719
- "application/json": unknown;
719
+ 'application/json': unknown;
720
720
  };
721
721
  };
722
722
  };
@@ -729,7 +729,7 @@ interface paths {
729
729
  patch?: never;
730
730
  trace?: never;
731
731
  };
732
- "/analytics-agg/robots-count": {
732
+ '/analytics-agg/robots-count': {
733
733
  parameters: {
734
734
  query?: never;
735
735
  header?: never;
@@ -755,7 +755,7 @@ interface paths {
755
755
  [name: string]: unknown;
756
756
  };
757
757
  content: {
758
- "application/json": {
758
+ 'application/json': {
759
759
  /** @example true */
760
760
  success: boolean;
761
761
  /** @example 200 */
@@ -765,7 +765,7 @@ interface paths {
765
765
  * @example 2026-05-29T12:00:00.000Z
766
766
  */
767
767
  timestamp: string;
768
- data: components["schemas"]["RobotsCountAnalyticsDataDto"];
768
+ data: components['schemas']['RobotsCountAnalyticsDataDto'];
769
769
  };
770
770
  };
771
771
  };
@@ -783,7 +783,7 @@ interface paths {
783
783
  * "message": "Unauthorized"
784
784
  * }
785
785
  */
786
- "application/json": unknown;
786
+ 'application/json': unknown;
787
787
  };
788
788
  };
789
789
  };
@@ -796,7 +796,7 @@ interface paths {
796
796
  patch?: never;
797
797
  trace?: never;
798
798
  };
799
- "/analytics-agg/disinfection-count": {
799
+ '/analytics-agg/disinfection-count': {
800
800
  parameters: {
801
801
  query?: never;
802
802
  header?: never;
@@ -822,7 +822,7 @@ interface paths {
822
822
  [name: string]: unknown;
823
823
  };
824
824
  content: {
825
- "application/json": {
825
+ 'application/json': {
826
826
  /** @example true */
827
827
  success: boolean;
828
828
  /** @example 200 */
@@ -832,7 +832,7 @@ interface paths {
832
832
  * @example 2026-05-29T12:00:00.000Z
833
833
  */
834
834
  timestamp: string;
835
- data: components["schemas"]["DisinfectionCountAnalyticsDataDto"];
835
+ data: components['schemas']['DisinfectionCountAnalyticsDataDto'];
836
836
  };
837
837
  };
838
838
  };
@@ -850,7 +850,7 @@ interface paths {
850
850
  * "message": "Unauthorized"
851
851
  * }
852
852
  */
853
- "application/json": unknown;
853
+ 'application/json': unknown;
854
854
  };
855
855
  };
856
856
  };
@@ -863,7 +863,7 @@ interface paths {
863
863
  patch?: never;
864
864
  trace?: never;
865
865
  };
866
- "/analytics-agg/disinfection-operator": {
866
+ '/analytics-agg/disinfection-operator': {
867
867
  parameters: {
868
868
  query?: never;
869
869
  header?: never;
@@ -889,7 +889,7 @@ interface paths {
889
889
  [name: string]: unknown;
890
890
  };
891
891
  content: {
892
- "application/json": {
892
+ 'application/json': {
893
893
  /** @example true */
894
894
  success: boolean;
895
895
  /** @example 200 */
@@ -899,7 +899,7 @@ interface paths {
899
899
  * @example 2026-05-29T12:00:00.000Z
900
900
  */
901
901
  timestamp: string;
902
- data: components["schemas"]["DisinfectionOperatorsAnalyticsDataDto"];
902
+ data: components['schemas']['DisinfectionOperatorsAnalyticsDataDto'];
903
903
  };
904
904
  };
905
905
  };
@@ -917,7 +917,7 @@ interface paths {
917
917
  * "message": "Unauthorized"
918
918
  * }
919
919
  */
920
- "application/json": unknown;
920
+ 'application/json': unknown;
921
921
  };
922
922
  };
923
923
  };
@@ -930,7 +930,7 @@ interface paths {
930
930
  patch?: never;
931
931
  trace?: never;
932
932
  };
933
- "/analytics-agg/disinfection-status": {
933
+ '/analytics-agg/disinfection-status': {
934
934
  parameters: {
935
935
  query?: never;
936
936
  header?: never;
@@ -956,7 +956,7 @@ interface paths {
956
956
  [name: string]: unknown;
957
957
  };
958
958
  content: {
959
- "application/json": {
959
+ 'application/json': {
960
960
  /** @example true */
961
961
  success: boolean;
962
962
  /** @example 200 */
@@ -966,7 +966,7 @@ interface paths {
966
966
  * @example 2026-05-29T12:00:00.000Z
967
967
  */
968
968
  timestamp: string;
969
- data: components["schemas"]["DisinfectionStatusAnalyticsDataDto"];
969
+ data: components['schemas']['DisinfectionStatusAnalyticsDataDto'];
970
970
  };
971
971
  };
972
972
  };
@@ -984,7 +984,7 @@ interface paths {
984
984
  * "message": "Unauthorized"
985
985
  * }
986
986
  */
987
- "application/json": unknown;
987
+ 'application/json': unknown;
988
988
  };
989
989
  };
990
990
  };
@@ -1017,17 +1017,17 @@ interface components {
1017
1017
  */
1018
1018
  expiresIn: number;
1019
1019
  /** @description Sanitized authenticated user snapshot returned with the token response. */
1020
- user: components["schemas"]["PublicUserDto"];
1020
+ user: components['schemas']['PublicUserDto'];
1021
1021
  };
1022
1022
  DisinfectionCountAnalyticsDataDto: {
1023
- data: components["schemas"]["DisinfectionCountResponseDto"];
1023
+ data: components['schemas']['DisinfectionCountResponseDto'];
1024
1024
  /** @example 2026-05-29T12:00:00.000Z */
1025
1025
  timestamp: string;
1026
1026
  /**
1027
1027
  * @example success
1028
1028
  * @enum {string}
1029
1029
  */
1030
- status: "success" | "error";
1030
+ status: 'success' | 'error';
1031
1031
  };
1032
1032
  DisinfectionCountResponseDto: {
1033
1033
  /** @example Warehouse Bot Alpha */
@@ -1068,24 +1068,24 @@ interface components {
1068
1068
  totalJobs: number;
1069
1069
  };
1070
1070
  DisinfectionOperatorsAnalyticsDataDto: {
1071
- data: components["schemas"]["DisinfectionOperatorResponseDto"][];
1071
+ data: components['schemas']['DisinfectionOperatorResponseDto'][];
1072
1072
  /** @example 2026-05-29T12:00:00.000Z */
1073
1073
  timestamp: string;
1074
1074
  /**
1075
1075
  * @example success
1076
1076
  * @enum {string}
1077
1077
  */
1078
- status: "success" | "error";
1078
+ status: 'success' | 'error';
1079
1079
  };
1080
1080
  DisinfectionStatusAnalyticsDataDto: {
1081
- data: components["schemas"]["DisinfectionStatusResponseDto"][];
1081
+ data: components['schemas']['DisinfectionStatusResponseDto'][];
1082
1082
  /** @example 2026-05-29T12:00:00.000Z */
1083
1083
  timestamp: string;
1084
1084
  /**
1085
1085
  * @example success
1086
1086
  * @enum {string}
1087
1087
  */
1088
- status: "success" | "error";
1088
+ status: 'success' | 'error';
1089
1089
  };
1090
1090
  DisinfectionStatusResponseDto: {
1091
1091
  /** @example COVERAGE_DONE */
@@ -1125,12 +1125,12 @@ interface components {
1125
1125
  * @example numeric
1126
1126
  * @enum {string}
1127
1127
  */
1128
- dataType: "numeric" | "string";
1128
+ dataType: 'numeric' | 'string';
1129
1129
  /**
1130
1130
  * @example stream
1131
1131
  * @enum {string}
1132
1132
  */
1133
- sourceType?: "non_stream" | "stream";
1133
+ sourceType?: 'non_stream' | 'stream';
1134
1134
  };
1135
1135
  PublicUserDto: {
1136
1136
  /** @example c3d4e5f6-a1b2-3456-abcd-789012345678 */
@@ -1149,10 +1149,14 @@ interface components {
1149
1149
  facilityId?: string | null;
1150
1150
  fleetId?: string | null;
1151
1151
  /** @enum {string|null} */
1152
- role?: "TENANT_ADMIN" | "WORKSPACE_ADMIN" | "FACILITY_ADMIN" | "FLEET_OPERATOR" | "FLEET_VIEWER" | null;
1152
+ role?: 'TENANT_ADMIN' | 'WORKSPACE_ADMIN' | 'FACILITY_ADMIN' | 'FLEET_OPERATOR' | 'FLEET_VIEWER' | null;
1153
1153
  /** @enum {string|null} */
1154
- scopeType?: "tenant" | "workspace" | "facility" | "fleet" | null;
1154
+ scopeType?: 'tenant' | 'workspace' | 'facility' | 'fleet' | null;
1155
1155
  scopeId?: string | null;
1156
+ /** @description UUID of user who created this record. */
1157
+ createdBy?: string | null;
1158
+ /** @description UUID of user who last updated this record. */
1159
+ updatedBy?: string | null;
1156
1160
  /**
1157
1161
  * Format: date-time
1158
1162
  * @example 2026-01-15T08:00:00.000Z
@@ -1283,6 +1287,16 @@ interface components {
1283
1287
  * @example 2026-05-20T10:00:00.000Z
1284
1288
  */
1285
1289
  lastStreamed?: string | null;
1290
+ /**
1291
+ * @description Software version currently running on the robot, or null if not yet received.
1292
+ * @example 2.0.84
1293
+ */
1294
+ botVersion?: string | null;
1295
+ /**
1296
+ * @description Hardware model of the robot, or null if not yet identified.
1297
+ * @example Violet Gen 4 AI
1298
+ */
1299
+ botModel?: string | null;
1286
1300
  };
1287
1301
  RobotMetricLiveDto: {
1288
1302
  /**
@@ -1307,14 +1321,14 @@ interface components {
1307
1321
  lastSyncTime: Record<string, never>;
1308
1322
  };
1309
1323
  RobotsCountAnalyticsDataDto: {
1310
- data: components["schemas"]["RobotsCountResponseDto"];
1324
+ data: components['schemas']['RobotsCountResponseDto'];
1311
1325
  /** @example 2026-05-29T12:00:00.000Z */
1312
1326
  timestamp: string;
1313
1327
  /**
1314
1328
  * @example success
1315
1329
  * @enum {string}
1316
1330
  */
1317
- status: "success" | "error";
1331
+ status: 'success' | 'error';
1318
1332
  };
1319
1333
  RobotsCountResponseDto: {
1320
1334
  /** @example 24 */
package/dist/index.d.ts 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
  };
@@ -150,7 +150,7 @@ interface paths {
150
150
  * "message": "email must be an email"
151
151
  * }
152
152
  */
153
- "application/json": unknown;
153
+ 'application/json': unknown;
154
154
  };
155
155
  };
156
156
  /** @description Authentication required. Provide a valid bearer token. */
@@ -167,7 +167,7 @@ interface paths {
167
167
  * "message": "Unauthorized"
168
168
  * }
169
169
  */
170
- "application/json": unknown;
170
+ 'application/json': unknown;
171
171
  };
172
172
  };
173
173
  };
@@ -178,7 +178,7 @@ interface paths {
178
178
  patch?: never;
179
179
  trace?: never;
180
180
  };
181
- "/robots": {
181
+ '/robots': {
182
182
  parameters: {
183
183
  query?: never;
184
184
  header?: never;
@@ -204,7 +204,7 @@ interface paths {
204
204
  [name: string]: unknown;
205
205
  };
206
206
  content: {
207
- "application/json": {
207
+ 'application/json': {
208
208
  /** @example true */
209
209
  success: boolean;
210
210
  /** @example 200 */
@@ -214,7 +214,7 @@ interface paths {
214
214
  * @example 2026-05-29T12:00:00.000Z
215
215
  */
216
216
  timestamp: string;
217
- data: components["schemas"]["RobotListItemDto"][];
217
+ data: components['schemas']['RobotListItemDto'][];
218
218
  };
219
219
  };
220
220
  };
@@ -232,7 +232,7 @@ interface paths {
232
232
  * "message": "Unauthorized"
233
233
  * }
234
234
  */
235
- "application/json": unknown;
235
+ 'application/json': unknown;
236
236
  };
237
237
  };
238
238
  };
@@ -245,7 +245,7 @@ interface paths {
245
245
  patch?: never;
246
246
  trace?: never;
247
247
  };
248
- "/robots/{id}": {
248
+ '/robots/{id}': {
249
249
  parameters: {
250
250
  query?: never;
251
251
  header?: never;
@@ -274,7 +274,7 @@ interface paths {
274
274
  [name: string]: unknown;
275
275
  };
276
276
  content: {
277
- "application/json": {
277
+ 'application/json': {
278
278
  /** @example true */
279
279
  success: boolean;
280
280
  /** @example 200 */
@@ -284,7 +284,7 @@ interface paths {
284
284
  * @example 2026-05-29T12:00:00.000Z
285
285
  */
286
286
  timestamp: string;
287
- data: components["schemas"]["RobotListItemDto"];
287
+ data: components['schemas']['RobotListItemDto'];
288
288
  };
289
289
  };
290
290
  };
@@ -302,7 +302,7 @@ interface paths {
302
302
  * "message": "email must be an email"
303
303
  * }
304
304
  */
305
- "application/json": unknown;
305
+ 'application/json': unknown;
306
306
  };
307
307
  };
308
308
  /** @description Authentication required. Provide a valid bearer token. */
@@ -319,7 +319,7 @@ interface paths {
319
319
  * "message": "Unauthorized"
320
320
  * }
321
321
  */
322
- "application/json": unknown;
322
+ 'application/json': unknown;
323
323
  };
324
324
  };
325
325
  /** @description Robot not found in the current tenant. */
@@ -336,7 +336,7 @@ interface paths {
336
336
  * "message": "Robot not found"
337
337
  * }
338
338
  */
339
- "application/json": unknown;
339
+ 'application/json': unknown;
340
340
  };
341
341
  };
342
342
  };
@@ -349,7 +349,7 @@ interface paths {
349
349
  patch?: never;
350
350
  trace?: never;
351
351
  };
352
- "/metrics/types": {
352
+ '/metrics/types': {
353
353
  parameters: {
354
354
  query?: never;
355
355
  header?: never;
@@ -375,7 +375,7 @@ interface paths {
375
375
  [name: string]: unknown;
376
376
  };
377
377
  content: {
378
- "application/json": {
378
+ 'application/json': {
379
379
  /** @example true */
380
380
  success: boolean;
381
381
  /** @example 200 */
@@ -385,7 +385,7 @@ interface paths {
385
385
  * @example 2026-05-29T12:00:00.000Z
386
386
  */
387
387
  timestamp: string;
388
- data: components["schemas"]["MetricTypeResponseDto"][];
388
+ data: components['schemas']['MetricTypeResponseDto'][];
389
389
  };
390
390
  };
391
391
  };
@@ -403,7 +403,7 @@ interface paths {
403
403
  * "message": "Unauthorized"
404
404
  * }
405
405
  */
406
- "application/json": unknown;
406
+ 'application/json': unknown;
407
407
  };
408
408
  };
409
409
  };
@@ -416,7 +416,7 @@ interface paths {
416
416
  patch?: never;
417
417
  trace?: never;
418
418
  };
419
- "/metrics/robot-values/{robotId}": {
419
+ '/metrics/robot-values/{robotId}': {
420
420
  parameters: {
421
421
  query?: never;
422
422
  header?: never;
@@ -448,7 +448,7 @@ interface paths {
448
448
  [name: string]: unknown;
449
449
  };
450
450
  content: {
451
- "application/json": {
451
+ 'application/json': {
452
452
  /** @example true */
453
453
  success: boolean;
454
454
  /** @example 200 */
@@ -458,7 +458,7 @@ interface paths {
458
458
  * @example 2026-05-29T12:00:00.000Z
459
459
  */
460
460
  timestamp: string;
461
- data: components["schemas"]["RobotMetricLiveDto"][];
461
+ data: components['schemas']['RobotMetricLiveDto'][];
462
462
  };
463
463
  };
464
464
  };
@@ -476,7 +476,7 @@ interface paths {
476
476
  * "message": "email must be an email"
477
477
  * }
478
478
  */
479
- "application/json": unknown;
479
+ 'application/json': unknown;
480
480
  };
481
481
  };
482
482
  /** @description Authentication required. Provide a valid bearer token. */
@@ -493,7 +493,7 @@ interface paths {
493
493
  * "message": "Unauthorized"
494
494
  * }
495
495
  */
496
- "application/json": unknown;
496
+ 'application/json': unknown;
497
497
  };
498
498
  };
499
499
  };
@@ -506,7 +506,7 @@ interface paths {
506
506
  patch?: never;
507
507
  trace?: never;
508
508
  };
509
- "/disinfection/robots": {
509
+ '/disinfection/robots': {
510
510
  parameters: {
511
511
  query?: never;
512
512
  header?: never;
@@ -532,7 +532,7 @@ interface paths {
532
532
  [name: string]: unknown;
533
533
  };
534
534
  content: {
535
- "application/json": {
535
+ 'application/json': {
536
536
  /** @example true */
537
537
  success: boolean;
538
538
  /** @example 200 */
@@ -542,7 +542,7 @@ interface paths {
542
542
  * @example 2026-05-29T12:00:00.000Z
543
543
  */
544
544
  timestamp: string;
545
- data: components["schemas"]["RobotDisinfectionStatsDto"][];
545
+ data: components['schemas']['RobotDisinfectionStatsDto'][];
546
546
  };
547
547
  };
548
548
  };
@@ -560,7 +560,7 @@ interface paths {
560
560
  * "message": "Unauthorized"
561
561
  * }
562
562
  */
563
- "application/json": unknown;
563
+ 'application/json': unknown;
564
564
  };
565
565
  };
566
566
  };
@@ -573,7 +573,7 @@ interface paths {
573
573
  patch?: never;
574
574
  trace?: never;
575
575
  };
576
- "/disinfection/ongoing-jobs": {
576
+ '/disinfection/ongoing-jobs': {
577
577
  parameters: {
578
578
  query?: never;
579
579
  header?: never;
@@ -599,7 +599,7 @@ interface paths {
599
599
  [name: string]: unknown;
600
600
  };
601
601
  content: {
602
- "application/json": {
602
+ 'application/json': {
603
603
  /** @example true */
604
604
  success: boolean;
605
605
  /** @example 200 */
@@ -609,7 +609,7 @@ interface paths {
609
609
  * @example 2026-05-29T12:00:00.000Z
610
610
  */
611
611
  timestamp: string;
612
- data: components["schemas"]["DisinfectionJobDto"][];
612
+ data: components['schemas']['DisinfectionJobDto'][];
613
613
  };
614
614
  };
615
615
  };
@@ -627,7 +627,7 @@ interface paths {
627
627
  * "message": "Unauthorized"
628
628
  * }
629
629
  */
630
- "application/json": unknown;
630
+ 'application/json': unknown;
631
631
  };
632
632
  };
633
633
  };
@@ -640,7 +640,7 @@ interface paths {
640
640
  patch?: never;
641
641
  trace?: never;
642
642
  };
643
- "/disinfection/jobs": {
643
+ '/disinfection/jobs': {
644
644
  parameters: {
645
645
  query?: never;
646
646
  header?: never;
@@ -655,7 +655,7 @@ interface paths {
655
655
  parameters: {
656
656
  query?: {
657
657
  /** @description Job outcome filter. Defaults to "all" (no status filtering) when omitted. */
658
- status?: "passed" | "partial" | "failed" | "all";
658
+ status?: 'passed' | 'partial' | 'failed' | 'all';
659
659
  /** @description UUID of a specific robot to filter by. */
660
660
  robotId?: string;
661
661
  };
@@ -671,7 +671,7 @@ interface paths {
671
671
  [name: string]: unknown;
672
672
  };
673
673
  content: {
674
- "application/json": {
674
+ 'application/json': {
675
675
  /** @example true */
676
676
  success: boolean;
677
677
  /** @example 200 */
@@ -681,7 +681,7 @@ interface paths {
681
681
  * @example 2026-05-29T12:00:00.000Z
682
682
  */
683
683
  timestamp: string;
684
- data: components["schemas"]["DisinfectionJobDto"][];
684
+ data: components['schemas']['DisinfectionJobDto'][];
685
685
  };
686
686
  };
687
687
  };
@@ -699,7 +699,7 @@ interface paths {
699
699
  * "message": "email must be an email"
700
700
  * }
701
701
  */
702
- "application/json": unknown;
702
+ 'application/json': unknown;
703
703
  };
704
704
  };
705
705
  /** @description Authentication required. Provide a valid bearer token. */
@@ -716,7 +716,7 @@ interface paths {
716
716
  * "message": "Unauthorized"
717
717
  * }
718
718
  */
719
- "application/json": unknown;
719
+ 'application/json': unknown;
720
720
  };
721
721
  };
722
722
  };
@@ -729,7 +729,7 @@ interface paths {
729
729
  patch?: never;
730
730
  trace?: never;
731
731
  };
732
- "/analytics-agg/robots-count": {
732
+ '/analytics-agg/robots-count': {
733
733
  parameters: {
734
734
  query?: never;
735
735
  header?: never;
@@ -755,7 +755,7 @@ interface paths {
755
755
  [name: string]: unknown;
756
756
  };
757
757
  content: {
758
- "application/json": {
758
+ 'application/json': {
759
759
  /** @example true */
760
760
  success: boolean;
761
761
  /** @example 200 */
@@ -765,7 +765,7 @@ interface paths {
765
765
  * @example 2026-05-29T12:00:00.000Z
766
766
  */
767
767
  timestamp: string;
768
- data: components["schemas"]["RobotsCountAnalyticsDataDto"];
768
+ data: components['schemas']['RobotsCountAnalyticsDataDto'];
769
769
  };
770
770
  };
771
771
  };
@@ -783,7 +783,7 @@ interface paths {
783
783
  * "message": "Unauthorized"
784
784
  * }
785
785
  */
786
- "application/json": unknown;
786
+ 'application/json': unknown;
787
787
  };
788
788
  };
789
789
  };
@@ -796,7 +796,7 @@ interface paths {
796
796
  patch?: never;
797
797
  trace?: never;
798
798
  };
799
- "/analytics-agg/disinfection-count": {
799
+ '/analytics-agg/disinfection-count': {
800
800
  parameters: {
801
801
  query?: never;
802
802
  header?: never;
@@ -822,7 +822,7 @@ interface paths {
822
822
  [name: string]: unknown;
823
823
  };
824
824
  content: {
825
- "application/json": {
825
+ 'application/json': {
826
826
  /** @example true */
827
827
  success: boolean;
828
828
  /** @example 200 */
@@ -832,7 +832,7 @@ interface paths {
832
832
  * @example 2026-05-29T12:00:00.000Z
833
833
  */
834
834
  timestamp: string;
835
- data: components["schemas"]["DisinfectionCountAnalyticsDataDto"];
835
+ data: components['schemas']['DisinfectionCountAnalyticsDataDto'];
836
836
  };
837
837
  };
838
838
  };
@@ -850,7 +850,7 @@ interface paths {
850
850
  * "message": "Unauthorized"
851
851
  * }
852
852
  */
853
- "application/json": unknown;
853
+ 'application/json': unknown;
854
854
  };
855
855
  };
856
856
  };
@@ -863,7 +863,7 @@ interface paths {
863
863
  patch?: never;
864
864
  trace?: never;
865
865
  };
866
- "/analytics-agg/disinfection-operator": {
866
+ '/analytics-agg/disinfection-operator': {
867
867
  parameters: {
868
868
  query?: never;
869
869
  header?: never;
@@ -889,7 +889,7 @@ interface paths {
889
889
  [name: string]: unknown;
890
890
  };
891
891
  content: {
892
- "application/json": {
892
+ 'application/json': {
893
893
  /** @example true */
894
894
  success: boolean;
895
895
  /** @example 200 */
@@ -899,7 +899,7 @@ interface paths {
899
899
  * @example 2026-05-29T12:00:00.000Z
900
900
  */
901
901
  timestamp: string;
902
- data: components["schemas"]["DisinfectionOperatorsAnalyticsDataDto"];
902
+ data: components['schemas']['DisinfectionOperatorsAnalyticsDataDto'];
903
903
  };
904
904
  };
905
905
  };
@@ -917,7 +917,7 @@ interface paths {
917
917
  * "message": "Unauthorized"
918
918
  * }
919
919
  */
920
- "application/json": unknown;
920
+ 'application/json': unknown;
921
921
  };
922
922
  };
923
923
  };
@@ -930,7 +930,7 @@ interface paths {
930
930
  patch?: never;
931
931
  trace?: never;
932
932
  };
933
- "/analytics-agg/disinfection-status": {
933
+ '/analytics-agg/disinfection-status': {
934
934
  parameters: {
935
935
  query?: never;
936
936
  header?: never;
@@ -956,7 +956,7 @@ interface paths {
956
956
  [name: string]: unknown;
957
957
  };
958
958
  content: {
959
- "application/json": {
959
+ 'application/json': {
960
960
  /** @example true */
961
961
  success: boolean;
962
962
  /** @example 200 */
@@ -966,7 +966,7 @@ interface paths {
966
966
  * @example 2026-05-29T12:00:00.000Z
967
967
  */
968
968
  timestamp: string;
969
- data: components["schemas"]["DisinfectionStatusAnalyticsDataDto"];
969
+ data: components['schemas']['DisinfectionStatusAnalyticsDataDto'];
970
970
  };
971
971
  };
972
972
  };
@@ -984,7 +984,7 @@ interface paths {
984
984
  * "message": "Unauthorized"
985
985
  * }
986
986
  */
987
- "application/json": unknown;
987
+ 'application/json': unknown;
988
988
  };
989
989
  };
990
990
  };
@@ -1017,17 +1017,17 @@ interface components {
1017
1017
  */
1018
1018
  expiresIn: number;
1019
1019
  /** @description Sanitized authenticated user snapshot returned with the token response. */
1020
- user: components["schemas"]["PublicUserDto"];
1020
+ user: components['schemas']['PublicUserDto'];
1021
1021
  };
1022
1022
  DisinfectionCountAnalyticsDataDto: {
1023
- data: components["schemas"]["DisinfectionCountResponseDto"];
1023
+ data: components['schemas']['DisinfectionCountResponseDto'];
1024
1024
  /** @example 2026-05-29T12:00:00.000Z */
1025
1025
  timestamp: string;
1026
1026
  /**
1027
1027
  * @example success
1028
1028
  * @enum {string}
1029
1029
  */
1030
- status: "success" | "error";
1030
+ status: 'success' | 'error';
1031
1031
  };
1032
1032
  DisinfectionCountResponseDto: {
1033
1033
  /** @example Warehouse Bot Alpha */
@@ -1068,24 +1068,24 @@ interface components {
1068
1068
  totalJobs: number;
1069
1069
  };
1070
1070
  DisinfectionOperatorsAnalyticsDataDto: {
1071
- data: components["schemas"]["DisinfectionOperatorResponseDto"][];
1071
+ data: components['schemas']['DisinfectionOperatorResponseDto'][];
1072
1072
  /** @example 2026-05-29T12:00:00.000Z */
1073
1073
  timestamp: string;
1074
1074
  /**
1075
1075
  * @example success
1076
1076
  * @enum {string}
1077
1077
  */
1078
- status: "success" | "error";
1078
+ status: 'success' | 'error';
1079
1079
  };
1080
1080
  DisinfectionStatusAnalyticsDataDto: {
1081
- data: components["schemas"]["DisinfectionStatusResponseDto"][];
1081
+ data: components['schemas']['DisinfectionStatusResponseDto'][];
1082
1082
  /** @example 2026-05-29T12:00:00.000Z */
1083
1083
  timestamp: string;
1084
1084
  /**
1085
1085
  * @example success
1086
1086
  * @enum {string}
1087
1087
  */
1088
- status: "success" | "error";
1088
+ status: 'success' | 'error';
1089
1089
  };
1090
1090
  DisinfectionStatusResponseDto: {
1091
1091
  /** @example COVERAGE_DONE */
@@ -1125,12 +1125,12 @@ interface components {
1125
1125
  * @example numeric
1126
1126
  * @enum {string}
1127
1127
  */
1128
- dataType: "numeric" | "string";
1128
+ dataType: 'numeric' | 'string';
1129
1129
  /**
1130
1130
  * @example stream
1131
1131
  * @enum {string}
1132
1132
  */
1133
- sourceType?: "non_stream" | "stream";
1133
+ sourceType?: 'non_stream' | 'stream';
1134
1134
  };
1135
1135
  PublicUserDto: {
1136
1136
  /** @example c3d4e5f6-a1b2-3456-abcd-789012345678 */
@@ -1149,10 +1149,14 @@ interface components {
1149
1149
  facilityId?: string | null;
1150
1150
  fleetId?: string | null;
1151
1151
  /** @enum {string|null} */
1152
- role?: "TENANT_ADMIN" | "WORKSPACE_ADMIN" | "FACILITY_ADMIN" | "FLEET_OPERATOR" | "FLEET_VIEWER" | null;
1152
+ role?: 'TENANT_ADMIN' | 'WORKSPACE_ADMIN' | 'FACILITY_ADMIN' | 'FLEET_OPERATOR' | 'FLEET_VIEWER' | null;
1153
1153
  /** @enum {string|null} */
1154
- scopeType?: "tenant" | "workspace" | "facility" | "fleet" | null;
1154
+ scopeType?: 'tenant' | 'workspace' | 'facility' | 'fleet' | null;
1155
1155
  scopeId?: string | null;
1156
+ /** @description UUID of user who created this record. */
1157
+ createdBy?: string | null;
1158
+ /** @description UUID of user who last updated this record. */
1159
+ updatedBy?: string | null;
1156
1160
  /**
1157
1161
  * Format: date-time
1158
1162
  * @example 2026-01-15T08:00:00.000Z
@@ -1283,6 +1287,16 @@ interface components {
1283
1287
  * @example 2026-05-20T10:00:00.000Z
1284
1288
  */
1285
1289
  lastStreamed?: string | null;
1290
+ /**
1291
+ * @description Software version currently running on the robot, or null if not yet received.
1292
+ * @example 2.0.84
1293
+ */
1294
+ botVersion?: string | null;
1295
+ /**
1296
+ * @description Hardware model of the robot, or null if not yet identified.
1297
+ * @example Violet Gen 4 AI
1298
+ */
1299
+ botModel?: string | null;
1286
1300
  };
1287
1301
  RobotMetricLiveDto: {
1288
1302
  /**
@@ -1307,14 +1321,14 @@ interface components {
1307
1321
  lastSyncTime: Record<string, never>;
1308
1322
  };
1309
1323
  RobotsCountAnalyticsDataDto: {
1310
- data: components["schemas"]["RobotsCountResponseDto"];
1324
+ data: components['schemas']['RobotsCountResponseDto'];
1311
1325
  /** @example 2026-05-29T12:00:00.000Z */
1312
1326
  timestamp: string;
1313
1327
  /**
1314
1328
  * @example success
1315
1329
  * @enum {string}
1316
1330
  */
1317
- status: "success" | "error";
1331
+ status: 'success' | 'error';
1318
1332
  };
1319
1333
  RobotsCountResponseDto: {
1320
1334
  /** @example 24 */
package/openapi.json CHANGED
@@ -1112,6 +1112,16 @@
1112
1112
  "type": "string",
1113
1113
  "nullable": true
1114
1114
  },
1115
+ "createdBy": {
1116
+ "type": "string",
1117
+ "nullable": true,
1118
+ "description": "UUID of user who created this record."
1119
+ },
1120
+ "updatedBy": {
1121
+ "type": "string",
1122
+ "nullable": true,
1123
+ "description": "UUID of user who last updated this record."
1124
+ },
1115
1125
  "createdAt": {
1116
1126
  "format": "date-time",
1117
1127
  "type": "string",
@@ -1295,6 +1305,18 @@
1295
1305
  "description": "ISO-8601 timestamp of the last received status stream update, or null.",
1296
1306
  "example": "2026-05-20T10:00:00.000Z",
1297
1307
  "nullable": true
1308
+ },
1309
+ "botVersion": {
1310
+ "type": "string",
1311
+ "description": "Software version currently running on the robot, or null if not yet received.",
1312
+ "example": "2.0.84",
1313
+ "nullable": true
1314
+ },
1315
+ "botModel": {
1316
+ "type": "string",
1317
+ "description": "Hardware model of the robot, or null if not yet identified.",
1318
+ "example": "Violet Gen 4 AI",
1319
+ "nullable": true
1298
1320
  }
1299
1321
  },
1300
1322
  "required": ["id", "tenantId", "name", "isSubscribed"]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "haystack-contracts",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Haystack public API — TypeScript types, path constants, and OpenAPI spec for frontend integrations",
5
5
  "author": "Haystack Robotics",
6
6
  "license": "MIT",
@@ -46,6 +46,7 @@
46
46
  "devDependencies": {
47
47
  "@haystack/typescript-config": "workspace:*",
48
48
  "openapi-typescript": "^7.8.0",
49
+ "prettier": "catalog:",
49
50
  "ts-node": "catalog:",
50
51
  "tsup": "catalog:",
51
52
  "typescript": "catalog:"