haystack-contracts 1.0.0 → 1.0.1

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.ts CHANGED
@@ -1,170 +1,1397 @@
1
1
  /**
2
- * Standard success response returned by all Haystack API endpoints.
3
- * @template T The shape of the `data` payload.
2
+ * Single source of truth for public API metadata shared by:
3
+ * - `haystack-contracts` (npm package)
4
+ * - `apps/api` OpenAPI export (`public-api-docs.config.ts`)
5
+ *
6
+ * Update here only — do not duplicate URLs or info text elsewhere.
4
7
  */
5
- interface ApiResponse<T = unknown> {
6
- /** Always `true` for success responses */
8
+ declare const PUBLIC_API_META: {
9
+ readonly openapiVersion: "3.0.3";
10
+ readonly apiVersion: "v1";
11
+ readonly apiBasePath: "/api/v1";
12
+ readonly productionHost: "https://api.haystackrobotics.com";
13
+ readonly info: {
14
+ readonly title: "Haystack Robotics API";
15
+ readonly version: "1.0.0";
16
+ readonly description: string;
17
+ readonly contact: {
18
+ readonly name: "Haystack Robotics";
19
+ readonly url: "https://docs.haystack-robotics.com";
20
+ readonly email: "support@haystackrobotics.com";
21
+ };
22
+ };
23
+ /** Relative to the `haystack-contracts` package root (published to npm). */
24
+ readonly openapiRelativePath: "openapi.json";
25
+ };
26
+ declare const HAYSTACK_API_VERSION: "v1";
27
+ declare const HAYSTACK_API_BASE_PATH: "/api/v1";
28
+ declare const HAYSTACK_PRODUCTION_API_URL: "https://api.haystackrobotics.com/api/v1";
29
+ /** npm package subpath for the public OpenAPI document (docs sites, Swagger UI, Redoc). */
30
+ declare const PUBLIC_OPENAPI_JSON: "./openapi.json";
31
+
32
+ /** Auto-generated from openapi.json — do not edit. */
33
+ declare const PublicApiPath: {
34
+ readonly analyticsAgg: {
35
+ readonly disinfectionCount: "/analytics-agg/disinfection-count";
36
+ readonly disinfectionOperator: "/analytics-agg/disinfection-operator";
37
+ readonly disinfectionStatus: "/analytics-agg/disinfection-status";
38
+ readonly robotsCount: "/analytics-agg/robots-count";
39
+ };
40
+ readonly auth: {
41
+ readonly login: "/auth/login";
42
+ };
43
+ readonly disinfection: {
44
+ readonly jobs: "/disinfection/jobs";
45
+ readonly ongoingJobs: "/disinfection/ongoing-jobs";
46
+ readonly robots: "/disinfection/robots";
47
+ };
48
+ readonly metrics: {
49
+ readonly robotValues: {
50
+ readonly byRobotId: (robotId: string) => string;
51
+ };
52
+ readonly types: "/metrics/types";
53
+ };
54
+ readonly robots: {
55
+ readonly list: "/robots";
56
+ readonly byId: (id: string) => string;
57
+ };
58
+ };
59
+
60
+ /** Auto-generated from openapi.json — do not edit. */
61
+ declare const Role: {
62
+ readonly TENANT_ADMIN: "TENANT_ADMIN";
63
+ readonly WORKSPACE_ADMIN: "WORKSPACE_ADMIN";
64
+ readonly FACILITY_ADMIN: "FACILITY_ADMIN";
65
+ readonly FLEET_OPERATOR: "FLEET_OPERATOR";
66
+ readonly FLEET_VIEWER: "FLEET_VIEWER";
67
+ };
68
+ type Role = (typeof Role)[keyof typeof Role];
69
+ declare const ScopeType: {
70
+ readonly TENANT: "tenant";
71
+ readonly WORKSPACE: "workspace";
72
+ readonly FACILITY: "facility";
73
+ readonly FLEET: "fleet";
74
+ };
75
+ type ScopeType = (typeof ScopeType)[keyof typeof ScopeType];
76
+ declare const MetricDataType: {
77
+ readonly NUMERIC: "numeric";
78
+ readonly STRING: "string";
79
+ };
80
+ type MetricDataType = (typeof MetricDataType)[keyof typeof MetricDataType];
81
+ declare const MetricSourceType: {
82
+ readonly NON_STREAM: "non_stream";
83
+ readonly STREAM: "stream";
84
+ };
85
+ type MetricSourceType = (typeof MetricSourceType)[keyof typeof MetricSourceType];
86
+ declare const AnalyticsAggregateStatus: {
87
+ readonly SUCCESS: "success";
88
+ readonly ERROR: "error";
89
+ };
90
+ type AnalyticsAggregateStatus = (typeof AnalyticsAggregateStatus)[keyof typeof AnalyticsAggregateStatus];
91
+
92
+ interface paths {
93
+ "/auth/login": {
94
+ parameters: {
95
+ query?: never;
96
+ header?: never;
97
+ path?: never;
98
+ cookie?: never;
99
+ };
100
+ get?: never;
101
+ put?: never;
102
+ /**
103
+ * Login with email and password
104
+ * @description Authenticates a user using a globally unique email address and password. This endpoint is public and does not require a bearer token.
105
+ */
106
+ post: {
107
+ parameters: {
108
+ query?: never;
109
+ header?: never;
110
+ path?: never;
111
+ cookie?: never;
112
+ };
113
+ requestBody: {
114
+ content: {
115
+ "application/json": components["schemas"]["LoginDto"];
116
+ };
117
+ };
118
+ responses: {
119
+ /** @description Authenticated successfully and returned access/refresh tokens. */
120
+ 200: {
121
+ headers: {
122
+ [name: string]: unknown;
123
+ };
124
+ content: {
125
+ "application/json": {
126
+ /** @example true */
127
+ success: boolean;
128
+ /** @example 200 */
129
+ statusCode: number;
130
+ /**
131
+ * Format: date-time
132
+ * @example 2026-05-29T12:00:00.000Z
133
+ */
134
+ timestamp: string;
135
+ data: components["schemas"]["AuthResponseDto"];
136
+ };
137
+ };
138
+ };
139
+ /** @description Validation failed. Check that all required fields are present and correctly typed. */
140
+ 400: {
141
+ headers: {
142
+ [name: string]: unknown;
143
+ };
144
+ content: {
145
+ /**
146
+ * @example {
147
+ * "success": false,
148
+ * "statusCode": 400,
149
+ * "error": "Bad Request",
150
+ * "message": "email must be an email"
151
+ * }
152
+ */
153
+ "application/json": unknown;
154
+ };
155
+ };
156
+ /** @description Authentication required. Provide a valid bearer token. */
157
+ 401: {
158
+ headers: {
159
+ [name: string]: unknown;
160
+ };
161
+ content: {
162
+ /**
163
+ * @example {
164
+ * "success": false,
165
+ * "statusCode": 401,
166
+ * "error": "Unauthorized",
167
+ * "message": "Unauthorized"
168
+ * }
169
+ */
170
+ "application/json": unknown;
171
+ };
172
+ };
173
+ };
174
+ };
175
+ delete?: never;
176
+ options?: never;
177
+ head?: never;
178
+ patch?: never;
179
+ trace?: never;
180
+ };
181
+ "/robots": {
182
+ parameters: {
183
+ query?: never;
184
+ header?: never;
185
+ path?: never;
186
+ cookie?: never;
187
+ };
188
+ /**
189
+ * List all robots
190
+ * @description Returns all robots registered in the configured tenant, ordered by online status and name. Each record includes the robot name, tenant, fleet assignment, online status, subscription status, and last-seen timestamp. Any authenticated user can access this endpoint.
191
+ */
192
+ get: {
193
+ parameters: {
194
+ query?: never;
195
+ header?: never;
196
+ path?: never;
197
+ cookie?: never;
198
+ };
199
+ requestBody?: never;
200
+ responses: {
201
+ /** @description List of robots in the current tenant. */
202
+ 200: {
203
+ headers: {
204
+ [name: string]: unknown;
205
+ };
206
+ content: {
207
+ "application/json": {
208
+ /** @example true */
209
+ success: boolean;
210
+ /** @example 200 */
211
+ statusCode: number;
212
+ /**
213
+ * Format: date-time
214
+ * @example 2026-05-29T12:00:00.000Z
215
+ */
216
+ timestamp: string;
217
+ data: components["schemas"]["RobotListItemDto"][];
218
+ };
219
+ };
220
+ };
221
+ /** @description Authentication required. Provide a valid bearer token. */
222
+ 401: {
223
+ headers: {
224
+ [name: string]: unknown;
225
+ };
226
+ content: {
227
+ /**
228
+ * @example {
229
+ * "success": false,
230
+ * "statusCode": 401,
231
+ * "error": "Unauthorized",
232
+ * "message": "Unauthorized"
233
+ * }
234
+ */
235
+ "application/json": unknown;
236
+ };
237
+ };
238
+ };
239
+ };
240
+ put?: never;
241
+ post?: never;
242
+ delete?: never;
243
+ options?: never;
244
+ head?: never;
245
+ patch?: never;
246
+ trace?: never;
247
+ };
248
+ "/robots/{id}": {
249
+ parameters: {
250
+ query?: never;
251
+ header?: never;
252
+ path?: never;
253
+ cookie?: never;
254
+ };
255
+ /**
256
+ * Get a robot by ID
257
+ * @description Returns the full record for a single robot, including its fleet assignment, online state, and timestamps.
258
+ */
259
+ get: {
260
+ parameters: {
261
+ query?: never;
262
+ header?: never;
263
+ path: {
264
+ /** @description UUID of the robot. */
265
+ id: string;
266
+ };
267
+ cookie?: never;
268
+ };
269
+ requestBody?: never;
270
+ responses: {
271
+ /** @description Robot record. */
272
+ 200: {
273
+ headers: {
274
+ [name: string]: unknown;
275
+ };
276
+ content: {
277
+ "application/json": {
278
+ /** @example true */
279
+ success: boolean;
280
+ /** @example 200 */
281
+ statusCode: number;
282
+ /**
283
+ * Format: date-time
284
+ * @example 2026-05-29T12:00:00.000Z
285
+ */
286
+ timestamp: string;
287
+ data: components["schemas"]["RobotListItemDto"];
288
+ };
289
+ };
290
+ };
291
+ /** @description Validation failed. Check that all required fields are present and correctly typed. */
292
+ 400: {
293
+ headers: {
294
+ [name: string]: unknown;
295
+ };
296
+ content: {
297
+ /**
298
+ * @example {
299
+ * "success": false,
300
+ * "statusCode": 400,
301
+ * "error": "Bad Request",
302
+ * "message": "email must be an email"
303
+ * }
304
+ */
305
+ "application/json": unknown;
306
+ };
307
+ };
308
+ /** @description Authentication required. Provide a valid bearer token. */
309
+ 401: {
310
+ headers: {
311
+ [name: string]: unknown;
312
+ };
313
+ content: {
314
+ /**
315
+ * @example {
316
+ * "success": false,
317
+ * "statusCode": 401,
318
+ * "error": "Unauthorized",
319
+ * "message": "Unauthorized"
320
+ * }
321
+ */
322
+ "application/json": unknown;
323
+ };
324
+ };
325
+ /** @description Robot not found in the current tenant. */
326
+ 404: {
327
+ headers: {
328
+ [name: string]: unknown;
329
+ };
330
+ content: {
331
+ /**
332
+ * @example {
333
+ * "success": false,
334
+ * "statusCode": 404,
335
+ * "error": "Not Found",
336
+ * "message": "Robot not found"
337
+ * }
338
+ */
339
+ "application/json": unknown;
340
+ };
341
+ };
342
+ };
343
+ };
344
+ put?: never;
345
+ post?: never;
346
+ delete?: never;
347
+ options?: never;
348
+ head?: never;
349
+ patch?: never;
350
+ trace?: never;
351
+ };
352
+ "/metrics/types": {
353
+ parameters: {
354
+ query?: never;
355
+ header?: never;
356
+ path?: never;
357
+ cookie?: never;
358
+ };
359
+ /**
360
+ * List all metric types
361
+ * @description Returns the full registry of metric types from the analytics store. Each entry includes an integer id, a human-readable name, and a description. Any authenticated user can access this endpoint.
362
+ */
363
+ get: {
364
+ parameters: {
365
+ query?: never;
366
+ header?: never;
367
+ path?: never;
368
+ cookie?: never;
369
+ };
370
+ requestBody?: never;
371
+ responses: {
372
+ /** @description List of all registered metric types. */
373
+ 200: {
374
+ headers: {
375
+ [name: string]: unknown;
376
+ };
377
+ content: {
378
+ "application/json": {
379
+ /** @example true */
380
+ success: boolean;
381
+ /** @example 200 */
382
+ statusCode: number;
383
+ /**
384
+ * Format: date-time
385
+ * @example 2026-05-29T12:00:00.000Z
386
+ */
387
+ timestamp: string;
388
+ data: components["schemas"]["MetricTypeResponseDto"][];
389
+ };
390
+ };
391
+ };
392
+ /** @description Authentication required. Provide a valid bearer token. */
393
+ 401: {
394
+ headers: {
395
+ [name: string]: unknown;
396
+ };
397
+ content: {
398
+ /**
399
+ * @example {
400
+ * "success": false,
401
+ * "statusCode": 401,
402
+ * "error": "Unauthorized",
403
+ * "message": "Unauthorized"
404
+ * }
405
+ */
406
+ "application/json": unknown;
407
+ };
408
+ };
409
+ };
410
+ };
411
+ put?: never;
412
+ post?: never;
413
+ delete?: never;
414
+ options?: never;
415
+ head?: never;
416
+ patch?: never;
417
+ trace?: never;
418
+ };
419
+ "/metrics/robot-values/{robotId}": {
420
+ parameters: {
421
+ query?: never;
422
+ header?: never;
423
+ path?: never;
424
+ cookie?: never;
425
+ };
426
+ /**
427
+ * List latest metric values for a robot
428
+ * @description Returns the most recent reading for every metric type collected for the specified robot from the analytics (OLAP) store. Pass `metricType` as a query param to restrict results to a single type.
429
+ */
430
+ get: {
431
+ parameters: {
432
+ query?: {
433
+ /** @description Integer id of a specific metric type to filter by. */
434
+ metricType?: number;
435
+ };
436
+ header?: never;
437
+ path: {
438
+ /** @description UUID of the robot. */
439
+ robotId: string;
440
+ };
441
+ cookie?: never;
442
+ };
443
+ requestBody?: never;
444
+ responses: {
445
+ /** @description Latest OLAP metric readings for the robot. */
446
+ 200: {
447
+ headers: {
448
+ [name: string]: unknown;
449
+ };
450
+ content: {
451
+ "application/json": {
452
+ /** @example true */
453
+ success: boolean;
454
+ /** @example 200 */
455
+ statusCode: number;
456
+ /**
457
+ * Format: date-time
458
+ * @example 2026-05-29T12:00:00.000Z
459
+ */
460
+ timestamp: string;
461
+ data: components["schemas"]["RobotMetricLiveDto"][];
462
+ };
463
+ };
464
+ };
465
+ /** @description Validation failed. Check that all required fields are present and correctly typed. */
466
+ 400: {
467
+ headers: {
468
+ [name: string]: unknown;
469
+ };
470
+ content: {
471
+ /**
472
+ * @example {
473
+ * "success": false,
474
+ * "statusCode": 400,
475
+ * "error": "Bad Request",
476
+ * "message": "email must be an email"
477
+ * }
478
+ */
479
+ "application/json": unknown;
480
+ };
481
+ };
482
+ /** @description Authentication required. Provide a valid bearer token. */
483
+ 401: {
484
+ headers: {
485
+ [name: string]: unknown;
486
+ };
487
+ content: {
488
+ /**
489
+ * @example {
490
+ * "success": false,
491
+ * "statusCode": 401,
492
+ * "error": "Unauthorized",
493
+ * "message": "Unauthorized"
494
+ * }
495
+ */
496
+ "application/json": unknown;
497
+ };
498
+ };
499
+ };
500
+ };
501
+ put?: never;
502
+ post?: never;
503
+ delete?: never;
504
+ options?: never;
505
+ head?: never;
506
+ patch?: never;
507
+ trace?: never;
508
+ };
509
+ "/disinfection/robots": {
510
+ parameters: {
511
+ query?: never;
512
+ header?: never;
513
+ path?: never;
514
+ cookie?: never;
515
+ };
516
+ /**
517
+ * Get per-robot disinfection stats
518
+ * @description Returns aggregated disinfection statistics for every robot in the current tenant. Includes bot name, facility name, room count, total duration, and success/partial/failed job counts.
519
+ */
520
+ get: {
521
+ parameters: {
522
+ query?: never;
523
+ header?: never;
524
+ path?: never;
525
+ cookie?: never;
526
+ };
527
+ requestBody?: never;
528
+ responses: {
529
+ /** @description Per-robot disinfection statistics for the current tenant. */
530
+ 200: {
531
+ headers: {
532
+ [name: string]: unknown;
533
+ };
534
+ content: {
535
+ "application/json": {
536
+ /** @example true */
537
+ success: boolean;
538
+ /** @example 200 */
539
+ statusCode: number;
540
+ /**
541
+ * Format: date-time
542
+ * @example 2026-05-29T12:00:00.000Z
543
+ */
544
+ timestamp: string;
545
+ data: components["schemas"]["RobotDisinfectionStatsDto"][];
546
+ };
547
+ };
548
+ };
549
+ /** @description Authentication required. Provide a valid bearer token. */
550
+ 401: {
551
+ headers: {
552
+ [name: string]: unknown;
553
+ };
554
+ content: {
555
+ /**
556
+ * @example {
557
+ * "success": false,
558
+ * "statusCode": 401,
559
+ * "error": "Unauthorized",
560
+ * "message": "Unauthorized"
561
+ * }
562
+ */
563
+ "application/json": unknown;
564
+ };
565
+ };
566
+ };
567
+ };
568
+ put?: never;
569
+ post?: never;
570
+ delete?: never;
571
+ options?: never;
572
+ head?: never;
573
+ patch?: never;
574
+ trace?: never;
575
+ };
576
+ "/disinfection/ongoing-jobs": {
577
+ parameters: {
578
+ query?: never;
579
+ header?: never;
580
+ path?: never;
581
+ cookie?: never;
582
+ };
583
+ /**
584
+ * List ongoing disinfection jobs
585
+ * @description Returns currently active disinfection jobs from OLTP. TODO: not yet implemented — returns an empty list until the OLTP query is defined.
586
+ */
587
+ get: {
588
+ parameters: {
589
+ query?: never;
590
+ header?: never;
591
+ path?: never;
592
+ cookie?: never;
593
+ };
594
+ requestBody?: never;
595
+ responses: {
596
+ /** @description List of ongoing disinfection jobs (currently empty). */
597
+ 200: {
598
+ headers: {
599
+ [name: string]: unknown;
600
+ };
601
+ content: {
602
+ "application/json": {
603
+ /** @example true */
604
+ success: boolean;
605
+ /** @example 200 */
606
+ statusCode: number;
607
+ /**
608
+ * Format: date-time
609
+ * @example 2026-05-29T12:00:00.000Z
610
+ */
611
+ timestamp: string;
612
+ data: components["schemas"]["DisinfectionJobDto"][];
613
+ };
614
+ };
615
+ };
616
+ /** @description Authentication required. Provide a valid bearer token. */
617
+ 401: {
618
+ headers: {
619
+ [name: string]: unknown;
620
+ };
621
+ content: {
622
+ /**
623
+ * @example {
624
+ * "success": false,
625
+ * "statusCode": 401,
626
+ * "error": "Unauthorized",
627
+ * "message": "Unauthorized"
628
+ * }
629
+ */
630
+ "application/json": unknown;
631
+ };
632
+ };
633
+ };
634
+ };
635
+ put?: never;
636
+ post?: never;
637
+ delete?: never;
638
+ options?: never;
639
+ head?: never;
640
+ patch?: never;
641
+ trace?: never;
642
+ };
643
+ "/disinfection/jobs": {
644
+ parameters: {
645
+ query?: never;
646
+ header?: never;
647
+ path?: never;
648
+ cookie?: never;
649
+ };
650
+ /**
651
+ * List disinfection jobs
652
+ * @description Returns completed disinfection jobs from OLAP. Optionally filter by status (passed, partial, failed); omit status or use "all" for no status filter. Haystack tenant users see jobs across all tenants; other tenants are scoped to their own tenant. Optionally filter by robotId.
653
+ */
654
+ get: {
655
+ parameters: {
656
+ query?: {
657
+ /** @description Job outcome filter. Defaults to "all" (no status filtering) when omitted. */
658
+ status?: "passed" | "partial" | "failed" | "all";
659
+ /** @description UUID of a specific robot to filter by. */
660
+ robotId?: string;
661
+ };
662
+ header?: never;
663
+ path?: never;
664
+ cookie?: never;
665
+ };
666
+ requestBody?: never;
667
+ responses: {
668
+ /** @description List of disinfection jobs matching the filters. */
669
+ 200: {
670
+ headers: {
671
+ [name: string]: unknown;
672
+ };
673
+ content: {
674
+ "application/json": {
675
+ /** @example true */
676
+ success: boolean;
677
+ /** @example 200 */
678
+ statusCode: number;
679
+ /**
680
+ * Format: date-time
681
+ * @example 2026-05-29T12:00:00.000Z
682
+ */
683
+ timestamp: string;
684
+ data: components["schemas"]["DisinfectionJobDto"][];
685
+ };
686
+ };
687
+ };
688
+ /** @description Validation failed. Check that all required fields are present and correctly typed. */
689
+ 400: {
690
+ headers: {
691
+ [name: string]: unknown;
692
+ };
693
+ content: {
694
+ /**
695
+ * @example {
696
+ * "success": false,
697
+ * "statusCode": 400,
698
+ * "error": "Bad Request",
699
+ * "message": "email must be an email"
700
+ * }
701
+ */
702
+ "application/json": unknown;
703
+ };
704
+ };
705
+ /** @description Authentication required. Provide a valid bearer token. */
706
+ 401: {
707
+ headers: {
708
+ [name: string]: unknown;
709
+ };
710
+ content: {
711
+ /**
712
+ * @example {
713
+ * "success": false,
714
+ * "statusCode": 401,
715
+ * "error": "Unauthorized",
716
+ * "message": "Unauthorized"
717
+ * }
718
+ */
719
+ "application/json": unknown;
720
+ };
721
+ };
722
+ };
723
+ };
724
+ put?: never;
725
+ post?: never;
726
+ delete?: never;
727
+ options?: never;
728
+ head?: never;
729
+ patch?: never;
730
+ trace?: never;
731
+ };
732
+ "/analytics-agg/robots-count": {
733
+ parameters: {
734
+ query?: never;
735
+ header?: never;
736
+ path?: never;
737
+ cookie?: never;
738
+ };
739
+ /**
740
+ * Get robot count statistics
741
+ * @description Returns total, online, offline, AI-enabled, and SW-update-pending robot counts. Haystack tenant users see aggregates across all tenants; other tenants are scoped to their own tenant.
742
+ */
743
+ get: {
744
+ parameters: {
745
+ query?: never;
746
+ header?: never;
747
+ path?: never;
748
+ cookie?: never;
749
+ };
750
+ requestBody?: never;
751
+ responses: {
752
+ /** @description Robot count statistics wrapped in AnalyticsResponse with timestamp and status. */
753
+ 200: {
754
+ headers: {
755
+ [name: string]: unknown;
756
+ };
757
+ content: {
758
+ "application/json": {
759
+ /** @example true */
760
+ success: boolean;
761
+ /** @example 200 */
762
+ statusCode: number;
763
+ /**
764
+ * Format: date-time
765
+ * @example 2026-05-29T12:00:00.000Z
766
+ */
767
+ timestamp: string;
768
+ data: components["schemas"]["RobotsCountAnalyticsDataDto"];
769
+ };
770
+ };
771
+ };
772
+ /** @description Authentication required. Provide a valid bearer token. */
773
+ 401: {
774
+ headers: {
775
+ [name: string]: unknown;
776
+ };
777
+ content: {
778
+ /**
779
+ * @example {
780
+ * "success": false,
781
+ * "statusCode": 401,
782
+ * "error": "Unauthorized",
783
+ * "message": "Unauthorized"
784
+ * }
785
+ */
786
+ "application/json": unknown;
787
+ };
788
+ };
789
+ };
790
+ };
791
+ put?: never;
792
+ post?: never;
793
+ delete?: never;
794
+ options?: never;
795
+ head?: never;
796
+ patch?: never;
797
+ trace?: never;
798
+ };
799
+ "/analytics-agg/disinfection-count": {
800
+ parameters: {
801
+ query?: never;
802
+ header?: never;
803
+ path?: never;
804
+ cookie?: never;
805
+ };
806
+ /**
807
+ * Get disinfection job aggregate statistics
808
+ * @description Returns top performing bot by total disinfection duration and aggregated job stats (total runtime, total successful, total partial jobs). Haystack tenant users see aggregates across all tenants; other tenants are scoped to their own tenant.
809
+ */
810
+ get: {
811
+ parameters: {
812
+ query?: never;
813
+ header?: never;
814
+ path?: never;
815
+ cookie?: never;
816
+ };
817
+ requestBody?: never;
818
+ responses: {
819
+ /** @description Disinfection count statistics wrapped in AnalyticsResponse with timestamp and status. */
820
+ 200: {
821
+ headers: {
822
+ [name: string]: unknown;
823
+ };
824
+ content: {
825
+ "application/json": {
826
+ /** @example true */
827
+ success: boolean;
828
+ /** @example 200 */
829
+ statusCode: number;
830
+ /**
831
+ * Format: date-time
832
+ * @example 2026-05-29T12:00:00.000Z
833
+ */
834
+ timestamp: string;
835
+ data: components["schemas"]["DisinfectionCountAnalyticsDataDto"];
836
+ };
837
+ };
838
+ };
839
+ /** @description Authentication required. Provide a valid bearer token. */
840
+ 401: {
841
+ headers: {
842
+ [name: string]: unknown;
843
+ };
844
+ content: {
845
+ /**
846
+ * @example {
847
+ * "success": false,
848
+ * "statusCode": 401,
849
+ * "error": "Unauthorized",
850
+ * "message": "Unauthorized"
851
+ * }
852
+ */
853
+ "application/json": unknown;
854
+ };
855
+ };
856
+ };
857
+ };
858
+ put?: never;
859
+ post?: never;
860
+ delete?: never;
861
+ options?: never;
862
+ head?: never;
863
+ patch?: never;
864
+ trace?: never;
865
+ };
866
+ "/analytics-agg/disinfection-operator": {
867
+ parameters: {
868
+ query?: never;
869
+ header?: never;
870
+ path?: never;
871
+ cookie?: never;
872
+ };
873
+ /**
874
+ * Get operator rankings by disinfection jobs
875
+ * @description Returns operators ranked by number of successful/partial disinfection jobs. Haystack tenant users see data across all tenants; other tenants are scoped to their own tenant.
876
+ */
877
+ get: {
878
+ parameters: {
879
+ query?: never;
880
+ header?: never;
881
+ path?: never;
882
+ cookie?: never;
883
+ };
884
+ requestBody?: never;
885
+ responses: {
886
+ /** @description List of operators ranked by total jobs wrapped in AnalyticsResponse with timestamp and status. */
887
+ 200: {
888
+ headers: {
889
+ [name: string]: unknown;
890
+ };
891
+ content: {
892
+ "application/json": {
893
+ /** @example true */
894
+ success: boolean;
895
+ /** @example 200 */
896
+ statusCode: number;
897
+ /**
898
+ * Format: date-time
899
+ * @example 2026-05-29T12:00:00.000Z
900
+ */
901
+ timestamp: string;
902
+ data: components["schemas"]["DisinfectionOperatorsAnalyticsDataDto"];
903
+ };
904
+ };
905
+ };
906
+ /** @description Authentication required. Provide a valid bearer token. */
907
+ 401: {
908
+ headers: {
909
+ [name: string]: unknown;
910
+ };
911
+ content: {
912
+ /**
913
+ * @example {
914
+ * "success": false,
915
+ * "statusCode": 401,
916
+ * "error": "Unauthorized",
917
+ * "message": "Unauthorized"
918
+ * }
919
+ */
920
+ "application/json": unknown;
921
+ };
922
+ };
923
+ };
924
+ };
925
+ put?: never;
926
+ post?: never;
927
+ delete?: never;
928
+ options?: never;
929
+ head?: never;
930
+ patch?: never;
931
+ trace?: never;
932
+ };
933
+ "/analytics-agg/disinfection-status": {
934
+ parameters: {
935
+ query?: never;
936
+ header?: never;
937
+ path?: never;
938
+ cookie?: never;
939
+ };
940
+ /**
941
+ * Get disinfection job status distribution
942
+ * @description Returns status-wise counts of disinfection jobs. Haystack tenant users see aggregates across all tenants; other tenants are scoped to their own tenant.
943
+ */
944
+ get: {
945
+ parameters: {
946
+ query?: never;
947
+ header?: never;
948
+ path?: never;
949
+ cookie?: never;
950
+ };
951
+ requestBody?: never;
952
+ responses: {
953
+ /** @description Status-wise job counts wrapped in AnalyticsResponse with timestamp and status. */
954
+ 200: {
955
+ headers: {
956
+ [name: string]: unknown;
957
+ };
958
+ content: {
959
+ "application/json": {
960
+ /** @example true */
961
+ success: boolean;
962
+ /** @example 200 */
963
+ statusCode: number;
964
+ /**
965
+ * Format: date-time
966
+ * @example 2026-05-29T12:00:00.000Z
967
+ */
968
+ timestamp: string;
969
+ data: components["schemas"]["DisinfectionStatusAnalyticsDataDto"];
970
+ };
971
+ };
972
+ };
973
+ /** @description Authentication required. Provide a valid bearer token. */
974
+ 401: {
975
+ headers: {
976
+ [name: string]: unknown;
977
+ };
978
+ content: {
979
+ /**
980
+ * @example {
981
+ * "success": false,
982
+ * "statusCode": 401,
983
+ * "error": "Unauthorized",
984
+ * "message": "Unauthorized"
985
+ * }
986
+ */
987
+ "application/json": unknown;
988
+ };
989
+ };
990
+ };
991
+ };
992
+ put?: never;
993
+ post?: never;
994
+ delete?: never;
995
+ options?: never;
996
+ head?: never;
997
+ patch?: never;
998
+ trace?: never;
999
+ };
1000
+ }
1001
+ interface components {
1002
+ schemas: {
1003
+ AuthResponseDto: {
1004
+ /**
1005
+ * @description Short-lived JWT access token (15 min).
1006
+ * @example eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.access-token-example.signature
1007
+ */
1008
+ accessToken: string;
1009
+ /**
1010
+ * @description Long-lived refresh token (7 days).
1011
+ * @example eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.refresh-token-example.signature
1012
+ */
1013
+ refreshToken: string;
1014
+ /**
1015
+ * @description Access token lifetime in seconds.
1016
+ * @example 900
1017
+ */
1018
+ expiresIn: number;
1019
+ /** @description Sanitized authenticated user snapshot returned with the token response. */
1020
+ user: components["schemas"]["PublicUserDto"];
1021
+ };
1022
+ DisinfectionCountAnalyticsDataDto: {
1023
+ data: components["schemas"]["DisinfectionCountResponseDto"];
1024
+ /** @example 2026-05-29T12:00:00.000Z */
1025
+ timestamp: string;
1026
+ /**
1027
+ * @example success
1028
+ * @enum {string}
1029
+ */
1030
+ status: "success" | "error";
1031
+ };
1032
+ DisinfectionCountResponseDto: {
1033
+ /** @example Warehouse Bot Alpha */
1034
+ topBotName: string;
1035
+ /** @example a1b2c3d4-e5f6-7890-abcd-ef1234567890 */
1036
+ topBotId: string;
1037
+ /** @example 125000 */
1038
+ totalRuntime: number;
1039
+ /** @example 320 */
1040
+ totalSuccessful: number;
1041
+ /** @example 45 */
1042
+ totalPartial: number;
1043
+ };
1044
+ DisinfectionJobDto: {
1045
+ /** @example Warehouse Bot Alpha */
1046
+ robotName: string;
1047
+ /** @example 2026-05-28T14:00:00.000Z */
1048
+ startTime: string;
1049
+ /** @example 2026-05-28T14:45:00.000Z */
1050
+ endTime: string | null;
1051
+ /** @example 2700 */
1052
+ durationSeconds: number | null;
1053
+ /** @example Alice Smith */
1054
+ operatorName: string;
1055
+ /** @example OR-3 */
1056
+ roomName: string;
1057
+ /** @example AUTO */
1058
+ disinfectMode: string;
1059
+ /** @example HIGH */
1060
+ level: string;
1061
+ /** @example COVERAGE_DONE */
1062
+ status: string;
1063
+ };
1064
+ DisinfectionOperatorResponseDto: {
1065
+ /** @example Alice Smith */
1066
+ operatorName: string;
1067
+ /** @example 128 */
1068
+ totalJobs: number;
1069
+ };
1070
+ DisinfectionOperatorsAnalyticsDataDto: {
1071
+ data: components["schemas"]["DisinfectionOperatorResponseDto"][];
1072
+ /** @example 2026-05-29T12:00:00.000Z */
1073
+ timestamp: string;
1074
+ /**
1075
+ * @example success
1076
+ * @enum {string}
1077
+ */
1078
+ status: "success" | "error";
1079
+ };
1080
+ DisinfectionStatusAnalyticsDataDto: {
1081
+ data: components["schemas"]["DisinfectionStatusResponseDto"][];
1082
+ /** @example 2026-05-29T12:00:00.000Z */
1083
+ timestamp: string;
1084
+ /**
1085
+ * @example success
1086
+ * @enum {string}
1087
+ */
1088
+ status: "success" | "error";
1089
+ };
1090
+ DisinfectionStatusResponseDto: {
1091
+ /** @example COVERAGE_DONE */
1092
+ status: string;
1093
+ /** @example 500 */
1094
+ count: number;
1095
+ };
1096
+ LoginDto: {
1097
+ /**
1098
+ * @description Registered email address.
1099
+ * @example superadmin@haystackrobotics.com
1100
+ */
1101
+ email: string;
1102
+ /**
1103
+ * @description Account password (minimum 8 characters).
1104
+ * @example SuperAdmin123!
1105
+ */
1106
+ password: string;
1107
+ };
1108
+ MetricTypeResponseDto: {
1109
+ /**
1110
+ * @description Integer id of the metric type.
1111
+ * @example 1
1112
+ */
1113
+ metricType: number;
1114
+ /**
1115
+ * @description Human-readable metric name.
1116
+ * @example Cpu
1117
+ */
1118
+ metricName: string;
1119
+ /**
1120
+ * @description What the metric measures.
1121
+ * @example CPU utilisation percentage
1122
+ */
1123
+ description: string;
1124
+ /**
1125
+ * @example numeric
1126
+ * @enum {string}
1127
+ */
1128
+ dataType: "numeric" | "string";
1129
+ /**
1130
+ * @example stream
1131
+ * @enum {string}
1132
+ */
1133
+ sourceType?: "non_stream" | "stream";
1134
+ };
1135
+ PublicUserDto: {
1136
+ /** @example c3d4e5f6-a1b2-3456-abcd-789012345678 */
1137
+ id: string;
1138
+ /** @example admin@haystackrobotics.com */
1139
+ email: string;
1140
+ /** @example Haystack */
1141
+ firstName: string;
1142
+ /** @example Admin */
1143
+ lastName: string;
1144
+ /** @example true */
1145
+ isActive: boolean;
1146
+ /** @example 11111111-1111-4111-8111-111111111111 */
1147
+ tenantId: string;
1148
+ workspaceId?: string | null;
1149
+ facilityId?: string | null;
1150
+ fleetId?: string | null;
1151
+ /** @enum {string|null} */
1152
+ role?: "TENANT_ADMIN" | "WORKSPACE_ADMIN" | "FACILITY_ADMIN" | "FLEET_OPERATOR" | "FLEET_VIEWER" | null;
1153
+ /** @enum {string|null} */
1154
+ scopeType?: "tenant" | "workspace" | "facility" | "fleet" | null;
1155
+ scopeId?: string | null;
1156
+ /**
1157
+ * Format: date-time
1158
+ * @example 2026-01-15T08:00:00.000Z
1159
+ */
1160
+ createdAt: string;
1161
+ /**
1162
+ * Format: date-time
1163
+ * @example 2026-05-20T10:00:00.000Z
1164
+ */
1165
+ updatedAt: string;
1166
+ };
1167
+ RobotDisinfectionStatsDto: {
1168
+ /** @example a1b2c3d4-e5f6-7890-abcd-ef1234567890 */
1169
+ robotId: string;
1170
+ /** @example 12 */
1171
+ roomCount: number;
1172
+ /** @example 86400 */
1173
+ totalDurationSeconds: number;
1174
+ /** @example 45 */
1175
+ successJobs: number;
1176
+ /** @example 8 */
1177
+ partialSuccessJobs: number;
1178
+ /** @example 3 */
1179
+ failedJobs: number;
1180
+ /** @example Warehouse Bot Alpha */
1181
+ botName: string | null;
1182
+ /** @example Warehouse Operations */
1183
+ facilityName: string | null;
1184
+ };
1185
+ RobotListItemDto: {
1186
+ /**
1187
+ * @description Unique identifier of the robot (UUID).
1188
+ * @example a1b2c3d4-e5f6-7890-abcd-ef1234567890
1189
+ */
1190
+ id: string;
1191
+ /**
1192
+ * @description UUID of the tenant that owns the robot.
1193
+ * @example 11111111-1111-4111-8111-111111111111
1194
+ */
1195
+ tenantId: string;
1196
+ /**
1197
+ * @description Name of the tenant that owns the robot.
1198
+ * @example Haystack Robotics
1199
+ */
1200
+ tenantName?: string;
1201
+ /**
1202
+ * @description Human-readable display name for the robot.
1203
+ * @example Warehouse Bot Alpha
1204
+ */
1205
+ name: string;
1206
+ /**
1207
+ * @description UUID of the fleet this robot is assigned to.
1208
+ * @example f1000000-0000-4000-8000-000000000001
1209
+ */
1210
+ fleetId?: string | null;
1211
+ /**
1212
+ * @description Name of the fleet this robot is assigned to.
1213
+ * @example Warehouse Fleet A
1214
+ */
1215
+ fleetName?: string;
1216
+ /**
1217
+ * @description Whether the robot is currently connected and transmitting data.
1218
+ * @example true
1219
+ */
1220
+ isOnline?: boolean;
1221
+ /**
1222
+ * @description Whether the robot is subscribed for telemetry processing.
1223
+ * @example true
1224
+ */
1225
+ isSubscribed: boolean;
1226
+ /**
1227
+ * @description ISO-8601 timestamp of the last confirmed contact with the robot.
1228
+ * @example 2026-03-07T18:30:00.000Z
1229
+ */
1230
+ lastTimeSeen?: string;
1231
+ /**
1232
+ * @description When the robot record was created (ISO-8601).
1233
+ * @example 2026-03-01T10:00:00.000Z
1234
+ */
1235
+ createdAt?: string;
1236
+ /**
1237
+ * @description When the robot record was last updated (ISO-8601).
1238
+ * @example 2026-03-07T18:30:00.000Z
1239
+ */
1240
+ updatedAt?: string;
1241
+ /**
1242
+ * @description Latest CPU usage reading (percent string), or null.
1243
+ * @example 87.733
1244
+ */
1245
+ cpu?: string | null;
1246
+ /**
1247
+ * @description Latest RAM usage reading (percent string), or null.
1248
+ * @example 77.33
1249
+ */
1250
+ ram?: string | null;
1251
+ /**
1252
+ * @description Latest Disk usage reading (percent string), or null.
1253
+ * @example 93
1254
+ */
1255
+ disk?: string | null;
1256
+ /**
1257
+ * @description Battery charge level (0–100), or null if not yet streamed.
1258
+ * @example 90
1259
+ */
1260
+ batteryPercent?: number | null;
1261
+ /**
1262
+ * @description Current robot operating mode, or null if not yet streamed.
1263
+ * @example DISINFECT
1264
+ */
1265
+ mode?: string | null;
1266
+ /**
1267
+ * @description Whether the emergency button is active, or null if not yet streamed.
1268
+ * @example false
1269
+ */
1270
+ emergency?: boolean | null;
1271
+ /**
1272
+ * @description Remaining lamp life in hours, or null if not yet streamed.
1273
+ * @example 9000
1274
+ */
1275
+ lampLifeHours?: number | null;
1276
+ /**
1277
+ * @description Whether a disinfection job is currently running, or null if not yet streamed.
1278
+ * @example true
1279
+ */
1280
+ disinfectionRunning?: boolean | null;
1281
+ /**
1282
+ * @description ISO-8601 timestamp of the last received status stream update, or null.
1283
+ * @example 2026-05-20T10:00:00.000Z
1284
+ */
1285
+ lastStreamed?: string | null;
1286
+ };
1287
+ RobotMetricLiveDto: {
1288
+ /**
1289
+ * @description Integer id of the metric type.
1290
+ * @example 1
1291
+ */
1292
+ metricId: number;
1293
+ /**
1294
+ * @description Human-readable metric name.
1295
+ * @example Cpu
1296
+ */
1297
+ metricName: string;
1298
+ /**
1299
+ * @description Latest recorded value.
1300
+ * @example 42.5
1301
+ */
1302
+ metricValue: number;
1303
+ /**
1304
+ * @description ISO-8601 timestamp of the most recent reading.
1305
+ * @example 2026-05-29T11:58:00.000Z
1306
+ */
1307
+ lastSyncTime: Record<string, never>;
1308
+ };
1309
+ RobotsCountAnalyticsDataDto: {
1310
+ data: components["schemas"]["RobotsCountResponseDto"];
1311
+ /** @example 2026-05-29T12:00:00.000Z */
1312
+ timestamp: string;
1313
+ /**
1314
+ * @example success
1315
+ * @enum {string}
1316
+ */
1317
+ status: "success" | "error";
1318
+ };
1319
+ RobotsCountResponseDto: {
1320
+ /** @example 24 */
1321
+ total: number;
1322
+ /** @example 20 */
1323
+ online: number;
1324
+ /** @example 4 */
1325
+ offline: number;
1326
+ /** @example 6 */
1327
+ aiEnabled: number;
1328
+ /** @example 2 */
1329
+ swUpdatePending: number;
1330
+ };
1331
+ };
1332
+ responses: never;
1333
+ parameters: never;
1334
+ requestBodies: never;
1335
+ headers: never;
1336
+ pathItems: never;
1337
+ }
1338
+ type operations = Record<string, never>;
1339
+
1340
+ /**
1341
+ * Friendly aliases over OpenAPI component schemas.
1342
+ * Generated from openapi.json — do not edit.
1343
+ */
1344
+
1345
+ type Schemas = components['schemas'];
1346
+ type LoginPayload = Schemas['LoginDto'];
1347
+ type AuthResponse = Schemas['AuthResponseDto'];
1348
+ type PublicUser = Schemas['PublicUserDto'];
1349
+ type RobotListItem = Schemas['RobotListItemDto'];
1350
+ type MetricType = Schemas['MetricTypeResponseDto'];
1351
+ type RobotMetricLive = Schemas['RobotMetricLiveDto'];
1352
+ type RobotDisinfectionStats = Schemas['RobotDisinfectionStatsDto'];
1353
+ type DisinfectionJob = Schemas['DisinfectionJobDto'];
1354
+ type RobotsCountAggregate = Schemas['RobotsCountResponseDto'];
1355
+ type DisinfectionCountAggregate = Schemas['DisinfectionCountResponseDto'];
1356
+ type DisinfectionOperatorAggregate = Schemas['DisinfectionOperatorResponseDto'];
1357
+ type DisinfectionStatusAggregate = Schemas['DisinfectionStatusResponseDto'];
1358
+ type RobotsCountAnalyticsData = Schemas['RobotsCountAnalyticsDataDto'];
1359
+ type DisinfectionCountAnalyticsData = Schemas['DisinfectionCountAnalyticsDataDto'];
1360
+ type DisinfectionOperatorsAnalyticsData = Schemas['DisinfectionOperatorsAnalyticsDataDto'];
1361
+ type DisinfectionStatusAnalyticsData = Schemas['DisinfectionStatusAnalyticsDataDto'];
1362
+
1363
+ /**
1364
+ * Haystack public API response envelopes.
1365
+ * Keep aligned with `packages/core/src/types/api.types.ts` (private monorepo twin).
1366
+ */
1367
+ interface ApiSuccessResponse<T> {
7
1368
  success: true;
8
- /** HTTP status code (e.g. 200, 201) */
9
1369
  statusCode: number;
10
- /** The response payload */
11
1370
  data: T;
12
- /** ISO 8601 timestamp of the response */
13
1371
  timestamp: string;
14
1372
  }
15
- /**
16
- * Standard error response returned when a request fails.
17
- */
18
1373
  interface ApiErrorResponse {
19
- /** Always `false` for error responses */
20
1374
  success: false;
21
- /** HTTP status code (e.g. 400, 404, 500) */
22
1375
  statusCode: number;
23
- /** Always null on errors */
24
1376
  data: null;
25
- /** Error details object */
26
1377
  error: {
27
- /** Human-readable error message */
28
- message: string | string[];
29
- /** Additional error fields, e.g. validation errors */
1378
+ message?: string | string[];
1379
+ error?: string;
30
1380
  [key: string]: unknown;
31
1381
  };
32
- /** ISO 8601 timestamp of the response */
33
1382
  timestamp: string;
34
- /** The request path that triggered the error */
35
1383
  path: string;
36
1384
  }
1385
+ type ApiResult<T> = ApiSuccessResponse<T> | ApiErrorResponse;
1386
+ type ApiData<T> = T extends ApiSuccessResponse<infer D> ? D : never;
37
1387
  interface PaginationMeta {
38
1388
  page: number;
39
1389
  limit: number;
40
1390
  total: number;
41
1391
  totalPages: number;
42
1392
  }
43
- interface PaginatedResponse<T = unknown> extends ApiResponse<T[]> {
1393
+ interface PaginatedSuccessResponse<T> extends ApiSuccessResponse<T[]> {
44
1394
  meta: PaginationMeta;
45
1395
  }
46
1396
 
47
- /**
48
- * A robot entry from Nimbus Cloud.
49
- */
50
- interface Robot {
51
- robotId: string;
52
- name?: string;
53
- status?: string;
54
- lastOnline?: string;
55
- [key: string]: unknown;
56
- }
57
- /**
58
- * A metric type available for robots.
59
- */
60
- interface Metric {
61
- metricId: number;
62
- name?: string;
63
- value?: unknown;
64
- timestamp?: string;
65
- [key: string]: unknown;
66
- }
67
- /**
68
- * The nested BasicData block inside a Cognimbus webhook payload.
69
- */
70
- interface WebhookBasicData {
71
- /** Robot ID (PascalCase — Cognimbus default) */
72
- Id?: string;
73
- /** Robot ID (camelCase — alternative) */
74
- robotId?: string;
75
- /** Robot name (PascalCase) */
76
- Name?: string;
77
- /** Robot name (camelCase) */
78
- robotName?: string;
79
- /** Online flag (PascalCase) */
80
- IsOnline?: boolean;
81
- /** Online flag (camelCase) */
82
- isOnline?: boolean;
83
- }
84
- /**
85
- * Full Cognimbus webhook payload.
86
- * Supports both nested (`BasicData.*`) and flat (`robotId`, `isOnline`) formats.
87
- */
88
- interface WebhookPayload extends WebhookBasicData {
89
- BasicData?: WebhookBasicData;
90
- LastTimeSeen?: string;
91
- lastTimeSeen?: string;
92
- AgentVersion?: string;
93
- agentVersion?: string;
94
- /** Tenant this robot belongs to */
95
- tenantId?: string;
96
- }
97
- type TenantStatus = 'ACTIVE' | 'SUSPENDED' | 'INACTIVE';
98
- interface CreateTenantPayload {
99
- name: string;
100
- slug: string;
101
- industry?: string;
102
- status?: TenantStatus;
103
- contactEmail?: string;
104
- }
105
- interface UpdateTenantPayload extends Partial<CreateTenantPayload> {
106
- }
107
- interface TenantResponse {
108
- id: string;
109
- name: string;
110
- slug: string;
111
- industry: string | null;
112
- status: TenantStatus;
113
- contactEmail: string | null;
114
- logoUrl: string | null;
115
- createdAt: string;
116
- updatedAt: string;
117
- }
118
- type UserRole = 'SUPER_ADMIN' | 'ADMIN' | 'OPERATOR' | 'VIEWER';
119
- interface CreateUserPayload {
120
- email: string;
121
- password: string;
122
- firstName: string;
123
- lastName: string;
124
- role?: UserRole;
125
- tenantId?: string;
126
- }
127
- interface UpdateUserPayload extends Partial<CreateUserPayload> {
128
- }
129
- interface UserResponse {
130
- id: string;
131
- email: string;
132
- firstName: string;
133
- lastName: string;
134
- role: UserRole;
135
- isActive: boolean;
136
- tenantId: string | null;
137
- createdAt: string;
138
- updatedAt: string;
139
- }
140
- interface BotSummaryResponse {
141
- robotId: string;
142
- robotName: string;
143
- isOnline: boolean;
144
- lastTimeSeen: string | null;
145
- lastOnlineTime: string | null;
146
- agentVersion: string | null;
147
- tenantId: string | null;
148
- lastUpdated: string;
149
- }
150
- interface BotHistoryResponse {
151
- id: number;
152
- robotId: string;
153
- robotName: string;
154
- isOnline: boolean;
155
- lastTimeSeen: string | null;
156
- agentVersion: string | null;
157
- tenantId: string | null;
158
- timestamp: string;
159
- }
160
- interface BotStateChangeResponse {
161
- id: number;
162
- robotId: string;
163
- robotName: string;
164
- previousState: boolean;
165
- newState: boolean;
166
- tenantId: string | null;
167
- timestamp: string;
168
- }
169
-
170
- export type { ApiErrorResponse, ApiResponse, BotHistoryResponse, BotStateChangeResponse, BotSummaryResponse, CreateTenantPayload, CreateUserPayload, Metric, PaginatedResponse, PaginationMeta, Robot, TenantResponse, TenantStatus, UpdateTenantPayload, UpdateUserPayload, UserResponse, UserRole, WebhookBasicData, WebhookPayload };
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 };