@formant/formant-cli 0.4.5 → 0.5.0

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.
@@ -38,6 +38,16 @@
38
38
  "allowNo": false,
39
39
  "type": "boolean"
40
40
  },
41
+ "toon": {
42
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
43
+ "exclusive": [
44
+ "json"
45
+ ],
46
+ "helpGroup": "GLOBAL",
47
+ "name": "toon",
48
+ "allowNo": false,
49
+ "type": "boolean"
50
+ },
41
51
  "limit": {
42
52
  "char": "l",
43
53
  "description": "Maximum number of rows to return",
@@ -121,6 +131,16 @@
121
131
  "name": "stage",
122
132
  "allowNo": false,
123
133
  "type": "boolean"
134
+ },
135
+ "toon": {
136
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
137
+ "exclusive": [
138
+ "json"
139
+ ],
140
+ "helpGroup": "GLOBAL",
141
+ "name": "toon",
142
+ "allowNo": false,
143
+ "type": "boolean"
124
144
  }
125
145
  },
126
146
  "hasDynamicHelp": false,
@@ -140,19 +160,19 @@
140
160
  "tables.js"
141
161
  ]
142
162
  },
143
- "event:get": {
163
+ "command:for-device": {
144
164
  "aliases": [],
145
165
  "args": {
146
- "id": {
147
- "description": "Event ID (UUID)",
148
- "name": "id",
166
+ "deviceId": {
167
+ "description": "Device ID (UUID)",
168
+ "name": "deviceId",
149
169
  "required": true
150
170
  }
151
171
  },
152
- "description": "Get detailed information about a specific event by its ID.",
172
+ "description": "List command templates available for a specific device.\n\nReturns commands that match the device's tags and filters. Only enabled commands\nthat apply to this device are shown.",
153
173
  "examples": [
154
- "<%= config.bin %> event get <event-id>",
155
- "<%= config.bin %> event get <event-id> --json"
174
+ "<%= config.bin %> command for-device <device-id>",
175
+ "<%= config.bin %> command for-device <device-id> --json"
156
176
  ],
157
177
  "flags": {
158
178
  "json": {
@@ -181,34 +201,48 @@
181
201
  "name": "stage",
182
202
  "allowNo": false,
183
203
  "type": "boolean"
204
+ },
205
+ "toon": {
206
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
207
+ "exclusive": [
208
+ "json"
209
+ ],
210
+ "helpGroup": "GLOBAL",
211
+ "name": "toon",
212
+ "allowNo": false,
213
+ "type": "boolean"
184
214
  }
185
215
  },
186
216
  "hasDynamicHelp": false,
187
217
  "hiddenAliases": [],
188
- "id": "event:get",
218
+ "id": "command:for-device",
189
219
  "pluginAlias": "@formant/formant-cli",
190
220
  "pluginName": "@formant/formant-cli",
191
221
  "pluginType": "core",
192
222
  "strict": true,
193
- "summary": "Get an event by ID",
223
+ "summary": "List commands available for a device",
194
224
  "enableJsonFlag": true,
195
225
  "isESM": true,
196
226
  "relativePath": [
197
227
  "dist",
198
228
  "commands",
199
- "event",
200
- "get.js"
229
+ "command",
230
+ "for-device.js"
201
231
  ]
202
232
  },
203
- "event:list": {
233
+ "command:get": {
204
234
  "aliases": [],
205
- "args": {},
206
- "description": "View important events emitted by devices with optional filters.\n\nEvents are significant occurrences from robots and sensors (e.g., device online/offline,\nerrors, state changes, commands). They can trigger signals for investigation.\n\nEvent types include: triggered-event, datapoint-event, device-online, device-offline,\nintervention-request, intervention-response, teleop-session-record, command-request,\ncommand-response, custom, comment, system, annotation, task-summary, stateful.\n\nSeverities: info, warning, error, critical.",
235
+ "args": {
236
+ "id": {
237
+ "description": "Command template ID (UUID)",
238
+ "name": "id",
239
+ "required": true
240
+ }
241
+ },
242
+ "description": "Get detailed information about a command template.\n\nShows the full template configuration including command string, parameter schema,\ndevice targeting filters, and delivery settings. If the template has structured\nparameters (schema), they are displayed in a readable format.",
207
243
  "examples": [
208
- "<%= config.bin %> event list",
209
- "<%= config.bin %> event list --device <id> --severity critical",
210
- "<%= config.bin %> event list --type device-offline --start 2026-01-01 --end 2026-01-02",
211
- "<%= config.bin %> event list --limit 100 --json"
244
+ "<%= config.bin %> command get <template-id>",
245
+ "<%= config.bin %> command get <template-id> --json"
212
246
  ],
213
247
  "flags": {
214
248
  "json": {
@@ -238,88 +272,42 @@
238
272
  "allowNo": false,
239
273
  "type": "boolean"
240
274
  },
241
- "device": {
242
- "char": "d",
243
- "description": "Filter by device ID",
244
- "name": "device",
245
- "hasDynamicHelp": false,
246
- "multiple": false,
247
- "type": "option"
248
- },
249
- "end": {
250
- "description": "End time (ISO 8601)",
251
- "name": "end",
252
- "hasDynamicHelp": false,
253
- "multiple": false,
254
- "type": "option"
255
- },
256
- "limit": {
257
- "char": "l",
258
- "description": "Maximum number of events to return",
259
- "name": "limit",
260
- "default": 25,
261
- "hasDynamicHelp": false,
262
- "multiple": false,
263
- "type": "option"
264
- },
265
- "severity": {
266
- "description": "Filter by severity",
267
- "name": "severity",
268
- "hasDynamicHelp": false,
269
- "multiple": false,
270
- "options": [
271
- "info",
272
- "warning",
273
- "error",
274
- "critical"
275
+ "toon": {
276
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
277
+ "exclusive": [
278
+ "json"
275
279
  ],
276
- "type": "option"
277
- },
278
- "start": {
279
- "description": "Start time (ISO 8601)",
280
- "name": "start",
281
- "hasDynamicHelp": false,
282
- "multiple": false,
283
- "type": "option"
284
- },
285
- "type": {
286
- "description": "Filter by event type",
287
- "name": "type",
288
- "hasDynamicHelp": false,
289
- "multiple": false,
290
- "type": "option"
280
+ "helpGroup": "GLOBAL",
281
+ "name": "toon",
282
+ "allowNo": false,
283
+ "type": "boolean"
291
284
  }
292
285
  },
293
286
  "hasDynamicHelp": false,
294
287
  "hiddenAliases": [],
295
- "id": "event:list",
288
+ "id": "command:get",
296
289
  "pluginAlias": "@formant/formant-cli",
297
290
  "pluginName": "@formant/formant-cli",
298
291
  "pluginType": "core",
299
292
  "strict": true,
300
- "summary": "View events emitted by devices",
293
+ "summary": "Get command template details",
301
294
  "enableJsonFlag": true,
302
295
  "isESM": true,
303
296
  "relativePath": [
304
297
  "dist",
305
298
  "commands",
306
- "event",
307
- "list.js"
299
+ "command",
300
+ "get.js"
308
301
  ]
309
302
  },
310
- "fleet:get": {
303
+ "command:history": {
311
304
  "aliases": [],
312
- "args": {
313
- "id": {
314
- "description": "Fleet (group) ID (UUID)",
315
- "name": "id",
316
- "required": true
317
- }
318
- },
319
- "description": "Get detailed information about a device group (fleet).\n\nShows the full fleet configuration including member devices and settings.",
305
+ "args": {},
306
+ "description": "Query command history for a device.\n\nShows commands that have been sent to a device, including delivery status and responses.\nUse this to check if commands were delivered and executed successfully.",
320
307
  "examples": [
321
- "<%= config.bin %> fleet get <fleet-id>",
322
- "<%= config.bin %> fleet get <fleet-id> --json"
308
+ "<%= config.bin %> command history --device <device-id>",
309
+ "<%= config.bin %> command history --device <device-id> --limit 50",
310
+ "<%= config.bin %> command history --device <device-id> --json"
323
311
  ],
324
312
  "flags": {
325
313
  "json": {
@@ -348,32 +336,60 @@
348
336
  "name": "stage",
349
337
  "allowNo": false,
350
338
  "type": "boolean"
339
+ },
340
+ "toon": {
341
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
342
+ "exclusive": [
343
+ "json"
344
+ ],
345
+ "helpGroup": "GLOBAL",
346
+ "name": "toon",
347
+ "allowNo": false,
348
+ "type": "boolean"
349
+ },
350
+ "device": {
351
+ "char": "d",
352
+ "description": "Device ID (UUID)",
353
+ "name": "device",
354
+ "required": true,
355
+ "hasDynamicHelp": false,
356
+ "multiple": false,
357
+ "type": "option"
358
+ },
359
+ "limit": {
360
+ "char": "l",
361
+ "description": "Maximum number of commands to return",
362
+ "name": "limit",
363
+ "default": 25,
364
+ "hasDynamicHelp": false,
365
+ "multiple": false,
366
+ "type": "option"
351
367
  }
352
368
  },
353
369
  "hasDynamicHelp": false,
354
370
  "hiddenAliases": [],
355
- "id": "fleet:get",
371
+ "id": "command:history",
356
372
  "pluginAlias": "@formant/formant-cli",
357
373
  "pluginName": "@formant/formant-cli",
358
374
  "pluginType": "core",
359
375
  "strict": true,
360
- "summary": "Get fleet details",
376
+ "summary": "Query command history",
361
377
  "enableJsonFlag": true,
362
378
  "isESM": true,
363
379
  "relativePath": [
364
380
  "dist",
365
381
  "commands",
366
- "fleet",
367
- "get.js"
382
+ "command",
383
+ "history.js"
368
384
  ]
369
385
  },
370
- "fleet:list": {
386
+ "command:list": {
371
387
  "aliases": [],
372
388
  "args": {},
373
- "description": "List all device groups (fleets) in your organization.\n\nDevice groups allow you to organize and manage sets of devices together.",
389
+ "description": "List all command templates defined in your organization.\n\nCommand templates define the commands that can be sent to devices. Each template\nspecifies the command string, parameters, delivery settings, and device targeting.",
374
390
  "examples": [
375
- "<%= config.bin %> fleet list",
376
- "<%= config.bin %> fleet list --json"
391
+ "<%= config.bin %> command list",
392
+ "<%= config.bin %> command list --json"
377
393
  ],
378
394
  "flags": {
379
395
  "json": {
@@ -402,38 +418,56 @@
402
418
  "name": "stage",
403
419
  "allowNo": false,
404
420
  "type": "boolean"
421
+ },
422
+ "toon": {
423
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
424
+ "exclusive": [
425
+ "json"
426
+ ],
427
+ "helpGroup": "GLOBAL",
428
+ "name": "toon",
429
+ "allowNo": false,
430
+ "type": "boolean"
405
431
  }
406
432
  },
407
433
  "hasDynamicHelp": false,
408
434
  "hiddenAliases": [],
409
- "id": "fleet:list",
435
+ "id": "command:list",
410
436
  "pluginAlias": "@formant/formant-cli",
411
437
  "pluginName": "@formant/formant-cli",
412
438
  "pluginType": "core",
413
439
  "strict": true,
414
- "summary": "List device groups",
440
+ "summary": "List command templates",
415
441
  "enableJsonFlag": true,
416
442
  "isESM": true,
417
443
  "relativePath": [
418
444
  "dist",
419
445
  "commands",
420
- "fleet",
446
+ "command",
421
447
  "list.js"
422
448
  ]
423
449
  },
424
- "event-trigger:get": {
450
+ "command:send": {
425
451
  "aliases": [],
426
452
  "args": {
427
- "id": {
428
- "description": "Event trigger ID (UUID)",
429
- "name": "id",
453
+ "deviceId": {
454
+ "description": "Device ID (UUID)",
455
+ "name": "deviceId",
456
+ "required": true
457
+ },
458
+ "templateId": {
459
+ "description": "Command template ID (UUID)",
460
+ "name": "templateId",
430
461
  "required": true
431
462
  }
432
463
  },
433
- "description": "Get detailed information about an event trigger.\n\nShows the full trigger configuration including conditions, exit conditions, commands\nit executes, and device targeting filters.",
464
+ "description": "Send a command to a device using a command template.\n\nFetches the template, validates parameters against its schema, and sends the command\nto the specified device. Use --param flags to override parameter values.\n\nFor templates with structured parameters (schema), parameter names and types are\nvalidated. For unstructured parameters, the raw value is sent as-is.\n\nUse --dry-run to preview the payload without actually sending.",
434
465
  "examples": [
435
- "<%= config.bin %> event-trigger get <trigger-id>",
436
- "<%= config.bin %> event-trigger get <trigger-id> --json"
466
+ "<%= config.bin %> command send <device-id> <template-id>",
467
+ "<%= config.bin %> command send <device-id> <template-id> --param speed=5 --param mode=fast",
468
+ "<%= config.bin %> command send <device-id> <template-id> --dry-run",
469
+ "<%= config.bin %> command send <device-id> <template-id> --raw-value '{\"x\":1,\"y\":2}'",
470
+ "<%= config.bin %> command send <device-id> <template-id> --json"
437
471
  ],
438
472
  "flags": {
439
473
  "json": {
@@ -462,36 +496,73 @@
462
496
  "name": "stage",
463
497
  "allowNo": false,
464
498
  "type": "boolean"
499
+ },
500
+ "toon": {
501
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
502
+ "exclusive": [
503
+ "json"
504
+ ],
505
+ "helpGroup": "GLOBAL",
506
+ "name": "toon",
507
+ "allowNo": false,
508
+ "type": "boolean"
509
+ },
510
+ "dry-run": {
511
+ "description": "Preview the command payload without sending",
512
+ "name": "dry-run",
513
+ "allowNo": false,
514
+ "type": "boolean"
515
+ },
516
+ "param": {
517
+ "char": "p",
518
+ "description": "Parameter override (name=value), can be specified multiple times",
519
+ "name": "param",
520
+ "hasDynamicHelp": false,
521
+ "multiple": true,
522
+ "type": "option"
523
+ },
524
+ "raw-value": {
525
+ "description": "Send a raw parameter value string (bypasses schema validation)",
526
+ "name": "raw-value",
527
+ "hasDynamicHelp": false,
528
+ "multiple": false,
529
+ "type": "option"
465
530
  }
466
531
  },
467
532
  "hasDynamicHelp": false,
468
533
  "hiddenAliases": [],
469
- "id": "event-trigger:get",
534
+ "id": "command:send",
470
535
  "pluginAlias": "@formant/formant-cli",
471
536
  "pluginName": "@formant/formant-cli",
472
537
  "pluginType": "core",
473
538
  "strict": true,
474
- "summary": "Get event trigger details",
539
+ "summary": "Send a command to a device",
475
540
  "enableJsonFlag": true,
476
541
  "isESM": true,
477
542
  "relativePath": [
478
543
  "dist",
479
544
  "commands",
480
- "event-trigger",
481
- "get.js"
545
+ "command",
546
+ "send.js"
482
547
  ]
483
548
  },
484
- "event-trigger:list": {
549
+ "event:get": {
485
550
  "aliases": [],
486
- "args": {},
487
- "description": "List all event trigger rules in your organization.\n\nEvent triggers monitor device data and generate events/signals when conditions are met.\nThey can trigger investigations, send notifications, or execute commands.",
488
- "examples": [
489
- "<%= config.bin %> event-trigger list",
490
- "<%= config.bin %> event-trigger list --json"
491
- ],
492
- "flags": {
493
- "json": {
494
- "description": "Format output as json.",
551
+ "args": {
552
+ "id": {
553
+ "description": "Event ID (UUID)",
554
+ "name": "id",
555
+ "required": true
556
+ }
557
+ },
558
+ "description": "Get detailed information about a specific event by its ID.",
559
+ "examples": [
560
+ "<%= config.bin %> event get <event-id>",
561
+ "<%= config.bin %> event get <event-id> --json"
562
+ ],
563
+ "flags": {
564
+ "json": {
565
+ "description": "Format output as json.",
495
566
  "helpGroup": "GLOBAL",
496
567
  "name": "json",
497
568
  "allowNo": false,
@@ -516,38 +587,44 @@
516
587
  "name": "stage",
517
588
  "allowNo": false,
518
589
  "type": "boolean"
590
+ },
591
+ "toon": {
592
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
593
+ "exclusive": [
594
+ "json"
595
+ ],
596
+ "helpGroup": "GLOBAL",
597
+ "name": "toon",
598
+ "allowNo": false,
599
+ "type": "boolean"
519
600
  }
520
601
  },
521
602
  "hasDynamicHelp": false,
522
603
  "hiddenAliases": [],
523
- "id": "event-trigger:list",
604
+ "id": "event:get",
524
605
  "pluginAlias": "@formant/formant-cli",
525
606
  "pluginName": "@formant/formant-cli",
526
607
  "pluginType": "core",
527
608
  "strict": true,
528
- "summary": "List event trigger rules",
609
+ "summary": "Get an event by ID",
529
610
  "enableJsonFlag": true,
530
611
  "isESM": true,
531
612
  "relativePath": [
532
613
  "dist",
533
614
  "commands",
534
- "event-trigger",
535
- "list.js"
615
+ "event",
616
+ "get.js"
536
617
  ]
537
618
  },
538
- "command:for-device": {
619
+ "event:list": {
539
620
  "aliases": [],
540
- "args": {
541
- "deviceId": {
542
- "description": "Device ID (UUID)",
543
- "name": "deviceId",
544
- "required": true
545
- }
546
- },
547
- "description": "List command templates available for a specific device.\n\nReturns commands that match the device's tags and filters. Only enabled commands\nthat apply to this device are shown.",
621
+ "args": {},
622
+ "description": "View important events emitted by devices with optional filters.\n\nEvents are significant occurrences from robots and sensors (e.g., device online/offline,\nerrors, state changes, commands). They can trigger signals for investigation.\n\nEvent types include: triggered-event, datapoint-event, device-online, device-offline,\nintervention-request, intervention-response, teleop-session-record, command-request,\ncommand-response, custom, comment, system, annotation, task-summary, stateful.\n\nSeverities: info, warning, error, critical.",
548
623
  "examples": [
549
- "<%= config.bin %> command for-device <device-id>",
550
- "<%= config.bin %> command for-device <device-id> --json"
624
+ "<%= config.bin %> event list",
625
+ "<%= config.bin %> event list --device <id> --severity critical",
626
+ "<%= config.bin %> event list --type device-offline --start 2026-01-01 --end 2026-01-02",
627
+ "<%= config.bin %> event list --limit 100 --json"
551
628
  ],
552
629
  "flags": {
553
630
  "json": {
@@ -576,38 +653,99 @@
576
653
  "name": "stage",
577
654
  "allowNo": false,
578
655
  "type": "boolean"
656
+ },
657
+ "toon": {
658
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
659
+ "exclusive": [
660
+ "json"
661
+ ],
662
+ "helpGroup": "GLOBAL",
663
+ "name": "toon",
664
+ "allowNo": false,
665
+ "type": "boolean"
666
+ },
667
+ "device": {
668
+ "char": "d",
669
+ "description": "Filter by device ID",
670
+ "name": "device",
671
+ "hasDynamicHelp": false,
672
+ "multiple": false,
673
+ "type": "option"
674
+ },
675
+ "end": {
676
+ "description": "End time (ISO 8601)",
677
+ "name": "end",
678
+ "hasDynamicHelp": false,
679
+ "multiple": false,
680
+ "type": "option"
681
+ },
682
+ "limit": {
683
+ "char": "l",
684
+ "description": "Maximum number of events to return",
685
+ "name": "limit",
686
+ "default": 25,
687
+ "hasDynamicHelp": false,
688
+ "multiple": false,
689
+ "type": "option"
690
+ },
691
+ "severity": {
692
+ "description": "Filter by severity",
693
+ "name": "severity",
694
+ "hasDynamicHelp": false,
695
+ "multiple": false,
696
+ "options": [
697
+ "info",
698
+ "warning",
699
+ "error",
700
+ "critical"
701
+ ],
702
+ "type": "option"
703
+ },
704
+ "start": {
705
+ "description": "Start time (ISO 8601)",
706
+ "name": "start",
707
+ "hasDynamicHelp": false,
708
+ "multiple": false,
709
+ "type": "option"
710
+ },
711
+ "type": {
712
+ "description": "Filter by event type",
713
+ "name": "type",
714
+ "hasDynamicHelp": false,
715
+ "multiple": false,
716
+ "type": "option"
579
717
  }
580
718
  },
581
719
  "hasDynamicHelp": false,
582
720
  "hiddenAliases": [],
583
- "id": "command:for-device",
721
+ "id": "event:list",
584
722
  "pluginAlias": "@formant/formant-cli",
585
723
  "pluginName": "@formant/formant-cli",
586
724
  "pluginType": "core",
587
725
  "strict": true,
588
- "summary": "List commands available for a device",
726
+ "summary": "View events emitted by devices",
589
727
  "enableJsonFlag": true,
590
728
  "isESM": true,
591
729
  "relativePath": [
592
730
  "dist",
593
731
  "commands",
594
- "command",
595
- "for-device.js"
732
+ "event",
733
+ "list.js"
596
734
  ]
597
735
  },
598
- "command:get": {
736
+ "event-trigger:get": {
599
737
  "aliases": [],
600
738
  "args": {
601
739
  "id": {
602
- "description": "Command template ID (UUID)",
740
+ "description": "Event trigger ID (UUID)",
603
741
  "name": "id",
604
742
  "required": true
605
743
  }
606
744
  },
607
- "description": "Get detailed information about a command template.\n\nShows the full template configuration including command string, parameter schema,\ndevice targeting filters, and delivery settings. If the template has structured\nparameters (schema), they are displayed in a readable format.",
745
+ "description": "Get detailed information about an event trigger.\n\nShows the full trigger configuration including conditions, exit conditions, commands\nit executes, and device targeting filters.",
608
746
  "examples": [
609
- "<%= config.bin %> command get <template-id>",
610
- "<%= config.bin %> command get <template-id> --json"
747
+ "<%= config.bin %> event-trigger get <trigger-id>",
748
+ "<%= config.bin %> event-trigger get <trigger-id> --json"
611
749
  ],
612
750
  "flags": {
613
751
  "json": {
@@ -636,33 +774,42 @@
636
774
  "name": "stage",
637
775
  "allowNo": false,
638
776
  "type": "boolean"
777
+ },
778
+ "toon": {
779
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
780
+ "exclusive": [
781
+ "json"
782
+ ],
783
+ "helpGroup": "GLOBAL",
784
+ "name": "toon",
785
+ "allowNo": false,
786
+ "type": "boolean"
639
787
  }
640
788
  },
641
789
  "hasDynamicHelp": false,
642
790
  "hiddenAliases": [],
643
- "id": "command:get",
791
+ "id": "event-trigger:get",
644
792
  "pluginAlias": "@formant/formant-cli",
645
793
  "pluginName": "@formant/formant-cli",
646
794
  "pluginType": "core",
647
795
  "strict": true,
648
- "summary": "Get command template details",
796
+ "summary": "Get event trigger details",
649
797
  "enableJsonFlag": true,
650
798
  "isESM": true,
651
799
  "relativePath": [
652
800
  "dist",
653
801
  "commands",
654
- "command",
802
+ "event-trigger",
655
803
  "get.js"
656
804
  ]
657
805
  },
658
- "command:history": {
806
+ "event-trigger:list": {
659
807
  "aliases": [],
660
808
  "args": {},
661
- "description": "Query command history for a device.\n\nShows commands that have been sent to a device, including delivery status and responses.\nUse this to check if commands were delivered and executed successfully.",
809
+ "description": "List all event trigger rules in your organization.\n\nEvent triggers monitor device data and generate events/signals when conditions are met.\nThey can trigger investigations, send notifications, or execute commands.",
662
810
  "examples": [
663
- "<%= config.bin %> command history --device <device-id>",
664
- "<%= config.bin %> command history --device <device-id> --limit 50",
665
- "<%= config.bin %> command history --device <device-id> --json"
811
+ "<%= config.bin %> event-trigger list",
812
+ "<%= config.bin %> event-trigger list --json"
666
813
  ],
667
814
  "flags": {
668
815
  "json": {
@@ -692,49 +839,47 @@
692
839
  "allowNo": false,
693
840
  "type": "boolean"
694
841
  },
695
- "device": {
696
- "char": "d",
697
- "description": "Device ID (UUID)",
698
- "name": "device",
699
- "required": true,
700
- "hasDynamicHelp": false,
701
- "multiple": false,
702
- "type": "option"
703
- },
704
- "limit": {
705
- "char": "l",
706
- "description": "Maximum number of commands to return",
707
- "name": "limit",
708
- "default": 25,
709
- "hasDynamicHelp": false,
710
- "multiple": false,
711
- "type": "option"
842
+ "toon": {
843
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
844
+ "exclusive": [
845
+ "json"
846
+ ],
847
+ "helpGroup": "GLOBAL",
848
+ "name": "toon",
849
+ "allowNo": false,
850
+ "type": "boolean"
712
851
  }
713
852
  },
714
853
  "hasDynamicHelp": false,
715
854
  "hiddenAliases": [],
716
- "id": "command:history",
855
+ "id": "event-trigger:list",
717
856
  "pluginAlias": "@formant/formant-cli",
718
857
  "pluginName": "@formant/formant-cli",
719
858
  "pluginType": "core",
720
859
  "strict": true,
721
- "summary": "Query command history",
860
+ "summary": "List event trigger rules",
722
861
  "enableJsonFlag": true,
723
862
  "isESM": true,
724
863
  "relativePath": [
725
864
  "dist",
726
865
  "commands",
727
- "command",
728
- "history.js"
866
+ "event-trigger",
867
+ "list.js"
729
868
  ]
730
869
  },
731
- "command:list": {
870
+ "fleet:get": {
732
871
  "aliases": [],
733
- "args": {},
734
- "description": "List all command templates defined in your organization.\n\nCommand templates define the commands that can be sent to devices. Each template\nspecifies the command string, parameters, delivery settings, and device targeting.",
872
+ "args": {
873
+ "id": {
874
+ "description": "Fleet (group) ID (UUID)",
875
+ "name": "id",
876
+ "required": true
877
+ }
878
+ },
879
+ "description": "Get detailed information about a device group (fleet).\n\nShows the full fleet configuration including member devices and settings.",
735
880
  "examples": [
736
- "<%= config.bin %> command list",
737
- "<%= config.bin %> command list --json"
881
+ "<%= config.bin %> fleet get <fleet-id>",
882
+ "<%= config.bin %> fleet get <fleet-id> --json"
738
883
  ],
739
884
  "flags": {
740
885
  "json": {
@@ -763,46 +908,42 @@
763
908
  "name": "stage",
764
909
  "allowNo": false,
765
910
  "type": "boolean"
911
+ },
912
+ "toon": {
913
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
914
+ "exclusive": [
915
+ "json"
916
+ ],
917
+ "helpGroup": "GLOBAL",
918
+ "name": "toon",
919
+ "allowNo": false,
920
+ "type": "boolean"
766
921
  }
767
922
  },
768
923
  "hasDynamicHelp": false,
769
924
  "hiddenAliases": [],
770
- "id": "command:list",
925
+ "id": "fleet:get",
771
926
  "pluginAlias": "@formant/formant-cli",
772
927
  "pluginName": "@formant/formant-cli",
773
928
  "pluginType": "core",
774
929
  "strict": true,
775
- "summary": "List command templates",
930
+ "summary": "Get fleet details",
776
931
  "enableJsonFlag": true,
777
932
  "isESM": true,
778
933
  "relativePath": [
779
934
  "dist",
780
935
  "commands",
781
- "command",
782
- "list.js"
936
+ "fleet",
937
+ "get.js"
783
938
  ]
784
939
  },
785
- "command:send": {
940
+ "fleet:list": {
786
941
  "aliases": [],
787
- "args": {
788
- "deviceId": {
789
- "description": "Device ID (UUID)",
790
- "name": "deviceId",
791
- "required": true
792
- },
793
- "templateId": {
794
- "description": "Command template ID (UUID)",
795
- "name": "templateId",
796
- "required": true
797
- }
798
- },
799
- "description": "Send a command to a device using a command template.\n\nFetches the template, validates parameters against its schema, and sends the command\nto the specified device. Use --param flags to override parameter values.\n\nFor templates with structured parameters (schema), parameter names and types are\nvalidated. For unstructured parameters, the raw value is sent as-is.\n\nUse --dry-run to preview the payload without actually sending.",
942
+ "args": {},
943
+ "description": "List all device groups (fleets) in your organization.\n\nDevice groups allow you to organize and manage sets of devices together.",
800
944
  "examples": [
801
- "<%= config.bin %> command send <device-id> <template-id>",
802
- "<%= config.bin %> command send <device-id> <template-id> --param speed=5 --param mode=fast",
803
- "<%= config.bin %> command send <device-id> <template-id> --dry-run",
804
- "<%= config.bin %> command send <device-id> <template-id> --raw-value '{\"x\":1,\"y\":2}'",
805
- "<%= config.bin %> command send <device-id> <template-id> --json"
945
+ "<%= config.bin %> fleet list",
946
+ "<%= config.bin %> fleet list --json"
806
947
  ],
807
948
  "flags": {
808
949
  "json": {
@@ -832,58 +973,47 @@
832
973
  "allowNo": false,
833
974
  "type": "boolean"
834
975
  },
835
- "dry-run": {
836
- "description": "Preview the command payload without sending",
837
- "name": "dry-run",
976
+ "toon": {
977
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
978
+ "exclusive": [
979
+ "json"
980
+ ],
981
+ "helpGroup": "GLOBAL",
982
+ "name": "toon",
838
983
  "allowNo": false,
839
984
  "type": "boolean"
840
- },
841
- "param": {
842
- "char": "p",
843
- "description": "Parameter override (name=value), can be specified multiple times",
844
- "name": "param",
845
- "hasDynamicHelp": false,
846
- "multiple": true,
847
- "type": "option"
848
- },
849
- "raw-value": {
850
- "description": "Send a raw parameter value string (bypasses schema validation)",
851
- "name": "raw-value",
852
- "hasDynamicHelp": false,
853
- "multiple": false,
854
- "type": "option"
855
985
  }
856
986
  },
857
987
  "hasDynamicHelp": false,
858
988
  "hiddenAliases": [],
859
- "id": "command:send",
989
+ "id": "fleet:list",
860
990
  "pluginAlias": "@formant/formant-cli",
861
991
  "pluginName": "@formant/formant-cli",
862
992
  "pluginType": "core",
863
993
  "strict": true,
864
- "summary": "Send a command to a device",
994
+ "summary": "List device groups",
865
995
  "enableJsonFlag": true,
866
996
  "isESM": true,
867
997
  "relativePath": [
868
998
  "dist",
869
999
  "commands",
870
- "command",
871
- "send.js"
1000
+ "fleet",
1001
+ "list.js"
872
1002
  ]
873
1003
  },
874
- "kv:get": {
1004
+ "device:config": {
875
1005
  "aliases": [],
876
1006
  "args": {
877
- "key": {
878
- "description": "Key to retrieve",
879
- "name": "key",
1007
+ "id": {
1008
+ "description": "Device ID (UUID)",
1009
+ "name": "id",
880
1010
  "required": true
881
1011
  }
882
1012
  },
883
- "description": "Get a value from the key-value store.\n\nThe key-value store allows devices and applications to store metadata.",
1013
+ "description": "Get the device configuration including stream definitions.\n\nShows the device's current configuration including telemetry streams, commands,\nand other settings.",
884
1014
  "examples": [
885
- "<%= config.bin %> kv get my-key",
886
- "<%= config.bin %> kv get my-key --json"
1015
+ "<%= config.bin %> device config <device-id>",
1016
+ "<%= config.bin %> device config <device-id> --json"
887
1017
  ],
888
1018
  "flags": {
889
1019
  "json": {
@@ -912,34 +1042,49 @@
912
1042
  "name": "stage",
913
1043
  "allowNo": false,
914
1044
  "type": "boolean"
1045
+ },
1046
+ "toon": {
1047
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1048
+ "exclusive": [
1049
+ "json"
1050
+ ],
1051
+ "helpGroup": "GLOBAL",
1052
+ "name": "toon",
1053
+ "allowNo": false,
1054
+ "type": "boolean"
915
1055
  }
916
1056
  },
917
1057
  "hasDynamicHelp": false,
918
1058
  "hiddenAliases": [],
919
- "id": "kv:get",
1059
+ "id": "device:config",
920
1060
  "pluginAlias": "@formant/formant-cli",
921
1061
  "pluginName": "@formant/formant-cli",
922
1062
  "pluginType": "core",
923
1063
  "strict": true,
924
- "summary": "Get key-value",
1064
+ "summary": "Get device configuration",
925
1065
  "enableJsonFlag": true,
926
1066
  "isESM": true,
927
1067
  "relativePath": [
928
1068
  "dist",
929
1069
  "commands",
930
- "kv",
931
- "get.js"
1070
+ "device",
1071
+ "config.js"
932
1072
  ]
933
1073
  },
934
- "kv:list": {
1074
+ "device:create": {
935
1075
  "aliases": [],
936
- "args": {},
937
- "description": "List all keys in the key-value store.\n\nShows all stored keys in the organization's key-value store. Use --prefix to filter\nkeys that start with a specific prefix, or --keys to query specific keys.",
1076
+ "args": {
1077
+ "name": {
1078
+ "description": "Name for the new device",
1079
+ "name": "name",
1080
+ "required": true
1081
+ }
1082
+ },
1083
+ "description": "Create a new device in your fleet.\n\nThe device is created as enabled by default. You can optionally specify tags.",
938
1084
  "examples": [
939
- "<%= config.bin %> kv list",
940
- "<%= config.bin %> kv list --prefix config",
941
- "<%= config.bin %> kv list --keys key1 --keys key2 --keys key3",
942
- "<%= config.bin %> kv list --json"
1085
+ "<%= config.bin %> device create my-robot",
1086
+ "<%= config.bin %> device create my-robot --tag location=warehouse --tag env=prod",
1087
+ "<%= config.bin %> device create my-robot --json"
943
1088
  ],
944
1089
  "flags": {
945
1090
  "json": {
@@ -969,58 +1114,55 @@
969
1114
  "allowNo": false,
970
1115
  "type": "boolean"
971
1116
  },
972
- "keys": {
973
- "char": "k",
974
- "description": "Specific keys to query (can be specified multiple times)",
975
- "name": "keys",
976
- "hasDynamicHelp": false,
977
- "multiple": true,
978
- "type": "option"
1117
+ "toon": {
1118
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1119
+ "exclusive": [
1120
+ "json"
1121
+ ],
1122
+ "helpGroup": "GLOBAL",
1123
+ "name": "toon",
1124
+ "allowNo": false,
1125
+ "type": "boolean"
979
1126
  },
980
- "prefix": {
981
- "char": "p",
982
- "description": "Filter keys by prefix",
983
- "name": "prefix",
1127
+ "tag": {
1128
+ "char": "t",
1129
+ "description": "Tag to apply (key=value), can be specified multiple times",
1130
+ "name": "tag",
984
1131
  "hasDynamicHelp": false,
985
- "multiple": false,
1132
+ "multiple": true,
986
1133
  "type": "option"
987
1134
  }
988
1135
  },
989
1136
  "hasDynamicHelp": false,
990
1137
  "hiddenAliases": [],
991
- "id": "kv:list",
1138
+ "id": "device:create",
992
1139
  "pluginAlias": "@formant/formant-cli",
993
1140
  "pluginName": "@formant/formant-cli",
994
1141
  "pluginType": "core",
995
1142
  "strict": true,
996
- "summary": "List key-value keys",
1143
+ "summary": "Create a new device",
997
1144
  "enableJsonFlag": true,
998
1145
  "isESM": true,
999
1146
  "relativePath": [
1000
1147
  "dist",
1001
1148
  "commands",
1002
- "kv",
1003
- "list.js"
1149
+ "device",
1150
+ "create.js"
1004
1151
  ]
1005
1152
  },
1006
- "kv:set": {
1153
+ "device:delete": {
1007
1154
  "aliases": [],
1008
1155
  "args": {
1009
- "key": {
1010
- "description": "Key to set",
1011
- "name": "key",
1012
- "required": true
1013
- },
1014
- "value": {
1015
- "description": "Value to store (JSON string)",
1016
- "name": "value",
1156
+ "id": {
1157
+ "description": "Device ID (UUID)",
1158
+ "name": "id",
1017
1159
  "required": true
1018
1160
  }
1019
1161
  },
1020
- "description": "Set a value in the key-value store.\n\nStores a value associated with a key. The value should be a JSON string.",
1162
+ "description": "Delete (disable) a device from your fleet.\n\nThis performs a soft-delete by disabling the device. The device and its telemetry\nhistory are preserved but it will no longer appear in device listings.",
1021
1163
  "examples": [
1022
- "<%= config.bin %> kv set my-key '{\"data\": \"value\"}'",
1023
- "<%= config.bin %> kv set config '{\"setting\": true}'"
1164
+ "<%= config.bin %> device delete <device-id>",
1165
+ "<%= config.bin %> device delete <device-id> --json"
1024
1166
  ],
1025
1167
  "flags": {
1026
1168
  "json": {
@@ -1049,32 +1191,48 @@
1049
1191
  "name": "stage",
1050
1192
  "allowNo": false,
1051
1193
  "type": "boolean"
1194
+ },
1195
+ "toon": {
1196
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1197
+ "exclusive": [
1198
+ "json"
1199
+ ],
1200
+ "helpGroup": "GLOBAL",
1201
+ "name": "toon",
1202
+ "allowNo": false,
1203
+ "type": "boolean"
1052
1204
  }
1053
1205
  },
1054
1206
  "hasDynamicHelp": false,
1055
1207
  "hiddenAliases": [],
1056
- "id": "kv:set",
1208
+ "id": "device:delete",
1057
1209
  "pluginAlias": "@formant/formant-cli",
1058
1210
  "pluginName": "@formant/formant-cli",
1059
1211
  "pluginType": "core",
1060
1212
  "strict": true,
1061
- "summary": "Set key-value",
1213
+ "summary": "Delete (disable) a device",
1062
1214
  "enableJsonFlag": true,
1063
1215
  "isESM": true,
1064
1216
  "relativePath": [
1065
1217
  "dist",
1066
1218
  "commands",
1067
- "kv",
1068
- "set.js"
1219
+ "device",
1220
+ "delete.js"
1069
1221
  ]
1070
1222
  },
1071
- "org:get": {
1223
+ "device:get": {
1072
1224
  "aliases": [],
1073
- "args": {},
1074
- "description": "Get information about your organization.\n\nDisplays the organization associated with your authenticated account.\nNo ID is needed — it is resolved automatically from your credentials.",
1225
+ "args": {
1226
+ "id": {
1227
+ "description": "Device ID (UUID)",
1228
+ "name": "id",
1229
+ "required": true
1230
+ }
1231
+ },
1232
+ "description": "Get detailed information about a specific device by its ID.",
1075
1233
  "examples": [
1076
- "<%= config.bin %> org get",
1077
- "<%= config.bin %> org get --json"
1234
+ "<%= config.bin %> device get <device-id>",
1235
+ "<%= config.bin %> device get <device-id> --json"
1078
1236
  ],
1079
1237
  "flags": {
1080
1238
  "json": {
@@ -1103,34 +1261,47 @@
1103
1261
  "name": "stage",
1104
1262
  "allowNo": false,
1105
1263
  "type": "boolean"
1264
+ },
1265
+ "toon": {
1266
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1267
+ "exclusive": [
1268
+ "json"
1269
+ ],
1270
+ "helpGroup": "GLOBAL",
1271
+ "name": "toon",
1272
+ "allowNo": false,
1273
+ "type": "boolean"
1106
1274
  }
1107
1275
  },
1108
1276
  "hasDynamicHelp": false,
1109
1277
  "hiddenAliases": [],
1110
- "id": "org:get",
1278
+ "id": "device:get",
1111
1279
  "pluginAlias": "@formant/formant-cli",
1112
1280
  "pluginName": "@formant/formant-cli",
1113
1281
  "pluginType": "core",
1114
1282
  "strict": true,
1115
- "summary": "Get your organization",
1283
+ "summary": "Get a device by ID",
1116
1284
  "enableJsonFlag": true,
1117
1285
  "isESM": true,
1118
1286
  "relativePath": [
1119
1287
  "dist",
1120
1288
  "commands",
1121
- "org",
1289
+ "device",
1122
1290
  "get.js"
1123
1291
  ]
1124
1292
  },
1125
- "org:update": {
1293
+ "device:list": {
1126
1294
  "aliases": [],
1127
1295
  "args": {},
1128
- "description": "Update your organization's details.\n\nAt least one of --name or --description must be provided.",
1296
+ "description": "List robots and sensors in your fleet. Shows only online devices by default.\n\nUse --include-offline to include offline devices. Use --with-data to show only\ndevices that have ingested data. Each device is enriched with data-based last\nseen timestamp and datapoint count from analytics.",
1129
1297
  "examples": [
1130
- "<%= config.bin %> org update --name \"My Fleet\"",
1131
- "<%= config.bin %> org update --description \"Production robot fleet\"",
1132
- "<%= config.bin %> org update --name \"My Fleet\" --description \"Production robot fleet\"",
1133
- "<%= config.bin %> org update --name \"My Fleet\" --json"
1298
+ "<%= config.bin %> device list",
1299
+ "<%= config.bin %> device list --include-offline",
1300
+ "<%= config.bin %> device list --with-data",
1301
+ "<%= config.bin %> device list --with-data --days 90",
1302
+ "<%= config.bin %> device list --include-offline --limit 100",
1303
+ "<%= config.bin %> device list --tag location=warehouse",
1304
+ "<%= config.bin %> device list --name robot --dev --json"
1134
1305
  ],
1135
1306
  "flags": {
1136
1307
  "json": {
@@ -1160,49 +1331,99 @@
1160
1331
  "allowNo": false,
1161
1332
  "type": "boolean"
1162
1333
  },
1163
- "description": {
1164
- "char": "d",
1165
- "description": "New description for the organization",
1166
- "name": "description",
1334
+ "toon": {
1335
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1336
+ "exclusive": [
1337
+ "json"
1338
+ ],
1339
+ "helpGroup": "GLOBAL",
1340
+ "name": "toon",
1341
+ "allowNo": false,
1342
+ "type": "boolean"
1343
+ },
1344
+ "include-offline": {
1345
+ "char": "a",
1346
+ "description": "Include offline devices",
1347
+ "name": "include-offline",
1348
+ "allowNo": false,
1349
+ "type": "boolean"
1350
+ },
1351
+ "days": {
1352
+ "description": "How many days back to search for last seen data",
1353
+ "name": "days",
1354
+ "default": 30,
1355
+ "hasDynamicHelp": false,
1356
+ "multiple": false,
1357
+ "type": "option"
1358
+ },
1359
+ "limit": {
1360
+ "char": "l",
1361
+ "description": "Maximum number of devices to return",
1362
+ "name": "limit",
1363
+ "default": 50,
1167
1364
  "hasDynamicHelp": false,
1168
1365
  "multiple": false,
1169
1366
  "type": "option"
1170
1367
  },
1171
1368
  "name": {
1172
1369
  "char": "n",
1173
- "description": "New name for the organization",
1370
+ "description": "Filter devices by name (search)",
1174
1371
  "name": "name",
1175
1372
  "hasDynamicHelp": false,
1176
1373
  "multiple": false,
1177
1374
  "type": "option"
1375
+ },
1376
+ "with-data": {
1377
+ "char": "w",
1378
+ "description": "Only show devices that have data in the last --days window",
1379
+ "name": "with-data",
1380
+ "allowNo": false,
1381
+ "type": "boolean"
1382
+ },
1383
+ "tag": {
1384
+ "char": "t",
1385
+ "description": "Filter by tag (key=value), can be specified multiple times",
1386
+ "name": "tag",
1387
+ "hasDynamicHelp": false,
1388
+ "multiple": true,
1389
+ "type": "option"
1178
1390
  }
1179
1391
  },
1180
1392
  "hasDynamicHelp": false,
1181
1393
  "hiddenAliases": [],
1182
- "id": "org:update",
1394
+ "id": "device:list",
1183
1395
  "pluginAlias": "@formant/formant-cli",
1184
1396
  "pluginName": "@formant/formant-cli",
1185
1397
  "pluginType": "core",
1186
1398
  "strict": true,
1187
- "summary": "Update your organization",
1399
+ "summary": "List robots and sensors in your fleet",
1188
1400
  "enableJsonFlag": true,
1189
1401
  "isESM": true,
1190
1402
  "relativePath": [
1191
1403
  "dist",
1192
1404
  "commands",
1193
- "org",
1194
- "update.js"
1405
+ "device",
1406
+ "list.js"
1195
1407
  ]
1196
1408
  },
1197
- "ingest:batch": {
1409
+ "device:rename": {
1198
1410
  "aliases": [],
1199
- "args": {},
1200
- "description": "Ingest multiple data points in a single batch request.\n\nReads a JSON file (or stdin) containing a batch ingestion payload and sends all data points\nin a single API request. This is more efficient than sending individual data points when you\nhave multiple values to ingest.\n\nINPUT FORMAT:\nThe input JSON must have the following structure:\n{\n \"items\": [\n {\n \"deviceId\": \"device-uuid\", // Required: Device ID (UUID)\n \"name\": \"stream-name\", // Required: Stream name\n \"type\": \"numeric|text|json|...\", // Required: Data type (see below)\n \"tags\": {\"key\": \"value\"}, // Optional: Tags object (string key-value pairs)\n \"points\": [[timestamp_ms, value]] // Required: Array of [timestamp, value] pairs\n }\n ]\n}\n\nSUPPORTED TYPES AND VALUE FORMATS:\n- numeric: Number value\n Example: \"points\": [[1708272000000, 42.5]]\n\n- text: String value\n Example: \"points\": [[1708272000000, \"hello world\"]]\n\n- json: JSON object encoded as string\n Example: \"points\": [[1708272000000, \"{\\\"x\\\":10,\\\"y\\\":20}\"]]\n\n- image: Object with url (required), size and annotations (optional)\n Example: \"points\": [[1708272000000, {\"url\": \"https://example.com/img.jpg\", \"size\": 102400}]]\n\n- video: Object with url, duration, mimeType (required), size (optional)\n Example: \"points\": [[1708272000000, {\"url\": \"https://example.com/vid.mp4\", \"duration\": 30000, \"mimeType\": \"video/mp4\"}]]\n\n- bitset: Object with keys array and values array (1-1000 pairs)\n Example: \"points\": [[1708272000000, {\"keys\": [\"door\", \"window\"], \"values\": [true, false]}]]\n\n- health: Object with status (required) and clockSkewMs (optional)\n Example: \"points\": [[1708272000000, {\"status\": \"operational\", \"clockSkewMs\": 150}]]\n Valid status values: \"unknown\", \"operational\", \"offline\", \"error\"\n\nEach item can have multiple points (timestamp/value pairs) for the same stream.\nTimestamps are Unix milliseconds (use Date.now() for current time).",
1411
+ "args": {
1412
+ "id": {
1413
+ "description": "Device ID (UUID)",
1414
+ "name": "id",
1415
+ "required": true
1416
+ },
1417
+ "name": {
1418
+ "description": "New name for the device",
1419
+ "name": "name",
1420
+ "required": true
1421
+ }
1422
+ },
1423
+ "description": "Rename a device by updating its name.",
1201
1424
  "examples": [
1202
- "<%= config.bin %> ingest batch --file data.json",
1203
- "<%= config.bin %> ingest batch --stdin < data.json",
1204
- "cat payload.json | <%= config.bin %> ingest batch --stdin",
1205
- "# Example payload.json with multiple types:\n{\n \"items\": [\n {\n \"deviceId\": \"abc-123\",\n \"name\": \"battery_level\",\n \"type\": \"numeric\",\n \"tags\": {\"env\": \"prod\"},\n \"points\": [[1708272000000, 42.5], [1708272060000, 41.8]]\n },\n {\n \"deviceId\": \"abc-123\",\n \"name\": \"status\",\n \"type\": \"text\",\n \"tags\": {\"env\": \"prod\"},\n \"points\": [[1708272000000, \"operational\"]]\n },\n {\n \"deviceId\": \"abc-123\",\n \"name\": \"health\",\n \"type\": \"health\",\n \"tags\": {},\n \"points\": [[1708272000000, {\"status\": \"operational\"}]]\n }\n ]\n}"
1425
+ "<%= config.bin %> device rename <device-id> new-robot-name",
1426
+ "<%= config.bin %> device rename <device-id> new-robot-name --json"
1206
1427
  ],
1207
1428
  "flags": {
1208
1429
  "json": {
@@ -1232,52 +1453,49 @@
1232
1453
  "allowNo": false,
1233
1454
  "type": "boolean"
1234
1455
  },
1235
- "file": {
1236
- "char": "f",
1237
- "description": "Path to JSON file containing batch payload",
1238
- "exclusive": [
1239
- "stdin"
1240
- ],
1241
- "name": "file",
1242
- "hasDynamicHelp": false,
1243
- "multiple": false,
1244
- "type": "option"
1245
- },
1246
- "stdin": {
1247
- "description": "Read JSON payload from stdin",
1456
+ "toon": {
1457
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1248
1458
  "exclusive": [
1249
- "file"
1459
+ "json"
1250
1460
  ],
1251
- "name": "stdin",
1461
+ "helpGroup": "GLOBAL",
1462
+ "name": "toon",
1252
1463
  "allowNo": false,
1253
1464
  "type": "boolean"
1254
1465
  }
1255
1466
  },
1256
1467
  "hasDynamicHelp": false,
1257
1468
  "hiddenAliases": [],
1258
- "id": "ingest:batch",
1469
+ "id": "device:rename",
1259
1470
  "pluginAlias": "@formant/formant-cli",
1260
1471
  "pluginName": "@formant/formant-cli",
1261
1472
  "pluginType": "core",
1262
1473
  "strict": true,
1263
- "summary": "Ingest batch data from file or stdin",
1474
+ "summary": "Rename a device",
1264
1475
  "enableJsonFlag": true,
1265
1476
  "isESM": true,
1266
1477
  "relativePath": [
1267
1478
  "dist",
1268
1479
  "commands",
1269
- "ingest",
1270
- "batch.js"
1480
+ "device",
1481
+ "rename.js"
1271
1482
  ]
1272
1483
  },
1273
- "ingest:bitset": {
1484
+ "device:streams": {
1274
1485
  "aliases": [],
1275
- "args": {},
1276
- "description": "Ingest a bitset data point to a device stream.\n\nSends a bitset (array of named boolean values) to the specified device stream. A bitset\nconsists of parallel arrays of keys (strings) and values (booleans).\n\nBitsets are useful for representing sets of binary states, flags, or boolean sensor readings\nwhere you have multiple named on/off states.\n\nConstraints:\n- Must have 1-1000 key/value pairs\n- Keys must be max 255 characters each\n- Keys and values arrays must have the same length",
1486
+ "args": {
1487
+ "id": {
1488
+ "description": "Device ID (UUID)",
1489
+ "name": "id",
1490
+ "required": true
1491
+ }
1492
+ },
1493
+ "description": "List telemetry streams for a device with data presence.\n\nShows streams from the device configuration and any streams discovered from\ningested data. Each stream is enriched with presence info from the analytics\nbackend: data point count, last seen time, and a freshness indicator\n(active/recent/stale/dormant).\n\nUnconfigured streams (discovered from data only) are marked with SOURCE \"data\".",
1277
1494
  "examples": [
1278
- "<%= config.bin %> ingest bitset --device <device-id> --stream sensors --keys \"door,window,motion\" --values \"true,false,true\"",
1279
- "<%= config.bin %> ingest bitset --device <device-id> --stream flags --keys \"active,paused,error\" --values \"true,false,false\" --tag system=main",
1280
- "<%= config.bin %> ingest bitset --device <device-id> --stream states --keys \"a,b\" --values \"false,true\""
1495
+ "<%= config.bin %> device streams <device-id>",
1496
+ "<%= config.bin %> device streams <device-id> --with-data",
1497
+ "<%= config.bin %> device streams <device-id> --with-data --days 30",
1498
+ "<%= config.bin %> device streams <device-id> --json"
1281
1499
  ],
1282
1500
  "flags": {
1283
1501
  "json": {
@@ -1307,192 +1525,63 @@
1307
1525
  "allowNo": false,
1308
1526
  "type": "boolean"
1309
1527
  },
1310
- "device": {
1311
- "char": "d",
1312
- "description": "Device ID (UUID)",
1313
- "name": "device",
1314
- "required": true,
1315
- "hasDynamicHelp": false,
1316
- "multiple": false,
1317
- "type": "option"
1318
- },
1319
- "stream": {
1320
- "char": "s",
1321
- "description": "Stream name",
1322
- "name": "stream",
1323
- "required": true,
1324
- "hasDynamicHelp": false,
1325
- "multiple": false,
1326
- "type": "option"
1327
- },
1328
- "keys": {
1329
- "char": "k",
1330
- "description": "Comma-separated list of key names (1-1000 keys, max 255 chars each)",
1331
- "name": "keys",
1332
- "required": true,
1333
- "hasDynamicHelp": false,
1334
- "multiple": false,
1335
- "type": "option"
1336
- },
1337
- "values": {
1338
- "char": "v",
1339
- "description": "Comma-separated list of boolean values (true/false, must match key count)",
1340
- "name": "values",
1341
- "required": true,
1342
- "hasDynamicHelp": false,
1343
- "multiple": false,
1344
- "type": "option"
1345
- },
1346
- "tag": {
1347
- "char": "t",
1348
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
1349
- "name": "tag",
1350
- "hasDynamicHelp": false,
1351
- "multiple": true,
1352
- "type": "option"
1353
- },
1354
- "timestamp": {
1355
- "description": "Unix timestamp in milliseconds (defaults to now)",
1356
- "name": "timestamp",
1357
- "hasDynamicHelp": false,
1358
- "multiple": false,
1359
- "type": "option"
1360
- }
1361
- },
1362
- "hasDynamicHelp": false,
1363
- "hiddenAliases": [],
1364
- "id": "ingest:bitset",
1365
- "pluginAlias": "@formant/formant-cli",
1366
- "pluginName": "@formant/formant-cli",
1367
- "pluginType": "core",
1368
- "strict": true,
1369
- "summary": "Ingest bitset data",
1370
- "enableJsonFlag": true,
1371
- "isESM": true,
1372
- "relativePath": [
1373
- "dist",
1374
- "commands",
1375
- "ingest",
1376
- "bitset.js"
1377
- ]
1378
- },
1379
- "ingest:health": {
1380
- "aliases": [],
1381
- "args": {},
1382
- "description": "Ingest a health status data point to a device stream.\n\nSends device health status information to the specified stream. Health data consists of:\n- status: One of \"unknown\", \"operational\", \"offline\", or \"error\"\n- clockSkewMs (optional): Clock skew in milliseconds between device and server\n\nHealth streams are used to track device operational state, system health, and time synchronization.",
1383
- "examples": [
1384
- "<%= config.bin %> ingest health --device <device-id> --stream system_health --status operational",
1385
- "<%= config.bin %> ingest health --device <device-id> --stream health --status error --tag component=motor",
1386
- "<%= config.bin %> ingest health --device <device-id> --stream sync --status operational --clock-skew 150"
1387
- ],
1388
- "flags": {
1389
- "json": {
1390
- "description": "Format output as json.",
1391
- "helpGroup": "GLOBAL",
1392
- "name": "json",
1393
- "allowNo": false,
1394
- "type": "boolean"
1395
- },
1396
- "dev": {
1397
- "description": "Target the dev environment",
1398
- "exclusive": [
1399
- "stage"
1400
- ],
1401
- "helpGroup": "GLOBAL",
1402
- "name": "dev",
1403
- "allowNo": false,
1404
- "type": "boolean"
1405
- },
1406
- "stage": {
1407
- "description": "Target the stage environment",
1528
+ "toon": {
1529
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1408
1530
  "exclusive": [
1409
- "dev"
1531
+ "json"
1410
1532
  ],
1411
1533
  "helpGroup": "GLOBAL",
1412
- "name": "stage",
1534
+ "name": "toon",
1413
1535
  "allowNo": false,
1414
1536
  "type": "boolean"
1415
1537
  },
1416
- "device": {
1417
- "char": "d",
1418
- "description": "Device ID (UUID)",
1419
- "name": "device",
1420
- "required": true,
1421
- "hasDynamicHelp": false,
1422
- "multiple": false,
1423
- "type": "option"
1424
- },
1425
- "stream": {
1426
- "char": "s",
1427
- "description": "Stream name",
1428
- "name": "stream",
1429
- "required": true,
1430
- "hasDynamicHelp": false,
1431
- "multiple": false,
1432
- "type": "option"
1433
- },
1434
- "status": {
1435
- "description": "Health status (unknown, operational, offline, or error)",
1436
- "name": "status",
1437
- "required": true,
1438
- "hasDynamicHelp": false,
1439
- "multiple": false,
1440
- "options": [
1441
- "unknown",
1442
- "operational",
1443
- "offline",
1444
- "error"
1445
- ],
1446
- "type": "option"
1447
- },
1448
- "clock-skew": {
1449
- "description": "Clock skew in milliseconds (optional)",
1450
- "name": "clock-skew",
1538
+ "days": {
1539
+ "description": "How many days back to look for stream data presence",
1540
+ "name": "days",
1541
+ "default": 7,
1451
1542
  "hasDynamicHelp": false,
1452
1543
  "multiple": false,
1453
1544
  "type": "option"
1454
1545
  },
1455
- "tag": {
1456
- "char": "t",
1457
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
1458
- "name": "tag",
1459
- "hasDynamicHelp": false,
1460
- "multiple": true,
1461
- "type": "option"
1462
- },
1463
- "timestamp": {
1464
- "description": "Unix timestamp in milliseconds (defaults to now)",
1465
- "name": "timestamp",
1466
- "hasDynamicHelp": false,
1467
- "multiple": false,
1468
- "type": "option"
1546
+ "with-data": {
1547
+ "char": "w",
1548
+ "description": "Only show streams that have data in the --days window",
1549
+ "name": "with-data",
1550
+ "allowNo": false,
1551
+ "type": "boolean"
1469
1552
  }
1470
1553
  },
1471
1554
  "hasDynamicHelp": false,
1472
1555
  "hiddenAliases": [],
1473
- "id": "ingest:health",
1556
+ "id": "device:streams",
1474
1557
  "pluginAlias": "@formant/formant-cli",
1475
1558
  "pluginName": "@formant/formant-cli",
1476
1559
  "pluginType": "core",
1477
1560
  "strict": true,
1478
- "summary": "Ingest health status data",
1561
+ "summary": "List device streams with data presence",
1479
1562
  "enableJsonFlag": true,
1480
1563
  "isESM": true,
1481
1564
  "relativePath": [
1482
1565
  "dist",
1483
1566
  "commands",
1484
- "ingest",
1485
- "health.js"
1567
+ "device",
1568
+ "streams.js"
1486
1569
  ]
1487
1570
  },
1488
- "ingest:image": {
1571
+ "device:tag": {
1489
1572
  "aliases": [],
1490
- "args": {},
1491
- "description": "Ingest an image URL to a device stream.\n\nSends an image reference (by URL) to the specified device stream. The image must be accessible\nvia HTTP/HTTPS. Formant will fetch and store the image from the provided URL.\n\nImage streams are used for camera feeds, snapshots, diagnostic images, etc.",
1573
+ "args": {
1574
+ "id": {
1575
+ "description": "Device ID (UUID)",
1576
+ "name": "id",
1577
+ "required": true
1578
+ }
1579
+ },
1580
+ "description": "Add or update tags on a device.\n\nTags are key-value pairs. If a tag key already exists, its value will be updated.\nSpecify one or more tags with --tag key=value.",
1492
1581
  "examples": [
1493
- "<%= config.bin %> ingest image --device <device-id> --stream camera_front --url https://example.com/image.jpg",
1494
- "<%= config.bin %> ingest image --device <device-id> --stream snapshot --url https://example.com/snap.png --size 1024000",
1495
- "<%= config.bin %> ingest image --device <device-id> --stream detection --url https://example.com/detect.jpg --tag frame=123"
1582
+ "<%= config.bin %> device tag <device-id> --tag location=warehouse",
1583
+ "<%= config.bin %> device tag <device-id> --tag env=prod --tag region=us-east",
1584
+ "<%= config.bin %> device tag <device-id> --tag location=factory --json"
1496
1585
  ],
1497
1586
  "flags": {
1498
1587
  "json": {
@@ -1522,87 +1611,57 @@
1522
1611
  "allowNo": false,
1523
1612
  "type": "boolean"
1524
1613
  },
1525
- "device": {
1526
- "char": "d",
1527
- "description": "Device ID (UUID)",
1528
- "name": "device",
1529
- "required": true,
1530
- "hasDynamicHelp": false,
1531
- "multiple": false,
1532
- "type": "option"
1533
- },
1534
- "stream": {
1535
- "char": "s",
1536
- "description": "Stream name",
1537
- "name": "stream",
1538
- "required": true,
1539
- "hasDynamicHelp": false,
1540
- "multiple": false,
1541
- "type": "option"
1542
- },
1543
- "url": {
1544
- "char": "u",
1545
- "description": "Image URL (must be http:// or https://)",
1546
- "name": "url",
1547
- "required": true,
1548
- "hasDynamicHelp": false,
1549
- "multiple": false,
1550
- "type": "option"
1551
- },
1552
- "size": {
1553
- "description": "Image size in bytes (optional)",
1554
- "name": "size",
1555
- "hasDynamicHelp": false,
1556
- "multiple": false,
1557
- "type": "option"
1614
+ "toon": {
1615
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1616
+ "exclusive": [
1617
+ "json"
1618
+ ],
1619
+ "helpGroup": "GLOBAL",
1620
+ "name": "toon",
1621
+ "allowNo": false,
1622
+ "type": "boolean"
1558
1623
  },
1559
1624
  "tag": {
1560
1625
  "char": "t",
1561
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
1626
+ "description": "Tag to add or update (key=value), can be specified multiple times",
1562
1627
  "name": "tag",
1628
+ "required": true,
1563
1629
  "hasDynamicHelp": false,
1564
1630
  "multiple": true,
1565
1631
  "type": "option"
1566
- },
1567
- "timestamp": {
1568
- "description": "Unix timestamp in milliseconds (defaults to now)",
1569
- "name": "timestamp",
1570
- "hasDynamicHelp": false,
1571
- "multiple": false,
1572
- "type": "option"
1573
1632
  }
1574
1633
  },
1575
1634
  "hasDynamicHelp": false,
1576
1635
  "hiddenAliases": [],
1577
- "id": "ingest:image",
1636
+ "id": "device:tag",
1578
1637
  "pluginAlias": "@formant/formant-cli",
1579
1638
  "pluginName": "@formant/formant-cli",
1580
1639
  "pluginType": "core",
1581
1640
  "strict": true,
1582
- "summary": "Ingest image data",
1641
+ "summary": "Add or update tags on a device",
1583
1642
  "enableJsonFlag": true,
1584
1643
  "isESM": true,
1585
1644
  "relativePath": [
1586
1645
  "dist",
1587
1646
  "commands",
1588
- "ingest",
1589
- "image.js"
1647
+ "device",
1648
+ "tag.js"
1590
1649
  ]
1591
1650
  },
1592
- "ingest:json": {
1651
+ "device:untag": {
1593
1652
  "aliases": [],
1594
1653
  "args": {
1595
- "value": {
1596
- "description": "JSON value to ingest (as a JSON string)",
1597
- "name": "value",
1654
+ "id": {
1655
+ "description": "Device ID (UUID)",
1656
+ "name": "id",
1598
1657
  "required": true
1599
1658
  }
1600
1659
  },
1601
- "description": "Ingest a JSON data point to a device stream.\n\nSends structured JSON data to the specified device stream. The value must be valid JSON.\nJSON streams are used for complex structured data like configuration objects, state machines,\nnested telemetry, etc.\n\nNote: The JSON is sent as a JSON-encoded string to Formant.",
1660
+ "description": "Remove tags from a device.\n\nSpecify one or more tag keys to remove with --key.",
1602
1661
  "examples": [
1603
- "<%= config.bin %> ingest json '{\"x\":1,\"y\":2}' --device <device-id> --stream position",
1604
- "<%= config.bin %> ingest json '{\"status\":\"active\",\"mode\":\"auto\"}' --device <device-id> --stream config",
1605
- "<%= config.bin %> ingest json '[1,2,3,4,5]' --device <device-id> --stream array_data"
1662
+ "<%= config.bin %> device untag <device-id> --key location",
1663
+ "<%= config.bin %> device untag <device-id> --key env --key region",
1664
+ "<%= config.bin %> device untag <device-id> --key location --json"
1606
1665
  ],
1607
1666
  "flags": {
1608
1667
  "json": {
@@ -1632,71 +1691,52 @@
1632
1691
  "allowNo": false,
1633
1692
  "type": "boolean"
1634
1693
  },
1635
- "device": {
1636
- "char": "d",
1637
- "description": "Device ID (UUID)",
1638
- "name": "device",
1639
- "required": true,
1640
- "hasDynamicHelp": false,
1641
- "multiple": false,
1642
- "type": "option"
1694
+ "toon": {
1695
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1696
+ "exclusive": [
1697
+ "json"
1698
+ ],
1699
+ "helpGroup": "GLOBAL",
1700
+ "name": "toon",
1701
+ "allowNo": false,
1702
+ "type": "boolean"
1643
1703
  },
1644
- "stream": {
1645
- "char": "s",
1646
- "description": "Stream name",
1647
- "name": "stream",
1704
+ "key": {
1705
+ "char": "k",
1706
+ "description": "Tag key to remove, can be specified multiple times",
1707
+ "name": "key",
1648
1708
  "required": true,
1649
1709
  "hasDynamicHelp": false,
1650
- "multiple": false,
1651
- "type": "option"
1652
- },
1653
- "tag": {
1654
- "char": "t",
1655
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
1656
- "name": "tag",
1657
- "hasDynamicHelp": false,
1658
1710
  "multiple": true,
1659
1711
  "type": "option"
1660
- },
1661
- "timestamp": {
1662
- "description": "Unix timestamp in milliseconds (defaults to now)",
1663
- "name": "timestamp",
1664
- "hasDynamicHelp": false,
1665
- "multiple": false,
1666
- "type": "option"
1667
1712
  }
1668
1713
  },
1669
1714
  "hasDynamicHelp": false,
1670
1715
  "hiddenAliases": [],
1671
- "id": "ingest:json",
1716
+ "id": "device:untag",
1672
1717
  "pluginAlias": "@formant/formant-cli",
1673
1718
  "pluginName": "@formant/formant-cli",
1674
1719
  "pluginType": "core",
1675
1720
  "strict": true,
1676
- "summary": "Ingest JSON data",
1721
+ "summary": "Remove tags from a device",
1677
1722
  "enableJsonFlag": true,
1678
1723
  "isESM": true,
1679
1724
  "relativePath": [
1680
1725
  "dist",
1681
1726
  "commands",
1682
- "ingest",
1683
- "json.js"
1727
+ "device",
1728
+ "untag.js"
1684
1729
  ]
1685
1730
  },
1686
- "ingest:numeric": {
1731
+ "ingest:batch": {
1687
1732
  "aliases": [],
1688
- "args": {
1689
- "value": {
1690
- "description": "Numeric value to ingest",
1691
- "name": "value",
1692
- "required": true
1693
- }
1694
- },
1695
- "description": "Ingest a numeric data point to a device stream.\n\nSends a single numeric value to the specified device stream. The value must be a valid number.\nNumeric streams are commonly used for sensor readings like battery level, temperature, speed, etc.",
1733
+ "args": {},
1734
+ "description": "Ingest multiple data points in a single batch request.\n\nReads a JSON file (or stdin) containing a batch ingestion payload and sends all data points\nin a single API request. This is more efficient than sending individual data points when you\nhave multiple values to ingest.\n\nINPUT FORMAT:\nThe input JSON must have the following structure:\n{\n \"items\": [\n {\n \"deviceId\": \"device-uuid\", // Required: Device ID (UUID)\n \"name\": \"stream-name\", // Required: Stream name\n \"type\": \"numeric|text|json|...\", // Required: Data type (see below)\n \"tags\": {\"key\": \"value\"}, // Optional: Tags object (string key-value pairs)\n \"points\": [[timestamp_ms, value]] // Required: Array of [timestamp, value] pairs\n }\n ]\n}\n\nSUPPORTED TYPES AND VALUE FORMATS:\n- numeric: Number value\n Example: \"points\": [[1708272000000, 42.5]]\n\n- text: String value\n Example: \"points\": [[1708272000000, \"hello world\"]]\n\n- json: JSON object encoded as string\n Example: \"points\": [[1708272000000, \"{\\\"x\\\":10,\\\"y\\\":20}\"]]\n\n- image: Object with url (required), size and annotations (optional)\n Example: \"points\": [[1708272000000, {\"url\": \"https://example.com/img.jpg\", \"size\": 102400}]]\n\n- video: Object with url, duration, mimeType (required), size (optional)\n Example: \"points\": [[1708272000000, {\"url\": \"https://example.com/vid.mp4\", \"duration\": 30000, \"mimeType\": \"video/mp4\"}]]\n\n- bitset: Object with keys array and values array (1-1000 pairs)\n Example: \"points\": [[1708272000000, {\"keys\": [\"door\", \"window\"], \"values\": [true, false]}]]\n\n- health: Object with status (required) and clockSkewMs (optional)\n Example: \"points\": [[1708272000000, {\"status\": \"operational\", \"clockSkewMs\": 150}]]\n Valid status values: \"unknown\", \"operational\", \"offline\", \"error\"\n\nEach item can have multiple points (timestamp/value pairs) for the same stream.\nTimestamps are Unix milliseconds (use Date.now() for current time).",
1696
1735
  "examples": [
1697
- "<%= config.bin %> ingest numeric 42.5 --device <device-id> --stream battery_level",
1698
- "<%= config.bin %> ingest numeric 98.6 --device <device-id> --stream temperature --tag unit=fahrenheit",
1699
- "<%= config.bin %> ingest numeric 1500 --device <device-id> --stream rpm --timestamp 1700000000000"
1736
+ "<%= config.bin %> ingest batch --file data.json",
1737
+ "<%= config.bin %> ingest batch --stdin < data.json",
1738
+ "cat payload.json | <%= config.bin %> ingest batch --stdin",
1739
+ "# Example payload.json with multiple types:\n{\n \"items\": [\n {\n \"deviceId\": \"abc-123\",\n \"name\": \"battery_level\",\n \"type\": \"numeric\",\n \"tags\": {\"env\": \"prod\"},\n \"points\": [[1708272000000, 42.5], [1708272060000, 41.8]]\n },\n {\n \"deviceId\": \"abc-123\",\n \"name\": \"status\",\n \"type\": \"text\",\n \"tags\": {\"env\": \"prod\"},\n \"points\": [[1708272000000, \"operational\"]]\n },\n {\n \"deviceId\": \"abc-123\",\n \"name\": \"health\",\n \"type\": \"health\",\n \"tags\": {},\n \"points\": [[1708272000000, {\"status\": \"operational\"}]]\n }\n ]\n}"
1700
1740
  ],
1701
1741
  "flags": {
1702
1742
  "json": {
@@ -1726,71 +1766,62 @@
1726
1766
  "allowNo": false,
1727
1767
  "type": "boolean"
1728
1768
  },
1729
- "device": {
1730
- "char": "d",
1731
- "description": "Device ID (UUID)",
1732
- "name": "device",
1733
- "required": true,
1734
- "hasDynamicHelp": false,
1735
- "multiple": false,
1736
- "type": "option"
1769
+ "toon": {
1770
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1771
+ "exclusive": [
1772
+ "json"
1773
+ ],
1774
+ "helpGroup": "GLOBAL",
1775
+ "name": "toon",
1776
+ "allowNo": false,
1777
+ "type": "boolean"
1737
1778
  },
1738
- "stream": {
1739
- "char": "s",
1740
- "description": "Stream name",
1741
- "name": "stream",
1742
- "required": true,
1779
+ "file": {
1780
+ "char": "f",
1781
+ "description": "Path to JSON file containing batch payload",
1782
+ "exclusive": [
1783
+ "stdin"
1784
+ ],
1785
+ "name": "file",
1743
1786
  "hasDynamicHelp": false,
1744
1787
  "multiple": false,
1745
1788
  "type": "option"
1746
1789
  },
1747
- "tag": {
1748
- "char": "t",
1749
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
1750
- "name": "tag",
1751
- "hasDynamicHelp": false,
1752
- "multiple": true,
1753
- "type": "option"
1754
- },
1755
- "timestamp": {
1756
- "description": "Unix timestamp in milliseconds (defaults to now)",
1757
- "name": "timestamp",
1758
- "hasDynamicHelp": false,
1759
- "multiple": false,
1760
- "type": "option"
1790
+ "stdin": {
1791
+ "description": "Read JSON payload from stdin",
1792
+ "exclusive": [
1793
+ "file"
1794
+ ],
1795
+ "name": "stdin",
1796
+ "allowNo": false,
1797
+ "type": "boolean"
1761
1798
  }
1762
1799
  },
1763
1800
  "hasDynamicHelp": false,
1764
1801
  "hiddenAliases": [],
1765
- "id": "ingest:numeric",
1802
+ "id": "ingest:batch",
1766
1803
  "pluginAlias": "@formant/formant-cli",
1767
1804
  "pluginName": "@formant/formant-cli",
1768
1805
  "pluginType": "core",
1769
1806
  "strict": true,
1770
- "summary": "Ingest numeric data",
1807
+ "summary": "Ingest batch data from file or stdin",
1771
1808
  "enableJsonFlag": true,
1772
1809
  "isESM": true,
1773
1810
  "relativePath": [
1774
1811
  "dist",
1775
1812
  "commands",
1776
1813
  "ingest",
1777
- "numeric.js"
1814
+ "batch.js"
1778
1815
  ]
1779
1816
  },
1780
- "ingest:text": {
1817
+ "ingest:bitset": {
1781
1818
  "aliases": [],
1782
- "args": {
1783
- "value": {
1784
- "description": "Text value to ingest",
1785
- "name": "value",
1786
- "required": true
1787
- }
1788
- },
1789
- "description": "Ingest a text data point to a device stream.\n\nSends a single text/string value to the specified device stream. Text streams are commonly\nused for logs, status messages, error messages, and other string data.",
1819
+ "args": {},
1820
+ "description": "Ingest a bitset data point to a device stream.\n\nSends a bitset (array of named boolean values) to the specified device stream. A bitset\nconsists of parallel arrays of keys (strings) and values (booleans).\n\nBitsets are useful for representing sets of binary states, flags, or boolean sensor readings\nwhere you have multiple named on/off states.\n\nConstraints:\n- Must have 1-1000 key/value pairs\n- Keys must be max 255 characters each\n- Keys and values arrays must have the same length",
1790
1821
  "examples": [
1791
- "<%= config.bin %> ingest text \"Robot started successfully\" --device <device-id> --stream status",
1792
- "<%= config.bin %> ingest text \"Error: sensor offline\" --device <device-id> --stream errors --tag severity=high",
1793
- "<%= config.bin %> ingest text \"Checkpoint A reached\" --device <device-id> --stream waypoints"
1822
+ "<%= config.bin %> ingest bitset --device <device-id> --stream sensors --keys \"door,window,motion\" --values \"true,false,true\"",
1823
+ "<%= config.bin %> ingest bitset --device <device-id> --stream flags --keys \"active,paused,error\" --values \"true,false,false\" --tag system=main",
1824
+ "<%= config.bin %> ingest bitset --device <device-id> --stream states --keys \"a,b\" --values \"false,true\""
1794
1825
  ],
1795
1826
  "flags": {
1796
1827
  "json": {
@@ -1820,6 +1851,16 @@
1820
1851
  "allowNo": false,
1821
1852
  "type": "boolean"
1822
1853
  },
1854
+ "toon": {
1855
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1856
+ "exclusive": [
1857
+ "json"
1858
+ ],
1859
+ "helpGroup": "GLOBAL",
1860
+ "name": "toon",
1861
+ "allowNo": false,
1862
+ "type": "boolean"
1863
+ },
1823
1864
  "device": {
1824
1865
  "char": "d",
1825
1866
  "description": "Device ID (UUID)",
@@ -1838,6 +1879,24 @@
1838
1879
  "multiple": false,
1839
1880
  "type": "option"
1840
1881
  },
1882
+ "keys": {
1883
+ "char": "k",
1884
+ "description": "Comma-separated list of key names (1-1000 keys, max 255 chars each)",
1885
+ "name": "keys",
1886
+ "required": true,
1887
+ "hasDynamicHelp": false,
1888
+ "multiple": false,
1889
+ "type": "option"
1890
+ },
1891
+ "values": {
1892
+ "char": "v",
1893
+ "description": "Comma-separated list of boolean values (true/false, must match key count)",
1894
+ "name": "values",
1895
+ "required": true,
1896
+ "hasDynamicHelp": false,
1897
+ "multiple": false,
1898
+ "type": "option"
1899
+ },
1841
1900
  "tag": {
1842
1901
  "char": "t",
1843
1902
  "description": "Tag as key=value where both are strings (can be specified multiple times)",
@@ -1856,29 +1915,29 @@
1856
1915
  },
1857
1916
  "hasDynamicHelp": false,
1858
1917
  "hiddenAliases": [],
1859
- "id": "ingest:text",
1918
+ "id": "ingest:bitset",
1860
1919
  "pluginAlias": "@formant/formant-cli",
1861
1920
  "pluginName": "@formant/formant-cli",
1862
1921
  "pluginType": "core",
1863
1922
  "strict": true,
1864
- "summary": "Ingest text data",
1923
+ "summary": "Ingest bitset data",
1865
1924
  "enableJsonFlag": true,
1866
1925
  "isESM": true,
1867
1926
  "relativePath": [
1868
1927
  "dist",
1869
1928
  "commands",
1870
1929
  "ingest",
1871
- "text.js"
1930
+ "bitset.js"
1872
1931
  ]
1873
1932
  },
1874
- "ingest:video": {
1933
+ "ingest:health": {
1875
1934
  "aliases": [],
1876
1935
  "args": {},
1877
- "description": "Ingest a video URL to a device stream.\n\nSends a video reference (by URL) to the specified device stream. The video must be accessible\nvia HTTP/HTTPS. You must provide the video duration in milliseconds.\n\nVideo streams are used for recorded video clips, timelapse videos, event recordings, etc.\n\nThe MIME type is auto-detected from the file extension (.mp4, .webm, .mov).",
1936
+ "description": "Ingest a health status data point to a device stream.\n\nSends device health status information to the specified stream. Health data consists of:\n- status: One of \"unknown\", \"operational\", \"offline\", or \"error\"\n- clockSkewMs (optional): Clock skew in milliseconds between device and server\n\nHealth streams are used to track device operational state, system health, and time synchronization.",
1878
1937
  "examples": [
1879
- "<%= config.bin %> ingest video --device <device-id> --stream recordings --url https://example.com/video.mp4 --duration 5000",
1880
- "<%= config.bin %> ingest video --device <device-id> --stream clips --url https://example.com/clip.webm --duration 3500 --size 2048000",
1881
- "<%= config.bin %> ingest video --device <device-id> --stream event_video --url https://example.com/event.mov --duration 10000 --tag event=collision"
1938
+ "<%= config.bin %> ingest health --device <device-id> --stream system_health --status operational",
1939
+ "<%= config.bin %> ingest health --device <device-id> --stream health --status error --tag component=motor",
1940
+ "<%= config.bin %> ingest health --device <device-id> --stream sync --status operational --clock-skew 150"
1882
1941
  ],
1883
1942
  "flags": {
1884
1943
  "json": {
@@ -1908,6 +1967,16 @@
1908
1967
  "allowNo": false,
1909
1968
  "type": "boolean"
1910
1969
  },
1970
+ "toon": {
1971
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1972
+ "exclusive": [
1973
+ "json"
1974
+ ],
1975
+ "helpGroup": "GLOBAL",
1976
+ "name": "toon",
1977
+ "allowNo": false,
1978
+ "type": "boolean"
1979
+ },
1911
1980
  "device": {
1912
1981
  "char": "d",
1913
1982
  "description": "Device ID (UUID)",
@@ -1926,26 +1995,23 @@
1926
1995
  "multiple": false,
1927
1996
  "type": "option"
1928
1997
  },
1929
- "url": {
1930
- "char": "u",
1931
- "description": "Video URL (must be http:// or https://)",
1932
- "name": "url",
1933
- "required": true,
1934
- "hasDynamicHelp": false,
1935
- "multiple": false,
1936
- "type": "option"
1937
- },
1938
- "duration": {
1939
- "description": "Video duration in milliseconds (required)",
1940
- "name": "duration",
1998
+ "status": {
1999
+ "description": "Health status (unknown, operational, offline, or error)",
2000
+ "name": "status",
1941
2001
  "required": true,
1942
2002
  "hasDynamicHelp": false,
1943
2003
  "multiple": false,
2004
+ "options": [
2005
+ "unknown",
2006
+ "operational",
2007
+ "offline",
2008
+ "error"
2009
+ ],
1944
2010
  "type": "option"
1945
2011
  },
1946
- "size": {
1947
- "description": "Video size in bytes (optional)",
1948
- "name": "size",
2012
+ "clock-skew": {
2013
+ "description": "Clock skew in milliseconds (optional)",
2014
+ "name": "clock-skew",
1949
2015
  "hasDynamicHelp": false,
1950
2016
  "multiple": false,
1951
2017
  "type": "option"
@@ -1968,29 +2034,29 @@
1968
2034
  },
1969
2035
  "hasDynamicHelp": false,
1970
2036
  "hiddenAliases": [],
1971
- "id": "ingest:video",
2037
+ "id": "ingest:health",
1972
2038
  "pluginAlias": "@formant/formant-cli",
1973
2039
  "pluginName": "@formant/formant-cli",
1974
2040
  "pluginType": "core",
1975
2041
  "strict": true,
1976
- "summary": "Ingest video data",
2042
+ "summary": "Ingest health status data",
1977
2043
  "enableJsonFlag": true,
1978
2044
  "isESM": true,
1979
2045
  "relativePath": [
1980
2046
  "dist",
1981
2047
  "commands",
1982
2048
  "ingest",
1983
- "video.js"
2049
+ "health.js"
1984
2050
  ]
1985
2051
  },
1986
- "investigation:analytics": {
2052
+ "ingest:image": {
1987
2053
  "aliases": [],
1988
2054
  "args": {},
1989
- "description": "Get investigation analytics with time-series data.\n\nReturns aggregated analytics about investigation runs over a time range,\noptionally grouped by result type or signal type.",
2055
+ "description": "Ingest an image URL to a device stream.\n\nSends an image reference (by URL) to the specified device stream. The image must be accessible\nvia HTTP/HTTPS. Formant will fetch and store the image from the provided URL.\n\nImage streams are used for camera feeds, snapshots, diagnostic images, etc.",
1990
2056
  "examples": [
1991
- "<%= config.bin %> investigation analytics --start 2026-01-01 --end 2026-02-01",
1992
- "<%= config.bin %> investigation analytics --start 2026-01-01 --end 2026-02-01 --interval hourly",
1993
- "<%= config.bin %> investigation analytics --start 2026-01-01 --end 2026-02-01 --group-by resultType --json"
2057
+ "<%= config.bin %> ingest image --device <device-id> --stream camera_front --url https://example.com/image.jpg",
2058
+ "<%= config.bin %> ingest image --device <device-id> --stream snapshot --url https://example.com/snap.png --size 1024000",
2059
+ "<%= config.bin %> ingest image --device <device-id> --stream detection --url https://example.com/detect.jpg --tag frame=123"
1994
2060
  ],
1995
2061
  "flags": {
1996
2062
  "json": {
@@ -2020,41 +2086,61 @@
2020
2086
  "allowNo": false,
2021
2087
  "type": "boolean"
2022
2088
  },
2023
- "end": {
2024
- "description": "End time (ISO 8601)",
2025
- "name": "end",
2089
+ "toon": {
2090
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2091
+ "exclusive": [
2092
+ "json"
2093
+ ],
2094
+ "helpGroup": "GLOBAL",
2095
+ "name": "toon",
2096
+ "allowNo": false,
2097
+ "type": "boolean"
2098
+ },
2099
+ "device": {
2100
+ "char": "d",
2101
+ "description": "Device ID (UUID)",
2102
+ "name": "device",
2026
2103
  "required": true,
2027
2104
  "hasDynamicHelp": false,
2028
2105
  "multiple": false,
2029
2106
  "type": "option"
2030
2107
  },
2031
- "group-by": {
2032
- "description": "Group results by",
2033
- "name": "group-by",
2108
+ "stream": {
2109
+ "char": "s",
2110
+ "description": "Stream name",
2111
+ "name": "stream",
2112
+ "required": true,
2034
2113
  "hasDynamicHelp": false,
2035
2114
  "multiple": false,
2036
- "options": [
2037
- "resultType",
2038
- "signalType"
2039
- ],
2040
2115
  "type": "option"
2041
2116
  },
2042
- "interval": {
2043
- "description": "Time interval for aggregation",
2044
- "name": "interval",
2045
- "default": "daily",
2117
+ "url": {
2118
+ "char": "u",
2119
+ "description": "Image URL (must be http:// or https://)",
2120
+ "name": "url",
2121
+ "required": true,
2046
2122
  "hasDynamicHelp": false,
2047
2123
  "multiple": false,
2048
- "options": [
2049
- "daily",
2050
- "hourly"
2051
- ],
2052
2124
  "type": "option"
2053
2125
  },
2054
- "start": {
2055
- "description": "Start time (ISO 8601)",
2056
- "name": "start",
2057
- "required": true,
2126
+ "size": {
2127
+ "description": "Image size in bytes (optional)",
2128
+ "name": "size",
2129
+ "hasDynamicHelp": false,
2130
+ "multiple": false,
2131
+ "type": "option"
2132
+ },
2133
+ "tag": {
2134
+ "char": "t",
2135
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
2136
+ "name": "tag",
2137
+ "hasDynamicHelp": false,
2138
+ "multiple": true,
2139
+ "type": "option"
2140
+ },
2141
+ "timestamp": {
2142
+ "description": "Unix timestamp in milliseconds (defaults to now)",
2143
+ "name": "timestamp",
2058
2144
  "hasDynamicHelp": false,
2059
2145
  "multiple": false,
2060
2146
  "type": "option"
@@ -2062,34 +2148,35 @@
2062
2148
  },
2063
2149
  "hasDynamicHelp": false,
2064
2150
  "hiddenAliases": [],
2065
- "id": "investigation:analytics",
2151
+ "id": "ingest:image",
2066
2152
  "pluginAlias": "@formant/formant-cli",
2067
2153
  "pluginName": "@formant/formant-cli",
2068
2154
  "pluginType": "core",
2069
2155
  "strict": true,
2070
- "summary": "Get investigation analytics",
2156
+ "summary": "Ingest image data",
2071
2157
  "enableJsonFlag": true,
2072
2158
  "isESM": true,
2073
2159
  "relativePath": [
2074
2160
  "dist",
2075
2161
  "commands",
2076
- "investigation",
2077
- "analytics.js"
2162
+ "ingest",
2163
+ "image.js"
2078
2164
  ]
2079
2165
  },
2080
- "investigation:get": {
2166
+ "ingest:json": {
2081
2167
  "aliases": [],
2082
2168
  "args": {
2083
- "id": {
2084
- "description": "Investigation (taskflow) ID",
2085
- "name": "id",
2169
+ "value": {
2170
+ "description": "JSON value to ingest (as a JSON string)",
2171
+ "name": "value",
2086
2172
  "required": true
2087
2173
  }
2088
2174
  },
2089
- "description": "Get detailed information about a specific investigation by ID.",
2175
+ "description": "Ingest a JSON data point to a device stream.\n\nSends structured JSON data to the specified device stream. The value must be valid JSON.\nJSON streams are used for complex structured data like configuration objects, state machines,\nnested telemetry, etc.\n\nNote: The JSON is sent as a JSON-encoded string to Formant.",
2090
2176
  "examples": [
2091
- "<%= config.bin %> investigation get <id>",
2092
- "<%= config.bin %> investigation get <id> --json"
2177
+ "<%= config.bin %> ingest json '{\"x\":1,\"y\":2}' --device <device-id> --stream position",
2178
+ "<%= config.bin %> ingest json '{\"status\":\"active\",\"mode\":\"auto\"}' --device <device-id> --stream config",
2179
+ "<%= config.bin %> ingest json '[1,2,3,4,5]' --device <device-id> --stream array_data"
2093
2180
  ],
2094
2181
  "flags": {
2095
2182
  "json": {
@@ -2118,33 +2205,82 @@
2118
2205
  "name": "stage",
2119
2206
  "allowNo": false,
2120
2207
  "type": "boolean"
2208
+ },
2209
+ "toon": {
2210
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2211
+ "exclusive": [
2212
+ "json"
2213
+ ],
2214
+ "helpGroup": "GLOBAL",
2215
+ "name": "toon",
2216
+ "allowNo": false,
2217
+ "type": "boolean"
2218
+ },
2219
+ "device": {
2220
+ "char": "d",
2221
+ "description": "Device ID (UUID)",
2222
+ "name": "device",
2223
+ "required": true,
2224
+ "hasDynamicHelp": false,
2225
+ "multiple": false,
2226
+ "type": "option"
2227
+ },
2228
+ "stream": {
2229
+ "char": "s",
2230
+ "description": "Stream name",
2231
+ "name": "stream",
2232
+ "required": true,
2233
+ "hasDynamicHelp": false,
2234
+ "multiple": false,
2235
+ "type": "option"
2236
+ },
2237
+ "tag": {
2238
+ "char": "t",
2239
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
2240
+ "name": "tag",
2241
+ "hasDynamicHelp": false,
2242
+ "multiple": true,
2243
+ "type": "option"
2244
+ },
2245
+ "timestamp": {
2246
+ "description": "Unix timestamp in milliseconds (defaults to now)",
2247
+ "name": "timestamp",
2248
+ "hasDynamicHelp": false,
2249
+ "multiple": false,
2250
+ "type": "option"
2121
2251
  }
2122
2252
  },
2123
2253
  "hasDynamicHelp": false,
2124
2254
  "hiddenAliases": [],
2125
- "id": "investigation:get",
2255
+ "id": "ingest:json",
2126
2256
  "pluginAlias": "@formant/formant-cli",
2127
2257
  "pluginName": "@formant/formant-cli",
2128
2258
  "pluginType": "core",
2129
2259
  "strict": true,
2130
- "summary": "Get an investigation by ID",
2260
+ "summary": "Ingest JSON data",
2131
2261
  "enableJsonFlag": true,
2132
2262
  "isESM": true,
2133
2263
  "relativePath": [
2134
2264
  "dist",
2135
2265
  "commands",
2136
- "investigation",
2137
- "get.js"
2266
+ "ingest",
2267
+ "json.js"
2138
2268
  ]
2139
2269
  },
2140
- "investigation:list": {
2270
+ "ingest:numeric": {
2141
2271
  "aliases": [],
2142
- "args": {},
2143
- "description": "List investigations (AI-powered analysis workflows) in your organization.\n\nInvestigations are automated AI workflows that analyze signals, diagnose problems,\nand produce reports. Use --signal-handler to filter for investigations that are\ntriggered automatically by signals.",
2272
+ "args": {
2273
+ "value": {
2274
+ "description": "Numeric value to ingest",
2275
+ "name": "value",
2276
+ "required": true
2277
+ }
2278
+ },
2279
+ "description": "Ingest a numeric data point to a device stream.\n\nSends a single numeric value to the specified device stream. The value must be a valid number.\nNumeric streams are commonly used for sensor readings like battery level, temperature, speed, etc.",
2144
2280
  "examples": [
2145
- "<%= config.bin %> investigation list",
2146
- "<%= config.bin %> investigation list --signal-handler",
2147
- "<%= config.bin %> investigation list --json"
2281
+ "<%= config.bin %> ingest numeric 42.5 --device <device-id> --stream battery_level",
2282
+ "<%= config.bin %> ingest numeric 98.6 --device <device-id> --stream temperature --tag unit=fahrenheit",
2283
+ "<%= config.bin %> ingest numeric 1500 --device <device-id> --stream rpm --timestamp 1700000000000"
2148
2284
  ],
2149
2285
  "flags": {
2150
2286
  "json": {
@@ -2174,49 +2310,81 @@
2174
2310
  "allowNo": false,
2175
2311
  "type": "boolean"
2176
2312
  },
2177
- "signal-handler": {
2178
- "description": "Only show investigations that handle signals",
2179
- "name": "signal-handler",
2313
+ "toon": {
2314
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2315
+ "exclusive": [
2316
+ "json"
2317
+ ],
2318
+ "helpGroup": "GLOBAL",
2319
+ "name": "toon",
2180
2320
  "allowNo": false,
2181
2321
  "type": "boolean"
2322
+ },
2323
+ "device": {
2324
+ "char": "d",
2325
+ "description": "Device ID (UUID)",
2326
+ "name": "device",
2327
+ "required": true,
2328
+ "hasDynamicHelp": false,
2329
+ "multiple": false,
2330
+ "type": "option"
2331
+ },
2332
+ "stream": {
2333
+ "char": "s",
2334
+ "description": "Stream name",
2335
+ "name": "stream",
2336
+ "required": true,
2337
+ "hasDynamicHelp": false,
2338
+ "multiple": false,
2339
+ "type": "option"
2340
+ },
2341
+ "tag": {
2342
+ "char": "t",
2343
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
2344
+ "name": "tag",
2345
+ "hasDynamicHelp": false,
2346
+ "multiple": true,
2347
+ "type": "option"
2348
+ },
2349
+ "timestamp": {
2350
+ "description": "Unix timestamp in milliseconds (defaults to now)",
2351
+ "name": "timestamp",
2352
+ "hasDynamicHelp": false,
2353
+ "multiple": false,
2354
+ "type": "option"
2182
2355
  }
2183
2356
  },
2184
2357
  "hasDynamicHelp": false,
2185
2358
  "hiddenAliases": [],
2186
- "id": "investigation:list",
2359
+ "id": "ingest:numeric",
2187
2360
  "pluginAlias": "@formant/formant-cli",
2188
2361
  "pluginName": "@formant/formant-cli",
2189
2362
  "pluginType": "core",
2190
2363
  "strict": true,
2191
- "summary": "List investigations",
2364
+ "summary": "Ingest numeric data",
2192
2365
  "enableJsonFlag": true,
2193
2366
  "isESM": true,
2194
2367
  "relativePath": [
2195
2368
  "dist",
2196
2369
  "commands",
2197
- "investigation",
2198
- "list.js"
2370
+ "ingest",
2371
+ "numeric.js"
2199
2372
  ]
2200
2373
  },
2201
- "investigation:run": {
2374
+ "ingest:text": {
2202
2375
  "aliases": [],
2203
2376
  "args": {
2204
- "investigationId": {
2205
- "description": "Investigation (taskflow) ID",
2206
- "name": "investigationId",
2207
- "required": true
2208
- },
2209
- "runId": {
2210
- "description": "Run ID",
2211
- "name": "runId",
2377
+ "value": {
2378
+ "description": "Text value to ingest",
2379
+ "name": "value",
2212
2380
  "required": true
2213
2381
  }
2214
2382
  },
2215
- "description": "Get detailed information about a specific investigation run.\n\nShows run details including status, signal information, events, and the complete execution \nlog with node inputs/outputs, task messages, tool usage, and results.\n\nUse this to trace the investigation run back to its signal and triggering event.",
2383
+ "description": "Ingest a text data point to a device stream.\n\nSends a single text/string value to the specified device stream. Text streams are commonly\nused for logs, status messages, error messages, and other string data.",
2216
2384
  "examples": [
2217
- "<%= config.bin %> investigation run <investigation-id> <run-id>",
2218
- "<%= config.bin %> investigation run <investigation-id> <run-id> --log-only",
2219
- "<%= config.bin %> investigation run <investigation-id> <run-id> --json"
2385
+ "<%= config.bin %> ingest text \"Robot started successfully\" --device <device-id> --stream status",
2386
+ "<%= config.bin %> ingest text \"Error: sensor offline\" --device <device-id> --stream errors --tag severity=high",
2387
+ "<%= config.bin %> ingest text \"Checkpoint A reached\" --device <device-id> --stream waypoints"
2220
2388
  ],
2221
2389
  "flags": {
2222
2390
  "json": {
@@ -2246,50 +2414,75 @@
2246
2414
  "allowNo": false,
2247
2415
  "type": "boolean"
2248
2416
  },
2249
- "log-only": {
2250
- "description": "Only show the execution log (skip run details)",
2251
- "name": "log-only",
2417
+ "toon": {
2418
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2419
+ "exclusive": [
2420
+ "json"
2421
+ ],
2422
+ "helpGroup": "GLOBAL",
2423
+ "name": "toon",
2252
2424
  "allowNo": false,
2253
2425
  "type": "boolean"
2254
2426
  },
2255
- "trace-signal": {
2256
- "description": "Fetch and display the signal and event information for this run",
2257
- "name": "trace-signal",
2258
- "allowNo": false,
2259
- "type": "boolean"
2427
+ "device": {
2428
+ "char": "d",
2429
+ "description": "Device ID (UUID)",
2430
+ "name": "device",
2431
+ "required": true,
2432
+ "hasDynamicHelp": false,
2433
+ "multiple": false,
2434
+ "type": "option"
2435
+ },
2436
+ "stream": {
2437
+ "char": "s",
2438
+ "description": "Stream name",
2439
+ "name": "stream",
2440
+ "required": true,
2441
+ "hasDynamicHelp": false,
2442
+ "multiple": false,
2443
+ "type": "option"
2444
+ },
2445
+ "tag": {
2446
+ "char": "t",
2447
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
2448
+ "name": "tag",
2449
+ "hasDynamicHelp": false,
2450
+ "multiple": true,
2451
+ "type": "option"
2452
+ },
2453
+ "timestamp": {
2454
+ "description": "Unix timestamp in milliseconds (defaults to now)",
2455
+ "name": "timestamp",
2456
+ "hasDynamicHelp": false,
2457
+ "multiple": false,
2458
+ "type": "option"
2260
2459
  }
2261
2460
  },
2262
2461
  "hasDynamicHelp": false,
2263
2462
  "hiddenAliases": [],
2264
- "id": "investigation:run",
2463
+ "id": "ingest:text",
2265
2464
  "pluginAlias": "@formant/formant-cli",
2266
2465
  "pluginName": "@formant/formant-cli",
2267
2466
  "pluginType": "core",
2268
2467
  "strict": true,
2269
- "summary": "Get investigation run details and execution log",
2468
+ "summary": "Ingest text data",
2270
2469
  "enableJsonFlag": true,
2271
2470
  "isESM": true,
2272
2471
  "relativePath": [
2273
2472
  "dist",
2274
2473
  "commands",
2275
- "investigation",
2276
- "run.js"
2474
+ "ingest",
2475
+ "text.js"
2277
2476
  ]
2278
2477
  },
2279
- "investigation:runs-list": {
2478
+ "ingest:video": {
2280
2479
  "aliases": [],
2281
- "args": {
2282
- "id": {
2283
- "description": "Investigation (taskflow) ID",
2284
- "name": "id",
2285
- "required": true
2286
- }
2287
- },
2288
- "description": "List actual investigation runs (not evaluation runs) for a specific investigation.\n\nShows runs with their status, signal IDs, and timestamps. Use 'investigations run' to see\ndetailed execution logs for a specific run.",
2480
+ "args": {},
2481
+ "description": "Ingest a video URL to a device stream.\n\nSends a video reference (by URL) to the specified device stream. The video must be accessible\nvia HTTP/HTTPS. You must provide the video duration in milliseconds.\n\nVideo streams are used for recorded video clips, timelapse videos, event recordings, etc.\n\nThe MIME type is auto-detected from the file extension (.mp4, .webm, .mov).",
2289
2482
  "examples": [
2290
- "<%= config.bin %> investigation runs-list <id>",
2291
- "<%= config.bin %> investigation runs-list <id> --limit 50",
2292
- "<%= config.bin %> investigation runs-list <id> --details --json"
2483
+ "<%= config.bin %> ingest video --device <device-id> --stream recordings --url https://example.com/video.mp4 --duration 5000",
2484
+ "<%= config.bin %> ingest video --device <device-id> --stream clips --url https://example.com/clip.webm --duration 3500 --size 2048000",
2485
+ "<%= config.bin %> ingest video --device <device-id> --stream event_video --url https://example.com/event.mov --duration 10000 --tag event=collision"
2293
2486
  ],
2294
2487
  "flags": {
2295
2488
  "json": {
@@ -2319,26 +2512,69 @@
2319
2512
  "allowNo": false,
2320
2513
  "type": "boolean"
2321
2514
  },
2322
- "details": {
2323
- "description": "Include detailed information about each run",
2324
- "name": "details",
2325
- "allowNo": false,
2326
- "type": "boolean"
2515
+ "toon": {
2516
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2517
+ "exclusive": [
2518
+ "json"
2519
+ ],
2520
+ "helpGroup": "GLOBAL",
2521
+ "name": "toon",
2522
+ "allowNo": false,
2523
+ "type": "boolean"
2524
+ },
2525
+ "device": {
2526
+ "char": "d",
2527
+ "description": "Device ID (UUID)",
2528
+ "name": "device",
2529
+ "required": true,
2530
+ "hasDynamicHelp": false,
2531
+ "multiple": false,
2532
+ "type": "option"
2533
+ },
2534
+ "stream": {
2535
+ "char": "s",
2536
+ "description": "Stream name",
2537
+ "name": "stream",
2538
+ "required": true,
2539
+ "hasDynamicHelp": false,
2540
+ "multiple": false,
2541
+ "type": "option"
2542
+ },
2543
+ "url": {
2544
+ "char": "u",
2545
+ "description": "Video URL (must be http:// or https://)",
2546
+ "name": "url",
2547
+ "required": true,
2548
+ "hasDynamicHelp": false,
2549
+ "multiple": false,
2550
+ "type": "option"
2551
+ },
2552
+ "duration": {
2553
+ "description": "Video duration in milliseconds (required)",
2554
+ "name": "duration",
2555
+ "required": true,
2556
+ "hasDynamicHelp": false,
2557
+ "multiple": false,
2558
+ "type": "option"
2327
2559
  },
2328
- "limit": {
2329
- "char": "l",
2330
- "description": "Maximum number of runs to return",
2331
- "name": "limit",
2332
- "default": 20,
2560
+ "size": {
2561
+ "description": "Video size in bytes (optional)",
2562
+ "name": "size",
2333
2563
  "hasDynamicHelp": false,
2334
2564
  "multiple": false,
2335
2565
  "type": "option"
2336
2566
  },
2337
- "offset": {
2338
- "char": "o",
2339
- "description": "Offset for pagination",
2340
- "name": "offset",
2341
- "default": 0,
2567
+ "tag": {
2568
+ "char": "t",
2569
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
2570
+ "name": "tag",
2571
+ "hasDynamicHelp": false,
2572
+ "multiple": true,
2573
+ "type": "option"
2574
+ },
2575
+ "timestamp": {
2576
+ "description": "Unix timestamp in milliseconds (defaults to now)",
2577
+ "name": "timestamp",
2342
2578
  "hasDynamicHelp": false,
2343
2579
  "multiple": false,
2344
2580
  "type": "option"
@@ -2346,34 +2582,28 @@
2346
2582
  },
2347
2583
  "hasDynamicHelp": false,
2348
2584
  "hiddenAliases": [],
2349
- "id": "investigation:runs-list",
2585
+ "id": "ingest:video",
2350
2586
  "pluginAlias": "@formant/formant-cli",
2351
2587
  "pluginName": "@formant/formant-cli",
2352
2588
  "pluginType": "core",
2353
2589
  "strict": true,
2354
- "summary": "List actual investigation runs",
2590
+ "summary": "Ingest video data",
2355
2591
  "enableJsonFlag": true,
2356
2592
  "isESM": true,
2357
2593
  "relativePath": [
2358
2594
  "dist",
2359
2595
  "commands",
2360
- "investigation",
2361
- "runs-list.js"
2596
+ "ingest",
2597
+ "video.js"
2362
2598
  ]
2363
2599
  },
2364
- "investigation:runs": {
2600
+ "org:get": {
2365
2601
  "aliases": [],
2366
- "args": {
2367
- "id": {
2368
- "description": "Investigation (taskflow) ID",
2369
- "name": "id",
2370
- "required": true
2371
- }
2372
- },
2373
- "description": "List evaluation runs for a specific investigation.",
2602
+ "args": {},
2603
+ "description": "Get information about your organization.\n\nDisplays the organization associated with your authenticated account.\nNo ID is needed — it is resolved automatically from your credentials.",
2374
2604
  "examples": [
2375
- "<%= config.bin %> investigation runs <id>",
2376
- "<%= config.bin %> investigation runs <id> --json"
2605
+ "<%= config.bin %> org get",
2606
+ "<%= config.bin %> org get --json"
2377
2607
  ],
2378
2608
  "flags": {
2379
2609
  "json": {
@@ -2402,32 +2632,44 @@
2402
2632
  "name": "stage",
2403
2633
  "allowNo": false,
2404
2634
  "type": "boolean"
2635
+ },
2636
+ "toon": {
2637
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2638
+ "exclusive": [
2639
+ "json"
2640
+ ],
2641
+ "helpGroup": "GLOBAL",
2642
+ "name": "toon",
2643
+ "allowNo": false,
2644
+ "type": "boolean"
2405
2645
  }
2406
2646
  },
2407
2647
  "hasDynamicHelp": false,
2408
2648
  "hiddenAliases": [],
2409
- "id": "investigation:runs",
2649
+ "id": "org:get",
2410
2650
  "pluginAlias": "@formant/formant-cli",
2411
2651
  "pluginName": "@formant/formant-cli",
2412
2652
  "pluginType": "core",
2413
2653
  "strict": true,
2414
- "summary": "List runs for an investigation",
2654
+ "summary": "Get your organization",
2415
2655
  "enableJsonFlag": true,
2416
2656
  "isESM": true,
2417
2657
  "relativePath": [
2418
2658
  "dist",
2419
2659
  "commands",
2420
- "investigation",
2421
- "runs.js"
2660
+ "org",
2661
+ "get.js"
2422
2662
  ]
2423
2663
  },
2424
- "investigation:stats": {
2664
+ "org:update": {
2425
2665
  "aliases": [],
2426
2666
  "args": {},
2427
- "description": "Get investigation statistics for a time range.",
2667
+ "description": "Update your organization's details.\n\nAt least one of --name or --description must be provided.",
2428
2668
  "examples": [
2429
- "<%= config.bin %> investigation stats --start 2026-01-01 --end 2026-02-01",
2430
- "<%= config.bin %> investigation stats --start 2026-01-01 --end 2026-02-01 --json"
2669
+ "<%= config.bin %> org update --name \"My Fleet\"",
2670
+ "<%= config.bin %> org update --description \"Production robot fleet\"",
2671
+ "<%= config.bin %> org update --name \"My Fleet\" --description \"Production robot fleet\"",
2672
+ "<%= config.bin %> org update --name \"My Fleet\" --json"
2431
2673
  ],
2432
2674
  "flags": {
2433
2675
  "json": {
@@ -2457,18 +2699,28 @@
2457
2699
  "allowNo": false,
2458
2700
  "type": "boolean"
2459
2701
  },
2460
- "end": {
2461
- "description": "End time (ISO 8601)",
2462
- "name": "end",
2463
- "required": true,
2702
+ "toon": {
2703
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2704
+ "exclusive": [
2705
+ "json"
2706
+ ],
2707
+ "helpGroup": "GLOBAL",
2708
+ "name": "toon",
2709
+ "allowNo": false,
2710
+ "type": "boolean"
2711
+ },
2712
+ "description": {
2713
+ "char": "d",
2714
+ "description": "New description for the organization",
2715
+ "name": "description",
2464
2716
  "hasDynamicHelp": false,
2465
2717
  "multiple": false,
2466
2718
  "type": "option"
2467
2719
  },
2468
- "start": {
2469
- "description": "Start time (ISO 8601)",
2470
- "name": "start",
2471
- "required": true,
2720
+ "name": {
2721
+ "char": "n",
2722
+ "description": "New name for the organization",
2723
+ "name": "name",
2472
2724
  "hasDynamicHelp": false,
2473
2725
  "multiple": false,
2474
2726
  "type": "option"
@@ -2476,34 +2728,34 @@
2476
2728
  },
2477
2729
  "hasDynamicHelp": false,
2478
2730
  "hiddenAliases": [],
2479
- "id": "investigation:stats",
2731
+ "id": "org:update",
2480
2732
  "pluginAlias": "@formant/formant-cli",
2481
2733
  "pluginName": "@formant/formant-cli",
2482
2734
  "pluginType": "core",
2483
2735
  "strict": true,
2484
- "summary": "Get investigation stats",
2736
+ "summary": "Update your organization",
2485
2737
  "enableJsonFlag": true,
2486
2738
  "isESM": true,
2487
2739
  "relativePath": [
2488
2740
  "dist",
2489
2741
  "commands",
2490
- "investigation",
2491
- "stats.js"
2742
+ "org",
2743
+ "update.js"
2492
2744
  ]
2493
2745
  },
2494
- "investigation:trigger": {
2746
+ "kv:get": {
2495
2747
  "aliases": [],
2496
2748
  "args": {
2497
- "id": {
2498
- "description": "Investigation (taskflow) ID",
2499
- "name": "id",
2749
+ "key": {
2750
+ "description": "Key to retrieve",
2751
+ "name": "key",
2500
2752
  "required": true
2501
2753
  }
2502
2754
  },
2503
- "description": "Trigger an investigation to run. Provide input text describing the problem\nor context for the investigation. The investigation runs asynchronously and\nreturns a run ID you can use to check results.",
2755
+ "description": "Get a value from the key-value store.\n\nThe key-value store allows devices and applications to store metadata.",
2504
2756
  "examples": [
2505
- "<%= config.bin %> investigation trigger <id> --input \"Robot stopped responding\"",
2506
- "<%= config.bin %> investigation trigger <id> --input \"Battery draining fast on device X\" --json"
2757
+ "<%= config.bin %> kv get my-key",
2758
+ "<%= config.bin %> kv get my-key --json"
2507
2759
  ],
2508
2760
  "flags": {
2509
2761
  "json": {
@@ -2533,53 +2785,43 @@
2533
2785
  "allowNo": false,
2534
2786
  "type": "boolean"
2535
2787
  },
2536
- "input": {
2537
- "char": "i",
2538
- "description": "Input text / problem description for the investigation",
2539
- "name": "input",
2540
- "required": true,
2541
- "hasDynamicHelp": false,
2542
- "multiple": false,
2543
- "type": "option"
2544
- },
2545
- "signal-id": {
2546
- "description": "Optional signal ID to associate with this run",
2547
- "name": "signal-id",
2548
- "hasDynamicHelp": false,
2549
- "multiple": false,
2550
- "type": "option"
2788
+ "toon": {
2789
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2790
+ "exclusive": [
2791
+ "json"
2792
+ ],
2793
+ "helpGroup": "GLOBAL",
2794
+ "name": "toon",
2795
+ "allowNo": false,
2796
+ "type": "boolean"
2551
2797
  }
2552
2798
  },
2553
2799
  "hasDynamicHelp": false,
2554
2800
  "hiddenAliases": [],
2555
- "id": "investigation:trigger",
2801
+ "id": "kv:get",
2556
2802
  "pluginAlias": "@formant/formant-cli",
2557
2803
  "pluginName": "@formant/formant-cli",
2558
2804
  "pluginType": "core",
2559
2805
  "strict": true,
2560
- "summary": "Trigger an investigation",
2806
+ "summary": "Get key-value",
2561
2807
  "enableJsonFlag": true,
2562
2808
  "isESM": true,
2563
2809
  "relativePath": [
2564
2810
  "dist",
2565
2811
  "commands",
2566
- "investigation",
2567
- "trigger.js"
2812
+ "kv",
2813
+ "get.js"
2568
2814
  ]
2569
2815
  },
2570
- "device:config": {
2816
+ "kv:list": {
2571
2817
  "aliases": [],
2572
- "args": {
2573
- "id": {
2574
- "description": "Device ID (UUID)",
2575
- "name": "id",
2576
- "required": true
2577
- }
2578
- },
2579
- "description": "Get the device configuration including stream definitions.\n\nShows the device's current configuration including telemetry streams, commands,\nand other settings.",
2818
+ "args": {},
2819
+ "description": "List all keys in the key-value store.\n\nShows all stored keys in the organization's key-value store. Use --prefix to filter\nkeys that start with a specific prefix, or --keys to query specific keys.",
2580
2820
  "examples": [
2581
- "<%= config.bin %> device config <device-id>",
2582
- "<%= config.bin %> device config <device-id> --json"
2821
+ "<%= config.bin %> kv list",
2822
+ "<%= config.bin %> kv list --prefix config",
2823
+ "<%= config.bin %> kv list --keys key1 --keys key2 --keys key3",
2824
+ "<%= config.bin %> kv list --json"
2583
2825
  ],
2584
2826
  "flags": {
2585
2827
  "json": {
@@ -2608,39 +2850,69 @@
2608
2850
  "name": "stage",
2609
2851
  "allowNo": false,
2610
2852
  "type": "boolean"
2853
+ },
2854
+ "toon": {
2855
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2856
+ "exclusive": [
2857
+ "json"
2858
+ ],
2859
+ "helpGroup": "GLOBAL",
2860
+ "name": "toon",
2861
+ "allowNo": false,
2862
+ "type": "boolean"
2863
+ },
2864
+ "keys": {
2865
+ "char": "k",
2866
+ "description": "Specific keys to query (can be specified multiple times)",
2867
+ "name": "keys",
2868
+ "hasDynamicHelp": false,
2869
+ "multiple": true,
2870
+ "type": "option"
2871
+ },
2872
+ "prefix": {
2873
+ "char": "p",
2874
+ "description": "Filter keys by prefix",
2875
+ "name": "prefix",
2876
+ "hasDynamicHelp": false,
2877
+ "multiple": false,
2878
+ "type": "option"
2611
2879
  }
2612
2880
  },
2613
2881
  "hasDynamicHelp": false,
2614
2882
  "hiddenAliases": [],
2615
- "id": "device:config",
2883
+ "id": "kv:list",
2616
2884
  "pluginAlias": "@formant/formant-cli",
2617
2885
  "pluginName": "@formant/formant-cli",
2618
2886
  "pluginType": "core",
2619
2887
  "strict": true,
2620
- "summary": "Get device configuration",
2888
+ "summary": "List key-value keys",
2621
2889
  "enableJsonFlag": true,
2622
2890
  "isESM": true,
2623
2891
  "relativePath": [
2624
2892
  "dist",
2625
2893
  "commands",
2626
- "device",
2627
- "config.js"
2894
+ "kv",
2895
+ "list.js"
2628
2896
  ]
2629
2897
  },
2630
- "device:create": {
2898
+ "kv:set": {
2631
2899
  "aliases": [],
2632
2900
  "args": {
2633
- "name": {
2634
- "description": "Name for the new device",
2635
- "name": "name",
2901
+ "key": {
2902
+ "description": "Key to set",
2903
+ "name": "key",
2904
+ "required": true
2905
+ },
2906
+ "value": {
2907
+ "description": "Value to store (JSON string)",
2908
+ "name": "value",
2636
2909
  "required": true
2637
2910
  }
2638
2911
  },
2639
- "description": "Create a new device in your fleet.\n\nThe device is created as enabled by default. You can optionally specify tags.",
2912
+ "description": "Set a value in the key-value store.\n\nStores a value associated with a key. The value should be a JSON string.",
2640
2913
  "examples": [
2641
- "<%= config.bin %> device create my-robot",
2642
- "<%= config.bin %> device create my-robot --tag location=warehouse --tag env=prod",
2643
- "<%= config.bin %> device create my-robot --json"
2914
+ "<%= config.bin %> kv set my-key '{\"data\": \"value\"}'",
2915
+ "<%= config.bin %> kv set config '{\"setting\": true}'"
2644
2916
  ],
2645
2917
  "flags": {
2646
2918
  "json": {
@@ -2670,45 +2942,42 @@
2670
2942
  "allowNo": false,
2671
2943
  "type": "boolean"
2672
2944
  },
2673
- "tag": {
2674
- "char": "t",
2675
- "description": "Tag to apply (key=value), can be specified multiple times",
2676
- "name": "tag",
2677
- "hasDynamicHelp": false,
2678
- "multiple": true,
2679
- "type": "option"
2945
+ "toon": {
2946
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2947
+ "exclusive": [
2948
+ "json"
2949
+ ],
2950
+ "helpGroup": "GLOBAL",
2951
+ "name": "toon",
2952
+ "allowNo": false,
2953
+ "type": "boolean"
2680
2954
  }
2681
2955
  },
2682
2956
  "hasDynamicHelp": false,
2683
2957
  "hiddenAliases": [],
2684
- "id": "device:create",
2958
+ "id": "kv:set",
2685
2959
  "pluginAlias": "@formant/formant-cli",
2686
2960
  "pluginName": "@formant/formant-cli",
2687
2961
  "pluginType": "core",
2688
2962
  "strict": true,
2689
- "summary": "Create a new device",
2963
+ "summary": "Set key-value",
2690
2964
  "enableJsonFlag": true,
2691
2965
  "isESM": true,
2692
2966
  "relativePath": [
2693
2967
  "dist",
2694
2968
  "commands",
2695
- "device",
2696
- "create.js"
2697
- ]
2698
- },
2699
- "device:delete": {
2700
- "aliases": [],
2701
- "args": {
2702
- "id": {
2703
- "description": "Device ID (UUID)",
2704
- "name": "id",
2705
- "required": true
2706
- }
2707
- },
2708
- "description": "Delete (disable) a device from your fleet.\n\nThis performs a soft-delete by disabling the device. The device and its telemetry\nhistory are preserved but it will no longer appear in device listings.",
2969
+ "kv",
2970
+ "set.js"
2971
+ ]
2972
+ },
2973
+ "investigation:analytics": {
2974
+ "aliases": [],
2975
+ "args": {},
2976
+ "description": "Get investigation analytics with time-series data.\n\nReturns aggregated analytics about investigation runs over a time range,\noptionally grouped by result type or signal type.",
2709
2977
  "examples": [
2710
- "<%= config.bin %> device delete <device-id>",
2711
- "<%= config.bin %> device delete <device-id> --json"
2978
+ "<%= config.bin %> investigation analytics --start 2026-01-01 --end 2026-02-01",
2979
+ "<%= config.bin %> investigation analytics --start 2026-01-01 --end 2026-02-01 --interval hourly",
2980
+ "<%= config.bin %> investigation analytics --start 2026-01-01 --end 2026-02-01 --group-by resultType --json"
2712
2981
  ],
2713
2982
  "flags": {
2714
2983
  "json": {
@@ -2737,38 +3006,87 @@
2737
3006
  "name": "stage",
2738
3007
  "allowNo": false,
2739
3008
  "type": "boolean"
3009
+ },
3010
+ "toon": {
3011
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3012
+ "exclusive": [
3013
+ "json"
3014
+ ],
3015
+ "helpGroup": "GLOBAL",
3016
+ "name": "toon",
3017
+ "allowNo": false,
3018
+ "type": "boolean"
3019
+ },
3020
+ "end": {
3021
+ "description": "End time (ISO 8601)",
3022
+ "name": "end",
3023
+ "required": true,
3024
+ "hasDynamicHelp": false,
3025
+ "multiple": false,
3026
+ "type": "option"
3027
+ },
3028
+ "group-by": {
3029
+ "description": "Group results by",
3030
+ "name": "group-by",
3031
+ "hasDynamicHelp": false,
3032
+ "multiple": false,
3033
+ "options": [
3034
+ "resultType",
3035
+ "signalType"
3036
+ ],
3037
+ "type": "option"
3038
+ },
3039
+ "interval": {
3040
+ "description": "Time interval for aggregation",
3041
+ "name": "interval",
3042
+ "default": "daily",
3043
+ "hasDynamicHelp": false,
3044
+ "multiple": false,
3045
+ "options": [
3046
+ "daily",
3047
+ "hourly"
3048
+ ],
3049
+ "type": "option"
3050
+ },
3051
+ "start": {
3052
+ "description": "Start time (ISO 8601)",
3053
+ "name": "start",
3054
+ "required": true,
3055
+ "hasDynamicHelp": false,
3056
+ "multiple": false,
3057
+ "type": "option"
2740
3058
  }
2741
3059
  },
2742
3060
  "hasDynamicHelp": false,
2743
3061
  "hiddenAliases": [],
2744
- "id": "device:delete",
3062
+ "id": "investigation:analytics",
2745
3063
  "pluginAlias": "@formant/formant-cli",
2746
3064
  "pluginName": "@formant/formant-cli",
2747
3065
  "pluginType": "core",
2748
3066
  "strict": true,
2749
- "summary": "Delete (disable) a device",
3067
+ "summary": "Get investigation analytics",
2750
3068
  "enableJsonFlag": true,
2751
3069
  "isESM": true,
2752
3070
  "relativePath": [
2753
3071
  "dist",
2754
3072
  "commands",
2755
- "device",
2756
- "delete.js"
3073
+ "investigation",
3074
+ "analytics.js"
2757
3075
  ]
2758
3076
  },
2759
- "device:get": {
3077
+ "investigation:get": {
2760
3078
  "aliases": [],
2761
3079
  "args": {
2762
3080
  "id": {
2763
- "description": "Device ID (UUID)",
3081
+ "description": "Investigation (taskflow) ID",
2764
3082
  "name": "id",
2765
3083
  "required": true
2766
3084
  }
2767
3085
  },
2768
- "description": "Get detailed information about a specific device by its ID.",
3086
+ "description": "Get detailed information about a specific investigation by ID.",
2769
3087
  "examples": [
2770
- "<%= config.bin %> device get <device-id>",
2771
- "<%= config.bin %> device get <device-id> --json"
3088
+ "<%= config.bin %> investigation get <id>",
3089
+ "<%= config.bin %> investigation get <id> --json"
2772
3090
  ],
2773
3091
  "flags": {
2774
3092
  "json": {
@@ -2797,37 +3115,43 @@
2797
3115
  "name": "stage",
2798
3116
  "allowNo": false,
2799
3117
  "type": "boolean"
3118
+ },
3119
+ "toon": {
3120
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3121
+ "exclusive": [
3122
+ "json"
3123
+ ],
3124
+ "helpGroup": "GLOBAL",
3125
+ "name": "toon",
3126
+ "allowNo": false,
3127
+ "type": "boolean"
2800
3128
  }
2801
3129
  },
2802
3130
  "hasDynamicHelp": false,
2803
3131
  "hiddenAliases": [],
2804
- "id": "device:get",
3132
+ "id": "investigation:get",
2805
3133
  "pluginAlias": "@formant/formant-cli",
2806
3134
  "pluginName": "@formant/formant-cli",
2807
3135
  "pluginType": "core",
2808
3136
  "strict": true,
2809
- "summary": "Get a device by ID",
3137
+ "summary": "Get an investigation by ID",
2810
3138
  "enableJsonFlag": true,
2811
3139
  "isESM": true,
2812
3140
  "relativePath": [
2813
3141
  "dist",
2814
3142
  "commands",
2815
- "device",
3143
+ "investigation",
2816
3144
  "get.js"
2817
3145
  ]
2818
3146
  },
2819
- "device:list": {
3147
+ "investigation:list": {
2820
3148
  "aliases": [],
2821
3149
  "args": {},
2822
- "description": "List robots and sensors in your fleet. Shows only online devices by default.\n\nUse --include-offline to include offline devices. Use --with-data to show only\ndevices that have ingested data. Each device is enriched with data-based last\nseen timestamp and datapoint count from analytics.",
3150
+ "description": "List investigations (AI-powered analysis workflows) in your organization.\n\nInvestigations are automated AI workflows that analyze signals, diagnose problems,\nand produce reports. Use --signal-handler to filter for investigations that are\ntriggered automatically by signals.",
2823
3151
  "examples": [
2824
- "<%= config.bin %> device list",
2825
- "<%= config.bin %> device list --include-offline",
2826
- "<%= config.bin %> device list --with-data",
2827
- "<%= config.bin %> device list --with-data --days 90",
2828
- "<%= config.bin %> device list --include-offline --limit 100",
2829
- "<%= config.bin %> device list --tag location=warehouse",
2830
- "<%= config.bin %> device list --name robot --dev --json"
3152
+ "<%= config.bin %> investigation list",
3153
+ "<%= config.bin %> investigation list --signal-handler",
3154
+ "<%= config.bin %> investigation list --json"
2831
3155
  ],
2832
3156
  "flags": {
2833
3157
  "json": {
@@ -2857,89 +3181,59 @@
2857
3181
  "allowNo": false,
2858
3182
  "type": "boolean"
2859
3183
  },
2860
- "include-offline": {
2861
- "char": "a",
2862
- "description": "Include offline devices",
2863
- "name": "include-offline",
3184
+ "toon": {
3185
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3186
+ "exclusive": [
3187
+ "json"
3188
+ ],
3189
+ "helpGroup": "GLOBAL",
3190
+ "name": "toon",
2864
3191
  "allowNo": false,
2865
3192
  "type": "boolean"
2866
3193
  },
2867
- "days": {
2868
- "description": "How many days back to search for last seen data",
2869
- "name": "days",
2870
- "default": 30,
2871
- "hasDynamicHelp": false,
2872
- "multiple": false,
2873
- "type": "option"
2874
- },
2875
- "limit": {
2876
- "char": "l",
2877
- "description": "Maximum number of devices to return",
2878
- "name": "limit",
2879
- "default": 50,
2880
- "hasDynamicHelp": false,
2881
- "multiple": false,
2882
- "type": "option"
2883
- },
2884
- "name": {
2885
- "char": "n",
2886
- "description": "Filter devices by name (search)",
2887
- "name": "name",
2888
- "hasDynamicHelp": false,
2889
- "multiple": false,
2890
- "type": "option"
2891
- },
2892
- "with-data": {
2893
- "char": "w",
2894
- "description": "Only show devices that have data in the last --days window",
2895
- "name": "with-data",
3194
+ "signal-handler": {
3195
+ "description": "Only show investigations that handle signals",
3196
+ "name": "signal-handler",
2896
3197
  "allowNo": false,
2897
3198
  "type": "boolean"
2898
- },
2899
- "tag": {
2900
- "char": "t",
2901
- "description": "Filter by tag (key=value), can be specified multiple times",
2902
- "name": "tag",
2903
- "hasDynamicHelp": false,
2904
- "multiple": true,
2905
- "type": "option"
2906
3199
  }
2907
3200
  },
2908
3201
  "hasDynamicHelp": false,
2909
3202
  "hiddenAliases": [],
2910
- "id": "device:list",
3203
+ "id": "investigation:list",
2911
3204
  "pluginAlias": "@formant/formant-cli",
2912
3205
  "pluginName": "@formant/formant-cli",
2913
3206
  "pluginType": "core",
2914
3207
  "strict": true,
2915
- "summary": "List robots and sensors in your fleet",
3208
+ "summary": "List investigations",
2916
3209
  "enableJsonFlag": true,
2917
3210
  "isESM": true,
2918
3211
  "relativePath": [
2919
3212
  "dist",
2920
3213
  "commands",
2921
- "device",
3214
+ "investigation",
2922
3215
  "list.js"
2923
3216
  ]
2924
3217
  },
2925
- "device:rename": {
3218
+ "investigation:run": {
2926
3219
  "aliases": [],
2927
3220
  "args": {
2928
- "id": {
2929
- "description": "Device ID (UUID)",
2930
- "name": "id",
3221
+ "investigationId": {
3222
+ "description": "Investigation (taskflow) ID",
3223
+ "name": "investigationId",
2931
3224
  "required": true
2932
3225
  },
2933
- "name": {
2934
- "description": "New name for the device",
2935
- "name": "name",
3226
+ "runId": {
3227
+ "description": "Run ID",
3228
+ "name": "runId",
2936
3229
  "required": true
2937
3230
  }
2938
3231
  },
2939
- "description": "Rename a device by updating its name.",
3232
+ "description": "Get detailed information about a specific investigation run.\n\nShows run details including status, signal information, events, and the complete execution \nlog with node inputs/outputs, task messages, tool usage, and results.\n\nUse this to trace the investigation run back to its signal and triggering event.",
2940
3233
  "examples": [
2941
- "<%= config.bin %> device rename <device-id> new-robot-name",
2942
- "<%= config.bin %> device rename <device-id> new-robot-name --json"
3234
+ "<%= config.bin %> investigation run <investigation-id> <run-id>",
3235
+ "<%= config.bin %> investigation run <investigation-id> <run-id> --log-only",
3236
+ "<%= config.bin %> investigation run <investigation-id> <run-id> --json"
2943
3237
  ],
2944
3238
  "flags": {
2945
3239
  "json": {
@@ -2968,40 +3262,61 @@
2968
3262
  "name": "stage",
2969
3263
  "allowNo": false,
2970
3264
  "type": "boolean"
3265
+ },
3266
+ "toon": {
3267
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3268
+ "exclusive": [
3269
+ "json"
3270
+ ],
3271
+ "helpGroup": "GLOBAL",
3272
+ "name": "toon",
3273
+ "allowNo": false,
3274
+ "type": "boolean"
3275
+ },
3276
+ "log-only": {
3277
+ "description": "Only show the execution log (skip run details)",
3278
+ "name": "log-only",
3279
+ "allowNo": false,
3280
+ "type": "boolean"
3281
+ },
3282
+ "trace-signal": {
3283
+ "description": "Fetch and display the signal and event information for this run",
3284
+ "name": "trace-signal",
3285
+ "allowNo": false,
3286
+ "type": "boolean"
2971
3287
  }
2972
3288
  },
2973
3289
  "hasDynamicHelp": false,
2974
3290
  "hiddenAliases": [],
2975
- "id": "device:rename",
3291
+ "id": "investigation:run",
2976
3292
  "pluginAlias": "@formant/formant-cli",
2977
3293
  "pluginName": "@formant/formant-cli",
2978
3294
  "pluginType": "core",
2979
3295
  "strict": true,
2980
- "summary": "Rename a device",
3296
+ "summary": "Get investigation run details and execution log",
2981
3297
  "enableJsonFlag": true,
2982
3298
  "isESM": true,
2983
3299
  "relativePath": [
2984
3300
  "dist",
2985
3301
  "commands",
2986
- "device",
2987
- "rename.js"
3302
+ "investigation",
3303
+ "run.js"
2988
3304
  ]
2989
3305
  },
2990
- "device:streams": {
3306
+ "investigation:runs-list": {
2991
3307
  "aliases": [],
2992
3308
  "args": {
2993
3309
  "id": {
2994
- "description": "Device ID (UUID)",
3310
+ "description": "Investigation (taskflow) ID",
2995
3311
  "name": "id",
2996
3312
  "required": true
2997
3313
  }
2998
3314
  },
2999
- "description": "List telemetry streams for a device with data presence.\n\nShows streams from the device configuration and any streams discovered from\ningested data. Each stream is enriched with presence info from the analytics\nbackend: data point count, last seen time, and a freshness indicator\n(active/recent/stale/dormant).\n\nUnconfigured streams (discovered from data only) are marked with SOURCE \"data\".",
3315
+ "description": "List actual investigation runs (not evaluation runs) for a specific investigation.\n\nShows runs with their status, signal IDs, and timestamps. Use 'investigations run' to see\ndetailed execution logs for a specific run.",
3000
3316
  "examples": [
3001
- "<%= config.bin %> device streams <device-id>",
3002
- "<%= config.bin %> device streams <device-id> --with-data",
3003
- "<%= config.bin %> device streams <device-id> --with-data --days 30",
3004
- "<%= config.bin %> device streams <device-id> --json"
3317
+ "<%= config.bin %> investigation runs-list <id>",
3318
+ "<%= config.bin %> investigation runs-list <id> --limit 50",
3319
+ "<%= config.bin %> investigation runs-list <id> --details --json"
3005
3320
  ],
3006
3321
  "flags": {
3007
3322
  "json": {
@@ -3031,53 +3346,71 @@
3031
3346
  "allowNo": false,
3032
3347
  "type": "boolean"
3033
3348
  },
3034
- "days": {
3035
- "description": "How many days back to look for stream data presence",
3036
- "name": "days",
3037
- "default": 7,
3349
+ "toon": {
3350
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3351
+ "exclusive": [
3352
+ "json"
3353
+ ],
3354
+ "helpGroup": "GLOBAL",
3355
+ "name": "toon",
3356
+ "allowNo": false,
3357
+ "type": "boolean"
3358
+ },
3359
+ "details": {
3360
+ "description": "Include detailed information about each run",
3361
+ "name": "details",
3362
+ "allowNo": false,
3363
+ "type": "boolean"
3364
+ },
3365
+ "limit": {
3366
+ "char": "l",
3367
+ "description": "Maximum number of runs to return",
3368
+ "name": "limit",
3369
+ "default": 20,
3038
3370
  "hasDynamicHelp": false,
3039
3371
  "multiple": false,
3040
3372
  "type": "option"
3041
3373
  },
3042
- "with-data": {
3043
- "char": "w",
3044
- "description": "Only show streams that have data in the --days window",
3045
- "name": "with-data",
3046
- "allowNo": false,
3047
- "type": "boolean"
3374
+ "offset": {
3375
+ "char": "o",
3376
+ "description": "Offset for pagination",
3377
+ "name": "offset",
3378
+ "default": 0,
3379
+ "hasDynamicHelp": false,
3380
+ "multiple": false,
3381
+ "type": "option"
3048
3382
  }
3049
3383
  },
3050
3384
  "hasDynamicHelp": false,
3051
3385
  "hiddenAliases": [],
3052
- "id": "device:streams",
3386
+ "id": "investigation:runs-list",
3053
3387
  "pluginAlias": "@formant/formant-cli",
3054
3388
  "pluginName": "@formant/formant-cli",
3055
3389
  "pluginType": "core",
3056
3390
  "strict": true,
3057
- "summary": "List device streams with data presence",
3391
+ "summary": "List actual investigation runs",
3058
3392
  "enableJsonFlag": true,
3059
3393
  "isESM": true,
3060
3394
  "relativePath": [
3061
3395
  "dist",
3062
3396
  "commands",
3063
- "device",
3064
- "streams.js"
3397
+ "investigation",
3398
+ "runs-list.js"
3065
3399
  ]
3066
3400
  },
3067
- "device:tag": {
3401
+ "investigation:runs": {
3068
3402
  "aliases": [],
3069
3403
  "args": {
3070
3404
  "id": {
3071
- "description": "Device ID (UUID)",
3405
+ "description": "Investigation (taskflow) ID",
3072
3406
  "name": "id",
3073
3407
  "required": true
3074
3408
  }
3075
3409
  },
3076
- "description": "Add or update tags on a device.\n\nTags are key-value pairs. If a tag key already exists, its value will be updated.\nSpecify one or more tags with --tag key=value.",
3410
+ "description": "List evaluation runs for a specific investigation.",
3077
3411
  "examples": [
3078
- "<%= config.bin %> device tag <device-id> --tag location=warehouse",
3079
- "<%= config.bin %> device tag <device-id> --tag env=prod --tag region=us-east",
3080
- "<%= config.bin %> device tag <device-id> --tag location=factory --json"
3412
+ "<%= config.bin %> investigation runs <id>",
3413
+ "<%= config.bin %> investigation runs <id> --json"
3081
3414
  ],
3082
3415
  "flags": {
3083
3416
  "json": {
@@ -3107,47 +3440,41 @@
3107
3440
  "allowNo": false,
3108
3441
  "type": "boolean"
3109
3442
  },
3110
- "tag": {
3111
- "char": "t",
3112
- "description": "Tag to add or update (key=value), can be specified multiple times",
3113
- "name": "tag",
3114
- "required": true,
3115
- "hasDynamicHelp": false,
3116
- "multiple": true,
3117
- "type": "option"
3443
+ "toon": {
3444
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3445
+ "exclusive": [
3446
+ "json"
3447
+ ],
3448
+ "helpGroup": "GLOBAL",
3449
+ "name": "toon",
3450
+ "allowNo": false,
3451
+ "type": "boolean"
3118
3452
  }
3119
3453
  },
3120
3454
  "hasDynamicHelp": false,
3121
3455
  "hiddenAliases": [],
3122
- "id": "device:tag",
3456
+ "id": "investigation:runs",
3123
3457
  "pluginAlias": "@formant/formant-cli",
3124
3458
  "pluginName": "@formant/formant-cli",
3125
3459
  "pluginType": "core",
3126
3460
  "strict": true,
3127
- "summary": "Add or update tags on a device",
3461
+ "summary": "List runs for an investigation",
3128
3462
  "enableJsonFlag": true,
3129
3463
  "isESM": true,
3130
3464
  "relativePath": [
3131
3465
  "dist",
3132
3466
  "commands",
3133
- "device",
3134
- "tag.js"
3467
+ "investigation",
3468
+ "runs.js"
3135
3469
  ]
3136
3470
  },
3137
- "device:untag": {
3471
+ "investigation:stats": {
3138
3472
  "aliases": [],
3139
- "args": {
3140
- "id": {
3141
- "description": "Device ID (UUID)",
3142
- "name": "id",
3143
- "required": true
3144
- }
3145
- },
3146
- "description": "Remove tags from a device.\n\nSpecify one or more tag keys to remove with --key.",
3473
+ "args": {},
3474
+ "description": "Get investigation statistics for a time range.",
3147
3475
  "examples": [
3148
- "<%= config.bin %> device untag <device-id> --key location",
3149
- "<%= config.bin %> device untag <device-id> --key env --key region",
3150
- "<%= config.bin %> device untag <device-id> --key location --json"
3476
+ "<%= config.bin %> investigation stats --start 2026-01-01 --end 2026-02-01",
3477
+ "<%= config.bin %> investigation stats --start 2026-01-01 --end 2026-02-01 --json"
3151
3478
  ],
3152
3479
  "flags": {
3153
3480
  "json": {
@@ -3177,45 +3504,63 @@
3177
3504
  "allowNo": false,
3178
3505
  "type": "boolean"
3179
3506
  },
3180
- "key": {
3181
- "char": "k",
3182
- "description": "Tag key to remove, can be specified multiple times",
3183
- "name": "key",
3507
+ "toon": {
3508
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3509
+ "exclusive": [
3510
+ "json"
3511
+ ],
3512
+ "helpGroup": "GLOBAL",
3513
+ "name": "toon",
3514
+ "allowNo": false,
3515
+ "type": "boolean"
3516
+ },
3517
+ "end": {
3518
+ "description": "End time (ISO 8601)",
3519
+ "name": "end",
3184
3520
  "required": true,
3185
3521
  "hasDynamicHelp": false,
3186
- "multiple": true,
3522
+ "multiple": false,
3523
+ "type": "option"
3524
+ },
3525
+ "start": {
3526
+ "description": "Start time (ISO 8601)",
3527
+ "name": "start",
3528
+ "required": true,
3529
+ "hasDynamicHelp": false,
3530
+ "multiple": false,
3187
3531
  "type": "option"
3188
3532
  }
3189
3533
  },
3190
3534
  "hasDynamicHelp": false,
3191
3535
  "hiddenAliases": [],
3192
- "id": "device:untag",
3536
+ "id": "investigation:stats",
3193
3537
  "pluginAlias": "@formant/formant-cli",
3194
3538
  "pluginName": "@formant/formant-cli",
3195
3539
  "pluginType": "core",
3196
3540
  "strict": true,
3197
- "summary": "Remove tags from a device",
3541
+ "summary": "Get investigation stats",
3198
3542
  "enableJsonFlag": true,
3199
3543
  "isESM": true,
3200
3544
  "relativePath": [
3201
3545
  "dist",
3202
3546
  "commands",
3203
- "device",
3204
- "untag.js"
3547
+ "investigation",
3548
+ "stats.js"
3205
3549
  ]
3206
3550
  },
3207
- "query": {
3551
+ "investigation:trigger": {
3208
3552
  "aliases": [],
3209
- "args": {},
3210
- "description": "Query telemetry stream data for a device over a time range.\n\nReturns time-series datapoints for the specified stream(s). Supports aggregation\nfor downsampling large datasets, and --latest-values-only to get only the most recent value.\n\nUse --all-streams with --latest-values-only to automatically discover and query all\nstreams — both from the device configuration and from actual ingested data\n(unconfigured streams included).\n\nStream types: numeric, text, image, video, location, json, bitset, battery, health,\n\"numeric set\", \"point cloud\", localization, \"transform tree\", file.\n\nAggregate levels: second, 5 seconds, 30 seconds, minute, 5 minutes, 30 minutes,\nhour, 4 hours, 12 hours, day, week, month, year.",
3553
+ "args": {
3554
+ "id": {
3555
+ "description": "Investigation (taskflow) ID",
3556
+ "name": "id",
3557
+ "required": true
3558
+ }
3559
+ },
3560
+ "description": "Trigger an investigation to run. Provide input text describing the problem\nor context for the investigation. The investigation runs asynchronously and\nreturns a run ID you can use to check results.",
3211
3561
  "examples": [
3212
- "<%= config.bin %> query --device <id> --stream battery_level --start 2026-01-01 --end 2026-01-02",
3213
- "<%= config.bin %> query --device <id> --stream speed --aggregate hour --start 2026-01-01 --end 2026-02-01",
3214
- "<%= config.bin %> query --device <id> --stream battery_level --stream temperature --start 2026-01-01 --end 2026-01-02",
3215
- "<%= config.bin %> query --device <id1> --device <id2> --stream battery_level --start 2026-01-01 --end 2026-01-02",
3216
- "<%= config.bin %> query --device <id> --stream battery_level --start 2026-01-01 --end 2026-02-01 --latest-values-only",
3217
- "<%= config.bin %> query --device <id> --all-streams --start 2026-01-01 --end 2026-02-01 --latest-values-only",
3218
- "<%= config.bin %> query --device <id> --stream temperature --type numeric --json"
3562
+ "<%= config.bin %> investigation trigger <id> --input \"Robot stopped responding\"",
3563
+ "<%= config.bin %> investigation trigger <id> --input \"Battery draining fast on device X\" --json"
3219
3564
  ],
3220
3565
  "flags": {
3221
3566
  "json": {
@@ -3245,78 +3590,28 @@
3245
3590
  "allowNo": false,
3246
3591
  "type": "boolean"
3247
3592
  },
3248
- "aggregate": {
3249
- "char": "a",
3250
- "description": "Aggregation level for downsampling",
3251
- "name": "aggregate",
3252
- "hasDynamicHelp": false,
3253
- "multiple": false,
3254
- "type": "option"
3255
- },
3256
- "all-streams": {
3257
- "description": "Query all streams for the device — from config and from ingested data (requires single --device and --latest-values-only)",
3258
- "name": "all-streams",
3259
- "allowNo": false,
3260
- "type": "boolean"
3261
- },
3262
- "days": {
3263
- "description": "How many days back to look for unconfigured streams when using --all-streams",
3264
- "name": "days",
3265
- "default": 14,
3266
- "hasDynamicHelp": false,
3267
- "multiple": false,
3268
- "type": "option"
3269
- },
3270
- "device": {
3271
- "char": "d",
3272
- "description": "Device ID(s), can be specified multiple times",
3273
- "name": "device",
3274
- "required": true,
3275
- "hasDynamicHelp": false,
3276
- "multiple": true,
3277
- "type": "option"
3278
- },
3279
- "end": {
3280
- "description": "End time (ISO 8601)",
3281
- "name": "end",
3282
- "required": true,
3283
- "hasDynamicHelp": false,
3284
- "multiple": false,
3285
- "type": "option"
3286
- },
3287
- "latest-values-only": {
3288
- "description": "Only return the most recent value per stream",
3289
- "name": "latest-values-only",
3593
+ "toon": {
3594
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3595
+ "exclusive": [
3596
+ "json"
3597
+ ],
3598
+ "helpGroup": "GLOBAL",
3599
+ "name": "toon",
3290
3600
  "allowNo": false,
3291
3601
  "type": "boolean"
3292
3602
  },
3293
- "limit": {
3294
- "char": "l",
3295
- "description": "Maximum number of datapoints",
3296
- "name": "limit",
3297
- "hasDynamicHelp": false,
3298
- "multiple": false,
3299
- "type": "option"
3300
- },
3301
- "start": {
3302
- "description": "Start time (ISO 8601)",
3303
- "name": "start",
3603
+ "input": {
3604
+ "char": "i",
3605
+ "description": "Input text / problem description for the investigation",
3606
+ "name": "input",
3304
3607
  "required": true,
3305
3608
  "hasDynamicHelp": false,
3306
3609
  "multiple": false,
3307
3610
  "type": "option"
3308
3611
  },
3309
- "stream": {
3310
- "char": "s",
3311
- "description": "Stream name(s), can be specified multiple times",
3312
- "name": "stream",
3313
- "hasDynamicHelp": false,
3314
- "multiple": true,
3315
- "type": "option"
3316
- },
3317
- "type": {
3318
- "description": "Filter by stream type",
3319
- "name": "type",
3612
+ "signal-id": {
3613
+ "description": "Optional signal ID to associate with this run",
3614
+ "name": "signal-id",
3320
3615
  "hasDynamicHelp": false,
3321
3616
  "multiple": false,
3322
3617
  "type": "option"
@@ -3324,19 +3619,19 @@
3324
3619
  },
3325
3620
  "hasDynamicHelp": false,
3326
3621
  "hiddenAliases": [],
3327
- "id": "query",
3622
+ "id": "investigation:trigger",
3328
3623
  "pluginAlias": "@formant/formant-cli",
3329
3624
  "pluginName": "@formant/formant-cli",
3330
3625
  "pluginType": "core",
3331
3626
  "strict": true,
3332
- "summary": "Query telemetry stream data",
3627
+ "summary": "Trigger an investigation",
3333
3628
  "enableJsonFlag": true,
3334
3629
  "isESM": true,
3335
3630
  "relativePath": [
3336
3631
  "dist",
3337
3632
  "commands",
3338
- "query",
3339
- "index.js"
3633
+ "investigation",
3634
+ "trigger.js"
3340
3635
  ]
3341
3636
  },
3342
3637
  "persona:delegate-task": {
@@ -3387,6 +3682,16 @@
3387
3682
  "allowNo": false,
3388
3683
  "type": "boolean"
3389
3684
  },
3685
+ "toon": {
3686
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3687
+ "exclusive": [
3688
+ "json"
3689
+ ],
3690
+ "helpGroup": "GLOBAL",
3691
+ "name": "toon",
3692
+ "allowNo": false,
3693
+ "type": "boolean"
3694
+ },
3390
3695
  "name": {
3391
3696
  "char": "n",
3392
3697
  "description": "Task name (defaults to first 50 chars of goal)",
@@ -3455,6 +3760,16 @@
3455
3760
  "name": "stage",
3456
3761
  "allowNo": false,
3457
3762
  "type": "boolean"
3763
+ },
3764
+ "toon": {
3765
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3766
+ "exclusive": [
3767
+ "json"
3768
+ ],
3769
+ "helpGroup": "GLOBAL",
3770
+ "name": "toon",
3771
+ "allowNo": false,
3772
+ "type": "boolean"
3458
3773
  }
3459
3774
  },
3460
3775
  "hasDynamicHelp": false,
@@ -3479,9 +3794,80 @@
3479
3794
  "args": {},
3480
3795
  "description": "List AI personas available in your organization.\n\nShows both built-in and custom personas with their ID, name, and description.",
3481
3796
  "examples": [
3482
- "<%= config.bin %> personas list",
3483
- "<%= config.bin %> personas list --json",
3484
- "<%= config.bin %> personas list --dev"
3797
+ "<%= config.bin %> personas list",
3798
+ "<%= config.bin %> personas list --json",
3799
+ "<%= config.bin %> personas list --dev"
3800
+ ],
3801
+ "flags": {
3802
+ "json": {
3803
+ "description": "Format output as json.",
3804
+ "helpGroup": "GLOBAL",
3805
+ "name": "json",
3806
+ "allowNo": false,
3807
+ "type": "boolean"
3808
+ },
3809
+ "dev": {
3810
+ "description": "Target the dev environment",
3811
+ "exclusive": [
3812
+ "stage"
3813
+ ],
3814
+ "helpGroup": "GLOBAL",
3815
+ "name": "dev",
3816
+ "allowNo": false,
3817
+ "type": "boolean"
3818
+ },
3819
+ "stage": {
3820
+ "description": "Target the stage environment",
3821
+ "exclusive": [
3822
+ "dev"
3823
+ ],
3824
+ "helpGroup": "GLOBAL",
3825
+ "name": "stage",
3826
+ "allowNo": false,
3827
+ "type": "boolean"
3828
+ },
3829
+ "toon": {
3830
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3831
+ "exclusive": [
3832
+ "json"
3833
+ ],
3834
+ "helpGroup": "GLOBAL",
3835
+ "name": "toon",
3836
+ "allowNo": false,
3837
+ "type": "boolean"
3838
+ }
3839
+ },
3840
+ "hasDynamicHelp": false,
3841
+ "hiddenAliases": [],
3842
+ "id": "persona:list",
3843
+ "pluginAlias": "@formant/formant-cli",
3844
+ "pluginName": "@formant/formant-cli",
3845
+ "pluginType": "core",
3846
+ "strict": true,
3847
+ "summary": "List AI personas",
3848
+ "enableJsonFlag": true,
3849
+ "isESM": true,
3850
+ "relativePath": [
3851
+ "dist",
3852
+ "commands",
3853
+ "persona",
3854
+ "list.js"
3855
+ ]
3856
+ },
3857
+ "persona:task-status": {
3858
+ "aliases": [],
3859
+ "args": {
3860
+ "taskId": {
3861
+ "description": "Task ID (from delegate-task output)",
3862
+ "name": "taskId",
3863
+ "required": true
3864
+ }
3865
+ },
3866
+ "description": "Check the status and results of a delegated task.\n\nShows all runs for a task including their status, result summary, and timestamps.",
3867
+ "examples": [
3868
+ "<%= config.bin %> persona task-status <task-id>",
3869
+ "<%= config.bin %> persona task-status <task-id> --json",
3870
+ "<%= config.bin %> persona task-status <task-id> --dev"
3485
3871
  ],
3486
3872
  "flags": {
3487
3873
  "json": {
@@ -3510,39 +3896,47 @@
3510
3896
  "name": "stage",
3511
3897
  "allowNo": false,
3512
3898
  "type": "boolean"
3899
+ },
3900
+ "toon": {
3901
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3902
+ "exclusive": [
3903
+ "json"
3904
+ ],
3905
+ "helpGroup": "GLOBAL",
3906
+ "name": "toon",
3907
+ "allowNo": false,
3908
+ "type": "boolean"
3513
3909
  }
3514
3910
  },
3515
3911
  "hasDynamicHelp": false,
3516
3912
  "hiddenAliases": [],
3517
- "id": "persona:list",
3913
+ "id": "persona:task-status",
3518
3914
  "pluginAlias": "@formant/formant-cli",
3519
3915
  "pluginName": "@formant/formant-cli",
3520
3916
  "pluginType": "core",
3521
3917
  "strict": true,
3522
- "summary": "List AI personas",
3918
+ "summary": "Check status of a delegated task",
3523
3919
  "enableJsonFlag": true,
3524
3920
  "isESM": true,
3525
3921
  "relativePath": [
3526
3922
  "dist",
3527
3923
  "commands",
3528
3924
  "persona",
3529
- "list.js"
3925
+ "task-status.js"
3530
3926
  ]
3531
3927
  },
3532
- "persona:task-status": {
3928
+ "query": {
3533
3929
  "aliases": [],
3534
- "args": {
3535
- "taskId": {
3536
- "description": "Task ID (from delegate-task output)",
3537
- "name": "taskId",
3538
- "required": true
3539
- }
3540
- },
3541
- "description": "Check the status and results of a delegated task.\n\nShows all runs for a task including their status, result summary, and timestamps.",
3930
+ "args": {},
3931
+ "description": "Query telemetry stream data for a device over a time range.\n\nReturns time-series datapoints for the specified stream(s). Supports aggregation\nfor downsampling large datasets, and --latest-values-only to get only the most recent value.\n\nUse --all-streams with --latest-values-only to automatically discover and query all\nstreams — both from the device configuration and from actual ingested data\n(unconfigured streams included).\n\nStream types: numeric, text, image, video, location, json, bitset, battery, health,\n\"numeric set\", \"point cloud\", localization, \"transform tree\", file.\n\nAggregate levels: second, 5 seconds, 30 seconds, minute, 5 minutes, 30 minutes,\nhour, 4 hours, 12 hours, day, week, month, year.",
3542
3932
  "examples": [
3543
- "<%= config.bin %> persona task-status <task-id>",
3544
- "<%= config.bin %> persona task-status <task-id> --json",
3545
- "<%= config.bin %> persona task-status <task-id> --dev"
3933
+ "<%= config.bin %> query --device <id> --stream battery_level --start 2026-01-01 --end 2026-01-02",
3934
+ "<%= config.bin %> query --device <id> --stream speed --aggregate hour --start 2026-01-01 --end 2026-02-01",
3935
+ "<%= config.bin %> query --device <id> --stream battery_level --stream temperature --start 2026-01-01 --end 2026-01-02",
3936
+ "<%= config.bin %> query --device <id1> --device <id2> --stream battery_level --start 2026-01-01 --end 2026-01-02",
3937
+ "<%= config.bin %> query --device <id> --stream battery_level --start 2026-01-01 --end 2026-02-01 --latest-values-only",
3938
+ "<%= config.bin %> query --device <id> --all-streams --start 2026-01-01 --end 2026-02-01 --latest-values-only",
3939
+ "<%= config.bin %> query --device <id> --stream temperature --type numeric --json"
3546
3940
  ],
3547
3941
  "flags": {
3548
3942
  "json": {
@@ -3571,38 +3965,124 @@
3571
3965
  "name": "stage",
3572
3966
  "allowNo": false,
3573
3967
  "type": "boolean"
3968
+ },
3969
+ "toon": {
3970
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3971
+ "exclusive": [
3972
+ "json"
3973
+ ],
3974
+ "helpGroup": "GLOBAL",
3975
+ "name": "toon",
3976
+ "allowNo": false,
3977
+ "type": "boolean"
3978
+ },
3979
+ "aggregate": {
3980
+ "char": "a",
3981
+ "description": "Aggregation level for downsampling",
3982
+ "name": "aggregate",
3983
+ "hasDynamicHelp": false,
3984
+ "multiple": false,
3985
+ "type": "option"
3986
+ },
3987
+ "all-streams": {
3988
+ "description": "Query all streams for the device — from config and from ingested data (requires single --device and --latest-values-only)",
3989
+ "name": "all-streams",
3990
+ "allowNo": false,
3991
+ "type": "boolean"
3992
+ },
3993
+ "days": {
3994
+ "description": "How many days back to look for unconfigured streams when using --all-streams",
3995
+ "name": "days",
3996
+ "default": 14,
3997
+ "hasDynamicHelp": false,
3998
+ "multiple": false,
3999
+ "type": "option"
4000
+ },
4001
+ "device": {
4002
+ "char": "d",
4003
+ "description": "Device ID(s), can be specified multiple times",
4004
+ "name": "device",
4005
+ "required": true,
4006
+ "hasDynamicHelp": false,
4007
+ "multiple": true,
4008
+ "type": "option"
4009
+ },
4010
+ "end": {
4011
+ "description": "End time (ISO 8601)",
4012
+ "name": "end",
4013
+ "required": true,
4014
+ "hasDynamicHelp": false,
4015
+ "multiple": false,
4016
+ "type": "option"
4017
+ },
4018
+ "latest-values-only": {
4019
+ "description": "Only return the most recent value per stream",
4020
+ "name": "latest-values-only",
4021
+ "allowNo": false,
4022
+ "type": "boolean"
4023
+ },
4024
+ "limit": {
4025
+ "char": "l",
4026
+ "description": "Maximum number of datapoints",
4027
+ "name": "limit",
4028
+ "hasDynamicHelp": false,
4029
+ "multiple": false,
4030
+ "type": "option"
4031
+ },
4032
+ "start": {
4033
+ "description": "Start time (ISO 8601)",
4034
+ "name": "start",
4035
+ "required": true,
4036
+ "hasDynamicHelp": false,
4037
+ "multiple": false,
4038
+ "type": "option"
4039
+ },
4040
+ "stream": {
4041
+ "char": "s",
4042
+ "description": "Stream name(s), can be specified multiple times",
4043
+ "name": "stream",
4044
+ "hasDynamicHelp": false,
4045
+ "multiple": true,
4046
+ "type": "option"
4047
+ },
4048
+ "type": {
4049
+ "description": "Filter by stream type",
4050
+ "name": "type",
4051
+ "hasDynamicHelp": false,
4052
+ "multiple": false,
4053
+ "type": "option"
3574
4054
  }
3575
4055
  },
3576
4056
  "hasDynamicHelp": false,
3577
4057
  "hiddenAliases": [],
3578
- "id": "persona:task-status",
4058
+ "id": "query",
3579
4059
  "pluginAlias": "@formant/formant-cli",
3580
4060
  "pluginName": "@formant/formant-cli",
3581
4061
  "pluginType": "core",
3582
4062
  "strict": true,
3583
- "summary": "Check status of a delegated task",
4063
+ "summary": "Query telemetry stream data",
3584
4064
  "enableJsonFlag": true,
3585
4065
  "isESM": true,
3586
4066
  "relativePath": [
3587
4067
  "dist",
3588
4068
  "commands",
3589
- "persona",
3590
- "task-status.js"
4069
+ "query",
4070
+ "index.js"
3591
4071
  ]
3592
4072
  },
3593
- "schedule:get": {
4073
+ "user:get": {
3594
4074
  "aliases": [],
3595
4075
  "args": {
3596
4076
  "id": {
3597
- "description": "Schedule ID (UUID)",
4077
+ "description": "User ID (UUID)",
3598
4078
  "name": "id",
3599
4079
  "required": true
3600
4080
  }
3601
4081
  },
3602
- "description": "Get detailed information about a schedule.\n\nShows the full schedule configuration including cron expression, command template,\ninvestigation link, and execution settings.",
4082
+ "description": "Get detailed information about a user.\n\nShows user details including email, name, roles, and account settings.",
3603
4083
  "examples": [
3604
- "<%= config.bin %> schedule get <schedule-id>",
3605
- "<%= config.bin %> schedule get <schedule-id> --json"
4084
+ "<%= config.bin %> user get <user-id>",
4085
+ "<%= config.bin %> user get <user-id> --json"
3606
4086
  ],
3607
4087
  "flags": {
3608
4088
  "json": {
@@ -3631,32 +4111,42 @@
3631
4111
  "name": "stage",
3632
4112
  "allowNo": false,
3633
4113
  "type": "boolean"
4114
+ },
4115
+ "toon": {
4116
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4117
+ "exclusive": [
4118
+ "json"
4119
+ ],
4120
+ "helpGroup": "GLOBAL",
4121
+ "name": "toon",
4122
+ "allowNo": false,
4123
+ "type": "boolean"
3634
4124
  }
3635
4125
  },
3636
4126
  "hasDynamicHelp": false,
3637
4127
  "hiddenAliases": [],
3638
- "id": "schedule:get",
4128
+ "id": "user:get",
3639
4129
  "pluginAlias": "@formant/formant-cli",
3640
4130
  "pluginName": "@formant/formant-cli",
3641
4131
  "pluginType": "core",
3642
4132
  "strict": true,
3643
- "summary": "Get schedule details",
4133
+ "summary": "Get user details",
3644
4134
  "enableJsonFlag": true,
3645
4135
  "isESM": true,
3646
4136
  "relativePath": [
3647
4137
  "dist",
3648
4138
  "commands",
3649
- "schedule",
4139
+ "user",
3650
4140
  "get.js"
3651
4141
  ]
3652
4142
  },
3653
- "schedule:list": {
4143
+ "user:list": {
3654
4144
  "aliases": [],
3655
4145
  "args": {},
3656
- "description": "List all schedules in your organization.\n\nSchedules can trigger commands or investigations on a recurring (cron) or one-time basis.",
4146
+ "description": "List all users in your organization.\n\nShows user accounts, their email addresses, and account status.",
3657
4147
  "examples": [
3658
- "<%= config.bin %> schedule list",
3659
- "<%= config.bin %> schedule list --json"
4148
+ "<%= config.bin %> user list",
4149
+ "<%= config.bin %> user list --json"
3660
4150
  ],
3661
4151
  "flags": {
3662
4152
  "json": {
@@ -3685,38 +4175,48 @@
3685
4175
  "name": "stage",
3686
4176
  "allowNo": false,
3687
4177
  "type": "boolean"
4178
+ },
4179
+ "toon": {
4180
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4181
+ "exclusive": [
4182
+ "json"
4183
+ ],
4184
+ "helpGroup": "GLOBAL",
4185
+ "name": "toon",
4186
+ "allowNo": false,
4187
+ "type": "boolean"
3688
4188
  }
3689
4189
  },
3690
4190
  "hasDynamicHelp": false,
3691
4191
  "hiddenAliases": [],
3692
- "id": "schedule:list",
4192
+ "id": "user:list",
3693
4193
  "pluginAlias": "@formant/formant-cli",
3694
4194
  "pluginName": "@formant/formant-cli",
3695
4195
  "pluginType": "core",
3696
4196
  "strict": true,
3697
- "summary": "List schedules",
4197
+ "summary": "List users",
3698
4198
  "enableJsonFlag": true,
3699
4199
  "isESM": true,
3700
4200
  "relativePath": [
3701
4201
  "dist",
3702
4202
  "commands",
3703
- "schedule",
4203
+ "user",
3704
4204
  "list.js"
3705
4205
  ]
3706
4206
  },
3707
- "user:get": {
4207
+ "schedule:get": {
3708
4208
  "aliases": [],
3709
4209
  "args": {
3710
4210
  "id": {
3711
- "description": "User ID (UUID)",
4211
+ "description": "Schedule ID (UUID)",
3712
4212
  "name": "id",
3713
4213
  "required": true
3714
4214
  }
3715
4215
  },
3716
- "description": "Get detailed information about a user.\n\nShows user details including email, name, roles, and account settings.",
4216
+ "description": "Get detailed information about a schedule.\n\nShows the full schedule configuration including cron expression, command template,\ninvestigation link, and execution settings.",
3717
4217
  "examples": [
3718
- "<%= config.bin %> user get <user-id>",
3719
- "<%= config.bin %> user get <user-id> --json"
4218
+ "<%= config.bin %> schedule get <schedule-id>",
4219
+ "<%= config.bin %> schedule get <schedule-id> --json"
3720
4220
  ],
3721
4221
  "flags": {
3722
4222
  "json": {
@@ -3745,32 +4245,42 @@
3745
4245
  "name": "stage",
3746
4246
  "allowNo": false,
3747
4247
  "type": "boolean"
4248
+ },
4249
+ "toon": {
4250
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4251
+ "exclusive": [
4252
+ "json"
4253
+ ],
4254
+ "helpGroup": "GLOBAL",
4255
+ "name": "toon",
4256
+ "allowNo": false,
4257
+ "type": "boolean"
3748
4258
  }
3749
4259
  },
3750
4260
  "hasDynamicHelp": false,
3751
4261
  "hiddenAliases": [],
3752
- "id": "user:get",
4262
+ "id": "schedule:get",
3753
4263
  "pluginAlias": "@formant/formant-cli",
3754
4264
  "pluginName": "@formant/formant-cli",
3755
4265
  "pluginType": "core",
3756
4266
  "strict": true,
3757
- "summary": "Get user details",
4267
+ "summary": "Get schedule details",
3758
4268
  "enableJsonFlag": true,
3759
4269
  "isESM": true,
3760
4270
  "relativePath": [
3761
4271
  "dist",
3762
4272
  "commands",
3763
- "user",
4273
+ "schedule",
3764
4274
  "get.js"
3765
4275
  ]
3766
4276
  },
3767
- "user:list": {
4277
+ "schedule:list": {
3768
4278
  "aliases": [],
3769
4279
  "args": {},
3770
- "description": "List all users in your organization.\n\nShows user accounts, their email addresses, and account status.",
4280
+ "description": "List all schedules in your organization.\n\nSchedules can trigger commands or investigations on a recurring (cron) or one-time basis.",
3771
4281
  "examples": [
3772
- "<%= config.bin %> user list",
3773
- "<%= config.bin %> user list --json"
4282
+ "<%= config.bin %> schedule list",
4283
+ "<%= config.bin %> schedule list --json"
3774
4284
  ],
3775
4285
  "flags": {
3776
4286
  "json": {
@@ -3799,22 +4309,32 @@
3799
4309
  "name": "stage",
3800
4310
  "allowNo": false,
3801
4311
  "type": "boolean"
4312
+ },
4313
+ "toon": {
4314
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4315
+ "exclusive": [
4316
+ "json"
4317
+ ],
4318
+ "helpGroup": "GLOBAL",
4319
+ "name": "toon",
4320
+ "allowNo": false,
4321
+ "type": "boolean"
3802
4322
  }
3803
4323
  },
3804
4324
  "hasDynamicHelp": false,
3805
4325
  "hiddenAliases": [],
3806
- "id": "user:list",
4326
+ "id": "schedule:list",
3807
4327
  "pluginAlias": "@formant/formant-cli",
3808
4328
  "pluginName": "@formant/formant-cli",
3809
4329
  "pluginType": "core",
3810
4330
  "strict": true,
3811
- "summary": "List users",
4331
+ "summary": "List schedules",
3812
4332
  "enableJsonFlag": true,
3813
4333
  "isESM": true,
3814
4334
  "relativePath": [
3815
4335
  "dist",
3816
4336
  "commands",
3817
- "user",
4337
+ "schedule",
3818
4338
  "list.js"
3819
4339
  ]
3820
4340
  },
@@ -3855,6 +4375,16 @@
3855
4375
  "allowNo": false,
3856
4376
  "type": "boolean"
3857
4377
  },
4378
+ "toon": {
4379
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4380
+ "exclusive": [
4381
+ "json"
4382
+ ],
4383
+ "helpGroup": "GLOBAL",
4384
+ "name": "toon",
4385
+ "allowNo": false,
4386
+ "type": "boolean"
4387
+ },
3858
4388
  "end": {
3859
4389
  "description": "End time (ISO 8601)",
3860
4390
  "name": "end",
@@ -3932,6 +4462,16 @@
3932
4462
  "allowNo": false,
3933
4463
  "type": "boolean"
3934
4464
  },
4465
+ "toon": {
4466
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4467
+ "exclusive": [
4468
+ "json"
4469
+ ],
4470
+ "helpGroup": "GLOBAL",
4471
+ "name": "toon",
4472
+ "allowNo": false,
4473
+ "type": "boolean"
4474
+ },
3935
4475
  "device": {
3936
4476
  "char": "d",
3937
4477
  "description": "Device ID to associate with this signal",
@@ -4028,6 +4568,16 @@
4028
4568
  "allowNo": false,
4029
4569
  "type": "boolean"
4030
4570
  },
4571
+ "toon": {
4572
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4573
+ "exclusive": [
4574
+ "json"
4575
+ ],
4576
+ "helpGroup": "GLOBAL",
4577
+ "name": "toon",
4578
+ "allowNo": false,
4579
+ "type": "boolean"
4580
+ },
4031
4581
  "trace": {
4032
4582
  "description": "Fetch and display the triggering event and event trigger information",
4033
4583
  "name": "trace",
@@ -4089,6 +4639,16 @@
4089
4639
  "allowNo": false,
4090
4640
  "type": "boolean"
4091
4641
  },
4642
+ "toon": {
4643
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4644
+ "exclusive": [
4645
+ "json"
4646
+ ],
4647
+ "helpGroup": "GLOBAL",
4648
+ "name": "toon",
4649
+ "allowNo": false,
4650
+ "type": "boolean"
4651
+ },
4092
4652
  "investigation": {
4093
4653
  "char": "i",
4094
4654
  "description": "Investigation (taskflow) ID — shows ground truth for signals that have one",
@@ -4153,6 +4713,16 @@
4153
4713
  "allowNo": false,
4154
4714
  "type": "boolean"
4155
4715
  },
4716
+ "toon": {
4717
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4718
+ "exclusive": [
4719
+ "json"
4720
+ ],
4721
+ "helpGroup": "GLOBAL",
4722
+ "name": "toon",
4723
+ "allowNo": false,
4724
+ "type": "boolean"
4725
+ },
4156
4726
  "end": {
4157
4727
  "description": "End time (ISO 8601)",
4158
4728
  "name": "end",
@@ -4258,6 +4828,16 @@
4258
4828
  "name": "stage",
4259
4829
  "allowNo": false,
4260
4830
  "type": "boolean"
4831
+ },
4832
+ "toon": {
4833
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4834
+ "exclusive": [
4835
+ "json"
4836
+ ],
4837
+ "helpGroup": "GLOBAL",
4838
+ "name": "toon",
4839
+ "allowNo": false,
4840
+ "type": "boolean"
4261
4841
  }
4262
4842
  },
4263
4843
  "hasDynamicHelp": false,
@@ -4278,5 +4858,5 @@
4278
4858
  ]
4279
4859
  }
4280
4860
  },
4281
- "version": "0.4.5"
4861
+ "version": "0.5.0"
4282
4862
  }