@formant/formant-cli 0.4.5 → 0.5.2

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,
@@ -181,6 +201,16 @@
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,
@@ -238,6 +268,16 @@
238
268
  "allowNo": false,
239
269
  "type": "boolean"
240
270
  },
271
+ "toon": {
272
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
273
+ "exclusive": [
274
+ "json"
275
+ ],
276
+ "helpGroup": "GLOBAL",
277
+ "name": "toon",
278
+ "allowNo": false,
279
+ "type": "boolean"
280
+ },
241
281
  "device": {
242
282
  "char": "d",
243
283
  "description": "Filter by device ID",
@@ -307,19 +347,19 @@
307
347
  "list.js"
308
348
  ]
309
349
  },
310
- "fleet:get": {
350
+ "event-trigger:get": {
311
351
  "aliases": [],
312
352
  "args": {
313
353
  "id": {
314
- "description": "Fleet (group) ID (UUID)",
354
+ "description": "Event trigger ID (UUID)",
315
355
  "name": "id",
316
356
  "required": true
317
357
  }
318
358
  },
319
- "description": "Get detailed information about a device group (fleet).\n\nShows the full fleet configuration including member devices and settings.",
359
+ "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.",
320
360
  "examples": [
321
- "<%= config.bin %> fleet get <fleet-id>",
322
- "<%= config.bin %> fleet get <fleet-id> --json"
361
+ "<%= config.bin %> event-trigger get <trigger-id>",
362
+ "<%= config.bin %> event-trigger get <trigger-id> --json"
323
363
  ],
324
364
  "flags": {
325
365
  "json": {
@@ -348,32 +388,42 @@
348
388
  "name": "stage",
349
389
  "allowNo": false,
350
390
  "type": "boolean"
391
+ },
392
+ "toon": {
393
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
394
+ "exclusive": [
395
+ "json"
396
+ ],
397
+ "helpGroup": "GLOBAL",
398
+ "name": "toon",
399
+ "allowNo": false,
400
+ "type": "boolean"
351
401
  }
352
402
  },
353
403
  "hasDynamicHelp": false,
354
404
  "hiddenAliases": [],
355
- "id": "fleet:get",
405
+ "id": "event-trigger:get",
356
406
  "pluginAlias": "@formant/formant-cli",
357
407
  "pluginName": "@formant/formant-cli",
358
408
  "pluginType": "core",
359
409
  "strict": true,
360
- "summary": "Get fleet details",
410
+ "summary": "Get event trigger details",
361
411
  "enableJsonFlag": true,
362
412
  "isESM": true,
363
413
  "relativePath": [
364
414
  "dist",
365
415
  "commands",
366
- "fleet",
416
+ "event-trigger",
367
417
  "get.js"
368
418
  ]
369
419
  },
370
- "fleet:list": {
420
+ "event-trigger:list": {
371
421
  "aliases": [],
372
422
  "args": {},
373
- "description": "List all device groups (fleets) in your organization.\n\nDevice groups allow you to organize and manage sets of devices together.",
423
+ "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.",
374
424
  "examples": [
375
- "<%= config.bin %> fleet list",
376
- "<%= config.bin %> fleet list --json"
425
+ "<%= config.bin %> event-trigger list",
426
+ "<%= config.bin %> event-trigger list --json"
377
427
  ],
378
428
  "flags": {
379
429
  "json": {
@@ -402,38 +452,48 @@
402
452
  "name": "stage",
403
453
  "allowNo": false,
404
454
  "type": "boolean"
455
+ },
456
+ "toon": {
457
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
458
+ "exclusive": [
459
+ "json"
460
+ ],
461
+ "helpGroup": "GLOBAL",
462
+ "name": "toon",
463
+ "allowNo": false,
464
+ "type": "boolean"
405
465
  }
406
466
  },
407
467
  "hasDynamicHelp": false,
408
468
  "hiddenAliases": [],
409
- "id": "fleet:list",
469
+ "id": "event-trigger:list",
410
470
  "pluginAlias": "@formant/formant-cli",
411
471
  "pluginName": "@formant/formant-cli",
412
472
  "pluginType": "core",
413
473
  "strict": true,
414
- "summary": "List device groups",
474
+ "summary": "List event trigger rules",
415
475
  "enableJsonFlag": true,
416
476
  "isESM": true,
417
477
  "relativePath": [
418
478
  "dist",
419
479
  "commands",
420
- "fleet",
480
+ "event-trigger",
421
481
  "list.js"
422
482
  ]
423
483
  },
424
- "event-trigger:get": {
484
+ "fleet:get": {
425
485
  "aliases": [],
426
486
  "args": {
427
487
  "id": {
428
- "description": "Event trigger ID (UUID)",
488
+ "description": "Fleet (group) ID (UUID)",
429
489
  "name": "id",
430
490
  "required": true
431
491
  }
432
492
  },
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.",
493
+ "description": "Get detailed information about a device group (fleet).\n\nShows the full fleet configuration including member devices and settings.",
434
494
  "examples": [
435
- "<%= config.bin %> event-trigger get <trigger-id>",
436
- "<%= config.bin %> event-trigger get <trigger-id> --json"
495
+ "<%= config.bin %> fleet get <fleet-id>",
496
+ "<%= config.bin %> fleet get <fleet-id> --json"
437
497
  ],
438
498
  "flags": {
439
499
  "json": {
@@ -462,32 +522,42 @@
462
522
  "name": "stage",
463
523
  "allowNo": false,
464
524
  "type": "boolean"
525
+ },
526
+ "toon": {
527
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
528
+ "exclusive": [
529
+ "json"
530
+ ],
531
+ "helpGroup": "GLOBAL",
532
+ "name": "toon",
533
+ "allowNo": false,
534
+ "type": "boolean"
465
535
  }
466
536
  },
467
537
  "hasDynamicHelp": false,
468
538
  "hiddenAliases": [],
469
- "id": "event-trigger:get",
539
+ "id": "fleet:get",
470
540
  "pluginAlias": "@formant/formant-cli",
471
541
  "pluginName": "@formant/formant-cli",
472
542
  "pluginType": "core",
473
543
  "strict": true,
474
- "summary": "Get event trigger details",
544
+ "summary": "Get fleet details",
475
545
  "enableJsonFlag": true,
476
546
  "isESM": true,
477
547
  "relativePath": [
478
548
  "dist",
479
549
  "commands",
480
- "event-trigger",
550
+ "fleet",
481
551
  "get.js"
482
552
  ]
483
553
  },
484
- "event-trigger:list": {
554
+ "fleet:list": {
485
555
  "aliases": [],
486
556
  "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.",
557
+ "description": "List all device groups (fleets) in your organization.\n\nDevice groups allow you to organize and manage sets of devices together.",
488
558
  "examples": [
489
- "<%= config.bin %> event-trigger list",
490
- "<%= config.bin %> event-trigger list --json"
559
+ "<%= config.bin %> fleet list",
560
+ "<%= config.bin %> fleet list --json"
491
561
  ],
492
562
  "flags": {
493
563
  "json": {
@@ -516,22 +586,32 @@
516
586
  "name": "stage",
517
587
  "allowNo": false,
518
588
  "type": "boolean"
589
+ },
590
+ "toon": {
591
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
592
+ "exclusive": [
593
+ "json"
594
+ ],
595
+ "helpGroup": "GLOBAL",
596
+ "name": "toon",
597
+ "allowNo": false,
598
+ "type": "boolean"
519
599
  }
520
600
  },
521
601
  "hasDynamicHelp": false,
522
602
  "hiddenAliases": [],
523
- "id": "event-trigger:list",
603
+ "id": "fleet:list",
524
604
  "pluginAlias": "@formant/formant-cli",
525
605
  "pluginName": "@formant/formant-cli",
526
606
  "pluginType": "core",
527
607
  "strict": true,
528
- "summary": "List event trigger rules",
608
+ "summary": "List device groups",
529
609
  "enableJsonFlag": true,
530
610
  "isESM": true,
531
611
  "relativePath": [
532
612
  "dist",
533
613
  "commands",
534
- "event-trigger",
614
+ "fleet",
535
615
  "list.js"
536
616
  ]
537
617
  },
@@ -576,6 +656,16 @@
576
656
  "name": "stage",
577
657
  "allowNo": false,
578
658
  "type": "boolean"
659
+ },
660
+ "toon": {
661
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
662
+ "exclusive": [
663
+ "json"
664
+ ],
665
+ "helpGroup": "GLOBAL",
666
+ "name": "toon",
667
+ "allowNo": false,
668
+ "type": "boolean"
579
669
  }
580
670
  },
581
671
  "hasDynamicHelp": false,
@@ -636,6 +726,16 @@
636
726
  "name": "stage",
637
727
  "allowNo": false,
638
728
  "type": "boolean"
729
+ },
730
+ "toon": {
731
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
732
+ "exclusive": [
733
+ "json"
734
+ ],
735
+ "helpGroup": "GLOBAL",
736
+ "name": "toon",
737
+ "allowNo": false,
738
+ "type": "boolean"
639
739
  }
640
740
  },
641
741
  "hasDynamicHelp": false,
@@ -692,6 +792,16 @@
692
792
  "allowNo": false,
693
793
  "type": "boolean"
694
794
  },
795
+ "toon": {
796
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
797
+ "exclusive": [
798
+ "json"
799
+ ],
800
+ "helpGroup": "GLOBAL",
801
+ "name": "toon",
802
+ "allowNo": false,
803
+ "type": "boolean"
804
+ },
695
805
  "device": {
696
806
  "char": "d",
697
807
  "description": "Device ID (UUID)",
@@ -763,6 +873,16 @@
763
873
  "name": "stage",
764
874
  "allowNo": false,
765
875
  "type": "boolean"
876
+ },
877
+ "toon": {
878
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
879
+ "exclusive": [
880
+ "json"
881
+ ],
882
+ "helpGroup": "GLOBAL",
883
+ "name": "toon",
884
+ "allowNo": false,
885
+ "type": "boolean"
766
886
  }
767
887
  },
768
888
  "hasDynamicHelp": false,
@@ -832,6 +952,16 @@
832
952
  "allowNo": false,
833
953
  "type": "boolean"
834
954
  },
955
+ "toon": {
956
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
957
+ "exclusive": [
958
+ "json"
959
+ ],
960
+ "helpGroup": "GLOBAL",
961
+ "name": "toon",
962
+ "allowNo": false,
963
+ "type": "boolean"
964
+ },
835
965
  "dry-run": {
836
966
  "description": "Preview the command payload without sending",
837
967
  "name": "dry-run",
@@ -871,19 +1001,15 @@
871
1001
  "send.js"
872
1002
  ]
873
1003
  },
