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/README.md +79 -88
- package/dist/index.d.mts +1371 -144
- package/dist/index.d.ts +1371 -144
- package/dist/index.js +107 -0
- package/dist/index.mjs +96 -0
- package/openapi.json +1380 -0
- package/package.json +51 -34
package/dist/index.d.ts
CHANGED
|
@@ -1,170 +1,1397 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
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
|
-
|
|
6
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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
|
|
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 };
|