874
- "kv:get": {
1004
+ "ingest:batch": {
875
1005
  "aliases": [],
876
- "args": {
877
- "key": {
878
- "description": "Key to retrieve",
879
- "name": "key",
880
- "required": true
881
- }
882
- },
883
- "description": "Get a value from the key-value store.\n\nThe key-value store allows devices and applications to store metadata.",
1006
+ "args": {},
1007
+ "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).",
884
1008
  "examples": [
885
- "<%= config.bin %> kv get my-key",
886
- "<%= config.bin %> kv get my-key --json"
1009
+ "<%= config.bin %> ingest batch --file data.json",
1010
+ "<%= config.bin %> ingest batch --stdin < data.json",
1011
+ "cat payload.json | <%= config.bin %> ingest batch --stdin",
1012
+ "# 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}"
887
1013
  ],
888
1014
  "flags": {
889
1015
  "json": {
@@ -912,34 +1038,63 @@
912
1038
  "name": "stage",
913
1039
  "allowNo": false,
914
1040
  "type": "boolean"
1041
+ },
1042
+ "toon": {
1043
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1044
+ "exclusive": [
1045
+ "json"
1046
+ ],
1047
+ "helpGroup": "GLOBAL",
1048
+ "name": "toon",
1049
+ "allowNo": false,
1050
+ "type": "boolean"
1051
+ },
1052
+ "file": {
1053
+ "char": "f",
1054
+ "description": "Path to JSON file containing batch payload",
1055
+ "exclusive": [
1056
+ "stdin"
1057
+ ],
1058
+ "name": "file",
1059
+ "hasDynamicHelp": false,
1060
+ "multiple": false,
1061
+ "type": "option"
1062
+ },
1063
+ "stdin": {
1064
+ "description": "Read JSON payload from stdin",
1065
+ "exclusive": [
1066
+ "file"
1067
+ ],
1068
+ "name": "stdin",
1069
+ "allowNo": false,
1070
+ "type": "boolean"
915
1071
  }
916
1072
  },
917
1073
  "hasDynamicHelp": false,
918
1074
  "hiddenAliases": [],
919
- "id": "kv:get",
1075
+ "id": "ingest:batch",
920
1076
  "pluginAlias": "@formant/formant-cli",
921
1077
  "pluginName": "@formant/formant-cli",
922
1078
  "pluginType": "core",
923
1079
  "strict": true,
924
- "summary": "Get key-value",
1080
+ "summary": "Ingest batch data from file or stdin",
925
1081
  "enableJsonFlag": true,
926
1082
  "isESM": true,
927
1083
  "relativePath": [
928
1084
  "dist",
929
1085
  "commands",
930
- "kv",
931
- "get.js"
1086
+ "ingest",
1087
+ "batch.js"
932
1088
  ]
933
1089
  },
934
- "kv:list": {
1090
+ "ingest:bitset": {
935
1091
  "aliases": [],
936
1092
  "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.",
1093
+ "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",
938
1094
  "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"
1095
+ "<%= config.bin %> ingest bitset --device <device-id> --stream sensors --keys \"door,window,motion\" --values \"true,false,true\"",
1096
+ "<%= config.bin %> ingest bitset --device <device-id> --stream flags --keys \"active,paused,error\" --values \"true,false,false\" --tag system=main",
1097
+ "<%= config.bin %> ingest bitset --device <device-id> --stream states --keys \"a,b\" --values \"false,true\""
943
1098
  ],
944
1099
  "flags": {
945
1100
  "json": {
@@ -969,18 +1124,63 @@
969
1124
  "allowNo": false,
970
1125
  "type": "boolean"
971
1126
  },
1127
+ "toon": {
1128
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1129
+ "exclusive": [
1130
+ "json"
1131
+ ],
1132
+ "helpGroup": "GLOBAL",
1133
+ "name": "toon",
1134
+ "allowNo": false,
1135
+ "type": "boolean"
1136
+ },
1137
+ "device": {
1138
+ "char": "d",
1139
+ "description": "Device ID (UUID)",
1140
+ "name": "device",
1141
+ "required": true,
1142
+ "hasDynamicHelp": false,
1143
+ "multiple": false,
1144
+ "type": "option"
1145
+ },
1146
+ "stream": {
1147
+ "char": "s",
1148
+ "description": "Stream name",
1149
+ "name": "stream",
1150
+ "required": true,
1151
+ "hasDynamicHelp": false,
1152
+ "multiple": false,
1153
+ "type": "option"
1154
+ },
972
1155
  "keys": {
973
1156
  "char": "k",
974
- "description": "Specific keys to query (can be specified multiple times)",
1157
+ "description": "Comma-separated list of key names (1-1000 keys, max 255 chars each)",
975
1158
  "name": "keys",
1159
+ "required": true,
1160
+ "hasDynamicHelp": false,
1161
+ "multiple": false,
1162
+ "type": "option"
1163
+ },
1164
+ "values": {
1165
+ "char": "v",
1166
+ "description": "Comma-separated list of boolean values (true/false, must match key count)",
1167
+ "name": "values",
1168
+ "required": true,
1169
+ "hasDynamicHelp": false,
1170
+ "multiple": false,
1171
+ "type": "option"
1172
+ },
1173
+ "tag": {
1174
+ "char": "t",
1175
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1176
+ "name": "tag",
976
1177
  "hasDynamicHelp": false,
977
1178
  "multiple": true,
978
1179
  "type": "option"
979
1180
  },
980
- "prefix": {
981
- "char": "p",
982
- "description": "Filter keys by prefix",
983
- "name": "prefix",
1181
+ "timestamp": {
1182
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1183
+ "name": "timestamp",
984
1184
  "hasDynamicHelp": false,
985
1185
  "multiple": false,
986
1186
  "type": "option"
@@ -988,39 +1188,29 @@
988
1188
  },
989
1189
  "hasDynamicHelp": false,
990
1190
  "hiddenAliases": [],
991
- "id": "kv:list",
1191
+ "id": "ingest:bitset",
992
1192
  "pluginAlias": "@formant/formant-cli",
993
1193
  "pluginName": "@formant/formant-cli",
994
1194
  "pluginType": "core",
995
1195
  "strict": true,
996
- "summary": "List key-value keys",
1196
+ "summary": "Ingest bitset data",
997
1197
  "enableJsonFlag": true,
998
1198
  "isESM": true,
999
1199
  "relativePath": [
1000
1200
  "dist",
1001
1201
  "commands",
1002
- "kv",
1003
- "list.js"
1202
+ "ingest",
1203
+ "bitset.js"
1004
1204
  ]
1005
1205
  },
1006
- "kv:set": {
1206
+ "ingest:health": {
1007
1207
  "aliases": [],
1008
- "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",
1017
- "required": true
1018
- }
1019
- },
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.",
1208
+ "args": {},
1209
+ "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.",
1021
1210
  "examples": [
1022
- "<%= config.bin %> kv set my-key '{\"data\": \"value\"}'",
1023
- "<%= config.bin %> kv set config '{\"setting\": true}'"
1211
+ "<%= config.bin %> ingest health --device <device-id> --stream system_health --status operational",
1212
+ "<%= config.bin %> ingest health --device <device-id> --stream health --status error --tag component=motor",
1213
+ "<%= config.bin %> ingest health --device <device-id> --stream sync --status operational --clock-skew 150"
1024
1214
  ],
1025
1215
  "flags": {
1026
1216
  "json": {
@@ -1049,88 +1239,97 @@
1049
1239
  "name": "stage",
1050
1240
  "allowNo": false,
1051
1241
  "type": "boolean"
1052
- }
1053
- },
1054
- "hasDynamicHelp": false,
1055
- "hiddenAliases": [],
1056
- "id": "kv:set",
1057
- "pluginAlias": "@formant/formant-cli",
1058
- "pluginName": "@formant/formant-cli",
1059
- "pluginType": "core",
1060
- "strict": true,
1061
- "summary": "Set key-value",
1062
- "enableJsonFlag": true,
1063
- "isESM": true,
1064
- "relativePath": [
1065
- "dist",
1066
- "commands",
1067
- "kv",
1068
- "set.js"
1069
- ]
1070
- },
1071
- "org:get": {
1072
- "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.",
1075
- "examples": [
1076
- "<%= config.bin %> org get",
1077
- "<%= config.bin %> org get --json"
1078
- ],
1079
- "flags": {
1080
- "json": {
1081
- "description": "Format output as json.",
1082
- "helpGroup": "GLOBAL",
1083
- "name": "json",
1084
- "allowNo": false,
1085
- "type": "boolean"
1086
1242
  },
1087
- "dev": {
1088
- "description": "Target the dev environment",
1243
+ "toon": {
1244
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1089
1245
  "exclusive": [
1090
- "stage"
1246
+ "json"
1091
1247
  ],
1092
1248
  "helpGroup": "GLOBAL",
1093
- "name": "dev",
1249
+ "name": "toon",
1094
1250
  "allowNo": false,
1095
1251
  "type": "boolean"
1096
1252
  },
1097
- "stage": {
1098
- "description": "Target the stage environment",
1099
- "exclusive": [
1100
- "dev"
1253
+ "device": {
1254
+ "char": "d",
1255
+ "description": "Device ID (UUID)",
1256
+ "name": "device",
1257
+ "required": true,
1258
+ "hasDynamicHelp": false,
1259
+ "multiple": false,
1260
+ "type": "option"
1261
+ },
1262
+ "stream": {
1263
+ "char": "s",
1264
+ "description": "Stream name",
1265
+ "name": "stream",
1266
+ "required": true,
1267
+ "hasDynamicHelp": false,
1268
+ "multiple": false,
1269
+ "type": "option"
1270
+ },
1271
+ "status": {
1272
+ "description": "Health status (unknown, operational, offline, or error)",
1273
+ "name": "status",
1274
+ "required": true,
1275
+ "hasDynamicHelp": false,
1276
+ "multiple": false,
1277
+ "options": [
1278
+ "unknown",
1279
+ "operational",
1280
+ "offline",
1281
+ "error"
1101
1282
  ],
1102
- "helpGroup": "GLOBAL",
1103
- "name": "stage",
1104
- "allowNo": false,
1105
- "type": "boolean"
1283
+ "type": "option"
1284
+ },
1285
+ "clock-skew": {
1286
+ "description": "Clock skew in milliseconds (optional)",
1287
+ "name": "clock-skew",
1288
+ "hasDynamicHelp": false,
1289
+ "multiple": false,
1290
+ "type": "option"
1291
+ },
1292
+ "tag": {
1293
+ "char": "t",
1294
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1295
+ "name": "tag",
1296
+ "hasDynamicHelp": false,
1297
+ "multiple": true,
1298
+ "type": "option"
1299
+ },
1300
+ "timestamp": {
1301
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1302
+ "name": "timestamp",
1303
+ "hasDynamicHelp": false,
1304
+ "multiple": false,
1305
+ "type": "option"
1106
1306
  }
1107
1307
  },
1108
1308
  "hasDynamicHelp": false,
1109
1309
  "hiddenAliases": [],
1110
- "id": "org:get",
1310
+ "id": "ingest:health",
1111
1311
  "pluginAlias": "@formant/formant-cli",
1112
1312
  "pluginName": "@formant/formant-cli",
1113
1313
  "pluginType": "core",
1114
1314
  "strict": true,
1115
- "summary": "Get your organization",
1315
+ "summary": "Ingest health status data",
1116
1316
  "enableJsonFlag": true,
1117
1317
  "isESM": true,
1118
1318
  "relativePath": [
1119
1319
  "dist",
1120
1320
  "commands",
1121
- "org",
1122
- "get.js"
1321
+ "ingest",
1322
+ "health.js"
1123
1323
  ]
1124
1324
  },
1125
- "org:update": {
1325
+ "ingest:image": {
1126
1326
  "aliases": [],
1127
1327
  "args": {},
1128
- "description": "Update your organization's details.\n\nAt least one of --name or --description must be provided.",
1328
+ "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.",
1129
1329
  "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"
1330
+ "<%= config.bin %> ingest image --device <device-id> --stream camera_front --url https://example.com/image.jpg",
1331
+ "<%= config.bin %> ingest image --device <device-id> --stream snapshot --url https://example.com/snap.png --size 1024000",
1332
+ "<%= config.bin %> ingest image --device <device-id> --stream detection --url https://example.com/detect.jpg --tag frame=123"
1134
1333
  ],
1135
1334
  "flags": {
1136
1335
  "json": {
@@ -1160,18 +1359,61 @@
1160
1359
  "allowNo": false,
1161
1360
  "type": "boolean"
1162
1361
  },
1163
- "description": {
1362
+ "toon": {
1363
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1364
+ "exclusive": [
1365
+ "json"
1366
+ ],
1367
+ "helpGroup": "GLOBAL",
1368
+ "name": "toon",
1369
+ "allowNo": false,
1370
+ "type": "boolean"
1371
+ },
1372
+ "device": {
1164
1373
  "char": "d",
1165
- "description": "New description for the organization",
1166
- "name": "description",
1374
+ "description": "Device ID (UUID)",
1375
+ "name": "device",
1376
+ "required": true,
1167
1377
  "hasDynamicHelp": false,
1168
1378
  "multiple": false,
1169
1379
  "type": "option"
1170
1380
  },
1171
- "name": {
1172
- "char": "n",
1173
- "description": "New name for the organization",
1174
- "name": "name",
1381
+ "stream": {
1382
+ "char": "s",
1383
+ "description": "Stream name",
1384
+ "name": "stream",
1385
+ "required": true,
1386
+ "hasDynamicHelp": false,
1387
+ "multiple": false,
1388
+ "type": "option"
1389
+ },
1390
+ "url": {
1391
+ "char": "u",
1392
+ "description": "Image URL (must be http:// or https://)",
1393
+ "name": "url",
1394
+ "required": true,
1395
+ "hasDynamicHelp": false,
1396
+ "multiple": false,
1397
+ "type": "option"
1398
+ },
1399
+ "size": {
1400
+ "description": "Image size in bytes (optional)",
1401
+ "name": "size",
1402
+ "hasDynamicHelp": false,
1403
+ "multiple": false,
1404
+ "type": "option"
1405
+ },
1406
+ "tag": {
1407
+ "char": "t",
1408
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1409
+ "name": "tag",
1410
+ "hasDynamicHelp": false,
1411
+ "multiple": true,
1412
+ "type": "option"
1413
+ },
1414
+ "timestamp": {
1415
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1416
+ "name": "timestamp",
1175
1417
  "hasDynamicHelp": false,
1176
1418
  "multiple": false,
1177
1419
  "type": "option"
@@ -1179,30 +1421,35 @@
1179
1421
  },
1180
1422
  "hasDynamicHelp": false,
1181
1423
  "hiddenAliases": [],
1182
- "id": "org:update",
1424
+ "id": "ingest:image",
1183
1425
  "pluginAlias": "@formant/formant-cli",
1184
1426
  "pluginName": "@formant/formant-cli",
1185
1427
  "pluginType": "core",
1186
1428
  "strict": true,
1187
- "summary": "Update your organization",
1429
+ "summary": "Ingest image data",
1188
1430
  "enableJsonFlag": true,
1189
1431
  "isESM": true,
1190
1432
  "relativePath": [
1191
1433
  "dist",
1192
1434
  "commands",
1193
- "org",
1194
- "update.js"
1435
+ "ingest",
1436
+ "image.js"
1195
1437
  ]
1196
1438
  },
1197
- "ingest:batch": {
1439
+ "ingest:json": {
1198
1440
  "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).",
1441
+ "args": {
1442
+ "value": {
1443
+ "description": "JSON value to ingest (as a JSON string)",
1444
+ "name": "value",
1445
+ "required": true
1446
+ }
1447
+ },
1448
+ "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.",
1201
1449
  "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}"
1450
+ "<%= config.bin %> ingest json '{\"x\":1,\"y\":2}' --device <device-id> --stream position",
1451
+ "<%= config.bin %> ingest json '{\"status\":\"active\",\"mode\":\"auto\"}' --device <device-id> --stream config",
1452
+ "<%= config.bin %> ingest json '[1,2,3,4,5]' --device <device-id> --stream array_data"
1206
1453
  ],
1207
1454
  "flags": {
1208
1455
  "json": {
@@ -1232,52 +1479,81 @@
1232
1479
  "allowNo": false,
1233
1480
  "type": "boolean"
1234
1481
  },
1235
- "file": {
1236
- "char": "f",
1237
- "description": "Path to JSON file containing batch payload",
1482
+ "toon": {
1483
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1238
1484
  "exclusive": [
1239
- "stdin"
1485
+ "json"
1240
1486
  ],
1241
- "name": "file",
1487
+ "helpGroup": "GLOBAL",
1488
+ "name": "toon",
1489
+ "allowNo": false,
1490
+ "type": "boolean"
1491
+ },
1492
+ "device": {
1493
+ "char": "d",
1494
+ "description": "Device ID (UUID)",
1495
+ "name": "device",
1496
+ "required": true,
1242
1497
  "hasDynamicHelp": false,
1243
1498
  "multiple": false,
1244
1499
  "type": "option"
1245
1500
  },
1246
- "stdin": {
1247
- "description": "Read JSON payload from stdin",
1248
- "exclusive": [
1249
- "file"
1250
- ],
1251
- "name": "stdin",
1252
- "allowNo": false,
1253
- "type": "boolean"
1501
+ "stream": {
1502
+ "char": "s",
1503
+ "description": "Stream name",
1504
+ "name": "stream",
1505
+ "required": true,
1506
+ "hasDynamicHelp": false,
1507
+ "multiple": false,
1508
+ "type": "option"
1509
+ },
1510
+ "tag": {
1511
+ "char": "t",
1512
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1513
+ "name": "tag",
1514
+ "hasDynamicHelp": false,
1515
+ "multiple": true,
1516
+ "type": "option"
1517
+ },
1518
+ "timestamp": {
1519
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1520
+ "name": "timestamp",
1521
+ "hasDynamicHelp": false,
1522
+ "multiple": false,
1523
+ "type": "option"
1254
1524
  }
1255
1525
  },
1256
1526
  "hasDynamicHelp": false,
1257
1527
  "hiddenAliases": [],
1258
- "id": "ingest:batch",
1528
+ "id": "ingest:json",
1259
1529
  "pluginAlias": "@formant/formant-cli",
1260
1530
  "pluginName": "@formant/formant-cli",
1261
1531
  "pluginType": "core",
1262
1532
  "strict": true,
1263
- "summary": "Ingest batch data from file or stdin",
1533
+ "summary": "Ingest JSON data",
1264
1534
  "enableJsonFlag": true,
1265
1535
  "isESM": true,
1266
1536
  "relativePath": [
1267
1537
  "dist",
1268
1538
  "commands",
1269
1539
  "ingest",
1270
- "batch.js"
1540
+ "json.js"
1271
1541
  ]
1272
1542
  },
1273
- "ingest:bitset": {
1543
+ "ingest:numeric": {
1274
1544
  "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",
1545
+ "args": {
1546
+ "value": {
1547
+ "description": "Numeric value to ingest",
1548
+ "name": "value",
1549
+ "required": true
1550
+ }
1551
+ },
1552
+ "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.",
1277
1553
  "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\""
1554
+ "<%= config.bin %> ingest numeric 42.5 --device <device-id> --stream battery_level",
1555
+ "<%= config.bin %> ingest numeric 98.6 --device <device-id> --stream temperature --tag unit=fahrenheit",
1556
+ "<%= config.bin %> ingest numeric 1500 --device <device-id> --stream rpm --timestamp 1700000000000"
1281
1557
  ],
1282
1558
  "flags": {
1283
1559
  "json": {
@@ -1307,6 +1583,16 @@
1307
1583
  "allowNo": false,
1308
1584
  "type": "boolean"
1309
1585
  },
1586
+ "toon": {
1587
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1588
+ "exclusive": [
1589
+ "json"
1590
+ ],
1591
+ "helpGroup": "GLOBAL",
1592
+ "name": "toon",
1593
+ "allowNo": false,
1594
+ "type": "boolean"
1595
+ },
1310
1596
  "device": {
1311
1597
  "char": "d",
1312
1598
  "description": "Device ID (UUID)",
@@ -1325,24 +1611,6 @@
1325
1611
  "multiple": false,
1326
1612
  "type": "option"
1327
1613
  },
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
1614
  "tag": {
1347
1615
  "char": "t",
1348
1616
  "description": "Tag as key=value where both are strings (can be specified multiple times)",
@@ -1361,29 +1629,35 @@
1361
1629
  },
1362
1630
  "hasDynamicHelp": false,
1363
1631
  "hiddenAliases": [],
1364
- "id": "ingest:bitset",
1632
+ "id": "ingest:numeric",
1365
1633
  "pluginAlias": "@formant/formant-cli",
1366
1634
  "pluginName": "@formant/formant-cli",
1367
1635
  "pluginType": "core",
1368
1636
  "strict": true,
1369
- "summary": "Ingest bitset data",
1637
+ "summary": "Ingest numeric data",
1370
1638
  "enableJsonFlag": true,
1371
1639
  "isESM": true,
1372
1640
  "relativePath": [
1373
1641
  "dist",
1374
1642
  "commands",
1375
1643
  "ingest",
1376
- "bitset.js"
1644
+ "numeric.js"
1377
1645
  ]
1378
1646
  },
1379
- "ingest:health": {
1647
+ "ingest:text": {
1380
1648
  "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.",
1649
+ "args": {
1650
+ "value": {
1651
+ "description": "Text value to ingest",
1652
+ "name": "value",
1653
+ "required": true
1654
+ }
1655
+ },
1656
+ "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.",
1383
1657
  "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"
1658
+ "<%= config.bin %> ingest text \"Robot started successfully\" --device <device-id> --stream status",
1659
+ "<%= config.bin %> ingest text \"Error: sensor offline\" --device <device-id> --stream errors --tag severity=high",
1660
+ "<%= config.bin %> ingest text \"Checkpoint A reached\" --device <device-id> --stream waypoints"
1387
1661
  ],
1388
1662
  "flags": {
1389
1663
  "json": {
@@ -1413,6 +1687,16 @@
1413
1687
  "allowNo": false,
1414
1688
  "type": "boolean"
1415
1689
  },
1690
+ "toon": {
1691
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1692
+ "exclusive": [
1693
+ "json"
1694
+ ],
1695
+ "helpGroup": "GLOBAL",
1696
+ "name": "toon",
1697
+ "allowNo": false,
1698
+ "type": "boolean"
1699
+ },
1416
1700
  "device": {
1417
1701
  "char": "d",
1418
1702
  "description": "Device ID (UUID)",
@@ -1431,27 +1715,6 @@
1431
1715
  "multiple": false,
1432
1716
  "type": "option"
1433
1717
  },
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",
1451
- "hasDynamicHelp": false,
1452
- "multiple": false,
1453
- "type": "option"
1454
- },
1455
1718
  "tag": {
1456
1719
  "char": "t",
1457
1720
  "description": "Tag as key=value where both are strings (can be specified multiple times)",
@@ -1470,29 +1733,29 @@
1470
1733
  },
1471
1734
  "hasDynamicHelp": false,
1472
1735
  "hiddenAliases": [],
1473
- "id": "ingest:health",
1736
+ "id": "ingest:text",
1474
1737
  "pluginAlias": "@formant/formant-cli",
1475
1738
  "pluginName": "@formant/formant-cli",
1476
1739
  "pluginType": "core",
1477
1740
  "strict": true,
1478
- "summary": "Ingest health status data",
1741
+ "summary": "Ingest text data",
1479
1742
  "enableJsonFlag": true,
1480
1743
  "isESM": true,
1481
1744
  "relativePath": [
1482
1745
  "dist",
1483
1746
  "commands",
1484
1747
  "ingest",
1485
- "health.js"
1748
+ "text.js"
1486
1749
  ]
1487
1750
  },
1488
- "ingest:image": {
1751
+ "ingest:video": {
1489
1752
  "aliases": [],
1490
1753
  "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.",
1754
+ "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).",
1492
1755
  "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"
1756
+ "<%= config.bin %> ingest video --device <device-id> --stream recordings --url https://example.com/video.mp4 --duration 5000",
1757
+ "<%= config.bin %> ingest video --device <device-id> --stream clips --url https://example.com/clip.webm --duration 3500 --size 2048000",
1758
+ "<%= config.bin %> ingest video --device <device-id> --stream event_video --url https://example.com/event.mov --duration 10000 --tag event=collision"
1496
1759
  ],
1497
1760
  "flags": {
1498
1761
  "json": {
@@ -1522,6 +1785,16 @@
1522
1785
  "allowNo": false,
1523
1786
  "type": "boolean"
1524
1787
  },
1788
+ "toon": {
1789
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1790
+ "exclusive": [
1791
+ "json"
1792
+ ],
1793
+ "helpGroup": "GLOBAL",
1794
+ "name": "toon",
1795
+ "allowNo": false,
1796
+ "type": "boolean"
1797
+ },
1525
1798
  "device": {
1526
1799
  "char": "d",
1527
1800
  "description": "Device ID (UUID)",
@@ -1542,15 +1815,23 @@
1542
1815
  },
1543
1816
  "url": {
1544
1817
  "char": "u",
1545
- "description": "Image URL (must be http:// or https://)",
1818
+ "description": "Video URL (must be http:// or https://)",
1546
1819
  "name": "url",
1547
1820
  "required": true,
1548
1821
  "hasDynamicHelp": false,
1549
1822
  "multiple": false,
1550
1823
  "type": "option"
1551
1824
  },
1825
+ "duration": {
1826
+ "description": "Video duration in milliseconds (required)",
1827
+ "name": "duration",
1828
+ "required": true,
1829
+ "hasDynamicHelp": false,
1830
+ "multiple": false,
1831
+ "type": "option"
1832
+ },
1552
1833
  "size": {
1553
- "description": "Image size in bytes (optional)",
1834
+ "description": "Video size in bytes (optional)",
1554
1835
  "name": "size",
1555
1836
  "hasDynamicHelp": false,
1556
1837
  "multiple": false,
@@ -1574,35 +1855,94 @@
1574
1855
  },
1575
1856
  "hasDynamicHelp": false,
1576
1857
  "hiddenAliases": [],
1577
- "id": "ingest:image",
1858
+ "id": "ingest:video",
1578
1859
  "pluginAlias": "@formant/formant-cli",
1579
1860
  "pluginName": "@formant/formant-cli",
1580
1861
  "pluginType": "core",
1581
1862
  "strict": true,
1582
- "summary": "Ingest image data",
1863
+ "summary": "Ingest video data",
1583
1864
  "enableJsonFlag": true,
1584
1865
  "isESM": true,
1585
1866
  "relativePath": [
1586
1867
  "dist",
1587
1868
  "commands",
1588
1869
  "ingest",
1589
- "image.js"
1870
+ "video.js"
1590
1871
  ]
1591
1872
  },
1592
- "ingest:json": {
1873
+ "org:get": {
1593
1874
  "aliases": [],
1594
- "args": {
1595
- "value": {
1596
- "description": "JSON value to ingest (as a JSON string)",
1597
- "name": "value",
1598
- "required": true
1875
+ "args": {},
1876
+ "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.",
1877
+ "examples": [
1878
+ "<%= config.bin %> org get",
1879
+ "<%= config.bin %> org get --json"
1880
+ ],
1881
+ "flags": {
1882
+ "json": {
1883
+ "description": "Format output as json.",
1884
+ "helpGroup": "GLOBAL",
1885
+ "name": "json",
1886
+ "allowNo": false,
1887
+ "type": "boolean"
1888
+ },
1889
+ "dev": {
1890
+ "description": "Target the dev environment",
1891
+ "exclusive": [
1892
+ "stage"
1893
+ ],
1894
+ "helpGroup": "GLOBAL",
1895
+ "name": "dev",
1896
+ "allowNo": false,
1897
+ "type": "boolean"
1898
+ },
1899
+ "stage": {
1900
+ "description": "Target the stage environment",
1901
+ "exclusive": [
1902
+ "dev"
1903
+ ],
1904
+ "helpGroup": "GLOBAL",
1905
+ "name": "stage",
1906
+ "allowNo": false,
1907
+ "type": "boolean"
1908
+ },
1909
+ "toon": {
1910
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1911
+ "exclusive": [
1912
+ "json"
1913
+ ],
1914
+ "helpGroup": "GLOBAL",
1915
+ "name": "toon",
1916
+ "allowNo": false,
1917
+ "type": "boolean"
1599
1918
  }
1600
1919
  },
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.",
1920
+ "hasDynamicHelp": false,
1921
+ "hiddenAliases": [],
1922
+ "id": "org:get",
1923
+ "pluginAlias": "@formant/formant-cli",
1924
+ "pluginName": "@formant/formant-cli",
1925
+ "pluginType": "core",
1926
+ "strict": true,
1927
+ "summary": "Get your organization",
1928
+ "enableJsonFlag": true,
1929
+ "isESM": true,
1930
+ "relativePath": [
1931
+ "dist",
1932
+ "commands",
1933
+ "org",
1934
+ "get.js"
1935
+ ]
1936
+ },
1937
+ "org:update": {
1938
+ "aliases": [],
1939
+ "args": {},
1940
+ "description": "Update your organization's details.\n\nAt least one of --name or --description must be provided.",
1602
1941
  "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"
1942
+ "<%= config.bin %> org update --name \"My Fleet\"",
1943
+ "<%= config.bin %> org update --description \"Production robot fleet\"",
1944
+ "<%= config.bin %> org update --name \"My Fleet\" --description \"Production robot fleet\"",
1945
+ "<%= config.bin %> org update --name \"My Fleet\" --json"
1606
1946
  ],
1607
1947
  "flags": {
1608
1948
  "json": {
@@ -1632,35 +1972,28 @@
1632
1972
  "allowNo": false,
1633
1973
  "type": "boolean"
1634
1974
  },
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"
1975
+ "toon": {
1976
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
1977
+ "exclusive": [
1978
+ "json"
1979
+ ],
1980
+ "helpGroup": "GLOBAL",
1981
+ "name": "toon",
1982
+ "allowNo": false,
1983
+ "type": "boolean"
1643
1984
  },
1644
- "stream": {
1645
- "char": "s",
1646
- "description": "Stream name",
1647
- "name": "stream",
1648
- "required": true,
1985
+ "description": {
1986
+ "char": "d",
1987
+ "description": "New description for the organization",
1988
+ "name": "description",
1649
1989
  "hasDynamicHelp": false,
1650
1990
  "multiple": false,
1651
1991
  "type": "option"
1652
1992
  },
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
- "multiple": true,
1659
- "type": "option"
1660
- },
1661
- "timestamp": {
1662
- "description": "Unix timestamp in milliseconds (defaults to now)",
1663
- "name": "timestamp",
1993
+ "name": {
1994
+ "char": "n",
1995
+ "description": "New name for the organization",
1996
+ "name": "name",
1664
1997
  "hasDynamicHelp": false,
1665
1998
  "multiple": false,
1666
1999
  "type": "option"
@@ -1668,35 +2001,34 @@
1668
2001
  },
1669
2002
  "hasDynamicHelp": false,
1670
2003
  "hiddenAliases": [],
1671
- "id": "ingest:json",
2004
+ "id": "org:update",
1672
2005
  "pluginAlias": "@formant/formant-cli",
1673
2006
  "pluginName": "@formant/formant-cli",
1674
2007
  "pluginType": "core",
1675
2008
  "strict": true,
1676
- "summary": "Ingest JSON data",
2009
+ "summary": "Update your organization",
1677
2010
  "enableJsonFlag": true,
1678
2011
  "isESM": true,
1679
2012
  "relativePath": [
1680
2013
  "dist",
1681
2014
  "commands",
1682
- "ingest",
1683
- "json.js"
2015
+ "org",
2016
+ "update.js"
1684
2017
  ]
1685
2018
  },
1686
- "ingest:numeric": {
2019
+ "kv:get": {
1687
2020
  "aliases": [],
1688
2021
  "args": {
1689
- "value": {
1690
- "description": "Numeric value to ingest",
1691
- "name": "value",
2022
+ "key": {
2023
+ "description": "Key to retrieve",
2024
+ "name": "key",
1692
2025
  "required": true
1693
2026
  }
1694
2027
  },
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.",
2028
+ "description": "Get a value from the key-value store.\n\nThe key-value store allows devices and applications to store metadata.",
1696
2029
  "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"
2030
+ "<%= config.bin %> kv get my-key",
2031
+ "<%= config.bin %> kv get my-key --json"
1700
2032
  ],
1701
2033
  "flags": {
1702
2034
  "json": {
@@ -1726,71 +2058,43 @@
1726
2058
  "allowNo": false,
1727
2059
  "type": "boolean"
1728
2060
  },
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"
1737
- },
1738
- "stream": {
1739
- "char": "s",
1740
- "description": "Stream name",
1741
- "name": "stream",
1742
- "required": true,
1743
- "hasDynamicHelp": false,
1744
- "multiple": false,
1745
- "type": "option"
1746
- },
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"
2061
+ "toon": {
2062
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2063
+ "exclusive": [
2064
+ "json"
2065
+ ],
2066
+ "helpGroup": "GLOBAL",
2067
+ "name": "toon",
2068
+ "allowNo": false,
2069
+ "type": "boolean"
1761
2070
  }
1762
2071
  },
1763
2072
  "hasDynamicHelp": false,
1764
2073
  "hiddenAliases": [],
1765
- "id": "ingest:numeric",
2074
+ "id": "kv:get",
1766
2075
  "pluginAlias": "@formant/formant-cli",
1767
2076
  "pluginName": "@formant/formant-cli",
1768
2077
  "pluginType": "core",
1769
2078
  "strict": true,
1770
- "summary": "Ingest numeric data",
2079
+ "summary": "Get key-value",
1771
2080
  "enableJsonFlag": true,
1772
2081
  "isESM": true,
1773
2082
  "relativePath": [
1774
2083
  "dist",
1775
2084
  "commands",
1776
- "ingest",
1777
- "numeric.js"
2085
+ "kv",
2086
+ "get.js"
1778
2087
  ]
1779
2088
  },
1780
- "ingest:text": {
2089
+ "kv:list": {
1781
2090
  "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.",
2091
+ "args": {},
2092
+ "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.",
1790
2093
  "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"
2094
+ "<%= config.bin %> kv list",
2095
+ "<%= config.bin %> kv list --prefix config",
2096
+ "<%= config.bin %> kv list --keys key1 --keys key2 --keys key3",
2097
+ "<%= config.bin %> kv list --json"
1794
2098
  ],
1795
2099
  "flags": {
1796
2100
  "json": {
@@ -1820,35 +2124,28 @@
1820
2124
  "allowNo": false,
1821
2125
  "type": "boolean"
1822
2126
  },
1823
- "device": {
1824
- "char": "d",
1825
- "description": "Device ID (UUID)",
1826
- "name": "device",
1827
- "required": true,
1828
- "hasDynamicHelp": false,
1829
- "multiple": false,
1830
- "type": "option"
1831
- },
1832
- "stream": {
1833
- "char": "s",
1834
- "description": "Stream name",
1835
- "name": "stream",
1836
- "required": true,
1837
- "hasDynamicHelp": false,
1838
- "multiple": false,
1839
- "type": "option"
2127
+ "toon": {
2128
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2129
+ "exclusive": [
2130
+ "json"
2131
+ ],
2132
+ "helpGroup": "GLOBAL",
2133
+ "name": "toon",
2134
+ "allowNo": false,
2135
+ "type": "boolean"
1840
2136
  },
1841
- "tag": {
1842
- "char": "t",
1843
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
1844
- "name": "tag",
2137
+ "keys": {
2138
+ "char": "k",
2139
+ "description": "Specific keys to query (can be specified multiple times)",
2140
+ "name": "keys",
1845
2141
  "hasDynamicHelp": false,
1846
2142
  "multiple": true,
1847
2143
  "type": "option"
1848
2144
  },
1849
- "timestamp": {
1850
- "description": "Unix timestamp in milliseconds (defaults to now)",
1851
- "name": "timestamp",
2145
+ "prefix": {
2146
+ "char": "p",
2147
+ "description": "Filter keys by prefix",
2148
+ "name": "prefix",
1852
2149
  "hasDynamicHelp": false,
1853
2150
  "multiple": false,
1854
2151
  "type": "option"
@@ -1856,29 +2153,39 @@
1856
2153
  },
1857
2154
  "hasDynamicHelp": false,
1858
2155
  "hiddenAliases": [],
1859
- "id": "ingest:text",
2156
+ "id": "kv:list",
1860
2157
  "pluginAlias": "@formant/formant-cli",
1861
2158
  "pluginName": "@formant/formant-cli",
1862
2159
  "pluginType": "core",
1863
2160
  "strict": true,
1864
- "summary": "Ingest text data",
2161
+ "summary": "List key-value keys",
1865
2162
  "enableJsonFlag": true,
1866
2163
  "isESM": true,
1867
2164
  "relativePath": [
1868
2165
  "dist",
1869
2166
  "commands",
1870
- "ingest",
1871
- "text.js"
2167
+ "kv",
2168
+ "list.js"
1872
2169
  ]
1873
2170
  },
1874
- "ingest:video": {
2171
+ "kv:set": {
1875
2172
  "aliases": [],
1876
- "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).",
2173
+ "args": {
2174
+ "key": {
2175
+ "description": "Key to set",
2176
+ "name": "key",
2177
+ "required": true
2178
+ },
2179
+ "value": {
2180
+ "description": "Value to store (JSON string)",
2181
+ "name": "value",
2182
+ "required": true
2183
+ }
2184
+ },
2185
+ "description": "Set a value in the key-value store.\n\nStores a value associated with a key. The value should be a JSON string.",
1878
2186
  "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"
2187
+ "<%= config.bin %> kv set my-key '{\"data\": \"value\"}'",
2188
+ "<%= config.bin %> kv set config '{\"setting\": true}'"
1882
2189
  ],
1883
2190
  "flags": {
1884
2191
  "json": {
@@ -1908,79 +2215,32 @@
1908
2215
  "allowNo": false,
1909
2216
  "type": "boolean"
1910
2217
  },
1911
- "device": {
1912
- "char": "d",
1913
- "description": "Device ID (UUID)",
1914
- "name": "device",
1915
- "required": true,
1916
- "hasDynamicHelp": false,
1917
- "multiple": false,
1918
- "type": "option"
1919
- },
1920
- "stream": {
1921
- "char": "s",
1922
- "description": "Stream name",
1923
- "name": "stream",
1924
- "required": true,
1925
- "hasDynamicHelp": false,
1926
- "multiple": false,
1927
- "type": "option"
1928
- },
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",
1941
- "required": true,
1942
- "hasDynamicHelp": false,
1943
- "multiple": false,
1944
- "type": "option"
1945
- },
1946
- "size": {
1947
- "description": "Video size in bytes (optional)",
1948
- "name": "size",
1949
- "hasDynamicHelp": false,
1950
- "multiple": false,
1951
- "type": "option"
1952
- },
1953
- "tag": {
1954
- "char": "t",
1955
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
1956
- "name": "tag",
1957
- "hasDynamicHelp": false,
1958
- "multiple": true,
1959
- "type": "option"
1960
- },
1961
- "timestamp": {
1962
- "description": "Unix timestamp in milliseconds (defaults to now)",
1963
- "name": "timestamp",
1964
- "hasDynamicHelp": false,
1965
- "multiple": false,
1966
- "type": "option"
2218
+ "toon": {
2219
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2220
+ "exclusive": [
2221
+ "json"
2222
+ ],
2223
+ "helpGroup": "GLOBAL",
2224
+ "name": "toon",
2225
+ "allowNo": false,
2226
+ "type": "boolean"
1967
2227
  }
1968
2228
  },
1969
2229
  "hasDynamicHelp": false,
1970
2230
  "hiddenAliases": [],
1971
- "id": "ingest:video",
2231
+ "id": "kv:set",
1972
2232
  "pluginAlias": "@formant/formant-cli",
1973
2233
  "pluginName": "@formant/formant-cli",
1974
2234
  "pluginType": "core",
1975
2235
  "strict": true,
1976
- "summary": "Ingest video data",
2236
+ "summary": "Set key-value",
1977
2237
  "enableJsonFlag": true,
1978
2238
  "isESM": true,
1979
2239
  "relativePath": [
1980
2240
  "dist",
1981
2241
  "commands",
1982
- "ingest",
1983
- "video.js"
2242
+ "kv",
2243
+ "set.js"
1984
2244
  ]
1985
2245
  },
1986
2246
  "investigation:analytics": {
@@ -2020,6 +2280,16 @@
2020
2280
  "allowNo": false,
2021
2281
  "type": "boolean"
2022
2282
  },
2283
+ "toon": {
2284
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2285
+ "exclusive": [
2286
+ "json"
2287
+ ],
2288
+ "helpGroup": "GLOBAL",
2289
+ "name": "toon",
2290
+ "allowNo": false,
2291
+ "type": "boolean"
2292
+ },
2023
2293
  "end": {
2024
2294
  "description": "End time (ISO 8601)",
2025
2295
  "name": "end",
@@ -2118,6 +2388,16 @@
2118
2388
  "name": "stage",
2119
2389
  "allowNo": false,
2120
2390
  "type": "boolean"
2391
+ },
2392
+ "toon": {
2393
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2394
+ "exclusive": [
2395
+ "json"
2396
+ ],
2397
+ "helpGroup": "GLOBAL",
2398
+ "name": "toon",
2399
+ "allowNo": false,
2400
+ "type": "boolean"
2121
2401
  }
2122
2402
  },
2123
2403
  "hasDynamicHelp": false,
@@ -2174,6 +2454,16 @@
2174
2454
  "allowNo": false,
2175
2455
  "type": "boolean"
2176
2456
  },
2457
+ "toon": {
2458
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2459
+ "exclusive": [
2460
+ "json"
2461
+ ],
2462
+ "helpGroup": "GLOBAL",
2463
+ "name": "toon",
2464
+ "allowNo": false,
2465
+ "type": "boolean"
2466
+ },
2177
2467
  "signal-handler": {
2178
2468
  "description": "Only show investigations that handle signals",
2179
2469
  "name": "signal-handler",
@@ -2246,6 +2536,16 @@
2246
2536
  "allowNo": false,
2247
2537
  "type": "boolean"
2248
2538
  },
2539
+ "toon": {
2540
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2541
+ "exclusive": [
2542
+ "json"
2543
+ ],
2544
+ "helpGroup": "GLOBAL",
2545
+ "name": "toon",
2546
+ "allowNo": false,
2547
+ "type": "boolean"
2548
+ },
2249
2549
  "log-only": {
2250
2550
  "description": "Only show the execution log (skip run details)",
2251
2551
  "name": "log-only",
@@ -2319,6 +2619,16 @@
2319
2619
  "allowNo": false,
2320
2620
  "type": "boolean"
2321
2621
  },
2622
+ "toon": {
2623
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2624
+ "exclusive": [
2625
+ "json"
2626
+ ],
2627
+ "helpGroup": "GLOBAL",
2628
+ "name": "toon",
2629
+ "allowNo": false,
2630
+ "type": "boolean"
2631
+ },
2322
2632
  "details": {
2323
2633
  "description": "Include detailed information about each run",
2324
2634
  "name": "details",
@@ -2393,13 +2703,23 @@
2393
2703
  "allowNo": false,
2394
2704
  "type": "boolean"
2395
2705
  },
2396
- "stage": {
2397
- "description": "Target the stage environment",
2706
+ "stage": {
2707
+ "description": "Target the stage environment",
2708
+ "exclusive": [
2709
+ "dev"
2710
+ ],
2711
+ "helpGroup": "GLOBAL",
2712
+ "name": "stage",
2713
+ "allowNo": false,
2714
+ "type": "boolean"
2715
+ },
2716
+ "toon": {
2717
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2398
2718
  "exclusive": [
2399
- "dev"
2719
+ "json"
2400
2720
  ],
2401
2721
  "helpGroup": "GLOBAL",
2402
- "name": "stage",
2722
+ "name": "toon",
2403
2723
  "allowNo": false,
2404
2724
  "type": "boolean"
2405
2725
  }
@@ -2457,6 +2777,16 @@
2457
2777
  "allowNo": false,
2458
2778
  "type": "boolean"
2459
2779
  },
2780
+ "toon": {
2781
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2782
+ "exclusive": [
2783
+ "json"
2784
+ ],
2785
+ "helpGroup": "GLOBAL",
2786
+ "name": "toon",
2787
+ "allowNo": false,
2788
+ "type": "boolean"
2789
+ },
2460
2790
  "end": {
2461
2791
  "description": "End time (ISO 8601)",
2462
2792
  "name": "end",
@@ -2533,6 +2863,16 @@
2533
2863
  "allowNo": false,
2534
2864
  "type": "boolean"
2535
2865
  },
2866
+ "toon": {
2867
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2868
+ "exclusive": [
2869
+ "json"
2870
+ ],
2871
+ "helpGroup": "GLOBAL",
2872
+ "name": "toon",
2873
+ "allowNo": false,
2874
+ "type": "boolean"
2875
+ },
2536
2876
  "input": {
2537
2877
  "char": "i",
2538
2878
  "description": "Input text / problem description for the investigation",
@@ -2567,19 +2907,25 @@
2567
2907
  "trigger.js"
2568
2908
  ]
2569
2909
  },
2570
- "device:config": {
2910
+ "persona:delegate-task": {
2571
2911
  "aliases": [],
2572
2912
  "args": {
2573
2913
  "id": {
2574
- "description": "Device ID (UUID)",
2914
+ "description": "Persona ID (UUID)",
2575
2915
  "name": "id",
2576
2916
  "required": true
2917
+ },
2918
+ "goal": {
2919
+ "description": "The task goal / instruction for the persona",
2920
+ "name": "goal",
2921
+ "required": true
2577
2922
  }
2578
2923
  },
2579
- "description": "Get the device configuration including stream definitions.\n\nShows the device's current configuration including telemetry streams, commands,\nand other settings.",
2924
+ "description": "Delegate a task to a persona for async execution.\n\nCreates a task with the given goal, assigns it to the persona, and queues it to run in the background. Returns immediately with a task ID you can use to check status later via \"persona task-status\".",
2580
2925
  "examples": [
2581
- "<%= config.bin %> device config <device-id>",
2582
- "<%= config.bin %> device config <device-id> --json"
2926
+ "<%= config.bin %> persona delegate-task <persona-id> \"Analyze recent device failures and summarize findings\"",
2927
+ "<%= config.bin %> persona delegate-task <persona-id> \"Generate a daily report of fleet health\" --name \"Daily Fleet Report\"",
2928
+ "<%= config.bin %> persona delegate-task <persona-id> \"Check all offline devices\" --dev"
2583
2929
  ],
2584
2930
  "flags": {
2585
2931
  "json": {
@@ -2608,107 +2954,57 @@
2608
2954
  "name": "stage",
2609
2955
  "allowNo": false,
2610
2956
  "type": "boolean"
2611
- }
2612
- },
2613
- "hasDynamicHelp": false,
2614
- "hiddenAliases": [],
2615
- "id": "device:config",
2616
- "pluginAlias": "@formant/formant-cli",
2617
- "pluginName": "@formant/formant-cli",
2618
- "pluginType": "core",
2619
- "strict": true,
2620
- "summary": "Get device configuration",
2621
- "enableJsonFlag": true,
2622
- "isESM": true,
2623
- "relativePath": [
2624
- "dist",
2625
- "commands",
2626
- "device",
2627
- "config.js"
2628
- ]
2629
- },
2630
- "device:create": {
2631
- "aliases": [],
2632
- "args": {
2633
- "name": {
2634
- "description": "Name for the new device",
2635
- "name": "name",
2636
- "required": true
2637
- }
2638
- },
2639
- "description": "Create a new device in your fleet.\n\nThe device is created as enabled by default. You can optionally specify tags.",
2640
- "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"
2644
- ],
2645
- "flags": {
2646
- "json": {
2647
- "description": "Format output as json.",
2648
- "helpGroup": "GLOBAL",
2649
- "name": "json",
2650
- "allowNo": false,
2651
- "type": "boolean"
2652
- },
2653
- "dev": {
2654
- "description": "Target the dev environment",
2655
- "exclusive": [
2656
- "stage"
2657
- ],
2658
- "helpGroup": "GLOBAL",
2659
- "name": "dev",
2660
- "allowNo": false,
2661
- "type": "boolean"
2662
2957
  },
2663
- "stage": {
2664
- "description": "Target the stage environment",
2958
+ "toon": {
2959
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2665
2960
  "exclusive": [
2666
- "dev"
2961
+ "json"
2667
2962
  ],
2668
2963
  "helpGroup": "GLOBAL",
2669
- "name": "stage",
2964
+ "name": "toon",
2670
2965
  "allowNo": false,
2671
2966
  "type": "boolean"
2672
2967
  },
2673
- "tag": {
2674
- "char": "t",
2675
- "description": "Tag to apply (key=value), can be specified multiple times",
2676
- "name": "tag",
2968
+ "name": {
2969
+ "char": "n",
2970
+ "description": "Task name (defaults to first 50 chars of goal)",
2971
+ "name": "name",
2677
2972
  "hasDynamicHelp": false,
2678
- "multiple": true,
2973
+ "multiple": false,
2679
2974
  "type": "option"
2680
2975
  }
2681
2976
  },
2682
2977
  "hasDynamicHelp": false,
2683
2978
  "hiddenAliases": [],
2684
- "id": "device:create",
2979
+ "id": "persona:delegate-task",
2685
2980
  "pluginAlias": "@formant/formant-cli",
2686
2981
  "pluginName": "@formant/formant-cli",
2687
2982
  "pluginType": "core",
2688
2983
  "strict": true,
2689
- "summary": "Create a new device",
2984
+ "summary": "Delegate an async task to a persona",
2690
2985
  "enableJsonFlag": true,
2691
2986
  "isESM": true,
2692
2987
  "relativePath": [
2693
2988
  "dist",
2694
2989
  "commands",
2695
- "device",
2696
- "create.js"
2990
+ "persona",
2991
+ "delegate-task.js"
2697
2992
  ]
2698
2993
  },
2699
- "device:delete": {
2994
+ "persona:get": {
2700
2995
  "aliases": [],
2701
2996
  "args": {
2702
2997
  "id": {
2703
- "description": "Device ID (UUID)",
2998
+ "description": "Persona ID (UUID)",
2704
2999
  "name": "id",
2705
3000
  "required": true
2706
3001
  }
2707
3002
  },
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.",
3003
+ "description": "Get detailed information about a persona including its integrations and available tools.\n\nUses the user-level persona endpoint which merges org, persona, and user configurations.",
2709
3004
  "examples": [
2710
- "<%= config.bin %> device delete <device-id>",
2711
- "<%= config.bin %> device delete <device-id> --json"
3005
+ "<%= config.bin %> personas get <persona-id>",
3006
+ "<%= config.bin %> personas get <persona-id> --json",
3007
+ "<%= config.bin %> personas get <persona-id> --dev"
2712
3008
  ],
2713
3009
  "flags": {
2714
3010
  "json": {
@@ -2737,97 +3033,43 @@
2737
3033
  "name": "stage",
2738
3034
  "allowNo": false,
2739
3035
  "type": "boolean"
2740
- }
2741
- },
2742
- "hasDynamicHelp": false,
2743
- "hiddenAliases": [],
2744
- "id": "device:delete",
2745
- "pluginAlias": "@formant/formant-cli",
2746
- "pluginName": "@formant/formant-cli",
2747
- "pluginType": "core",
2748
- "strict": true,
2749
- "summary": "Delete (disable) a device",
2750
- "enableJsonFlag": true,
2751
- "isESM": true,
2752
- "relativePath": [
2753
- "dist",
2754
- "commands",
2755
- "device",
2756
- "delete.js"
2757
- ]
2758
- },
2759
- "device:get": {
2760
- "aliases": [],
2761
- "args": {
2762
- "id": {
2763
- "description": "Device ID (UUID)",
2764
- "name": "id",
2765
- "required": true
2766
- }
2767
- },
2768
- "description": "Get detailed information about a specific device by its ID.",
2769
- "examples": [
2770
- "<%= config.bin %> device get <device-id>",
2771
- "<%= config.bin %> device get <device-id> --json"
2772
- ],
2773
- "flags": {
2774
- "json": {
2775
- "description": "Format output as json.",
2776
- "helpGroup": "GLOBAL",
2777
- "name": "json",
2778
- "allowNo": false,
2779
- "type": "boolean"
2780
- },
2781
- "dev": {
2782
- "description": "Target the dev environment",
2783
- "exclusive": [
2784
- "stage"
2785
- ],
2786
- "helpGroup": "GLOBAL",
2787
- "name": "dev",
2788
- "allowNo": false,
2789
- "type": "boolean"
2790
3036
  },
2791
- "stage": {
2792
- "description": "Target the stage environment",
3037
+ "toon": {
3038
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
2793
3039
  "exclusive": [
2794
- "dev"
3040
+ "json"
2795
3041
  ],
2796
3042
  "helpGroup": "GLOBAL",
2797
- "name": "stage",
3043
+ "name": "toon",
2798
3044
  "allowNo": false,
2799
3045
  "type": "boolean"
2800
3046
  }
2801
3047
  },
2802
3048
  "hasDynamicHelp": false,
2803
3049
  "hiddenAliases": [],
2804
- "id": "device:get",
3050
+ "id": "persona:get",
2805
3051
  "pluginAlias": "@formant/formant-cli",
2806
3052
  "pluginName": "@formant/formant-cli",
2807
3053
  "pluginType": "core",
2808
3054
  "strict": true,
2809
- "summary": "Get a device by ID",
3055
+ "summary": "Get persona details and tools",
2810
3056
  "enableJsonFlag": true,
2811
3057
  "isESM": true,
2812
3058
  "relativePath": [
2813
3059
  "dist",
2814
3060
  "commands",
2815
- "device",
3061
+ "persona",
2816
3062
  "get.js"
2817
3063
  ]
2818
3064
  },
2819
- "device:list": {
3065
+ "persona:list": {
2820
3066
  "aliases": [],
2821
3067
  "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.",
3068
+ "description": "List AI personas available in your organization.\n\nShows both built-in and custom personas with their ID, name, and description.",
2823
3069
  "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"
3070
+ "<%= config.bin %> personas list",
3071
+ "<%= config.bin %> personas list --json",
3072
+ "<%= config.bin %> personas list --dev"
2831
3073
  ],
2832
3074
  "flags": {
2833
3075
  "json": {
@@ -2857,89 +3099,48 @@
2857
3099
  "allowNo": false,
2858
3100
  "type": "boolean"
2859
3101
  },
2860
- "include-offline": {
2861
- "char": "a",
2862
- "description": "Include offline devices",
2863
- "name": "include-offline",
2864
- "allowNo": false,
2865
- "type": "boolean"
2866
- },
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",
3102
+ "toon": {
3103
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3104
+ "exclusive": [
3105
+ "json"
3106
+ ],
3107
+ "helpGroup": "GLOBAL",
3108
+ "name": "toon",
2896
3109
  "allowNo": false,
2897
3110
  "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
3111
  }
2907
3112
  },
2908
3113
  "hasDynamicHelp": false,
2909
3114
  "hiddenAliases": [],
2910
- "id": "device:list",
3115
+ "id": "persona:list",
2911
3116
  "pluginAlias": "@formant/formant-cli",
2912
3117
  "pluginName": "@formant/formant-cli",
2913
3118
  "pluginType": "core",
2914
3119
  "strict": true,
2915
- "summary": "List robots and sensors in your fleet",
3120
+ "summary": "List AI personas",
2916
3121
  "enableJsonFlag": true,
2917
3122
  "isESM": true,
2918
3123
  "relativePath": [
2919
3124
  "dist",
2920
3125
  "commands",
2921
- "device",
3126
+ "persona",
2922
3127
  "list.js"
2923
3128
  ]
2924
3129
  },
2925
- "device:rename": {
3130
+ "persona:task-status": {
2926
3131
  "aliases": [],
2927
3132
  "args": {
2928
- "id": {
2929
- "description": "Device ID (UUID)",
2930
- "name": "id",
2931
- "required": true
2932
- },
2933
- "name": {
2934
- "description": "New name for the device",
2935
- "name": "name",
3133
+ "taskId": {
3134
+ "description": "Task ID (from delegate-task output)",
3135
+ "name": "taskId",
2936
3136
  "required": true
2937
3137
  }
2938
3138
  },
2939
- "description": "Rename a device by updating its name.",
3139
+ "description": "Check the status and results of a delegated task.\n\nShows all runs for a task including their status, result summary, and timestamps.",
2940
3140
  "examples": [
2941
- "<%= config.bin %> device rename <device-id> new-robot-name",
2942
- "<%= config.bin %> device rename <device-id> new-robot-name --json"
3141
+ "<%= config.bin %> persona task-status <task-id>",
3142
+ "<%= config.bin %> persona task-status <task-id> --json",
3143
+ "<%= config.bin %> persona task-status <task-id> --dev"
2943
3144
  ],
2944
3145
  "flags": {
2945
3146
  "json": {
@@ -2968,26 +3169,36 @@
2968
3169
  "name": "stage",
2969
3170
  "allowNo": false,
2970
3171
  "type": "boolean"
3172
+ },
3173
+ "toon": {
3174
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3175
+ "exclusive": [
3176
+ "json"
3177
+ ],
3178
+ "helpGroup": "GLOBAL",
3179
+ "name": "toon",
3180
+ "allowNo": false,
3181
+ "type": "boolean"
2971
3182
  }
2972
3183
  },
2973
3184
  "hasDynamicHelp": false,
2974
3185
  "hiddenAliases": [],
2975
- "id": "device:rename",
3186
+ "id": "persona:task-status",
2976
3187
  "pluginAlias": "@formant/formant-cli",
2977
3188
  "pluginName": "@formant/formant-cli",
2978
3189
  "pluginType": "core",
2979
3190
  "strict": true,
2980
- "summary": "Rename a device",
3191
+ "summary": "Check status of a delegated task",
2981
3192
  "enableJsonFlag": true,
2982
3193
  "isESM": true,
2983
3194
  "relativePath": [
2984
3195
  "dist",
2985
3196
  "commands",
2986
- "device",
2987
- "rename.js"
3197
+ "persona",
3198
+ "task-status.js"
2988
3199
  ]
2989
3200
  },
2990
- "device:streams": {
3201
+ "device:config": {
2991
3202
  "aliases": [],
2992
3203
  "args": {
2993
3204
  "id": {
@@ -2996,12 +3207,10 @@
2996
3207
  "required": true
2997
3208
  }
2998
3209
  },
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\".",
3210
+ "description": "Get the device configuration including stream definitions.\n\nShows the device's current configuration including telemetry streams, commands,\nand other settings.",
3000
3211
  "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"
3212
+ "<%= config.bin %> device config <device-id>",
3213
+ "<%= config.bin %> device config <device-id> --json"
3005
3214
  ],
3006
3215
  "flags": {
3007
3216
  "json": {
@@ -3031,53 +3240,48 @@
3031
3240
  "allowNo": false,
3032
3241
  "type": "boolean"
3033
3242
  },
3034
- "days": {
3035
- "description": "How many days back to look for stream data presence",
3036
- "name": "days",
3037
- "default": 7,
3038
- "hasDynamicHelp": false,
3039
- "multiple": false,
3040
- "type": "option"
3041
- },
3042
- "with-data": {
3043
- "char": "w",
3044
- "description": "Only show streams that have data in the --days window",
3045
- "name": "with-data",
3243
+ "toon": {
3244
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3245
+ "exclusive": [
3246
+ "json"
3247
+ ],
3248
+ "helpGroup": "GLOBAL",
3249
+ "name": "toon",
3046
3250
  "allowNo": false,
3047
3251
  "type": "boolean"
3048
3252
  }
3049
3253
  },
3050
3254
  "hasDynamicHelp": false,
3051
3255
  "hiddenAliases": [],
3052
- "id": "device:streams",
3256
+ "id": "device:config",
3053
3257
  "pluginAlias": "@formant/formant-cli",
3054
3258
  "pluginName": "@formant/formant-cli",
3055
3259
  "pluginType": "core",
3056
3260
  "strict": true,
3057
- "summary": "List device streams with data presence",
3261
+ "summary": "Get device configuration",
3058
3262
  "enableJsonFlag": true,
3059
3263
  "isESM": true,
3060
3264
  "relativePath": [
3061
3265
  "dist",
3062
3266
  "commands",
3063
3267
  "device",
3064
- "streams.js"
3268
+ "config.js"
3065
3269
  ]
3066
3270
  },
3067
- "device:tag": {
3271
+ "device:create": {
3068
3272
  "aliases": [],
3069
3273
  "args": {
3070
- "id": {
3071
- "description": "Device ID (UUID)",
3072
- "name": "id",
3274
+ "name": {
3275
+ "description": "Name for the new device",
3276
+ "name": "name",
3073
3277
  "required": true
3074
3278
  }
3075
3279
  },
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.",
3280
+ "description": "Create a new device in your fleet.\n\nThe device is created as enabled by default. You can optionally specify tags.",
3077
3281
  "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"
3282
+ "<%= config.bin %> device create my-robot",
3283
+ "<%= config.bin %> device create my-robot --tag location=warehouse --tag env=prod",
3284
+ "<%= config.bin %> device create my-robot --json"
3081
3285
  ],
3082
3286
  "flags": {
3083
3287
  "json": {
@@ -3107,11 +3311,20 @@
3107
3311
  "allowNo": false,
3108
3312
  "type": "boolean"
3109
3313
  },
3314
+ "toon": {
3315
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3316
+ "exclusive": [
3317
+ "json"
3318
+ ],
3319
+ "helpGroup": "GLOBAL",
3320
+ "name": "toon",
3321
+ "allowNo": false,
3322
+ "type": "boolean"
3323
+ },
3110
3324
  "tag": {
3111
3325
  "char": "t",
3112
- "description": "Tag to add or update (key=value), can be specified multiple times",
3326
+ "description": "Tag to apply (key=value), can be specified multiple times",
3113
3327
  "name": "tag",
3114
- "required": true,
3115
3328
  "hasDynamicHelp": false,
3116
3329
  "multiple": true,
3117
3330
  "type": "option"
@@ -3119,22 +3332,22 @@
3119
3332
  },
3120
3333
  "hasDynamicHelp": false,
3121
3334
  "hiddenAliases": [],
3122
- "id": "device:tag",
3335
+ "id": "device:create",
3123
3336
  "pluginAlias": "@formant/formant-cli",
3124
3337
  "pluginName": "@formant/formant-cli",
3125
3338
  "pluginType": "core",
3126
3339
  "strict": true,
3127
- "summary": "Add or update tags on a device",
3340
+ "summary": "Create a new device",
3128
3341
  "enableJsonFlag": true,
3129
3342
  "isESM": true,
3130
3343
  "relativePath": [
3131
3344
  "dist",
3132
3345
  "commands",
3133
3346
  "device",
3134
- "tag.js"
3347
+ "create.js"
3135
3348
  ]
3136
3349
  },
3137
- "device:untag": {
3350
+ "device:delete": {
3138
3351
  "aliases": [],
3139
3352
  "args": {
3140
3353
  "id": {
@@ -3143,11 +3356,10 @@
3143
3356
  "required": true
3144
3357
  }
3145
3358
  },
3146
- "description": "Remove tags from a device.\n\nSpecify one or more tag keys to remove with --key.",
3359
+ "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.",
3147
3360
  "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"
3361
+ "<%= config.bin %> device delete <device-id>",
3362
+ "<%= config.bin %> device delete <device-id> --json"
3151
3363
  ],
3152
3364
  "flags": {
3153
3365
  "json": {
@@ -3177,45 +3389,47 @@
3177
3389
  "allowNo": false,
3178
3390
  "type": "boolean"
3179
3391
  },
3180
- "key": {
3181
- "char": "k",
3182
- "description": "Tag key to remove, can be specified multiple times",
3183
- "name": "key",
3184
- "required": true,
3185
- "hasDynamicHelp": false,
3186
- "multiple": true,
3187
- "type": "option"
3392
+ "toon": {
3393
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3394
+ "exclusive": [
3395
+ "json"
3396
+ ],
3397
+ "helpGroup": "GLOBAL",
3398
+ "name": "toon",
3399
+ "allowNo": false,
3400
+ "type": "boolean"
3188
3401
  }
3189
3402
  },
3190
3403
  "hasDynamicHelp": false,
3191
3404
  "hiddenAliases": [],
3192
- "id": "device:untag",
3405
+ "id": "device:delete",
3193
3406
  "pluginAlias": "@formant/formant-cli",
3194
3407
  "pluginName": "@formant/formant-cli",
3195
3408
  "pluginType": "core",
3196
3409
  "strict": true,
3197
- "summary": "Remove tags from a device",
3410
+ "summary": "Delete (disable) a device",
3198
3411
  "enableJsonFlag": true,
3199
3412
  "isESM": true,
3200
3413
  "relativePath": [
3201
3414
  "dist",
3202
3415
  "commands",
3203
3416
  "device",
3204
- "untag.js"
3417
+ "delete.js"
3205
3418
  ]
3206
3419
  },
3207
- "query": {
3420
+ "device:get": {
3208
3421
  "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.",
3422
+ "args": {
3423
+ "id": {
3424
+ "description": "Device ID (UUID)",
3425
+ "name": "id",
3426
+ "required": true
3427
+ }
3428
+ },
3429
+ "description": "Get detailed information about a specific device by its ID.",
3211
3430
  "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"
3431
+ "<%= config.bin %> device get <device-id>",
3432
+ "<%= config.bin %> device get <device-id> --json"
3219
3433
  ],
3220
3434
  "flags": {
3221
3435
  "json": {
@@ -3245,119 +3459,47 @@
3245
3459
  "allowNo": false,
3246
3460
  "type": "boolean"
3247
3461
  },
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",
3462
+ "toon": {
3463
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3464
+ "exclusive": [
3465
+ "json"
3466
+ ],
3467
+ "helpGroup": "GLOBAL",
3468
+ "name": "toon",
3290
3469
  "allowNo": false,
3291
3470
  "type": "boolean"
3292
- },
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",
3304
- "required": true,
3305
- "hasDynamicHelp": false,
3306
- "multiple": false,
3307
- "type": "option"
3308
- },
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",
3320
- "hasDynamicHelp": false,
3321
- "multiple": false,
3322
- "type": "option"
3323
3471
  }
3324
3472
  },
3325
3473
  "hasDynamicHelp": false,
3326
3474
  "hiddenAliases": [],
3327
- "id": "query",
3475
+ "id": "device:get",
3328
3476
  "pluginAlias": "@formant/formant-cli",
3329
3477
  "pluginName": "@formant/formant-cli",
3330
3478
  "pluginType": "core",
3331
3479
  "strict": true,
3332
- "summary": "Query telemetry stream data",
3480
+ "summary": "Get a device by ID",
3333
3481
  "enableJsonFlag": true,
3334
3482
  "isESM": true,
3335
3483
  "relativePath": [
3336
3484
  "dist",
3337
3485
  "commands",
3338
- "query",
3339
- "index.js"
3486
+ "device",
3487
+ "get.js"
3340
3488
  ]
3341
3489
  },
3342
- "persona:delegate-task": {
3490
+ "device:list": {
3343
3491
  "aliases": [],
3344
- "args": {
3345
- "id": {
3346
- "description": "Persona ID (UUID)",
3347
- "name": "id",
3348
- "required": true
3349
- },
3350
- "goal": {
3351
- "description": "The task goal / instruction for the persona",
3352
- "name": "goal",
3353
- "required": true
3354
- }
3355
- },
3356
- "description": "Delegate a task to a persona for async execution.\n\nCreates a task with the given goal, assigns it to the persona, and queues it to run in the background. Returns immediately with a task ID you can use to check status later via \"persona task-status\".",
3492
+ "args": {},
3493
+ "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.",
3357
3494
  "examples": [
3358
- "<%= config.bin %> persona delegate-task <persona-id> \"Analyze recent device failures and summarize findings\"",
3359
- "<%= config.bin %> persona delegate-task <persona-id> \"Generate a daily report of fleet health\" --name \"Daily Fleet Report\"",
3360
- "<%= config.bin %> persona delegate-task <persona-id> \"Check all offline devices\" --dev"
3495
+ "<%= config.bin %> device list",
3496
+ "<%= config.bin %> device list --include-offline",
3497
+ "<%= config.bin %> device list --with-data",
3498
+ "<%= config.bin %> device list --with-data --days 90",
3499
+ "<%= config.bin %> device list --include-offline --limit 100",
3500
+ "<%= config.bin %> device list --tag location=warehouse",
3501
+ "<%= config.bin %> device list --name robot --dev --json",
3502
+ "<%= config.bin %> device list --name mech-0 --name mech-1 --dev --toon"
3361
3503
  ],
3362
3504
  "flags": {
3363
3505
  "json": {
@@ -3387,46 +3529,99 @@
3387
3529
  "allowNo": false,
3388
3530
  "type": "boolean"
3389
3531
  },
3532
+ "toon": {
3533
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3534
+ "exclusive": [
3535
+ "json"
3536
+ ],
3537
+ "helpGroup": "GLOBAL",
3538
+ "name": "toon",
3539
+ "allowNo": false,
3540
+ "type": "boolean"
3541
+ },
3542
+ "include-offline": {
3543
+ "char": "a",
3544
+ "description": "Include offline devices",
3545
+ "name": "include-offline",
3546
+ "allowNo": false,
3547
+ "type": "boolean"
3548
+ },
3549
+ "days": {
3550
+ "description": "How many days back to search for last seen data",
3551
+ "name": "days",
3552
+ "default": 30,
3553
+ "hasDynamicHelp": false,
3554
+ "multiple": false,
3555
+ "type": "option"
3556
+ },
3557
+ "limit": {
3558
+ "char": "l",
3559
+ "description": "Maximum number of devices to return",
3560
+ "name": "limit",
3561
+ "default": 50,
3562
+ "hasDynamicHelp": false,
3563
+ "multiple": false,
3564
+ "type": "option"
3565
+ },
3390
3566
  "name": {
3391
3567
  "char": "n",
3392
- "description": "Task name (defaults to first 50 chars of goal)",
3568
+ "description": "Filter devices by name (search), can be specified multiple times",
3393
3569
  "name": "name",
3394
3570
  "hasDynamicHelp": false,
3395
- "multiple": false,
3571
+ "multiple": true,
3572
+ "type": "option"
3573
+ },
3574
+ "with-data": {
3575
+ "char": "w",
3576
+ "description": "Only show devices that have data in the last --days window",
3577
+ "name": "with-data",
3578
+ "allowNo": false,
3579
+ "type": "boolean"
3580
+ },
3581
+ "tag": {
3582
+ "char": "t",
3583
+ "description": "Filter by tag (key=value), can be specified multiple times",
3584
+ "name": "tag",
3585
+ "hasDynamicHelp": false,
3586
+ "multiple": true,
3396
3587
  "type": "option"
3397
3588
  }
3398
3589
  },
3399
3590
  "hasDynamicHelp": false,
3400
3591
  "hiddenAliases": [],
3401
- "id": "persona:delegate-task",
3592
+ "id": "device:list",
3402
3593
  "pluginAlias": "@formant/formant-cli",
3403
3594
  "pluginName": "@formant/formant-cli",
3404
3595
  "pluginType": "core",
3405
3596
  "strict": true,
3406
- "summary": "Delegate an async task to a persona",
3597
+ "summary": "List robots and sensors in your fleet",
3407
3598
  "enableJsonFlag": true,
3408
3599
  "isESM": true,
3409
3600
  "relativePath": [
3410
3601
  "dist",
3411
3602
  "commands",
3412
- "persona",
3413
- "delegate-task.js"
3603
+ "device",
3604
+ "list.js"
3414
3605
  ]
3415
3606
  },
3416
- "persona:get": {
3607
+ "device:rename": {
3417
3608
  "aliases": [],
3418
3609
  "args": {
3419
3610
  "id": {
3420
- "description": "Persona ID (UUID)",
3611
+ "description": "Device ID (UUID)",
3421
3612
  "name": "id",
3422
3613
  "required": true
3614
+ },
3615
+ "name": {
3616
+ "description": "New name for the device",
3617
+ "name": "name",
3618
+ "required": true
3423
3619
  }
3424
3620
  },
3425
- "description": "Get detailed information about a persona including its integrations and available tools.\n\nUses the user-level persona endpoint which merges org, persona, and user configurations.",
3621
+ "description": "Rename a device by updating its name.",
3426
3622
  "examples": [
3427
- "<%= config.bin %> personas get <persona-id>",
3428
- "<%= config.bin %> personas get <persona-id> --json",
3429
- "<%= config.bin %> personas get <persona-id> --dev"
3623
+ "<%= config.bin %> device rename <device-id> new-robot-name",
3624
+ "<%= config.bin %> device rename <device-id> new-robot-name --json"
3430
3625
  ],
3431
3626
  "flags": {
3432
3627
  "json": {
@@ -3455,33 +3650,50 @@
3455
3650
  "name": "stage",
3456
3651
  "allowNo": false,
3457
3652
  "type": "boolean"
3653
+ },
3654
+ "toon": {
3655
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3656
+ "exclusive": [
3657
+ "json"
3658
+ ],
3659
+ "helpGroup": "GLOBAL",
3660
+ "name": "toon",
3661
+ "allowNo": false,
3662
+ "type": "boolean"
3458
3663
  }
3459
3664
  },
3460
3665
  "hasDynamicHelp": false,
3461
3666
  "hiddenAliases": [],
3462
- "id": "persona:get",
3667
+ "id": "device:rename",
3463
3668
  "pluginAlias": "@formant/formant-cli",
3464
3669
  "pluginName": "@formant/formant-cli",
3465
3670
  "pluginType": "core",
3466
3671
  "strict": true,
3467
- "summary": "Get persona details and tools",
3672
+ "summary": "Rename a device",
3468
3673
  "enableJsonFlag": true,
3469
3674
  "isESM": true,
3470
3675
  "relativePath": [
3471
3676
  "dist",
3472
3677
  "commands",
3473
- "persona",
3474
- "get.js"
3678
+ "device",
3679
+ "rename.js"
3475
3680
  ]
3476
3681
  },
3477
- "persona:list": {
3682
+ "device:streams": {
3478
3683
  "aliases": [],
3479
- "args": {},
3480
- "description": "List AI personas available in your organization.\n\nShows both built-in and custom personas with their ID, name, and description.",
3684
+ "args": {
3685
+ "id": {
3686
+ "description": "Device ID (UUID)",
3687
+ "name": "id",
3688
+ "required": true
3689
+ }
3690
+ },
3691
+ "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\".",
3481
3692
  "examples": [
3482
- "<%= config.bin %> personas list",
3483
- "<%= config.bin %> personas list --json",
3484
- "<%= config.bin %> personas list --dev"
3693
+ "<%= config.bin %> device streams <device-id>",
3694
+ "<%= config.bin %> device streams <device-id> --with-data",
3695
+ "<%= config.bin %> device streams <device-id> --with-data --days 30",
3696
+ "<%= config.bin %> device streams <device-id> --json"
3485
3697
  ],
3486
3698
  "flags": {
3487
3699
  "json": {
@@ -3510,39 +3722,64 @@
3510
3722
  "name": "stage",
3511
3723
  "allowNo": false,
3512
3724
  "type": "boolean"
3725
+ },
3726
+ "toon": {
3727
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3728
+ "exclusive": [
3729
+ "json"
3730
+ ],
3731
+ "helpGroup": "GLOBAL",
3732
+ "name": "toon",
3733
+ "allowNo": false,
3734
+ "type": "boolean"
3735
+ },
3736
+ "days": {
3737
+ "description": "How many days back to look for stream data presence",
3738
+ "name": "days",
3739
+ "default": 7,
3740
+ "hasDynamicHelp": false,
3741
+ "multiple": false,
3742
+ "type": "option"
3743
+ },
3744
+ "with-data": {
3745
+ "char": "w",
3746
+ "description": "Only show streams that have data in the --days window",
3747
+ "name": "with-data",
3748
+ "allowNo": false,
3749
+ "type": "boolean"
3513
3750
  }
3514
3751
  },
3515
3752
  "hasDynamicHelp": false,
3516
3753
  "hiddenAliases": [],
3517
- "id": "persona:list",
3754
+ "id": "device:streams",
3518
3755
  "pluginAlias": "@formant/formant-cli",
3519
3756
  "pluginName": "@formant/formant-cli",
3520
3757
  "pluginType": "core",
3521
3758
  "strict": true,
3522
- "summary": "List AI personas",
3759
+ "summary": "List device streams with data presence",
3523
3760
  "enableJsonFlag": true,
3524
3761
  "isESM": true,
3525
3762
  "relativePath": [
3526
3763
  "dist",
3527
3764
  "commands",
3528
- "persona",
3529
- "list.js"
3765
+ "device",
3766
+ "streams.js"
3530
3767
  ]
3531
3768
  },
3532
- "persona:task-status": {
3769
+ "device:tag": {
3533
3770
  "aliases": [],
3534
3771
  "args": {
3535
- "taskId": {
3536
- "description": "Task ID (from delegate-task output)",
3537
- "name": "taskId",
3772
+ "id": {
3773
+ "description": "Device ID (UUID)",
3774
+ "name": "id",
3538
3775
  "required": true
3539
3776
  }
3540
3777
  },
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.",
3778
+ "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.",
3542
3779
  "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"
3780
+ "<%= config.bin %> device tag <device-id> --tag location=warehouse",
3781
+ "<%= config.bin %> device tag <device-id> --tag env=prod --tag region=us-east",
3782
+ "<%= config.bin %> device tag <device-id> --tag location=factory --json"
3546
3783
  ],
3547
3784
  "flags": {
3548
3785
  "json": {
@@ -3571,38 +3808,58 @@
3571
3808
  "name": "stage",
3572
3809
  "allowNo": false,
3573
3810
  "type": "boolean"
3811
+ },
3812
+ "toon": {
3813
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3814
+ "exclusive": [
3815
+ "json"
3816
+ ],
3817
+ "helpGroup": "GLOBAL",
3818
+ "name": "toon",
3819
+ "allowNo": false,
3820
+ "type": "boolean"
3821
+ },
3822
+ "tag": {
3823
+ "char": "t",
3824
+ "description": "Tag to add or update (key=value), can be specified multiple times",
3825
+ "name": "tag",
3826
+ "required": true,
3827
+ "hasDynamicHelp": false,
3828
+ "multiple": true,
3829
+ "type": "option"
3574
3830
  }
3575
3831
  },
3576
3832
  "hasDynamicHelp": false,
3577
3833
  "hiddenAliases": [],
3578
- "id": "persona:task-status",
3834
+ "id": "device:tag",
3579
3835
  "pluginAlias": "@formant/formant-cli",
3580
3836
  "pluginName": "@formant/formant-cli",
3581
3837
  "pluginType": "core",
3582
3838
  "strict": true,
3583
- "summary": "Check status of a delegated task",
3839
+ "summary": "Add or update tags on a device",
3584
3840
  "enableJsonFlag": true,
3585
3841
  "isESM": true,
3586
3842
  "relativePath": [
3587
3843
  "dist",
3588
3844
  "commands",
3589
- "persona",
3590
- "task-status.js"
3845
+ "device",
3846
+ "tag.js"
3591
3847
  ]
3592
3848
  },
3593
- "schedule:get": {
3849
+ "device:untag": {
3594
3850
  "aliases": [],
3595
3851
  "args": {
3596
3852
  "id": {
3597
- "description": "Schedule ID (UUID)",
3853
+ "description": "Device ID (UUID)",
3598
3854
  "name": "id",
3599
3855
  "required": true
3600
3856
  }
3601
3857
  },
3602
- "description": "Get detailed information about a schedule.\n\nShows the full schedule configuration including cron expression, command template,\ninvestigation link, and execution settings.",
3858
+ "description": "Remove tags from a device.\n\nSpecify one or more tag keys to remove with --key.",
3603
3859
  "examples": [
3604
- "<%= config.bin %> schedule get <schedule-id>",
3605
- "<%= config.bin %> schedule get <schedule-id> --json"
3860
+ "<%= config.bin %> device untag <device-id> --key location",
3861
+ "<%= config.bin %> device untag <device-id> --key env --key region",
3862
+ "<%= config.bin %> device untag <device-id> --key location --json"
3606
3863
  ],
3607
3864
  "flags": {
3608
3865
  "json": {
@@ -3631,32 +3888,56 @@
3631
3888
  "name": "stage",
3632
3889
  "allowNo": false,
3633
3890
  "type": "boolean"
3891
+ },
3892
+ "toon": {
3893
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3894
+ "exclusive": [
3895
+ "json"
3896
+ ],
3897
+ "helpGroup": "GLOBAL",
3898
+ "name": "toon",
3899
+ "allowNo": false,
3900
+ "type": "boolean"
3901
+ },
3902
+ "key": {
3903
+ "char": "k",
3904
+ "description": "Tag key to remove, can be specified multiple times",
3905
+ "name": "key",
3906
+ "required": true,
3907
+ "hasDynamicHelp": false,
3908
+ "multiple": true,
3909
+ "type": "option"
3634
3910
  }
3635
3911
  },
3636
3912
  "hasDynamicHelp": false,
3637
3913
  "hiddenAliases": [],
3638
- "id": "schedule:get",
3914
+ "id": "device:untag",
3639
3915
  "pluginAlias": "@formant/formant-cli",
3640
3916
  "pluginName": "@formant/formant-cli",
3641
3917
  "pluginType": "core",
3642
3918
  "strict": true,
3643
- "summary": "Get schedule details",
3919
+ "summary": "Remove tags from a device",
3644
3920
  "enableJsonFlag": true,
3645
3921
  "isESM": true,
3646
3922
  "relativePath": [
3647
3923
  "dist",
3648
3924
  "commands",
3649
- "schedule",
3650
- "get.js"
3925
+ "device",
3926
+ "untag.js"
3651
3927
  ]
3652
3928
  },
3653
- "schedule:list": {
3929
+ "query": {
3654
3930
  "aliases": [],
3655
3931
  "args": {},
3656
- "description": "List all schedules in your organization.\n\nSchedules can trigger commands or investigations on a recurring (cron) or one-time basis.",
3932
+ "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.",
3657
3933
  "examples": [
3658
- "<%= config.bin %> schedule list",
3659
- "<%= config.bin %> schedule list --json"
3934
+ "<%= config.bin %> query --device <id> --stream battery_level --start 2026-01-01 --end 2026-01-02",
3935
+ "<%= config.bin %> query --device <id> --stream speed --aggregate hour --start 2026-01-01 --end 2026-02-01",
3936
+ "<%= config.bin %> query --device <id> --stream battery_level --stream temperature --start 2026-01-01 --end 2026-01-02",
3937
+ "<%= config.bin %> query --device <id1> --device <id2> --stream battery_level --start 2026-01-01 --end 2026-01-02",
3938
+ "<%= config.bin %> query --device <id> --stream battery_level --start 2026-01-01 --end 2026-02-01 --latest-values-only",
3939
+ "<%= config.bin %> query --device <id> --all-streams --start 2026-01-01 --end 2026-02-01 --latest-values-only",
3940
+ "<%= config.bin %> query --device <id> --stream temperature --type numeric --json"
3660
3941
  ],
3661
3942
  "flags": {
3662
3943
  "json": {
@@ -3676,47 +3957,133 @@
3676
3957
  "allowNo": false,
3677
3958
  "type": "boolean"
3678
3959
  },
3679
- "stage": {
3680
- "description": "Target the stage environment",
3681
- "exclusive": [
3682
- "dev"
3683
- ],
3684
- "helpGroup": "GLOBAL",
3685
- "name": "stage",
3960
+ "stage": {
3961
+ "description": "Target the stage environment",
3962
+ "exclusive": [
3963
+ "dev"
3964
+ ],
3965
+ "helpGroup": "GLOBAL",
3966
+ "name": "stage",
3967
+ "allowNo": false,
3968
+ "type": "boolean"
3969
+ },
3970
+ "toon": {
3971
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
3972
+ "exclusive": [
3973
+ "json"
3974
+ ],
3975
+ "helpGroup": "GLOBAL",
3976
+ "name": "toon",
3977
+ "allowNo": false,
3978
+ "type": "boolean"
3979
+ },
3980
+ "aggregate": {
3981
+ "char": "a",
3982
+ "description": "Aggregation level for downsampling",
3983
+ "name": "aggregate",
3984
+ "hasDynamicHelp": false,
3985
+ "multiple": false,
3986
+ "type": "option"
3987
+ },
3988
+ "all-streams": {
3989
+ "description": "Query all streams for the device — from config and from ingested data (requires single --device and --latest-values-only)",
3990
+ "name": "all-streams",
3991
+ "allowNo": false,
3992
+ "type": "boolean"
3993
+ },
3994
+ "days": {
3995
+ "description": "How many days back to look for unconfigured streams when using --all-streams",
3996
+ "name": "days",
3997
+ "default": 14,
3998
+ "hasDynamicHelp": false,
3999
+ "multiple": false,
4000
+ "type": "option"
4001
+ },
4002
+ "device": {
4003
+ "char": "d",
4004
+ "description": "Device ID(s), can be specified multiple times",
4005
+ "name": "device",
4006
+ "required": true,
4007
+ "hasDynamicHelp": false,
4008
+ "multiple": true,
4009
+ "type": "option"
4010
+ },
4011
+ "end": {
4012
+ "description": "End time (ISO 8601)",
4013
+ "name": "end",
4014
+ "required": true,
4015
+ "hasDynamicHelp": false,
4016
+ "multiple": false,
4017
+ "type": "option"
4018
+ },
4019
+ "latest-values-only": {
4020
+ "description": "Only return the most recent value per stream",
4021
+ "name": "latest-values-only",
3686
4022
  "allowNo": false,
3687
4023
  "type": "boolean"
4024
+ },
4025
+ "limit": {
4026
+ "char": "l",
4027
+ "description": "Maximum number of datapoints",
4028
+ "name": "limit",
4029
+ "hasDynamicHelp": false,
4030
+ "multiple": false,
4031
+ "type": "option"
4032
+ },
4033
+ "start": {
4034
+ "description": "Start time (ISO 8601)",
4035
+ "name": "start",
4036
+ "required": true,
4037
+ "hasDynamicHelp": false,
4038
+ "multiple": false,
4039
+ "type": "option"
4040
+ },
4041
+ "stream": {
4042
+ "char": "s",
4043
+ "description": "Stream name(s), can be specified multiple times",
4044
+ "name": "stream",
4045
+ "hasDynamicHelp": false,
4046
+ "multiple": true,
4047
+ "type": "option"
4048
+ },
4049
+ "type": {
4050
+ "description": "Filter by stream type",
4051
+ "name": "type",
4052
+ "hasDynamicHelp": false,
4053
+ "multiple": false,
4054
+ "type": "option"
3688
4055
  }
3689
4056
  },
3690
4057
  "hasDynamicHelp": false,
3691
4058
  "hiddenAliases": [],
3692
- "id": "schedule:list",
4059
+ "id": "query",
3693
4060
  "pluginAlias": "@formant/formant-cli",
3694
4061
  "pluginName": "@formant/formant-cli",
3695
4062
  "pluginType": "core",
3696
4063
  "strict": true,
3697
- "summary": "List schedules",
4064
+ "summary": "Query telemetry stream data",
3698
4065
  "enableJsonFlag": true,
3699
4066
  "isESM": true,
3700
4067
  "relativePath": [
3701
4068
  "dist",
3702
4069
  "commands",
3703
- "schedule",
3704
- "list.js"
4070
+ "query",
4071
+ "index.js"
3705
4072
  ]
3706
4073
  },
3707
- "user:get": {
4074
+ "schedule:get": {
3708
4075
  "aliases": [],
3709
4076
  "args": {
3710
4077
  "id": {
3711
- "description": "User ID (UUID)",
4078
+ "description": "Schedule ID (UUID)",
3712
4079
  "name": "id",
3713
4080
  "required": true
3714
4081
  }
3715
4082
  },
3716
- "description": "Get detailed information about a user.\n\nShows user details including email, name, roles, and account settings.",
4083
+ "description": "Get detailed information about a schedule.\n\nShows the full schedule configuration including cron expression, command template,\ninvestigation link, and execution settings.",
3717
4084
  "examples": [
3718
- "<%= config.bin %> user get <user-id>",
3719
- "<%= config.bin %> user get <user-id> --json"
4085
+ "<%= config.bin %> schedule get <schedule-id>",
4086
+ "<%= config.bin %> schedule get <schedule-id> --json"
3720
4087
  ],
3721
4088
  "flags": {
3722
4089
  "json": {
@@ -3745,32 +4112,42 @@
3745
4112
  "name": "stage",
3746
4113
  "allowNo": false,
3747
4114
  "type": "boolean"
4115
+ },
4116
+ "toon": {
4117
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4118
+ "exclusive": [
4119
+ "json"
4120
+ ],
4121
+ "helpGroup": "GLOBAL",
4122
+ "name": "toon",
4123
+ "allowNo": false,
4124
+ "type": "boolean"
3748
4125
  }
3749
4126
  },
3750
4127
  "hasDynamicHelp": false,
3751
4128
  "hiddenAliases": [],
3752
- "id": "user:get",
4129
+ "id": "schedule:get",
3753
4130
  "pluginAlias": "@formant/formant-cli",
3754
4131
  "pluginName": "@formant/formant-cli",
3755
4132
  "pluginType": "core",
3756
4133
  "strict": true,
3757
- "summary": "Get user details",
4134
+ "summary": "Get schedule details",
3758
4135
  "enableJsonFlag": true,
3759
4136
  "isESM": true,
3760
4137
  "relativePath": [
3761
4138
  "dist",
3762
4139
  "commands",
3763
- "user",
4140
+ "schedule",
3764
4141
  "get.js"
3765
4142
  ]
3766
4143
  },
3767
- "user:list": {
4144
+ "schedule:list": {
3768
4145
  "aliases": [],
3769
4146
  "args": {},
3770
- "description": "List all users in your organization.\n\nShows user accounts, their email addresses, and account status.",
4147
+ "description": "List all schedules in your organization.\n\nSchedules can trigger commands or investigations on a recurring (cron) or one-time basis.",
3771
4148
  "examples": [
3772
- "<%= config.bin %> user list",
3773
- "<%= config.bin %> user list --json"
4149
+ "<%= config.bin %> schedule list",
4150
+ "<%= config.bin %> schedule list --json"
3774
4151
  ],
3775
4152
  "flags": {
3776
4153
  "json": {
@@ -3799,22 +4176,32 @@
3799
4176
  "name": "stage",
3800
4177
  "allowNo": false,
3801
4178
  "type": "boolean"
4179
+ },
4180
+ "toon": {
4181
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4182
+ "exclusive": [
4183
+ "json"
4184
+ ],
4185
+ "helpGroup": "GLOBAL",
4186
+ "name": "toon",
4187
+ "allowNo": false,
4188
+ "type": "boolean"
3802
4189
  }
3803
4190
  },
3804
4191
  "hasDynamicHelp": false,
3805
4192
  "hiddenAliases": [],
3806
- "id": "user:list",
4193
+ "id": "schedule:list",
3807
4194
  "pluginAlias": "@formant/formant-cli",
3808
4195
  "pluginName": "@formant/formant-cli",
3809
4196
  "pluginType": "core",
3810
4197
  "strict": true,
3811
- "summary": "List users",
4198
+ "summary": "List schedules",
3812
4199
  "enableJsonFlag": true,
3813
4200
  "isESM": true,
3814
4201
  "relativePath": [
3815
4202
  "dist",
3816
4203
  "commands",
3817
- "user",
4204
+ "schedule",
3818
4205
  "list.js"
3819
4206
  ]
3820
4207
  },
@@ -3855,6 +4242,16 @@
3855
4242
  "allowNo": false,
3856
4243
  "type": "boolean"
3857
4244
  },
4245
+ "toon": {
4246
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4247
+ "exclusive": [
4248
+ "json"
4249
+ ],
4250
+ "helpGroup": "GLOBAL",
4251
+ "name": "toon",
4252
+ "allowNo": false,
4253
+ "type": "boolean"
4254
+ },
3858
4255
  "end": {
3859
4256
  "description": "End time (ISO 8601)",
3860
4257
  "name": "end",
@@ -3932,6 +4329,16 @@
3932
4329
  "allowNo": false,
3933
4330
  "type": "boolean"
3934
4331
  },
4332
+ "toon": {
4333
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4334
+ "exclusive": [
4335
+ "json"
4336
+ ],
4337
+ "helpGroup": "GLOBAL",
4338
+ "name": "toon",
4339
+ "allowNo": false,
4340
+ "type": "boolean"
4341
+ },
3935
4342
  "device": {
3936
4343
  "char": "d",
3937
4344
  "description": "Device ID to associate with this signal",
@@ -4028,6 +4435,16 @@
4028
4435
  "allowNo": false,
4029
4436
  "type": "boolean"
4030
4437
  },
4438
+ "toon": {
4439
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4440
+ "exclusive": [
4441
+ "json"
4442
+ ],
4443
+ "helpGroup": "GLOBAL",
4444
+ "name": "toon",
4445
+ "allowNo": false,
4446
+ "type": "boolean"
4447
+ },
4031
4448
  "trace": {
4032
4449
  "description": "Fetch and display the triggering event and event trigger information",
4033
4450
  "name": "trace",
@@ -4089,6 +4506,16 @@
4089
4506
  "allowNo": false,
4090
4507
  "type": "boolean"
4091
4508
  },
4509
+ "toon": {
4510
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4511
+ "exclusive": [
4512
+ "json"
4513
+ ],
4514
+ "helpGroup": "GLOBAL",
4515
+ "name": "toon",
4516
+ "allowNo": false,
4517
+ "type": "boolean"
4518
+ },
4092
4519
  "investigation": {
4093
4520
  "char": "i",
4094
4521
  "description": "Investigation (taskflow) ID — shows ground truth for signals that have one",
@@ -4153,6 +4580,16 @@
4153
4580
  "allowNo": false,
4154
4581
  "type": "boolean"
4155
4582
  },
4583
+ "toon": {
4584
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4585
+ "exclusive": [
4586
+ "json"
4587
+ ],
4588
+ "helpGroup": "GLOBAL",
4589
+ "name": "toon",
4590
+ "allowNo": false,
4591
+ "type": "boolean"
4592
+ },
4156
4593
  "end": {
4157
4594
  "description": "End time (ISO 8601)",
4158
4595
  "name": "end",
@@ -4258,6 +4695,16 @@
4258
4695
  "name": "stage",
4259
4696
  "allowNo": false,
4260
4697
  "type": "boolean"
4698
+ },
4699
+ "toon": {
4700
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4701
+ "exclusive": [
4702
+ "json"
4703
+ ],
4704
+ "helpGroup": "GLOBAL",
4705
+ "name": "toon",
4706
+ "allowNo": false,
4707
+ "type": "boolean"
4261
4708
  }
4262
4709
  },
4263
4710
  "hasDynamicHelp": false,
@@ -4276,7 +4723,141 @@
4276
4723
  "signal",
4277
4724
  "set-ground-truth.js"
4278
4725
  ]
4726
+ },
4727
+ "user:get": {
4728
+ "aliases": [],
4729
+ "args": {
4730
+ "id": {
4731
+ "description": "User ID (UUID)",
4732
+ "name": "id",
4733
+ "required": true
4734
+ }
4735
+ },
4736
+ "description": "Get detailed information about a user.\n\nShows user details including email, name, roles, and account settings.",
4737
+ "examples": [
4738
+ "<%= config.bin %> user get <user-id>",
4739
+ "<%= config.bin %> user get <user-id> --json"
4740
+ ],
4741
+ "flags": {
4742
+ "json": {
4743
+ "description": "Format output as json.",
4744
+ "helpGroup": "GLOBAL",
4745
+ "name": "json",
4746
+ "allowNo": false,
4747
+ "type": "boolean"
4748
+ },
4749
+ "dev": {
4750
+ "description": "Target the dev environment",
4751
+ "exclusive": [
4752
+ "stage"
4753
+ ],
4754
+ "helpGroup": "GLOBAL",
4755
+ "name": "dev",
4756
+ "allowNo": false,
4757
+ "type": "boolean"
4758
+ },
4759
+ "stage": {
4760
+ "description": "Target the stage environment",
4761
+ "exclusive": [
4762
+ "dev"
4763
+ ],
4764
+ "helpGroup": "GLOBAL",
4765
+ "name": "stage",
4766
+ "allowNo": false,
4767
+ "type": "boolean"
4768
+ },
4769
+ "toon": {
4770
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4771
+ "exclusive": [
4772
+ "json"
4773
+ ],
4774
+ "helpGroup": "GLOBAL",
4775
+ "name": "toon",
4776
+ "allowNo": false,
4777
+ "type": "boolean"
4778
+ }
4779
+ },
4780
+ "hasDynamicHelp": false,
4781
+ "hiddenAliases": [],
4782
+ "id": "user:get",
4783
+ "pluginAlias": "@formant/formant-cli",
4784
+ "pluginName": "@formant/formant-cli",
4785
+ "pluginType": "core",
4786
+ "strict": true,
4787
+ "summary": "Get user details",
4788
+ "enableJsonFlag": true,
4789
+ "isESM": true,
4790
+ "relativePath": [
4791
+ "dist",
4792
+ "commands",
4793
+ "user",
4794
+ "get.js"
4795
+ ]
4796
+ },
4797
+ "user:list": {
4798
+ "aliases": [],
4799
+ "args": {},
4800
+ "description": "List all users in your organization.\n\nShows user accounts, their email addresses, and account status.",
4801
+ "examples": [
4802
+ "<%= config.bin %> user list",
4803
+ "<%= config.bin %> user list --json"
4804
+ ],
4805
+ "flags": {
4806
+ "json": {
4807
+ "description": "Format output as json.",
4808
+ "helpGroup": "GLOBAL",
4809
+ "name": "json",
4810
+ "allowNo": false,
4811
+ "type": "boolean"
4812
+ },
4813
+ "dev": {
4814
+ "description": "Target the dev environment",
4815
+ "exclusive": [
4816
+ "stage"
4817
+ ],
4818
+ "helpGroup": "GLOBAL",
4819
+ "name": "dev",
4820
+ "allowNo": false,
4821
+ "type": "boolean"
4822
+ },
4823
+ "stage": {
4824
+ "description": "Target the stage environment",
4825
+ "exclusive": [
4826
+ "dev"
4827
+ ],
4828
+ "helpGroup": "GLOBAL",
4829
+ "name": "stage",
4830
+ "allowNo": false,
4831
+ "type": "boolean"
4832
+ },
4833
+ "toon": {
4834
+ "description": "Output data in TOON (Token-Oriented Object Notation) format",
4835
+ "exclusive": [
4836
+ "json"
4837
+ ],
4838
+ "helpGroup": "GLOBAL",
4839
+ "name": "toon",
4840
+ "allowNo": false,
4841
+ "type": "boolean"
4842
+ }
4843
+ },
4844
+ "hasDynamicHelp": false,
4845
+ "hiddenAliases": [],
4846
+ "id": "user:list",
4847
+ "pluginAlias": "@formant/formant-cli",
4848
+ "pluginName": "@formant/formant-cli",
4849
+ "pluginType": "core",
4850
+ "strict": true,
4851
+ "summary": "List users",
4852
+ "enableJsonFlag": true,
4853
+ "isESM": true,
4854
+ "relativePath": [
4855
+ "dist",
4856
+ "commands",
4857
+ "user",
4858
+ "list.js"
4859
+ ]
4279
4860
  }
4280
4861
  },
4281
- "version": "0.4.5"
4862
+ "version": "0.5.2"
4282
4863
  }