@formant/formant-cli 0.4.2 → 0.4.4

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.
@@ -421,120 +421,6 @@
421
421
  "list.js"
422
422
  ]
423
423
  },
424
- "fleet:get": {
425
- "aliases": [],
426
- "args": {
427
- "id": {
428
- "description": "Fleet (group) ID (UUID)",
429
- "name": "id",
430
- "required": true
431
- }
432
- },
433
- "description": "Get detailed information about a device group (fleet).\n\nShows the full fleet configuration including member devices and settings.",
434
- "examples": [
435
- "<%= config.bin %> fleet get <fleet-id>",
436
- "<%= config.bin %> fleet get <fleet-id> --json"
437
- ],
438
- "flags": {
439
- "json": {
440
- "description": "Format output as json.",
441
- "helpGroup": "GLOBAL",
442
- "name": "json",
443
- "allowNo": false,
444
- "type": "boolean"
445
- },
446
- "dev": {
447
- "description": "Target the dev environment",
448
- "exclusive": [
449
- "stage"
450
- ],
451
- "helpGroup": "GLOBAL",
452
- "name": "dev",
453
- "allowNo": false,
454
- "type": "boolean"
455
- },
456
- "stage": {
457
- "description": "Target the stage environment",
458
- "exclusive": [
459
- "dev"
460
- ],
461
- "helpGroup": "GLOBAL",
462
- "name": "stage",
463
- "allowNo": false,
464
- "type": "boolean"
465
- }
466
- },
467
- "hasDynamicHelp": false,
468
- "hiddenAliases": [],
469
- "id": "fleet:get",
470
- "pluginAlias": "@formant/formant-cli",
471
- "pluginName": "@formant/formant-cli",
472
- "pluginType": "core",
473
- "strict": true,
474
- "summary": "Get fleet details",
475
- "enableJsonFlag": true,
476
- "isESM": true,
477
- "relativePath": [
478
- "dist",
479
- "commands",
480
- "fleet",
481
- "get.js"
482
- ]
483
- },
484
- "fleet:list": {
485
- "aliases": [],
486
- "args": {},
487
- "description": "List all device groups (fleets) in your organization.\n\nDevice groups allow you to organize and manage sets of devices together.",
488
- "examples": [
489
- "<%= config.bin %> fleet list",
490
- "<%= config.bin %> fleet list --json"
491
- ],
492
- "flags": {
493
- "json": {
494
- "description": "Format output as json.",
495
- "helpGroup": "GLOBAL",
496
- "name": "json",
497
- "allowNo": false,
498
- "type": "boolean"
499
- },
500
- "dev": {
501
- "description": "Target the dev environment",
502
- "exclusive": [
503
- "stage"
504
- ],
505
- "helpGroup": "GLOBAL",
506
- "name": "dev",
507
- "allowNo": false,
508
- "type": "boolean"
509
- },
510
- "stage": {
511
- "description": "Target the stage environment",
512
- "exclusive": [
513
- "dev"
514
- ],
515
- "helpGroup": "GLOBAL",
516
- "name": "stage",
517
- "allowNo": false,
518
- "type": "boolean"
519
- }
520
- },
521
- "hasDynamicHelp": false,
522
- "hiddenAliases": [],
523
- "id": "fleet:list",
524
- "pluginAlias": "@formant/formant-cli",
525
- "pluginName": "@formant/formant-cli",
526
- "pluginType": "core",
527
- "strict": true,
528
- "summary": "List device groups",
529
- "enableJsonFlag": true,
530
- "isESM": true,
531
- "relativePath": [
532
- "dist",
533
- "commands",
534
- "fleet",
535
- "list.js"
536
- ]
537
- },
538
424
  "command:for-device": {
539
425
  "aliases": [],
540
426
  "args": {
@@ -871,19 +757,19 @@
871
757
  "send.js"
872
758
  ]
873
759
  },
874
- "kv:get": {
760
+ "fleet:get": {
875
761
  "aliases": [],
876
762
  "args": {
877
- "key": {
878
- "description": "Key to retrieve",
879
- "name": "key",
763
+ "id": {
764
+ "description": "Fleet (group) ID (UUID)",
765
+ "name": "id",
880
766
  "required": true
881
767
  }
882
768
  },
883
- "description": "Get a value from the key-value store.\n\nThe key-value store allows devices and applications to store metadata.",
769
+ "description": "Get detailed information about a device group (fleet).\n\nShows the full fleet configuration including member devices and settings.",
884
770
  "examples": [
885
- "<%= config.bin %> kv get my-key",
886
- "<%= config.bin %> kv get my-key --json"
771
+ "<%= config.bin %> fleet get <fleet-id>",
772
+ "<%= config.bin %> fleet get <fleet-id> --json"
887
773
  ],
888
774
  "flags": {
889
775
  "json": {
@@ -916,30 +802,28 @@
916
802
  },
917
803
  "hasDynamicHelp": false,
918
804
  "hiddenAliases": [],
919
- "id": "kv:get",
805
+ "id": "fleet:get",
920
806
  "pluginAlias": "@formant/formant-cli",
921
807
  "pluginName": "@formant/formant-cli",
922
808
  "pluginType": "core",
923
809
  "strict": true,
924
- "summary": "Get key-value",
810
+ "summary": "Get fleet details",
925
811
  "enableJsonFlag": true,
926
812
  "isESM": true,
927
813
  "relativePath": [
928
814
  "dist",
929
815
  "commands",
930
- "kv",
816
+ "fleet",
931
817
  "get.js"
932
818
  ]
933
819
  },
934
- "kv:list": {
820
+ "fleet:list": {
935
821
  "aliases": [],
936
822
  "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.",
823
+ "description": "List all device groups (fleets) in your organization.\n\nDevice groups allow you to organize and manage sets of devices together.",
938
824
  "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"
825
+ "<%= config.bin %> fleet list",
826
+ "<%= config.bin %> fleet list --json"
943
827
  ],
944
828
  "flags": {
945
829
  "json": {
@@ -968,59 +852,38 @@
968
852
  "name": "stage",
969
853
  "allowNo": false,
970
854
  "type": "boolean"
971
- },
972
- "keys": {
973
- "char": "k",
974
- "description": "Specific keys to query (can be specified multiple times)",
975
- "name": "keys",
976
- "hasDynamicHelp": false,
977
- "multiple": true,
978
- "type": "option"
979
- },
980
- "prefix": {
981
- "char": "p",
982
- "description": "Filter keys by prefix",
983
- "name": "prefix",
984
- "hasDynamicHelp": false,
985
- "multiple": false,
986
- "type": "option"
987
855
  }
988
856
  },
989
857
  "hasDynamicHelp": false,
990
858
  "hiddenAliases": [],
991
- "id": "kv:list",
859
+ "id": "fleet:list",
992
860
  "pluginAlias": "@formant/formant-cli",
993
861
  "pluginName": "@formant/formant-cli",
994
862
  "pluginType": "core",
995
863
  "strict": true,
996
- "summary": "List key-value keys",
864
+ "summary": "List device groups",
997
865
  "enableJsonFlag": true,
998
866
  "isESM": true,
999
867
  "relativePath": [
1000
868
  "dist",
1001
869
  "commands",
1002
- "kv",
870
+ "fleet",
1003
871
  "list.js"
1004
872
  ]
1005
873
  },
1006
- "kv:set": {
874
+ "device:config": {
1007
875
  "aliases": [],
1008
876
  "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",
877
+ "id": {
878
+ "description": "Device ID (UUID)",
879
+ "name": "id",
1017
880
  "required": true
1018
881
  }
1019
882
  },
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.",
883
+ "description": "Get the device configuration including stream definitions.\n\nShows the device's current configuration including telemetry streams, commands,\nand other settings.",
1021
884
  "examples": [
1022
- "<%= config.bin %> kv set my-key '{\"data\": \"value\"}'",
1023
- "<%= config.bin %> kv set config '{\"setting\": true}'"
885
+ "<%= config.bin %> device config <device-id>",
886
+ "<%= config.bin %> device config <device-id> --json"
1024
887
  ],
1025
888
  "flags": {
1026
889
  "json": {
@@ -1053,30 +916,35 @@
1053
916
  },
1054
917
  "hasDynamicHelp": false,
1055
918
  "hiddenAliases": [],
1056
- "id": "kv:set",
919
+ "id": "device:config",
1057
920
  "pluginAlias": "@formant/formant-cli",
1058
921
  "pluginName": "@formant/formant-cli",
1059
922
  "pluginType": "core",
1060
923
  "strict": true,
1061
- "summary": "Set key-value",
924
+ "summary": "Get device configuration",
1062
925
  "enableJsonFlag": true,
1063
926
  "isESM": true,
1064
927
  "relativePath": [
1065
928
  "dist",
1066
929
  "commands",
1067
- "kv",
1068
- "set.js"
930
+ "device",
931
+ "config.js"
1069
932
  ]
1070
933
  },
1071
- "ingest:batch": {
934
+ "device:create": {
1072
935
  "aliases": [],
1073
- "args": {},
1074
- "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).",
936
+ "args": {
937
+ "name": {
938
+ "description": "Name for the new device",
939
+ "name": "name",
940
+ "required": true
941
+ }
942
+ },
943
+ "description": "Create a new device in your fleet.\n\nThe device is created as enabled by default. You can optionally specify tags.",
1075
944
  "examples": [
1076
- "<%= config.bin %> ingest batch --file data.json",
1077
- "<%= config.bin %> ingest batch --stdin < data.json",
1078
- "cat payload.json | <%= config.bin %> ingest batch --stdin",
1079
- "# 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}"
945
+ "<%= config.bin %> device create my-robot",
946
+ "<%= config.bin %> device create my-robot --tag location=warehouse --tag env=prod",
947
+ "<%= config.bin %> device create my-robot --json"
1080
948
  ],
1081
949
  "flags": {
1082
950
  "json": {
@@ -1106,52 +974,45 @@
1106
974
  "allowNo": false,
1107
975
  "type": "boolean"
1108
976
  },
1109
- "file": {
1110
- "char": "f",
1111
- "description": "Path to JSON file containing batch payload",
1112
- "exclusive": [
1113
- "stdin"
1114
- ],
1115
- "name": "file",
977
+ "tag": {
978
+ "char": "t",
979
+ "description": "Tag to apply (key=value), can be specified multiple times",
980
+ "name": "tag",
1116
981
  "hasDynamicHelp": false,
1117
- "multiple": false,
982
+ "multiple": true,
1118
983
  "type": "option"
1119
- },
1120
- "stdin": {
1121
- "description": "Read JSON payload from stdin",
1122
- "exclusive": [
1123
- "file"
1124
- ],
1125
- "name": "stdin",
1126
- "allowNo": false,
1127
- "type": "boolean"
1128
984
  }
1129
985
  },
1130
986
  "hasDynamicHelp": false,
1131
987
  "hiddenAliases": [],
1132
- "id": "ingest:batch",
988
+ "id": "device:create",
1133
989
  "pluginAlias": "@formant/formant-cli",
1134
990
  "pluginName": "@formant/formant-cli",
1135
991
  "pluginType": "core",
1136
992
  "strict": true,
1137
- "summary": "Ingest batch data from file or stdin",
993
+ "summary": "Create a new device",
1138
994
  "enableJsonFlag": true,
1139
995
  "isESM": true,
1140
996
  "relativePath": [
1141
997
  "dist",
1142
998
  "commands",
1143
- "ingest",
1144
- "batch.js"
999
+ "device",
1000
+ "create.js"
1145
1001
  ]
1146
1002
  },
1147
- "ingest:bitset": {
1003
+ "device:delete": {
1148
1004
  "aliases": [],
1149
- "args": {},
1150
- "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",
1005
+ "args": {
1006
+ "id": {
1007
+ "description": "Device ID (UUID)",
1008
+ "name": "id",
1009
+ "required": true
1010
+ }
1011
+ },
1012
+ "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.",
1151
1013
  "examples": [
1152
- "<%= config.bin %> ingest bitset --device <device-id> --stream sensors --keys \"door,window,motion\" --values \"true,false,true\"",
1153
- "<%= config.bin %> ingest bitset --device <device-id> --stream flags --keys \"active,paused,error\" --values \"true,false,false\" --tag system=main",
1154
- "<%= config.bin %> ingest bitset --device <device-id> --stream states --keys \"a,b\" --values \"false,true\""
1014
+ "<%= config.bin %> device delete <device-id>",
1015
+ "<%= config.bin %> device delete <device-id> --json"
1155
1016
  ],
1156
1017
  "flags": {
1157
1018
  "json": {
@@ -1180,84 +1041,38 @@
1180
1041
  "name": "stage",
1181
1042
  "allowNo": false,
1182
1043
  "type": "boolean"
1183
- },
1184
- "device": {
1185
- "char": "d",
1186
- "description": "Device ID (UUID)",
1187
- "name": "device",
1188
- "required": true,
1189
- "hasDynamicHelp": false,
1190
- "multiple": false,
1191
- "type": "option"
1192
- },
1193
- "stream": {
1194
- "char": "s",
1195
- "description": "Stream name",
1196
- "name": "stream",
1197
- "required": true,
1198
- "hasDynamicHelp": false,
1199
- "multiple": false,
1200
- "type": "option"
1201
- },
1202
- "keys": {
1203
- "char": "k",
1204
- "description": "Comma-separated list of key names (1-1000 keys, max 255 chars each)",
1205
- "name": "keys",
1206
- "required": true,
1207
- "hasDynamicHelp": false,
1208
- "multiple": false,
1209
- "type": "option"
1210
- },
1211
- "values": {
1212
- "char": "v",
1213
- "description": "Comma-separated list of boolean values (true/false, must match key count)",
1214
- "name": "values",
1215
- "required": true,
1216
- "hasDynamicHelp": false,
1217
- "multiple": false,
1218
- "type": "option"
1219
- },
1220
- "tag": {
1221
- "char": "t",
1222
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
1223
- "name": "tag",
1224
- "hasDynamicHelp": false,
1225
- "multiple": true,
1226
- "type": "option"
1227
- },
1228
- "timestamp": {
1229
- "description": "Unix timestamp in milliseconds (defaults to now)",
1230
- "name": "timestamp",
1231
- "hasDynamicHelp": false,
1232
- "multiple": false,
1233
- "type": "option"
1234
1044
  }
1235
1045
  },
1236
1046
  "hasDynamicHelp": false,
1237
1047
  "hiddenAliases": [],
1238
- "id": "ingest:bitset",
1048
+ "id": "device:delete",
1239
1049
  "pluginAlias": "@formant/formant-cli",
1240
1050
  "pluginName": "@formant/formant-cli",
1241
1051
  "pluginType": "core",
1242
1052
  "strict": true,
1243
- "summary": "Ingest bitset data",
1053
+ "summary": "Delete (disable) a device",
1244
1054
  "enableJsonFlag": true,
1245
1055
  "isESM": true,
1246
1056
  "relativePath": [
1247
1057
  "dist",
1248
1058
  "commands",
1249
- "ingest",
1250
- "bitset.js"
1059
+ "device",
1060
+ "delete.js"
1251
1061
  ]
1252
1062
  },
1253
- "ingest:health": {
1063
+ "device:get": {
1254
1064
  "aliases": [],
1255
- "args": {},
1256
- "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.",
1065
+ "args": {
1066
+ "id": {
1067
+ "description": "Device ID (UUID)",
1068
+ "name": "id",
1069
+ "required": true
1070
+ }
1071
+ },
1072
+ "description": "Get detailed information about a specific device by its ID.",
1257
1073
  "examples": [
1258
- "<%= config.bin %> ingest health --device <device-id> --stream system_health --status operational",
1259
- "<%= config.bin %> ingest health --device <device-id> --stream health --status error --tag component=motor",
1260
- "<%= config.bin %> ingest health --device <device-id> --stream sync --status operational --clock-skew 150"
1074
+ "<%= config.bin %> device get <device-id>",
1075
+ "<%= config.bin %> device get <device-id> --json"
1261
1076
  ],
1262
1077
  "flags": {
1263
1078
  "json": {
@@ -1286,87 +1101,37 @@
1286
1101
  "name": "stage",
1287
1102
  "allowNo": false,
1288
1103
  "type": "boolean"
1289
- },
1290
- "device": {
1291
- "char": "d",
1292
- "description": "Device ID (UUID)",
1293
- "name": "device",
1294
- "required": true,
1295
- "hasDynamicHelp": false,
1296
- "multiple": false,
1297
- "type": "option"
1298
- },
1299
- "stream": {
1300
- "char": "s",
1301
- "description": "Stream name",
1302
- "name": "stream",
1303
- "required": true,
1304
- "hasDynamicHelp": false,
1305
- "multiple": false,
1306
- "type": "option"
1307
- },
1308
- "status": {
1309
- "description": "Health status (unknown, operational, offline, or error)",
1310
- "name": "status",
1311
- "required": true,
1312
- "hasDynamicHelp": false,
1313
- "multiple": false,
1314
- "options": [
1315
- "unknown",
1316
- "operational",
1317
- "offline",
1318
- "error"
1319
- ],
1320
- "type": "option"
1321
- },
1322
- "clock-skew": {
1323
- "description": "Clock skew in milliseconds (optional)",
1324
- "name": "clock-skew",
1325
- "hasDynamicHelp": false,
1326
- "multiple": false,
1327
- "type": "option"
1328
- },
1329
- "tag": {
1330
- "char": "t",
1331
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
1332
- "name": "tag",
1333
- "hasDynamicHelp": false,
1334
- "multiple": true,
1335
- "type": "option"
1336
- },
1337
- "timestamp": {
1338
- "description": "Unix timestamp in milliseconds (defaults to now)",
1339
- "name": "timestamp",
1340
- "hasDynamicHelp": false,
1341
- "multiple": false,
1342
- "type": "option"
1343
1104
  }
1344
1105
  },
1345
1106
  "hasDynamicHelp": false,
1346
1107
  "hiddenAliases": [],
1347
- "id": "ingest:health",
1108
+ "id": "device:get",
1348
1109
  "pluginAlias": "@formant/formant-cli",
1349
1110
  "pluginName": "@formant/formant-cli",
1350
1111
  "pluginType": "core",
1351
1112
  "strict": true,
1352
- "summary": "Ingest health status data",
1113
+ "summary": "Get a device by ID",
1353
1114
  "enableJsonFlag": true,
1354
1115
  "isESM": true,
1355
1116
  "relativePath": [
1356
1117
  "dist",
1357
1118
  "commands",
1358
- "ingest",
1359
- "health.js"
1119
+ "device",
1120
+ "get.js"
1360
1121
  ]
1361
1122
  },
1362
- "ingest:image": {
1123
+ "device:list": {
1363
1124
  "aliases": [],
1364
1125
  "args": {},
1365
- "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.",
1126
+ "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.",
1366
1127
  "examples": [
1367
- "<%= config.bin %> ingest image --device <device-id> --stream camera_front --url https://example.com/image.jpg",
1368
- "<%= config.bin %> ingest image --device <device-id> --stream snapshot --url https://example.com/snap.png --size 1024000",
1369
- "<%= config.bin %> ingest image --device <device-id> --stream detection --url https://example.com/detect.jpg --tag frame=123"
1128
+ "<%= config.bin %> device list",
1129
+ "<%= config.bin %> device list --include-offline",
1130
+ "<%= config.bin %> device list --with-data",
1131
+ "<%= config.bin %> device list --with-data --days 90",
1132
+ "<%= config.bin %> device list --include-offline --limit 100",
1133
+ "<%= config.bin %> device list --tag location=warehouse",
1134
+ "<%= config.bin %> device list --name robot --dev --json"
1370
1135
  ],
1371
1136
  "flags": {
1372
1137
  "json": {
@@ -1396,87 +1161,89 @@
1396
1161
  "allowNo": false,
1397
1162
  "type": "boolean"
1398
1163
  },
1399
- "device": {
1400
- "char": "d",
1401
- "description": "Device ID (UUID)",
1402
- "name": "device",
1403
- "required": true,
1404
- "hasDynamicHelp": false,
1405
- "multiple": false,
1406
- "type": "option"
1164
+ "include-offline": {
1165
+ "char": "a",
1166
+ "description": "Include offline devices",
1167
+ "name": "include-offline",
1168
+ "allowNo": false,
1169
+ "type": "boolean"
1407
1170
  },
1408
- "stream": {
1409
- "char": "s",
1410
- "description": "Stream name",
1411
- "name": "stream",
1412
- "required": true,
1171
+ "days": {
1172
+ "description": "How many days back to search for last seen data",
1173
+ "name": "days",
1174
+ "default": 30,
1413
1175
  "hasDynamicHelp": false,
1414
1176
  "multiple": false,
1415
1177
  "type": "option"
1416
1178
  },
1417
- "url": {
1418
- "char": "u",
1419
- "description": "Image URL (must be http:// or https://)",
1420
- "name": "url",
1421
- "required": true,
1179
+ "limit": {
1180
+ "char": "l",
1181
+ "description": "Maximum number of devices to return",
1182
+ "name": "limit",
1183
+ "default": 50,
1422
1184
  "hasDynamicHelp": false,
1423
1185
  "multiple": false,
1424
1186
  "type": "option"
1425
1187
  },
1426
- "size": {
1427
- "description": "Image size in bytes (optional)",
1428
- "name": "size",
1188
+ "name": {
1189
+ "char": "n",
1190
+ "description": "Filter devices by name (search)",
1191
+ "name": "name",
1429
1192
  "hasDynamicHelp": false,
1430
1193
  "multiple": false,
1431
1194
  "type": "option"
1432
1195
  },
1196
+ "with-data": {
1197
+ "char": "w",
1198
+ "description": "Only show devices that have data in the last --days window",
1199
+ "name": "with-data",
1200
+ "allowNo": false,
1201
+ "type": "boolean"
1202
+ },
1433
1203
  "tag": {
1434
1204
  "char": "t",
1435
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
1205
+ "description": "Filter by tag (key=value), can be specified multiple times",
1436
1206
  "name": "tag",
1437
1207
  "hasDynamicHelp": false,
1438
1208
  "multiple": true,
1439
1209
  "type": "option"
1440
- },
1441
- "timestamp": {
1442
- "description": "Unix timestamp in milliseconds (defaults to now)",
1443
- "name": "timestamp",
1444
- "hasDynamicHelp": false,
1445
- "multiple": false,
1446
- "type": "option"
1447
1210
  }
1448
1211
  },
1449
1212
  "hasDynamicHelp": false,
1450
1213
  "hiddenAliases": [],
1451
- "id": "ingest:image",
1214
+ "id": "device:list",
1452
1215
  "pluginAlias": "@formant/formant-cli",
1453
1216
  "pluginName": "@formant/formant-cli",
1454
1217
  "pluginType": "core",
1455
1218
  "strict": true,
1456
- "summary": "Ingest image data",
1219
+ "summary": "List robots and sensors in your fleet",
1457
1220
  "enableJsonFlag": true,
1458
1221
  "isESM": true,
1459
1222
  "relativePath": [
1460
1223
  "dist",
1461
1224
  "commands",
1462
- "ingest",
1463
- "image.js"
1225
+ "device",
1226
+ "list.js"
1464
1227
  ]
1465
1228
  },
1466
- "ingest:json": {
1229
+ "device:rename": {
1467
1230
  "aliases": [],
1468
1231
  "args": {
1469
- "value": {
1470
- "description": "JSON value to ingest (as a JSON string)",
1471
- "name": "value",
1232
+ "id": {
1233
+ "description": "Device ID (UUID)",
1234
+ "name": "id",
1235
+ "required": true
1236
+ },
1237
+ "name": {
1238
+ "description": "New name for the device",
1239
+ "name": "name",
1472
1240
  "required": true
1473
1241
  }
1474
1242
  },
1475
- "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.",
1243
+ "description": "Rename a device by updating its name.",
1476
1244
  "examples": [
1477
- "<%= config.bin %> ingest json '{\"x\":1,\"y\":2}' --device <device-id> --stream position",
1478
- "<%= config.bin %> ingest json '{\"status\":\"active\",\"mode\":\"auto\"}' --device <device-id> --stream config",
1479
- "<%= config.bin %> ingest json '[1,2,3,4,5]' --device <device-id> --stream array_data"
1245
+ "<%= config.bin %> device rename <device-id> new-robot-name",
1246
+ "<%= config.bin %> device rename <device-id> new-robot-name --json"
1480
1247
  ],
1481
1248
  "flags": {
1482
1249
  "json": {
@@ -1505,72 +1272,40 @@
1505
1272
  "name": "stage",
1506
1273
  "allowNo": false,
1507
1274
  "type": "boolean"
1508
- },
1509
- "device": {
1510
- "char": "d",
1275
+ }
1276
+ },
1277
+ "hasDynamicHelp": false,
1278
+ "hiddenAliases": [],
1279
+ "id": "device:rename",
1280
+ "pluginAlias": "@formant/formant-cli",
1281
+ "pluginName": "@formant/formant-cli",
1282
+ "pluginType": "core",
1283
+ "strict": true,
1284
+ "summary": "Rename a device",
1285
+ "enableJsonFlag": true,
1286
+ "isESM": true,
1287
+ "relativePath": [
1288
+ "dist",
1289
+ "commands",
1290
+ "device",
1291
+ "rename.js"
1292
+ ]
1293
+ },
1294
+ "device:streams": {
1295
+ "aliases": [],
1296
+ "args": {
1297
+ "id": {
1511
1298
  "description": "Device ID (UUID)",
1512
- "name": "device",
1513
- "required": true,
1514
- "hasDynamicHelp": false,
1515
- "multiple": false,
1516
- "type": "option"
1517
- },
1518
- "stream": {
1519
- "char": "s",
1520
- "description": "Stream name",
1521
- "name": "stream",
1522
- "required": true,
1523
- "hasDynamicHelp": false,
1524
- "multiple": false,
1525
- "type": "option"
1526
- },
1527
- "tag": {
1528
- "char": "t",
1529
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
1530
- "name": "tag",
1531
- "hasDynamicHelp": false,
1532
- "multiple": true,
1533
- "type": "option"
1534
- },
1535
- "timestamp": {
1536
- "description": "Unix timestamp in milliseconds (defaults to now)",
1537
- "name": "timestamp",
1538
- "hasDynamicHelp": false,
1539
- "multiple": false,
1540
- "type": "option"
1541
- }
1542
- },
1543
- "hasDynamicHelp": false,
1544
- "hiddenAliases": [],
1545
- "id": "ingest:json",
1546
- "pluginAlias": "@formant/formant-cli",
1547
- "pluginName": "@formant/formant-cli",
1548
- "pluginType": "core",
1549
- "strict": true,
1550
- "summary": "Ingest JSON data",
1551
- "enableJsonFlag": true,
1552
- "isESM": true,
1553
- "relativePath": [
1554
- "dist",
1555
- "commands",
1556
- "ingest",
1557
- "json.js"
1558
- ]
1559
- },
1560
- "ingest:numeric": {
1561
- "aliases": [],
1562
- "args": {
1563
- "value": {
1564
- "description": "Numeric value to ingest",
1565
- "name": "value",
1299
+ "name": "id",
1566
1300
  "required": true
1567
1301
  }
1568
1302
  },
1569
- "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.",
1303
+ "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\".",
1570
1304
  "examples": [
1571
- "<%= config.bin %> ingest numeric 42.5 --device <device-id> --stream battery_level",
1572
- "<%= config.bin %> ingest numeric 98.6 --device <device-id> --stream temperature --tag unit=fahrenheit",
1573
- "<%= config.bin %> ingest numeric 1500 --device <device-id> --stream rpm --timestamp 1700000000000"
1305
+ "<%= config.bin %> device streams <device-id>",
1306
+ "<%= config.bin %> device streams <device-id> --with-data",
1307
+ "<%= config.bin %> device streams <device-id> --with-data --days 30",
1308
+ "<%= config.bin %> device streams <device-id> --json"
1574
1309
  ],
1575
1310
  "flags": {
1576
1311
  "json": {
@@ -1600,71 +1335,53 @@
1600
1335
  "allowNo": false,
1601
1336
  "type": "boolean"
1602
1337
  },
1603
- "device": {
1604
- "char": "d",
1605
- "description": "Device ID (UUID)",
1606
- "name": "device",
1607
- "required": true,
1608
- "hasDynamicHelp": false,
1609
- "multiple": false,
1610
- "type": "option"
1611
- },
1612
- "stream": {
1613
- "char": "s",
1614
- "description": "Stream name",
1615
- "name": "stream",
1616
- "required": true,
1338
+ "days": {
1339
+ "description": "How many days back to look for stream data presence",
1340
+ "name": "days",
1341
+ "default": 7,
1617
1342
  "hasDynamicHelp": false,
1618
1343
  "multiple": false,
1619
1344
  "type": "option"
1620
1345
  },
1621
- "tag": {
1622
- "char": "t",
1623
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
1624
- "name": "tag",
1625
- "hasDynamicHelp": false,
1626
- "multiple": true,
1627
- "type": "option"
1628
- },
1629
- "timestamp": {
1630
- "description": "Unix timestamp in milliseconds (defaults to now)",
1631
- "name": "timestamp",
1632
- "hasDynamicHelp": false,
1633
- "multiple": false,
1634
- "type": "option"
1346
+ "with-data": {
1347
+ "char": "w",
1348
+ "description": "Only show streams that have data in the --days window",
1349
+ "name": "with-data",
1350
+ "allowNo": false,
1351
+ "type": "boolean"
1635
1352
  }
1636
1353
  },
1637
1354
  "hasDynamicHelp": false,
1638
1355
  "hiddenAliases": [],
1639
- "id": "ingest:numeric",
1356
+ "id": "device:streams",
1640
1357
  "pluginAlias": "@formant/formant-cli",
1641
1358
  "pluginName": "@formant/formant-cli",
1642
1359
  "pluginType": "core",
1643
1360
  "strict": true,
1644
- "summary": "Ingest numeric data",
1361
+ "summary": "List device streams with data presence",
1645
1362
  "enableJsonFlag": true,
1646
1363
  "isESM": true,
1647
1364
  "relativePath": [
1648
1365
  "dist",
1649
1366
  "commands",
1650
- "ingest",
1651
- "numeric.js"
1367
+ "device",
1368
+ "streams.js"
1652
1369
  ]
1653
1370
  },
1654
- "ingest:text": {
1371
+ "device:tag": {
1655
1372
  "aliases": [],
1656
1373
  "args": {
1657
- "value": {
1658
- "description": "Text value to ingest",
1659
- "name": "value",
1374
+ "id": {
1375
+ "description": "Device ID (UUID)",
1376
+ "name": "id",
1660
1377
  "required": true
1661
1378
  }
1662
1379
  },
1663
- "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.",
1380
+ "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.",
1664
1381
  "examples": [
1665
- "<%= config.bin %> ingest text \"Robot started successfully\" --device <device-id> --stream status",
1666
- "<%= config.bin %> ingest text \"Error: sensor offline\" --device <device-id> --stream errors --tag severity=high",
1667
- "<%= config.bin %> ingest text \"Checkpoint A reached\" --device <device-id> --stream waypoints"
1382
+ "<%= config.bin %> device tag <device-id> --tag location=warehouse",
1383
+ "<%= config.bin %> device tag <device-id> --tag env=prod --tag region=us-east",
1384
+ "<%= config.bin %> device tag <device-id> --tag location=factory --json"
1668
1385
  ],
1669
1386
  "flags": {
1670
1387
  "json": {
@@ -1694,65 +1411,47 @@
1694
1411
  "allowNo": false,
1695
1412
  "type": "boolean"
1696
1413
  },
1697
- "device": {
1698
- "char": "d",
1699
- "description": "Device ID (UUID)",
1700
- "name": "device",
1701
- "required": true,
1702
- "hasDynamicHelp": false,
1703
- "multiple": false,
1704
- "type": "option"
1705
- },
1706
- "stream": {
1707
- "char": "s",
1708
- "description": "Stream name",
1709
- "name": "stream",
1710
- "required": true,
1711
- "hasDynamicHelp": false,
1712
- "multiple": false,
1713
- "type": "option"
1714
- },
1715
1414
  "tag": {
1716
1415
  "char": "t",
1717
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
1416
+ "description": "Tag to add or update (key=value), can be specified multiple times",
1718
1417
  "name": "tag",
1418
+ "required": true,
1719
1419
  "hasDynamicHelp": false,
1720
1420
  "multiple": true,
1721
1421
  "type": "option"
1722
- },
1723
- "timestamp": {
1724
- "description": "Unix timestamp in milliseconds (defaults to now)",
1725
- "name": "timestamp",
1726
- "hasDynamicHelp": false,
1727
- "multiple": false,
1728
- "type": "option"
1729
1422
  }
1730
1423
  },
1731
1424
  "hasDynamicHelp": false,
1732
1425
  "hiddenAliases": [],
1733
- "id": "ingest:text",
1426
+ "id": "device:tag",
1734
1427
  "pluginAlias": "@formant/formant-cli",
1735
1428
  "pluginName": "@formant/formant-cli",
1736
1429
  "pluginType": "core",
1737
1430
  "strict": true,
1738
- "summary": "Ingest text data",
1431
+ "summary": "Add or update tags on a device",
1739
1432
  "enableJsonFlag": true,
1740
1433
  "isESM": true,
1741
1434
  "relativePath": [
1742
1435
  "dist",
1743
1436
  "commands",
1744
- "ingest",
1745
- "text.js"
1437
+ "device",
1438
+ "tag.js"
1746
1439
  ]
1747
1440
  },
1748
- "ingest:video": {
1441
+ "device:untag": {
1749
1442
  "aliases": [],
1750
- "args": {},
1751
- "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).",
1443
+ "args": {
1444
+ "id": {
1445
+ "description": "Device ID (UUID)",
1446
+ "name": "id",
1447
+ "required": true
1448
+ }
1449
+ },
1450
+ "description": "Remove tags from a device.\n\nSpecify one or more tag keys to remove with --key.",
1752
1451
  "examples": [
1753
- "<%= config.bin %> ingest video --device <device-id> --stream recordings --url https://example.com/video.mp4 --duration 5000",
1754
- "<%= config.bin %> ingest video --device <device-id> --stream clips --url https://example.com/clip.webm --duration 3500 --size 2048000",
1755
- "<%= config.bin %> ingest video --device <device-id> --stream event_video --url https://example.com/event.mov --duration 10000 --tag event=collision"
1452
+ "<%= config.bin %> device untag <device-id> --key location",
1453
+ "<%= config.bin %> device untag <device-id> --key env --key region",
1454
+ "<%= config.bin %> device untag <device-id> --key location --json"
1756
1455
  ],
1757
1456
  "flags": {
1758
1457
  "json": {
@@ -1782,88 +1481,46 @@
1782
1481
  "allowNo": false,
1783
1482
  "type": "boolean"
1784
1483
  },
1785
- "device": {
1786
- "char": "d",
1787
- "description": "Device ID (UUID)",
1788
- "name": "device",
1789
- "required": true,
1790
- "hasDynamicHelp": false,
1791
- "multiple": false,
1792
- "type": "option"
1793
- },
1794
- "stream": {
1795
- "char": "s",
1796
- "description": "Stream name",
1797
- "name": "stream",
1798
- "required": true,
1799
- "hasDynamicHelp": false,
1800
- "multiple": false,
1801
- "type": "option"
1802
- },
1803
- "url": {
1804
- "char": "u",
1805
- "description": "Video URL (must be http:// or https://)",
1806
- "name": "url",
1807
- "required": true,
1808
- "hasDynamicHelp": false,
1809
- "multiple": false,
1810
- "type": "option"
1811
- },
1812
- "duration": {
1813
- "description": "Video duration in milliseconds (required)",
1814
- "name": "duration",
1484
+ "key": {
1485
+ "char": "k",
1486
+ "description": "Tag key to remove, can be specified multiple times",
1487
+ "name": "key",
1815
1488
  "required": true,
1816
1489
  "hasDynamicHelp": false,
1817
- "multiple": false,
1818
- "type": "option"
1819
- },
1820
- "size": {
1821
- "description": "Video size in bytes (optional)",
1822
- "name": "size",
1823
- "hasDynamicHelp": false,
1824
- "multiple": false,
1825
- "type": "option"
1826
- },
1827
- "tag": {
1828
- "char": "t",
1829
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
1830
- "name": "tag",
1831
- "hasDynamicHelp": false,
1832
1490
  "multiple": true,
1833
1491
  "type": "option"
1834
- },
1835
- "timestamp": {
1836
- "description": "Unix timestamp in milliseconds (defaults to now)",
1837
- "name": "timestamp",
1838
- "hasDynamicHelp": false,
1839
- "multiple": false,
1840
- "type": "option"
1841
1492
  }
1842
1493
  },
1843
1494
  "hasDynamicHelp": false,
1844
1495
  "hiddenAliases": [],
1845
- "id": "ingest:video",
1496
+ "id": "device:untag",
1846
1497
  "pluginAlias": "@formant/formant-cli",
1847
1498
  "pluginName": "@formant/formant-cli",
1848
1499
  "pluginType": "core",
1849
1500
  "strict": true,
1850
- "summary": "Ingest video data",
1501
+ "summary": "Remove tags from a device",
1851
1502
  "enableJsonFlag": true,
1852
1503
  "isESM": true,
1853
1504
  "relativePath": [
1854
1505
  "dist",
1855
1506
  "commands",
1856
- "ingest",
1857
- "video.js"
1507
+ "device",
1508
+ "untag.js"
1858
1509
  ]
1859
1510
  },
1860
- "org:get": {
1511
+ "kv:get": {
1861
1512
  "aliases": [],
1862
- "args": {},
1863
- "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.",
1513
+ "args": {
1514
+ "key": {
1515
+ "description": "Key to retrieve",
1516
+ "name": "key",
1517
+ "required": true
1518
+ }
1519
+ },
1520
+ "description": "Get a value from the key-value store.\n\nThe key-value store allows devices and applications to store metadata.",
1864
1521
  "examples": [
1865
- "<%= config.bin %> org get",
1866
- "<%= config.bin %> org get --json"
1522
+ "<%= config.bin %> kv get my-key",
1523
+ "<%= config.bin %> kv get my-key --json"
1867
1524
  ],
1868
1525
  "flags": {
1869
1526
  "json": {
@@ -1896,30 +1553,30 @@
1896
1553
  },
1897
1554
  "hasDynamicHelp": false,
1898
1555
  "hiddenAliases": [],
1899
- "id": "org:get",
1556
+ "id": "kv:get",
1900
1557
  "pluginAlias": "@formant/formant-cli",
1901
1558
  "pluginName": "@formant/formant-cli",
1902
1559
  "pluginType": "core",
1903
1560
  "strict": true,
1904
- "summary": "Get your organization",
1561
+ "summary": "Get key-value",
1905
1562
  "enableJsonFlag": true,
1906
1563
  "isESM": true,
1907
1564
  "relativePath": [
1908
1565
  "dist",
1909
1566
  "commands",
1910
- "org",
1567
+ "kv",
1911
1568
  "get.js"
1912
1569
  ]
1913
1570
  },
1914
- "org:update": {
1571
+ "kv:list": {
1915
1572
  "aliases": [],
1916
1573
  "args": {},
1917
- "description": "Update your organization's details.\n\nAt least one of --name or --description must be provided.",
1574
+ "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.",
1918
1575
  "examples": [
1919
- "<%= config.bin %> org update --name \"My Fleet\"",
1920
- "<%= config.bin %> org update --description \"Production robot fleet\"",
1921
- "<%= config.bin %> org update --name \"My Fleet\" --description \"Production robot fleet\"",
1922
- "<%= config.bin %> org update --name \"My Fleet\" --json"
1576
+ "<%= config.bin %> kv list",
1577
+ "<%= config.bin %> kv list --prefix config",
1578
+ "<%= config.bin %> kv list --keys key1 --keys key2 --keys key3",
1579
+ "<%= config.bin %> kv list --json"
1923
1580
  ],
1924
1581
  "flags": {
1925
1582
  "json": {
@@ -1949,18 +1606,18 @@
1949
1606
  "allowNo": false,
1950
1607
  "type": "boolean"
1951
1608
  },
1952
- "description": {
1953
- "char": "d",
1954
- "description": "New description for the organization",
1955
- "name": "description",
1609
+ "keys": {
1610
+ "char": "k",
1611
+ "description": "Specific keys to query (can be specified multiple times)",
1612
+ "name": "keys",
1956
1613
  "hasDynamicHelp": false,
1957
- "multiple": false,
1614
+ "multiple": true,
1958
1615
  "type": "option"
1959
1616
  },
1960
- "name": {
1961
- "char": "n",
1962
- "description": "New name for the organization",
1963
- "name": "name",
1617
+ "prefix": {
1618
+ "char": "p",
1619
+ "description": "Filter keys by prefix",
1620
+ "name": "prefix",
1964
1621
  "hasDynamicHelp": false,
1965
1622
  "multiple": false,
1966
1623
  "type": "option"
@@ -1968,29 +1625,39 @@
1968
1625
  },
1969
1626
  "hasDynamicHelp": false,
1970
1627
  "hiddenAliases": [],
1971
- "id": "org:update",
1628
+ "id": "kv:list",
1972
1629
  "pluginAlias": "@formant/formant-cli",
1973
1630
  "pluginName": "@formant/formant-cli",
1974
1631
  "pluginType": "core",
1975
1632
  "strict": true,
1976
- "summary": "Update your organization",
1633
+ "summary": "List key-value keys",
1977
1634
  "enableJsonFlag": true,
1978
1635
  "isESM": true,
1979
1636
  "relativePath": [
1980
1637
  "dist",
1981
1638
  "commands",
1982
- "org",
1983
- "update.js"
1639
+ "kv",
1640
+ "list.js"
1984
1641
  ]
1985
1642
  },
1986
- "investigation:analytics": {
1643
+ "kv:set": {
1987
1644
  "aliases": [],
1988
- "args": {},
1989
- "description": "Get investigation analytics with time-series data.\n\nReturns aggregated analytics about investigation runs over a time range,\noptionally grouped by result type or signal type.",
1645
+ "args": {
1646
+ "key": {
1647
+ "description": "Key to set",
1648
+ "name": "key",
1649
+ "required": true
1650
+ },
1651
+ "value": {
1652
+ "description": "Value to store (JSON string)",
1653
+ "name": "value",
1654
+ "required": true
1655
+ }
1656
+ },
1657
+ "description": "Set a value in the key-value store.\n\nStores a value associated with a key. The value should be a JSON string.",
1990
1658
  "examples": [
1991
- "<%= config.bin %> investigation analytics --start 2026-01-01 --end 2026-02-01",
1992
- "<%= config.bin %> investigation analytics --start 2026-01-01 --end 2026-02-01 --interval hourly",
1993
- "<%= config.bin %> investigation analytics --start 2026-01-01 --end 2026-02-01 --group-by resultType --json"
1659
+ "<%= config.bin %> kv set my-key '{\"data\": \"value\"}'",
1660
+ "<%= config.bin %> kv set config '{\"setting\": true}'"
1994
1661
  ],
1995
1662
  "flags": {
1996
1663
  "json": {
@@ -2019,77 +1686,34 @@
2019
1686
  "name": "stage",
2020
1687
  "allowNo": false,
2021
1688
  "type": "boolean"
2022
- },
2023
- "end": {
2024
- "description": "End time (ISO 8601)",
2025
- "name": "end",
2026
- "required": true,
2027
- "hasDynamicHelp": false,
2028
- "multiple": false,
2029
- "type": "option"
2030
- },
2031
- "group-by": {
2032
- "description": "Group results by",
2033
- "name": "group-by",
2034
- "hasDynamicHelp": false,
2035
- "multiple": false,
2036
- "options": [
2037
- "resultType",
2038
- "signalType"
2039
- ],
2040
- "type": "option"
2041
- },
2042
- "interval": {
2043
- "description": "Time interval for aggregation",
2044
- "name": "interval",
2045
- "default": "daily",
2046
- "hasDynamicHelp": false,
2047
- "multiple": false,
2048
- "options": [
2049
- "daily",
2050
- "hourly"
2051
- ],
2052
- "type": "option"
2053
- },
2054
- "start": {
2055
- "description": "Start time (ISO 8601)",
2056
- "name": "start",
2057
- "required": true,
2058
- "hasDynamicHelp": false,
2059
- "multiple": false,
2060
- "type": "option"
2061
1689
  }
2062
1690
  },
2063
1691
  "hasDynamicHelp": false,
2064
1692
  "hiddenAliases": [],
2065
- "id": "investigation:analytics",
1693
+ "id": "kv:set",
2066
1694
  "pluginAlias": "@formant/formant-cli",
2067
1695
  "pluginName": "@formant/formant-cli",
2068
1696
  "pluginType": "core",
2069
1697
  "strict": true,
2070
- "summary": "Get investigation analytics",
1698
+ "summary": "Set key-value",
2071
1699
  "enableJsonFlag": true,
2072
1700
  "isESM": true,
2073
1701
  "relativePath": [
2074
1702
  "dist",
2075
1703
  "commands",
2076
- "investigation",
2077
- "analytics.js"
1704
+ "kv",
1705
+ "set.js"
2078
1706
  ]
2079
1707
  },
2080
- "investigation:get": {
1708
+ "ingest:batch": {
2081
1709
  "aliases": [],
2082
- "args": {
2083
- "id": {
2084
- "description": "Investigation (taskflow) ID",
2085
- "name": "id",
2086
- "required": true
2087
- }
2088
- },
2089
- "description": "Get detailed information about a specific investigation by ID.",
1710
+ "args": {},
1711
+ "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).",
2090
1712
  "examples": [
2091
- "<%= config.bin %> investigation get <id>",
2092
- "<%= config.bin %> investigation get <id> --json"
1713
+ "<%= config.bin %> ingest batch --file data.json",
1714
+ "<%= config.bin %> ingest batch --stdin < data.json",
1715
+ "cat payload.json | <%= config.bin %> ingest batch --stdin",
1716
+ "# 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}"
2093
1717
  ],
2094
1718
  "flags": {
2095
1719
  "json": {
@@ -2118,33 +1742,53 @@
2118
1742
  "name": "stage",
2119
1743
  "allowNo": false,
2120
1744
  "type": "boolean"
1745
+ },
1746
+ "file": {
1747
+ "char": "f",
1748
+ "description": "Path to JSON file containing batch payload",
1749
+ "exclusive": [
1750
+ "stdin"
1751
+ ],
1752
+ "name": "file",
1753
+ "hasDynamicHelp": false,
1754
+ "multiple": false,
1755
+ "type": "option"
1756
+ },
1757
+ "stdin": {
1758
+ "description": "Read JSON payload from stdin",
1759
+ "exclusive": [
1760
+ "file"
1761
+ ],
1762
+ "name": "stdin",
1763
+ "allowNo": false,
1764
+ "type": "boolean"
2121
1765
  }
2122
1766
  },
2123
1767
  "hasDynamicHelp": false,
2124
1768
  "hiddenAliases": [],
2125
- "id": "investigation:get",
1769
+ "id": "ingest:batch",
2126
1770
  "pluginAlias": "@formant/formant-cli",
2127
1771
  "pluginName": "@formant/formant-cli",
2128
1772
  "pluginType": "core",
2129
1773
  "strict": true,
2130
- "summary": "Get an investigation by ID",
1774
+ "summary": "Ingest batch data from file or stdin",
2131
1775
  "enableJsonFlag": true,
2132
1776
  "isESM": true,
2133
1777
  "relativePath": [
2134
1778
  "dist",
2135
1779
  "commands",
2136
- "investigation",
2137
- "get.js"
1780
+ "ingest",
1781
+ "batch.js"
2138
1782
  ]
2139
1783
  },
2140
- "investigation:list": {
1784
+ "ingest:bitset": {
2141
1785
  "aliases": [],
2142
1786
  "args": {},
2143
- "description": "List investigations (AI-powered analysis workflows) in your organization.\n\nInvestigations are automated AI workflows that analyze signals, diagnose problems,\nand produce reports. Use --signal-handler to filter for investigations that are\ntriggered automatically by signals.",
1787
+ "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",
2144
1788
  "examples": [
2145
- "<%= config.bin %> investigation list",
2146
- "<%= config.bin %> investigation list --signal-handler",
2147
- "<%= config.bin %> investigation list --json"
1789
+ "<%= config.bin %> ingest bitset --device <device-id> --stream sensors --keys \"door,window,motion\" --values \"true,false,true\"",
1790
+ "<%= config.bin %> ingest bitset --device <device-id> --stream flags --keys \"active,paused,error\" --values \"true,false,false\" --tag system=main",
1791
+ "<%= config.bin %> ingest bitset --device <device-id> --stream states --keys \"a,b\" --values \"false,true\""
2148
1792
  ],
2149
1793
  "flags": {
2150
1794
  "json": {
@@ -2174,49 +1818,83 @@
2174
1818
  "allowNo": false,
2175
1819
  "type": "boolean"
2176
1820
  },
2177
- "signal-handler": {
2178
- "description": "Only show investigations that handle signals",
2179
- "name": "signal-handler",
2180
- "allowNo": false,
2181
- "type": "boolean"
1821
+ "device": {
1822
+ "char": "d",
1823
+ "description": "Device ID (UUID)",
1824
+ "name": "device",
1825
+ "required": true,
1826
+ "hasDynamicHelp": false,
1827
+ "multiple": false,
1828
+ "type": "option"
1829
+ },
1830
+ "stream": {
1831
+ "char": "s",
1832
+ "description": "Stream name",
1833
+ "name": "stream",
1834
+ "required": true,
1835
+ "hasDynamicHelp": false,
1836
+ "multiple": false,
1837
+ "type": "option"
1838
+ },
1839
+ "keys": {
1840
+ "char": "k",
1841
+ "description": "Comma-separated list of key names (1-1000 keys, max 255 chars each)",
1842
+ "name": "keys",
1843
+ "required": true,
1844
+ "hasDynamicHelp": false,
1845
+ "multiple": false,
1846
+ "type": "option"
1847
+ },
1848
+ "values": {
1849
+ "char": "v",
1850
+ "description": "Comma-separated list of boolean values (true/false, must match key count)",
1851
+ "name": "values",
1852
+ "required": true,
1853
+ "hasDynamicHelp": false,
1854
+ "multiple": false,
1855
+ "type": "option"
1856
+ },
1857
+ "tag": {
1858
+ "char": "t",
1859
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1860
+ "name": "tag",
1861
+ "hasDynamicHelp": false,
1862
+ "multiple": true,
1863
+ "type": "option"
1864
+ },
1865
+ "timestamp": {
1866
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1867
+ "name": "timestamp",
1868
+ "hasDynamicHelp": false,
1869
+ "multiple": false,
1870
+ "type": "option"
2182
1871
  }
2183
1872
  },
2184
1873
  "hasDynamicHelp": false,
2185
1874
  "hiddenAliases": [],
2186
- "id": "investigation:list",
1875
+ "id": "ingest:bitset",
2187
1876
  "pluginAlias": "@formant/formant-cli",
2188
1877
  "pluginName": "@formant/formant-cli",
2189
1878
  "pluginType": "core",
2190
1879
  "strict": true,
2191
- "summary": "List investigations",
1880
+ "summary": "Ingest bitset data",
2192
1881
  "enableJsonFlag": true,
2193
1882
  "isESM": true,
2194
1883
  "relativePath": [
2195
1884
  "dist",
2196
1885
  "commands",
2197
- "investigation",
2198
- "list.js"
1886
+ "ingest",
1887
+ "bitset.js"
2199
1888
  ]
2200
1889
  },
2201
- "investigation:run": {
1890
+ "ingest:health": {
2202
1891
  "aliases": [],
2203
- "args": {
2204
- "investigationId": {
2205
- "description": "Investigation (taskflow) ID",
2206
- "name": "investigationId",
2207
- "required": true
2208
- },
2209
- "runId": {
2210
- "description": "Run ID",
2211
- "name": "runId",
2212
- "required": true
2213
- }
2214
- },
2215
- "description": "Get detailed information about a specific investigation run.\n\nShows run details including status, signal information, events, and the complete execution \nlog with node inputs/outputs, task messages, tool usage, and results.\n\nUse this to trace the investigation run back to its signal and triggering event.",
1892
+ "args": {},
1893
+ "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.",
2216
1894
  "examples": [
2217
- "<%= config.bin %> investigation run <investigation-id> <run-id>",
2218
- "<%= config.bin %> investigation run <investigation-id> <run-id> --log-only",
2219
- "<%= config.bin %> investigation run <investigation-id> <run-id> --json"
1895
+ "<%= config.bin %> ingest health --device <device-id> --stream system_health --status operational",
1896
+ "<%= config.bin %> ingest health --device <device-id> --stream health --status error --tag component=motor",
1897
+ "<%= config.bin %> ingest health --device <device-id> --stream sync --status operational --clock-skew 150"
2220
1898
  ],
2221
1899
  "flags": {
2222
1900
  "json": {
@@ -2246,50 +1924,196 @@
2246
1924
  "allowNo": false,
2247
1925
  "type": "boolean"
2248
1926
  },
2249
- "log-only": {
2250
- "description": "Only show the execution log (skip run details)",
2251
- "name": "log-only",
2252
- "allowNo": false,
2253
- "type": "boolean"
1927
+ "device": {
1928
+ "char": "d",
1929
+ "description": "Device ID (UUID)",
1930
+ "name": "device",
1931
+ "required": true,
1932
+ "hasDynamicHelp": false,
1933
+ "multiple": false,
1934
+ "type": "option"
2254
1935
  },
2255
- "trace-signal": {
2256
- "description": "Fetch and display the signal and event information for this run",
2257
- "name": "trace-signal",
1936
+ "stream": {
1937
+ "char": "s",
1938
+ "description": "Stream name",
1939
+ "name": "stream",
1940
+ "required": true,
1941
+ "hasDynamicHelp": false,
1942
+ "multiple": false,
1943
+ "type": "option"
1944
+ },
1945
+ "status": {
1946
+ "description": "Health status (unknown, operational, offline, or error)",
1947
+ "name": "status",
1948
+ "required": true,
1949
+ "hasDynamicHelp": false,
1950
+ "multiple": false,
1951
+ "options": [
1952
+ "unknown",
1953
+ "operational",
1954
+ "offline",
1955
+ "error"
1956
+ ],
1957
+ "type": "option"
1958
+ },
1959
+ "clock-skew": {
1960
+ "description": "Clock skew in milliseconds (optional)",
1961
+ "name": "clock-skew",
1962
+ "hasDynamicHelp": false,
1963
+ "multiple": false,
1964
+ "type": "option"
1965
+ },
1966
+ "tag": {
1967
+ "char": "t",
1968
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1969
+ "name": "tag",
1970
+ "hasDynamicHelp": false,
1971
+ "multiple": true,
1972
+ "type": "option"
1973
+ },
1974
+ "timestamp": {
1975
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1976
+ "name": "timestamp",
1977
+ "hasDynamicHelp": false,
1978
+ "multiple": false,
1979
+ "type": "option"
1980
+ }
1981
+ },
1982
+ "hasDynamicHelp": false,
1983
+ "hiddenAliases": [],
1984
+ "id": "ingest:health",
1985
+ "pluginAlias": "@formant/formant-cli",
1986
+ "pluginName": "@formant/formant-cli",
1987
+ "pluginType": "core",
1988
+ "strict": true,
1989
+ "summary": "Ingest health status data",
1990
+ "enableJsonFlag": true,
1991
+ "isESM": true,
1992
+ "relativePath": [
1993
+ "dist",
1994
+ "commands",
1995
+ "ingest",
1996
+ "health.js"
1997
+ ]
1998
+ },
1999
+ "ingest:image": {
2000
+ "aliases": [],
2001
+ "args": {},
2002
+ "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.",
2003
+ "examples": [
2004
+ "<%= config.bin %> ingest image --device <device-id> --stream camera_front --url https://example.com/image.jpg",
2005
+ "<%= config.bin %> ingest image --device <device-id> --stream snapshot --url https://example.com/snap.png --size 1024000",
2006
+ "<%= config.bin %> ingest image --device <device-id> --stream detection --url https://example.com/detect.jpg --tag frame=123"
2007
+ ],
2008
+ "flags": {
2009
+ "json": {
2010
+ "description": "Format output as json.",
2011
+ "helpGroup": "GLOBAL",
2012
+ "name": "json",
2013
+ "allowNo": false,
2014
+ "type": "boolean"
2015
+ },
2016
+ "dev": {
2017
+ "description": "Target the dev environment",
2018
+ "exclusive": [
2019
+ "stage"
2020
+ ],
2021
+ "helpGroup": "GLOBAL",
2022
+ "name": "dev",
2023
+ "allowNo": false,
2024
+ "type": "boolean"
2025
+ },
2026
+ "stage": {
2027
+ "description": "Target the stage environment",
2028
+ "exclusive": [
2029
+ "dev"
2030
+ ],
2031
+ "helpGroup": "GLOBAL",
2032
+ "name": "stage",
2258
2033
  "allowNo": false,
2259
2034
  "type": "boolean"
2035
+ },
2036
+ "device": {
2037
+ "char": "d",
2038
+ "description": "Device ID (UUID)",
2039
+ "name": "device",
2040
+ "required": true,
2041
+ "hasDynamicHelp": false,
2042
+ "multiple": false,
2043
+ "type": "option"
2044
+ },
2045
+ "stream": {
2046
+ "char": "s",
2047
+ "description": "Stream name",
2048
+ "name": "stream",
2049
+ "required": true,
2050
+ "hasDynamicHelp": false,
2051
+ "multiple": false,
2052
+ "type": "option"
2053
+ },
2054
+ "url": {
2055
+ "char": "u",
2056
+ "description": "Image URL (must be http:// or https://)",
2057
+ "name": "url",
2058
+ "required": true,
2059
+ "hasDynamicHelp": false,
2060
+ "multiple": false,
2061
+ "type": "option"
2062
+ },
2063
+ "size": {
2064
+ "description": "Image size in bytes (optional)",
2065
+ "name": "size",
2066
+ "hasDynamicHelp": false,
2067
+ "multiple": false,
2068
+ "type": "option"
2069
+ },
2070
+ "tag": {
2071
+ "char": "t",
2072
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
2073
+ "name": "tag",
2074
+ "hasDynamicHelp": false,
2075
+ "multiple": true,
2076
+ "type": "option"
2077
+ },
2078
+ "timestamp": {
2079
+ "description": "Unix timestamp in milliseconds (defaults to now)",
2080
+ "name": "timestamp",
2081
+ "hasDynamicHelp": false,
2082
+ "multiple": false,
2083
+ "type": "option"
2260
2084
  }
2261
2085
  },
2262
2086
  "hasDynamicHelp": false,
2263
2087
  "hiddenAliases": [],
2264
- "id": "investigation:run",
2088
+ "id": "ingest:image",
2265
2089
  "pluginAlias": "@formant/formant-cli",
2266
2090
  "pluginName": "@formant/formant-cli",
2267
2091
  "pluginType": "core",
2268
2092
  "strict": true,
2269
- "summary": "Get investigation run details and execution log",
2093
+ "summary": "Ingest image data",
2270
2094
  "enableJsonFlag": true,
2271
2095
  "isESM": true,
2272
2096
  "relativePath": [
2273
2097
  "dist",
2274
2098
  "commands",
2275
- "investigation",
2276
- "run.js"
2099
+ "ingest",
2100
+ "image.js"
2277
2101
  ]
2278
2102
  },
2279
- "investigation:runs-list": {
2103
+ "ingest:json": {
2280
2104
  "aliases": [],
2281
2105
  "args": {
2282
- "id": {
2283
- "description": "Investigation (taskflow) ID",
2284
- "name": "id",
2106
+ "value": {
2107
+ "description": "JSON value to ingest (as a JSON string)",
2108
+ "name": "value",
2285
2109
  "required": true
2286
2110
  }
2287
2111
  },
2288
- "description": "List actual investigation runs (not evaluation runs) for a specific investigation.\n\nShows runs with their status, signal IDs, and timestamps. Use 'investigations run' to see\ndetailed execution logs for a specific run.",
2112
+ "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.",
2289
2113
  "examples": [
2290
- "<%= config.bin %> investigation runs-list <id>",
2291
- "<%= config.bin %> investigation runs-list <id> --limit 50",
2292
- "<%= config.bin %> investigation runs-list <id> --details --json"
2114
+ "<%= config.bin %> ingest json '{\"x\":1,\"y\":2}' --device <device-id> --stream position",
2115
+ "<%= config.bin %> ingest json '{\"status\":\"active\",\"mode\":\"auto\"}' --device <device-id> --stream config",
2116
+ "<%= config.bin %> ingest json '[1,2,3,4,5]' --device <device-id> --stream array_data"
2293
2117
  ],
2294
2118
  "flags": {
2295
2119
  "json": {
@@ -2319,26 +2143,223 @@
2319
2143
  "allowNo": false,
2320
2144
  "type": "boolean"
2321
2145
  },
2322
- "details": {
2323
- "description": "Include detailed information about each run",
2324
- "name": "details",
2146
+ "device": {
2147
+ "char": "d",
2148
+ "description": "Device ID (UUID)",
2149
+ "name": "device",
2150
+ "required": true,
2151
+ "hasDynamicHelp": false,
2152
+ "multiple": false,
2153
+ "type": "option"
2154
+ },
2155
+ "stream": {
2156
+ "char": "s",
2157
+ "description": "Stream name",
2158
+ "name": "stream",
2159
+ "required": true,
2160
+ "hasDynamicHelp": false,
2161
+ "multiple": false,
2162
+ "type": "option"
2163
+ },
2164
+ "tag": {
2165
+ "char": "t",
2166
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
2167
+ "name": "tag",
2168
+ "hasDynamicHelp": false,
2169
+ "multiple": true,
2170
+ "type": "option"
2171
+ },
2172
+ "timestamp": {
2173
+ "description": "Unix timestamp in milliseconds (defaults to now)",
2174
+ "name": "timestamp",
2175
+ "hasDynamicHelp": false,
2176
+ "multiple": false,
2177
+ "type": "option"
2178
+ }
2179
+ },
2180
+ "hasDynamicHelp": false,
2181
+ "hiddenAliases": [],
2182
+ "id": "ingest:json",
2183
+ "pluginAlias": "@formant/formant-cli",
2184
+ "pluginName": "@formant/formant-cli",
2185
+ "pluginType": "core",
2186
+ "strict": true,
2187
+ "summary": "Ingest JSON data",
2188
+ "enableJsonFlag": true,
2189
+ "isESM": true,
2190
+ "relativePath": [
2191
+ "dist",
2192
+ "commands",
2193
+ "ingest",
2194
+ "json.js"
2195
+ ]
2196
+ },
2197
+ "ingest:numeric": {
2198
+ "aliases": [],
2199
+ "args": {
2200
+ "value": {
2201
+ "description": "Numeric value to ingest",
2202
+ "name": "value",
2203
+ "required": true
2204
+ }
2205
+ },
2206
+ "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.",
2207
+ "examples": [
2208
+ "<%= config.bin %> ingest numeric 42.5 --device <device-id> --stream battery_level",
2209
+ "<%= config.bin %> ingest numeric 98.6 --device <device-id> --stream temperature --tag unit=fahrenheit",
2210
+ "<%= config.bin %> ingest numeric 1500 --device <device-id> --stream rpm --timestamp 1700000000000"
2211
+ ],
2212
+ "flags": {
2213
+ "json": {
2214
+ "description": "Format output as json.",
2215
+ "helpGroup": "GLOBAL",
2216
+ "name": "json",
2325
2217
  "allowNo": false,
2326
2218
  "type": "boolean"
2327
2219
  },
2328
- "limit": {
2329
- "char": "l",
2330
- "description": "Maximum number of runs to return",
2331
- "name": "limit",
2332
- "default": 20,
2220
+ "dev": {
2221
+ "description": "Target the dev environment",
2222
+ "exclusive": [
2223
+ "stage"
2224
+ ],
2225
+ "helpGroup": "GLOBAL",
2226
+ "name": "dev",
2227
+ "allowNo": false,
2228
+ "type": "boolean"
2229
+ },
2230
+ "stage": {
2231
+ "description": "Target the stage environment",
2232
+ "exclusive": [
2233
+ "dev"
2234
+ ],
2235
+ "helpGroup": "GLOBAL",
2236
+ "name": "stage",
2237
+ "allowNo": false,
2238
+ "type": "boolean"
2239
+ },
2240
+ "device": {
2241
+ "char": "d",
2242
+ "description": "Device ID (UUID)",
2243
+ "name": "device",
2244
+ "required": true,
2333
2245
  "hasDynamicHelp": false,
2334
2246
  "multiple": false,
2335
2247
  "type": "option"
2336
2248
  },
2337
- "offset": {
2338
- "char": "o",
2339
- "description": "Offset for pagination",
2340
- "name": "offset",
2341
- "default": 0,
2249
+ "stream": {
2250
+ "char": "s",
2251
+ "description": "Stream name",
2252
+ "name": "stream",
2253
+ "required": true,
2254
+ "hasDynamicHelp": false,
2255
+ "multiple": false,
2256
+ "type": "option"
2257
+ },
2258
+ "tag": {
2259
+ "char": "t",
2260
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
2261
+ "name": "tag",
2262
+ "hasDynamicHelp": false,
2263
+ "multiple": true,
2264
+ "type": "option"
2265
+ },
2266
+ "timestamp": {
2267
+ "description": "Unix timestamp in milliseconds (defaults to now)",
2268
+ "name": "timestamp",
2269
+ "hasDynamicHelp": false,
2270
+ "multiple": false,
2271
+ "type": "option"
2272
+ }
2273
+ },
2274
+ "hasDynamicHelp": false,
2275
+ "hiddenAliases": [],
2276
+ "id": "ingest:numeric",
2277
+ "pluginAlias": "@formant/formant-cli",
2278
+ "pluginName": "@formant/formant-cli",
2279
+ "pluginType": "core",
2280
+ "strict": true,
2281
+ "summary": "Ingest numeric data",
2282
+ "enableJsonFlag": true,
2283
+ "isESM": true,
2284
+ "relativePath": [
2285
+ "dist",
2286
+ "commands",
2287
+ "ingest",
2288
+ "numeric.js"
2289
+ ]
2290
+ },
2291
+ "ingest:text": {
2292
+ "aliases": [],
2293
+ "args": {
2294
+ "value": {
2295
+ "description": "Text value to ingest",
2296
+ "name": "value",
2297
+ "required": true
2298
+ }
2299
+ },
2300
+ "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.",
2301
+ "examples": [
2302
+ "<%= config.bin %> ingest text \"Robot started successfully\" --device <device-id> --stream status",
2303
+ "<%= config.bin %> ingest text \"Error: sensor offline\" --device <device-id> --stream errors --tag severity=high",
2304
+ "<%= config.bin %> ingest text \"Checkpoint A reached\" --device <device-id> --stream waypoints"
2305
+ ],
2306
+ "flags": {
2307
+ "json": {
2308
+ "description": "Format output as json.",
2309
+ "helpGroup": "GLOBAL",
2310
+ "name": "json",
2311
+ "allowNo": false,
2312
+ "type": "boolean"
2313
+ },
2314
+ "dev": {
2315
+ "description": "Target the dev environment",
2316
+ "exclusive": [
2317
+ "stage"
2318
+ ],
2319
+ "helpGroup": "GLOBAL",
2320
+ "name": "dev",
2321
+ "allowNo": false,
2322
+ "type": "boolean"
2323
+ },
2324
+ "stage": {
2325
+ "description": "Target the stage environment",
2326
+ "exclusive": [
2327
+ "dev"
2328
+ ],
2329
+ "helpGroup": "GLOBAL",
2330
+ "name": "stage",
2331
+ "allowNo": false,
2332
+ "type": "boolean"
2333
+ },
2334
+ "device": {
2335
+ "char": "d",
2336
+ "description": "Device ID (UUID)",
2337
+ "name": "device",
2338
+ "required": true,
2339
+ "hasDynamicHelp": false,
2340
+ "multiple": false,
2341
+ "type": "option"
2342
+ },
2343
+ "stream": {
2344
+ "char": "s",
2345
+ "description": "Stream name",
2346
+ "name": "stream",
2347
+ "required": true,
2348
+ "hasDynamicHelp": false,
2349
+ "multiple": false,
2350
+ "type": "option"
2351
+ },
2352
+ "tag": {
2353
+ "char": "t",
2354
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
2355
+ "name": "tag",
2356
+ "hasDynamicHelp": false,
2357
+ "multiple": true,
2358
+ "type": "option"
2359
+ },
2360
+ "timestamp": {
2361
+ "description": "Unix timestamp in milliseconds (defaults to now)",
2362
+ "name": "timestamp",
2342
2363
  "hasDynamicHelp": false,
2343
2364
  "multiple": false,
2344
2365
  "type": "option"
@@ -2346,34 +2367,29 @@
2346
2367
  },
2347
2368
  "hasDynamicHelp": false,
2348
2369
  "hiddenAliases": [],
2349
- "id": "investigation:runs-list",
2370
+ "id": "ingest:text",
2350
2371
  "pluginAlias": "@formant/formant-cli",
2351
2372
  "pluginName": "@formant/formant-cli",
2352
2373
  "pluginType": "core",
2353
2374
  "strict": true,
2354
- "summary": "List actual investigation runs",
2375
+ "summary": "Ingest text data",
2355
2376
  "enableJsonFlag": true,
2356
2377
  "isESM": true,
2357
2378
  "relativePath": [
2358
2379
  "dist",
2359
2380
  "commands",
2360
- "investigation",
2361
- "runs-list.js"
2381
+ "ingest",
2382
+ "text.js"
2362
2383
  ]
2363
2384
  },
2364
- "investigation:runs": {
2385
+ "ingest:video": {
2365
2386
  "aliases": [],
2366
- "args": {
2367
- "id": {
2368
- "description": "Investigation (taskflow) ID",
2369
- "name": "id",
2370
- "required": true
2371
- }
2372
- },
2373
- "description": "List evaluation runs for a specific investigation.",
2387
+ "args": {},
2388
+ "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).",
2374
2389
  "examples": [
2375
- "<%= config.bin %> investigation runs <id>",
2376
- "<%= config.bin %> investigation runs <id> --json"
2390
+ "<%= config.bin %> ingest video --device <device-id> --stream recordings --url https://example.com/video.mp4 --duration 5000",
2391
+ "<%= config.bin %> ingest video --device <device-id> --stream clips --url https://example.com/clip.webm --duration 3500 --size 2048000",
2392
+ "<%= config.bin %> ingest video --device <device-id> --stream event_video --url https://example.com/event.mov --duration 10000 --tag event=collision"
2377
2393
  ],
2378
2394
  "flags": {
2379
2395
  "json": {
@@ -2402,32 +2418,90 @@
2402
2418
  "name": "stage",
2403
2419
  "allowNo": false,
2404
2420
  "type": "boolean"
2421
+ },
2422
+ "device": {
2423
+ "char": "d",
2424
+ "description": "Device ID (UUID)",
2425
+ "name": "device",
2426
+ "required": true,
2427
+ "hasDynamicHelp": false,
2428
+ "multiple": false,
2429
+ "type": "option"
2430
+ },
2431
+ "stream": {
2432
+ "char": "s",
2433
+ "description": "Stream name",
2434
+ "name": "stream",
2435
+ "required": true,
2436
+ "hasDynamicHelp": false,
2437
+ "multiple": false,
2438
+ "type": "option"
2439
+ },
2440
+ "url": {
2441
+ "char": "u",
2442
+ "description": "Video URL (must be http:// or https://)",
2443
+ "name": "url",
2444
+ "required": true,
2445
+ "hasDynamicHelp": false,
2446
+ "multiple": false,
2447
+ "type": "option"
2448
+ },
2449
+ "duration": {
2450
+ "description": "Video duration in milliseconds (required)",
2451
+ "name": "duration",
2452
+ "required": true,
2453
+ "hasDynamicHelp": false,
2454
+ "multiple": false,
2455
+ "type": "option"
2456
+ },
2457
+ "size": {
2458
+ "description": "Video size in bytes (optional)",
2459
+ "name": "size",
2460
+ "hasDynamicHelp": false,
2461
+ "multiple": false,
2462
+ "type": "option"
2463
+ },
2464
+ "tag": {
2465
+ "char": "t",
2466
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
2467
+ "name": "tag",
2468
+ "hasDynamicHelp": false,
2469
+ "multiple": true,
2470
+ "type": "option"
2471
+ },
2472
+ "timestamp": {
2473
+ "description": "Unix timestamp in milliseconds (defaults to now)",
2474
+ "name": "timestamp",
2475
+ "hasDynamicHelp": false,
2476
+ "multiple": false,
2477
+ "type": "option"
2405
2478
  }
2406
2479
  },
2407
2480
  "hasDynamicHelp": false,
2408
2481
  "hiddenAliases": [],
2409
- "id": "investigation:runs",
2482
+ "id": "ingest:video",
2410
2483
  "pluginAlias": "@formant/formant-cli",
2411
2484
  "pluginName": "@formant/formant-cli",
2412
2485
  "pluginType": "core",
2413
2486
  "strict": true,
2414
- "summary": "List runs for an investigation",
2487
+ "summary": "Ingest video data",
2415
2488
  "enableJsonFlag": true,
2416
2489
  "isESM": true,
2417
2490
  "relativePath": [
2418
2491
  "dist",
2419
2492
  "commands",
2420
- "investigation",
2421
- "runs.js"
2493
+ "ingest",
2494
+ "video.js"
2422
2495
  ]
2423
2496
  },
2424
- "investigation:stats": {
2497
+ "investigation:analytics": {
2425
2498
  "aliases": [],
2426
2499
  "args": {},
2427
- "description": "Get investigation statistics for a time range.",
2500
+ "description": "Get investigation analytics with time-series data.\n\nReturns aggregated analytics about investigation runs over a time range,\noptionally grouped by result type or signal type.",
2428
2501
  "examples": [
2429
- "<%= config.bin %> investigation stats --start 2026-01-01 --end 2026-02-01",
2430
- "<%= config.bin %> investigation stats --start 2026-01-01 --end 2026-02-01 --json"
2502
+ "<%= config.bin %> investigation analytics --start 2026-01-01 --end 2026-02-01",
2503
+ "<%= config.bin %> investigation analytics --start 2026-01-01 --end 2026-02-01 --interval hourly",
2504
+ "<%= config.bin %> investigation analytics --start 2026-01-01 --end 2026-02-01 --group-by resultType --json"
2431
2505
  ],
2432
2506
  "flags": {
2433
2507
  "json": {
@@ -2465,6 +2539,29 @@
2465
2539
  "multiple": false,
2466
2540
  "type": "option"
2467
2541
  },
2542
+ "group-by": {
2543
+ "description": "Group results by",
2544
+ "name": "group-by",
2545
+ "hasDynamicHelp": false,
2546
+ "multiple": false,
2547
+ "options": [
2548
+ "resultType",
2549
+ "signalType"
2550
+ ],
2551
+ "type": "option"
2552
+ },
2553
+ "interval": {
2554
+ "description": "Time interval for aggregation",
2555
+ "name": "interval",
2556
+ "default": "daily",
2557
+ "hasDynamicHelp": false,
2558
+ "multiple": false,
2559
+ "options": [
2560
+ "daily",
2561
+ "hourly"
2562
+ ],
2563
+ "type": "option"
2564
+ },
2468
2565
  "start": {
2469
2566
  "description": "Start time (ISO 8601)",
2470
2567
  "name": "start",
@@ -2476,22 +2573,22 @@
2476
2573
  },
2477
2574
  "hasDynamicHelp": false,
2478
2575
  "hiddenAliases": [],
2479
- "id": "investigation:stats",
2576
+ "id": "investigation:analytics",
2480
2577
  "pluginAlias": "@formant/formant-cli",
2481
2578
  "pluginName": "@formant/formant-cli",
2482
2579
  "pluginType": "core",
2483
2580
  "strict": true,
2484
- "summary": "Get investigation stats",
2581
+ "summary": "Get investigation analytics",
2485
2582
  "enableJsonFlag": true,
2486
2583
  "isESM": true,
2487
2584
  "relativePath": [
2488
2585
  "dist",
2489
2586
  "commands",
2490
2587
  "investigation",
2491
- "stats.js"
2588
+ "analytics.js"
2492
2589
  ]
2493
2590
  },
2494
- "investigation:trigger": {
2591
+ "investigation:get": {
2495
2592
  "aliases": [],
2496
2593
  "args": {
2497
2594
  "id": {
@@ -2500,10 +2597,10 @@
2500
2597
  "required": true
2501
2598
  }
2502
2599
  },
2503
- "description": "Trigger an investigation to run. Provide input text describing the problem\nor context for the investigation. The investigation runs asynchronously and\nreturns a run ID you can use to check results.",
2600
+ "description": "Get detailed information about a specific investigation by ID.",
2504
2601
  "examples": [
2505
- "<%= config.bin %> investigation trigger <id> --input \"Robot stopped responding\"",
2506
- "<%= config.bin %> investigation trigger <id> --input \"Battery draining fast on device X\" --json"
2602
+ "<%= config.bin %> investigation get <id>",
2603
+ "<%= config.bin %> investigation get <id> --json"
2507
2604
  ],
2508
2605
  "flags": {
2509
2606
  "json": {
@@ -2532,54 +2629,33 @@
2532
2629
  "name": "stage",
2533
2630
  "allowNo": false,
2534
2631
  "type": "boolean"
2535
- },
2536
- "input": {
2537
- "char": "i",
2538
- "description": "Input text / problem description for the investigation",
2539
- "name": "input",
2540
- "required": true,
2541
- "hasDynamicHelp": false,
2542
- "multiple": false,
2543
- "type": "option"
2544
- },
2545
- "signal-id": {
2546
- "description": "Optional signal ID to associate with this run",
2547
- "name": "signal-id",
2548
- "hasDynamicHelp": false,
2549
- "multiple": false,
2550
- "type": "option"
2551
2632
  }
2552
2633
  },
2553
2634
  "hasDynamicHelp": false,
2554
2635
  "hiddenAliases": [],
2555
- "id": "investigation:trigger",
2636
+ "id": "investigation:get",
2556
2637
  "pluginAlias": "@formant/formant-cli",
2557
2638
  "pluginName": "@formant/formant-cli",
2558
2639
  "pluginType": "core",
2559
2640
  "strict": true,
2560
- "summary": "Trigger an investigation",
2641
+ "summary": "Get an investigation by ID",
2561
2642
  "enableJsonFlag": true,
2562
2643
  "isESM": true,
2563
2644
  "relativePath": [
2564
2645
  "dist",
2565
2646
  "commands",
2566
2647
  "investigation",
2567
- "trigger.js"
2648
+ "get.js"
2568
2649
  ]
2569
2650
  },
2570
- "device:config": {
2651
+ "investigation:list": {
2571
2652
  "aliases": [],
2572
- "args": {
2573
- "id": {
2574
- "description": "Device ID (UUID)",
2575
- "name": "id",
2576
- "required": true
2577
- }
2578
- },
2579
- "description": "Get the device configuration including stream definitions.\n\nShows the device's current configuration including telemetry streams, commands,\nand other settings.",
2653
+ "args": {},
2654
+ "description": "List investigations (AI-powered analysis workflows) in your organization.\n\nInvestigations are automated AI workflows that analyze signals, diagnose problems,\nand produce reports. Use --signal-handler to filter for investigations that are\ntriggered automatically by signals.",
2580
2655
  "examples": [
2581
- "<%= config.bin %> device config <device-id>",
2582
- "<%= config.bin %> device config <device-id> --json"
2656
+ "<%= config.bin %> investigation list",
2657
+ "<%= config.bin %> investigation list --signal-handler",
2658
+ "<%= config.bin %> investigation list --json"
2583
2659
  ],
2584
2660
  "flags": {
2585
2661
  "json": {
@@ -2608,39 +2684,50 @@
2608
2684
  "name": "stage",
2609
2685
  "allowNo": false,
2610
2686
  "type": "boolean"
2687
+ },
2688
+ "signal-handler": {
2689
+ "description": "Only show investigations that handle signals",
2690
+ "name": "signal-handler",
2691
+ "allowNo": false,
2692
+ "type": "boolean"
2611
2693
  }
2612
2694
  },
2613
2695
  "hasDynamicHelp": false,
2614
2696
  "hiddenAliases": [],
2615
- "id": "device:config",
2697
+ "id": "investigation:list",
2616
2698
  "pluginAlias": "@formant/formant-cli",
2617
2699
  "pluginName": "@formant/formant-cli",
2618
2700
  "pluginType": "core",
2619
2701
  "strict": true,
2620
- "summary": "Get device configuration",
2702
+ "summary": "List investigations",
2621
2703
  "enableJsonFlag": true,
2622
2704
  "isESM": true,
2623
2705
  "relativePath": [
2624
2706
  "dist",
2625
2707
  "commands",
2626
- "device",
2627
- "config.js"
2708
+ "investigation",
2709
+ "list.js"
2628
2710
  ]
2629
2711
  },
2630
- "device:create": {
2712
+ "investigation:run": {
2631
2713
  "aliases": [],
2632
2714
  "args": {
2633
- "name": {
2634
- "description": "Name for the new device",
2635
- "name": "name",
2715
+ "investigationId": {
2716
+ "description": "Investigation (taskflow) ID",
2717
+ "name": "investigationId",
2718
+ "required": true
2719
+ },
2720
+ "runId": {
2721
+ "description": "Run ID",
2722
+ "name": "runId",
2636
2723
  "required": true
2637
2724
  }
2638
2725
  },
2639
- "description": "Create a new device in your fleet.\n\nThe device is created as enabled by default. You can optionally specify tags.",
2726
+ "description": "Get detailed information about a specific investigation run.\n\nShows run details including status, signal information, events, and the complete execution \nlog with node inputs/outputs, task messages, tool usage, and results.\n\nUse this to trace the investigation run back to its signal and triggering event.",
2640
2727
  "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"
2728
+ "<%= config.bin %> investigation run <investigation-id> <run-id>",
2729
+ "<%= config.bin %> investigation run <investigation-id> <run-id> --log-only",
2730
+ "<%= config.bin %> investigation run <investigation-id> <run-id> --json"
2644
2731
  ],
2645
2732
  "flags": {
2646
2733
  "json": {
@@ -2670,45 +2757,50 @@
2670
2757
  "allowNo": false,
2671
2758
  "type": "boolean"
2672
2759
  },
2673
- "tag": {
2674
- "char": "t",
2675
- "description": "Tag to apply (key=value), can be specified multiple times",
2676
- "name": "tag",
2677
- "hasDynamicHelp": false,
2678
- "multiple": true,
2679
- "type": "option"
2760
+ "log-only": {
2761
+ "description": "Only show the execution log (skip run details)",
2762
+ "name": "log-only",
2763
+ "allowNo": false,
2764
+ "type": "boolean"
2765
+ },
2766
+ "trace-signal": {
2767
+ "description": "Fetch and display the signal and event information for this run",
2768
+ "name": "trace-signal",
2769
+ "allowNo": false,
2770
+ "type": "boolean"
2680
2771
  }
2681
2772
  },
2682
2773
  "hasDynamicHelp": false,
2683
2774
  "hiddenAliases": [],
2684
- "id": "device:create",
2775
+ "id": "investigation:run",
2685
2776
  "pluginAlias": "@formant/formant-cli",
2686
2777
  "pluginName": "@formant/formant-cli",
2687
2778
  "pluginType": "core",
2688
2779
  "strict": true,
2689
- "summary": "Create a new device",
2780
+ "summary": "Get investigation run details and execution log",
2690
2781
  "enableJsonFlag": true,
2691
2782
  "isESM": true,
2692
2783
  "relativePath": [
2693
2784
  "dist",
2694
2785
  "commands",
2695
- "device",
2696
- "create.js"
2786
+ "investigation",
2787
+ "run.js"
2697
2788
  ]
2698
2789
  },
2699
- "device:delete": {
2790
+ "investigation:runs-list": {
2700
2791
  "aliases": [],
2701
2792
  "args": {
2702
2793
  "id": {
2703
- "description": "Device ID (UUID)",
2794
+ "description": "Investigation (taskflow) ID",
2704
2795
  "name": "id",
2705
2796
  "required": true
2706
2797
  }
2707
2798
  },
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.",
2799
+ "description": "List actual investigation runs (not evaluation runs) for a specific investigation.\n\nShows runs with their status, signal IDs, and timestamps. Use 'investigations run' to see\ndetailed execution logs for a specific run.",
2709
2800
  "examples": [
2710
- "<%= config.bin %> device delete <device-id>",
2711
- "<%= config.bin %> device delete <device-id> --json"
2801
+ "<%= config.bin %> investigation runs-list <id>",
2802
+ "<%= config.bin %> investigation runs-list <id> --limit 50",
2803
+ "<%= config.bin %> investigation runs-list <id> --details --json"
2712
2804
  ],
2713
2805
  "flags": {
2714
2806
  "json": {
@@ -2737,38 +2829,62 @@
2737
2829
  "name": "stage",
2738
2830
  "allowNo": false,
2739
2831
  "type": "boolean"
2832
+ },
2833
+ "details": {
2834
+ "description": "Include detailed information about each run",
2835
+ "name": "details",
2836
+ "allowNo": false,
2837
+ "type": "boolean"
2838
+ },
2839
+ "limit": {
2840
+ "char": "l",
2841
+ "description": "Maximum number of runs to return",
2842
+ "name": "limit",
2843
+ "default": 20,
2844
+ "hasDynamicHelp": false,
2845
+ "multiple": false,
2846
+ "type": "option"
2847
+ },
2848
+ "offset": {
2849
+ "char": "o",
2850
+ "description": "Offset for pagination",
2851
+ "name": "offset",
2852
+ "default": 0,
2853
+ "hasDynamicHelp": false,
2854
+ "multiple": false,
2855
+ "type": "option"
2740
2856
  }
2741
2857
  },
2742
2858
  "hasDynamicHelp": false,
2743
2859
  "hiddenAliases": [],
2744
- "id": "device:delete",
2860
+ "id": "investigation:runs-list",
2745
2861
  "pluginAlias": "@formant/formant-cli",
2746
2862
  "pluginName": "@formant/formant-cli",
2747
2863
  "pluginType": "core",
2748
2864
  "strict": true,
2749
- "summary": "Delete (disable) a device",
2865
+ "summary": "List actual investigation runs",
2750
2866
  "enableJsonFlag": true,
2751
2867
  "isESM": true,
2752
2868
  "relativePath": [
2753
2869
  "dist",
2754
2870
  "commands",
2755
- "device",
2756
- "delete.js"
2871
+ "investigation",
2872
+ "runs-list.js"
2757
2873
  ]
2758
2874
  },
2759
- "device:get": {
2875
+ "investigation:runs": {
2760
2876
  "aliases": [],
2761
2877
  "args": {
2762
2878
  "id": {
2763
- "description": "Device ID (UUID)",
2879
+ "description": "Investigation (taskflow) ID",
2764
2880
  "name": "id",
2765
2881
  "required": true
2766
2882
  }
2767
2883
  },
2768
- "description": "Get detailed information about a specific device by its ID.",
2884
+ "description": "List evaluation runs for a specific investigation.",
2769
2885
  "examples": [
2770
- "<%= config.bin %> device get <device-id>",
2771
- "<%= config.bin %> device get <device-id> --json"
2886
+ "<%= config.bin %> investigation runs <id>",
2887
+ "<%= config.bin %> investigation runs <id> --json"
2772
2888
  ],
2773
2889
  "flags": {
2774
2890
  "json": {
@@ -2801,34 +2917,28 @@
2801
2917
  },
2802
2918
  "hasDynamicHelp": false,
2803
2919
  "hiddenAliases": [],
2804
- "id": "device:get",
2920
+ "id": "investigation:runs",
2805
2921
  "pluginAlias": "@formant/formant-cli",
2806
2922
  "pluginName": "@formant/formant-cli",
2807
2923
  "pluginType": "core",
2808
2924
  "strict": true,
2809
- "summary": "Get a device by ID",
2925
+ "summary": "List runs for an investigation",
2810
2926
  "enableJsonFlag": true,
2811
2927
  "isESM": true,
2812
2928
  "relativePath": [
2813
2929
  "dist",
2814
2930
  "commands",
2815
- "device",
2816
- "get.js"
2931
+ "investigation",
2932
+ "runs.js"
2817
2933
  ]
2818
2934
  },
2819
- "device:last-seen": {
2935
+ "investigation:stats": {
2820
2936
  "aliases": [],
2821
- "args": {
2822
- "id": {
2823
- "description": "Device ID (UUID)",
2824
- "name": "id",
2825
- "required": true
2826
- }
2827
- },
2828
- "description": "Get when a device was last seen online.\n\nShows the most recent timestamp when the device was detected as online.",
2937
+ "args": {},
2938
+ "description": "Get investigation statistics for a time range.",
2829
2939
  "examples": [
2830
- "<%= config.bin %> device last-seen <device-id>",
2831
- "<%= config.bin %> device last-seen <device-id> --json"
2940
+ "<%= config.bin %> investigation stats --start 2026-01-01 --end 2026-02-01",
2941
+ "<%= config.bin %> investigation stats --start 2026-01-01 --end 2026-02-01 --json"
2832
2942
  ],
2833
2943
  "flags": {
2834
2944
  "json": {
@@ -2857,35 +2967,54 @@
2857
2967
  "name": "stage",
2858
2968
  "allowNo": false,
2859
2969
  "type": "boolean"
2970
+ },
2971
+ "end": {
2972
+ "description": "End time (ISO 8601)",
2973
+ "name": "end",
2974
+ "required": true,
2975
+ "hasDynamicHelp": false,
2976
+ "multiple": false,
2977
+ "type": "option"
2978
+ },
2979
+ "start": {
2980
+ "description": "Start time (ISO 8601)",
2981
+ "name": "start",
2982
+ "required": true,
2983
+ "hasDynamicHelp": false,
2984
+ "multiple": false,
2985
+ "type": "option"
2860
2986
  }
2861
2987
  },
2862
2988
  "hasDynamicHelp": false,
2863
2989
  "hiddenAliases": [],
2864
- "id": "device:last-seen",
2990
+ "id": "investigation:stats",
2865
2991
  "pluginAlias": "@formant/formant-cli",
2866
2992
  "pluginName": "@formant/formant-cli",
2867
2993
  "pluginType": "core",
2868
2994
  "strict": true,
2869
- "summary": "Get device last seen timestamp",
2995
+ "summary": "Get investigation stats",
2870
2996
  "enableJsonFlag": true,
2871
2997
  "isESM": true,
2872
2998
  "relativePath": [
2873
2999
  "dist",
2874
3000
  "commands",
2875
- "device",
2876
- "last-seen.js"
3001
+ "investigation",
3002
+ "stats.js"
2877
3003
  ]
2878
3004
  },
2879
- "device:list": {
3005
+ "investigation:trigger": {
2880
3006
  "aliases": [],
2881
- "args": {},
2882
- "description": "List robots and sensors in your fleet. Shows only online devices by default.\n\nUse --all to include offline devices.",
3007
+ "args": {
3008
+ "id": {
3009
+ "description": "Investigation (taskflow) ID",
3010
+ "name": "id",
3011
+ "required": true
3012
+ }
3013
+ },
3014
+ "description": "Trigger an investigation to run. Provide input text describing the problem\nor context for the investigation. The investigation runs asynchronously and\nreturns a run ID you can use to check results.",
2883
3015
  "examples": [
2884
- "<%= config.bin %> device list",
2885
- "<%= config.bin %> device list --all",
2886
- "<%= config.bin %> device list --all --limit 100",
2887
- "<%= config.bin %> device list --tag location=warehouse",
2888
- "<%= config.bin %> device list --name robot --dev --json"
3016
+ "<%= config.bin %> investigation trigger <id> --input \"Robot stopped responding\"",
3017
+ "<%= config.bin %> investigation trigger <id> --input \"Battery draining fast on device X\" --json"
2889
3018
  ],
2890
3019
  "flags": {
2891
3020
  "json": {
@@ -2915,74 +3044,59 @@
2915
3044
  "allowNo": false,
2916
3045
  "type": "boolean"
2917
3046
  },
2918
- "all": {
2919
- "char": "a",
2920
- "description": "Show all devices (online and offline)",
2921
- "name": "all",
2922
- "allowNo": false,
2923
- "type": "boolean"
2924
- },
2925
- "limit": {
2926
- "char": "l",
2927
- "description": "Maximum number of devices to return",
2928
- "name": "limit",
2929
- "default": 50,
3047
+ "input": {
3048
+ "char": "i",
3049
+ "description": "Input text / problem description for the investigation",
3050
+ "name": "input",
3051
+ "required": true,
2930
3052
  "hasDynamicHelp": false,
2931
3053
  "multiple": false,
2932
3054
  "type": "option"
2933
3055
  },
2934
- "name": {
2935
- "char": "n",
2936
- "description": "Filter devices by name (search)",
2937
- "name": "name",
3056
+ "signal-id": {
3057
+ "description": "Optional signal ID to associate with this run",
3058
+ "name": "signal-id",
2938
3059
  "hasDynamicHelp": false,
2939
3060
  "multiple": false,
2940
3061
  "type": "option"
2941
- },
2942
- "tag": {
2943
- "char": "t",
2944
- "description": "Filter by tag (key=value), can be specified multiple times",
2945
- "name": "tag",
2946
- "hasDynamicHelp": false,
2947
- "multiple": true,
2948
- "type": "option"
2949
3062
  }
2950
3063
  },
2951
3064
  "hasDynamicHelp": false,
2952
3065
  "hiddenAliases": [],
2953
- "id": "device:list",
3066
+ "id": "investigation:trigger",
2954
3067
  "pluginAlias": "@formant/formant-cli",
2955
3068
  "pluginName": "@formant/formant-cli",
2956
3069
  "pluginType": "core",
2957
3070
  "strict": true,
2958
- "summary": "List robots and sensors in your fleet",
3071
+ "summary": "Trigger an investigation",
2959
3072
  "enableJsonFlag": true,
2960
3073
  "isESM": true,
2961
3074
  "relativePath": [
2962
3075
  "dist",
2963
3076
  "commands",
2964
- "device",
2965
- "list.js"
3077
+ "investigation",
3078
+ "trigger.js"
2966
3079
  ]
2967
3080
  },
2968
- "device:rename": {
3081
+ "persona:delegate-task": {
2969
3082
  "aliases": [],
2970
3083
  "args": {
2971
3084
  "id": {
2972
- "description": "Device ID (UUID)",
3085
+ "description": "Persona ID (UUID)",
2973
3086
  "name": "id",
2974
3087
  "required": true
2975
3088
  },
2976
- "name": {
2977
- "description": "New name for the device",
2978
- "name": "name",
3089
+ "goal": {
3090
+ "description": "The task goal / instruction for the persona",
3091
+ "name": "goal",
2979
3092
  "required": true
2980
3093
  }
2981
3094
  },
2982
- "description": "Rename a device by updating its name.",
3095
+ "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\".",
2983
3096
  "examples": [
2984
- "<%= config.bin %> device rename <device-id> new-robot-name",
2985
- "<%= config.bin %> device rename <device-id> new-robot-name --json"
3097
+ "<%= config.bin %> persona delegate-task <persona-id> \"Analyze recent device failures and summarize findings\"",
3098
+ "<%= config.bin %> persona delegate-task <persona-id> \"Generate a daily report of fleet health\" --name \"Daily Fleet Report\"",
3099
+ "<%= config.bin %> persona delegate-task <persona-id> \"Check all offline devices\" --dev"
2986
3100
  ],
2987
3101
  "flags": {
2988
3102
  "json": {
@@ -3011,39 +3125,47 @@
3011
3125
  "name": "stage",
3012
3126
  "allowNo": false,
3013
3127
  "type": "boolean"
3128
+ },
3129
+ "name": {
3130
+ "char": "n",
3131
+ "description": "Task name (defaults to first 50 chars of goal)",
3132
+ "name": "name",
3133
+ "hasDynamicHelp": false,
3134
+ "multiple": false,
3135
+ "type": "option"
3014
3136
  }
3015
3137
  },
3016
3138
  "hasDynamicHelp": false,
3017
3139
  "hiddenAliases": [],
3018
- "id": "device:rename",
3140
+ "id": "persona:delegate-task",
3019
3141
  "pluginAlias": "@formant/formant-cli",
3020
3142
  "pluginName": "@formant/formant-cli",
3021
3143
  "pluginType": "core",
3022
3144
  "strict": true,
3023
- "summary": "Rename a device",
3145
+ "summary": "Delegate an async task to a persona",
3024
3146
  "enableJsonFlag": true,
3025
3147
  "isESM": true,
3026
3148
  "relativePath": [
3027
3149
  "dist",
3028
3150
  "commands",
3029
- "device",
3030
- "rename.js"
3151
+ "persona",
3152
+ "delegate-task.js"
3031
3153
  ]
3032
3154
  },
3033
- "device:streams": {
3155
+ "persona:get": {
3034
3156
  "aliases": [],
3035
3157
  "args": {
3036
3158
  "id": {
3037
- "description": "Device ID (UUID)",
3159
+ "description": "Persona ID (UUID)",
3038
3160
  "name": "id",
3039
3161
  "required": true
3040
3162
  }
3041
3163
  },
3042
- "description": "List telemetry streams for a device.\n\nShows streams parsed from the device configuration as well as any streams\ndiscovered from actual ingested data (even if not explicitly configured).\nUnconfigured streams are marked with a SOURCE of \"data\" in the output.",
3164
+ "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.",
3043
3165
  "examples": [
3044
- "<%= config.bin %> device streams <device-id>",
3045
- "<%= config.bin %> device streams <device-id> --json",
3046
- "<%= config.bin %> device streams <device-id> --days 30"
3166
+ "<%= config.bin %> personas get <persona-id>",
3167
+ "<%= config.bin %> personas get <persona-id> --json",
3168
+ "<%= config.bin %> personas get <persona-id> --dev"
3047
3169
  ],
3048
3170
  "flags": {
3049
3171
  "json": {
@@ -3072,47 +3194,33 @@
3072
3194
  "name": "stage",
3073
3195
  "allowNo": false,
3074
3196
  "type": "boolean"
3075
- },
3076
- "days": {
3077
- "description": "How many days back to look for unconfigured streams in ingested data",
3078
- "name": "days",
3079
- "default": 14,
3080
- "hasDynamicHelp": false,
3081
- "multiple": false,
3082
- "type": "option"
3083
3197
  }
3084
3198
  },
3085
3199
  "hasDynamicHelp": false,
3086
3200
  "hiddenAliases": [],
3087
- "id": "device:streams",
3201
+ "id": "persona:get",
3088
3202
  "pluginAlias": "@formant/formant-cli",
3089
3203
  "pluginName": "@formant/formant-cli",
3090
3204
  "pluginType": "core",
3091
3205
  "strict": true,
3092
- "summary": "List device streams",
3206
+ "summary": "Get persona details and tools",
3093
3207
  "enableJsonFlag": true,
3094
3208
  "isESM": true,
3095
3209
  "relativePath": [
3096
3210
  "dist",
3097
3211
  "commands",
3098
- "device",
3099
- "streams.js"
3212
+ "persona",
3213
+ "get.js"
3100
3214
  ]
3101
3215
  },
3102
- "device:tag": {
3216
+ "persona:list": {
3103
3217
  "aliases": [],
3104
- "args": {
3105
- "id": {
3106
- "description": "Device ID (UUID)",
3107
- "name": "id",
3108
- "required": true
3109
- }
3110
- },
3111
- "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.",
3218
+ "args": {},
3219
+ "description": "List AI personas available in your organization.\n\nShows both built-in and custom personas with their ID, name, and description.",
3112
3220
  "examples": [
3113
- "<%= config.bin %> device tag <device-id> --tag location=warehouse",
3114
- "<%= config.bin %> device tag <device-id> --tag env=prod --tag region=us-east",
3115
- "<%= config.bin %> device tag <device-id> --tag location=factory --json"
3221
+ "<%= config.bin %> personas list",
3222
+ "<%= config.bin %> personas list --json",
3223
+ "<%= config.bin %> personas list --dev"
3116
3224
  ],
3117
3225
  "flags": {
3118
3226
  "json": {
@@ -3141,48 +3249,39 @@
3141
3249
  "name": "stage",
3142
3250
  "allowNo": false,
3143
3251
  "type": "boolean"
3144
- },
3145
- "tag": {
3146
- "char": "t",
3147
- "description": "Tag to add or update (key=value), can be specified multiple times",
3148
- "name": "tag",
3149
- "required": true,
3150
- "hasDynamicHelp": false,
3151
- "multiple": true,
3152
- "type": "option"
3153
3252
  }
3154
3253
  },
3155
3254
  "hasDynamicHelp": false,
3156
3255
  "hiddenAliases": [],
3157
- "id": "device:tag",
3256
+ "id": "persona:list",
3158
3257
  "pluginAlias": "@formant/formant-cli",
3159
3258
  "pluginName": "@formant/formant-cli",
3160
3259
  "pluginType": "core",
3161
3260
  "strict": true,
3162
- "summary": "Add or update tags on a device",
3261
+ "summary": "List AI personas",
3163
3262
  "enableJsonFlag": true,
3164
3263
  "isESM": true,
3165
3264
  "relativePath": [
3166
3265
  "dist",
3167
3266
  "commands",
3168
- "device",
3169
- "tag.js"
3267
+ "persona",
3268
+ "list.js"
3170
3269
  ]
3171
3270
  },
3172
- "device:untag": {
3271
+ "persona:task-status": {
3173
3272
  "aliases": [],
3174
3273
  "args": {
3175
- "id": {
3176
- "description": "Device ID (UUID)",
3177
- "name": "id",
3274
+ "taskId": {
3275
+ "description": "Task ID (from delegate-task output)",
3276
+ "name": "taskId",
3178
3277
  "required": true
3179
3278
  }
3180
3279
  },
3181
- "description": "Remove tags from a device.\n\nSpecify one or more tag keys to remove with --key.",
3280
+ "description": "Check the status and results of a delegated task.\n\nShows all runs for a task including their status, result summary, and timestamps.",
3182
3281
  "examples": [
3183
- "<%= config.bin %> device untag <device-id> --key location",
3184
- "<%= config.bin %> device untag <device-id> --key env --key region",
3185
- "<%= config.bin %> device untag <device-id> --key location --json"
3282
+ "<%= config.bin %> persona task-status <task-id>",
3283
+ "<%= config.bin %> persona task-status <task-id> --json",
3284
+ "<%= config.bin %> persona task-status <task-id> --dev"
3186
3285
  ],
3187
3286
  "flags": {
3188
3287
  "json": {
@@ -3203,40 +3302,31 @@
3203
3302
  "type": "boolean"
3204
3303
  },
3205
3304
  "stage": {
3206
- "description": "Target the stage environment",
3207
- "exclusive": [
3208
- "dev"
3209
- ],
3210
- "helpGroup": "GLOBAL",
3211
- "name": "stage",
3212
- "allowNo": false,
3213
- "type": "boolean"
3214
- },
3215
- "key": {
3216
- "char": "k",
3217
- "description": "Tag key to remove, can be specified multiple times",
3218
- "name": "key",
3219
- "required": true,
3220
- "hasDynamicHelp": false,
3221
- "multiple": true,
3222
- "type": "option"
3305
+ "description": "Target the stage environment",
3306
+ "exclusive": [
3307
+ "dev"
3308
+ ],
3309
+ "helpGroup": "GLOBAL",
3310
+ "name": "stage",
3311
+ "allowNo": false,
3312
+ "type": "boolean"
3223
3313
  }
3224
3314
  },
3225
3315
  "hasDynamicHelp": false,
3226
3316
  "hiddenAliases": [],
3227
- "id": "device:untag",
3317
+ "id": "persona:task-status",
3228
3318
  "pluginAlias": "@formant/formant-cli",
3229
3319
  "pluginName": "@formant/formant-cli",
3230
3320
  "pluginType": "core",
3231
3321
  "strict": true,
3232
- "summary": "Remove tags from a device",
3322
+ "summary": "Check status of a delegated task",
3233
3323
  "enableJsonFlag": true,
3234
3324
  "isESM": true,
3235
3325
  "relativePath": [
3236
3326
  "dist",
3237
3327
  "commands",
3238
- "device",
3239
- "untag.js"
3328
+ "persona",
3329
+ "task-status.js"
3240
3330
  ]
3241
3331
  },
3242
3332
  "query": {
@@ -3246,6 +3336,8 @@
3246
3336
  "examples": [
3247
3337
  "<%= config.bin %> query --device <id> --stream battery_level --start 2026-01-01 --end 2026-01-02",
3248
3338
  "<%= config.bin %> query --device <id> --stream speed --aggregate hour --start 2026-01-01 --end 2026-02-01",
3339
+ "<%= config.bin %> query --device <id> --stream battery_level --stream temperature --start 2026-01-01 --end 2026-01-02",
3340
+ "<%= config.bin %> query --device <id1> --device <id2> --stream battery_level --start 2026-01-01 --end 2026-01-02",
3249
3341
  "<%= config.bin %> query --device <id> --stream battery_level --latest",
3250
3342
  "<%= config.bin %> query --device <id> --stream temperature --type numeric --json"
3251
3343
  ],
@@ -3287,11 +3379,11 @@
3287
3379
  },
3288
3380
  "device": {
3289
3381
  "char": "d",
3290
- "description": "Device ID (UUID)",
3382
+ "description": "Device ID(s), can be specified multiple times",
3291
3383
  "name": "device",
3292
3384
  "required": true,
3293
3385
  "hasDynamicHelp": false,
3294
- "multiple": false,
3386
+ "multiple": true,
3295
3387
  "type": "option"
3296
3388
  },
3297
3389
  "end": {
@@ -3443,19 +3535,13 @@
3443
3535
  "latest-values.js"
3444
3536
  ]
3445
3537
  },
3446
- "schedule:get": {
3538
+ "org:get": {
3447
3539
  "aliases": [],
3448
- "args": {
3449
- "id": {
3450
- "description": "Schedule ID (UUID)",
3451
- "name": "id",
3452
- "required": true
3453
- }
3454
- },
3455
- "description": "Get detailed information about a schedule.\n\nShows the full schedule configuration including cron expression, command template,\ninvestigation link, and execution settings.",
3540
+ "args": {},
3541
+ "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.",
3456
3542
  "examples": [
3457
- "<%= config.bin %> schedule get <schedule-id>",
3458
- "<%= config.bin %> schedule get <schedule-id> --json"
3543
+ "<%= config.bin %> org get",
3544
+ "<%= config.bin %> org get --json"
3459
3545
  ],
3460
3546
  "flags": {
3461
3547
  "json": {
@@ -3488,28 +3574,30 @@
3488
3574
  },
3489
3575
  "hasDynamicHelp": false,
3490
3576
  "hiddenAliases": [],
3491
- "id": "schedule:get",
3577
+ "id": "org:get",
3492
3578
  "pluginAlias": "@formant/formant-cli",
3493
3579
  "pluginName": "@formant/formant-cli",
3494
3580
  "pluginType": "core",
3495
3581
  "strict": true,
3496
- "summary": "Get schedule details",
3582
+ "summary": "Get your organization",
3497
3583
  "enableJsonFlag": true,
3498
3584
  "isESM": true,
3499
3585
  "relativePath": [
3500
3586
  "dist",
3501
3587
  "commands",
3502
- "schedule",
3588
+ "org",
3503
3589
  "get.js"
3504
3590
  ]
3505
3591
  },
3506
- "schedule:list": {
3592
+ "org:update": {
3507
3593
  "aliases": [],
3508
3594
  "args": {},
3509
- "description": "List all schedules in your organization.\n\nSchedules can trigger commands or investigations on a recurring (cron) or one-time basis.",
3595
+ "description": "Update your organization's details.\n\nAt least one of --name or --description must be provided.",
3510
3596
  "examples": [
3511
- "<%= config.bin %> schedule list",
3512
- "<%= config.bin %> schedule list --json"
3597
+ "<%= config.bin %> org update --name \"My Fleet\"",
3598
+ "<%= config.bin %> org update --description \"Production robot fleet\"",
3599
+ "<%= config.bin %> org update --name \"My Fleet\" --description \"Production robot fleet\"",
3600
+ "<%= config.bin %> org update --name \"My Fleet\" --json"
3513
3601
  ],
3514
3602
  "flags": {
3515
3603
  "json": {
@@ -3538,76 +3626,18 @@
3538
3626
  "name": "stage",
3539
3627
  "allowNo": false,
3540
3628
  "type": "boolean"
3541
- }
3542
- },
3543
- "hasDynamicHelp": false,
3544
- "hiddenAliases": [],
3545
- "id": "schedule:list",
3546
- "pluginAlias": "@formant/formant-cli",
3547
- "pluginName": "@formant/formant-cli",
3548
- "pluginType": "core",
3549
- "strict": true,
3550
- "summary": "List schedules",
3551
- "enableJsonFlag": true,
3552
- "isESM": true,
3553
- "relativePath": [
3554
- "dist",
3555
- "commands",
3556
- "schedule",
3557
- "list.js"
3558
- ]
3559
- },
3560
- "persona:delegate-task": {
3561
- "aliases": [],
3562
- "args": {
3563
- "id": {
3564
- "description": "Persona ID (UUID)",
3565
- "name": "id",
3566
- "required": true
3567
- },
3568
- "goal": {
3569
- "description": "The task goal / instruction for the persona",
3570
- "name": "goal",
3571
- "required": true
3572
- }
3573
- },
3574
- "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\".",
3575
- "examples": [
3576
- "<%= config.bin %> persona delegate-task <persona-id> \"Analyze recent device failures and summarize findings\"",
3577
- "<%= config.bin %> persona delegate-task <persona-id> \"Generate a daily report of fleet health\" --name \"Daily Fleet Report\"",
3578
- "<%= config.bin %> persona delegate-task <persona-id> \"Check all offline devices\" --dev"
3579
- ],
3580
- "flags": {
3581
- "json": {
3582
- "description": "Format output as json.",
3583
- "helpGroup": "GLOBAL",
3584
- "name": "json",
3585
- "allowNo": false,
3586
- "type": "boolean"
3587
- },
3588
- "dev": {
3589
- "description": "Target the dev environment",
3590
- "exclusive": [
3591
- "stage"
3592
- ],
3593
- "helpGroup": "GLOBAL",
3594
- "name": "dev",
3595
- "allowNo": false,
3596
- "type": "boolean"
3597
3629
  },
3598
- "stage": {
3599
- "description": "Target the stage environment",
3600
- "exclusive": [
3601
- "dev"
3602
- ],
3603
- "helpGroup": "GLOBAL",
3604
- "name": "stage",
3605
- "allowNo": false,
3606
- "type": "boolean"
3630
+ "description": {
3631
+ "char": "d",
3632
+ "description": "New description for the organization",
3633
+ "name": "description",
3634
+ "hasDynamicHelp": false,
3635
+ "multiple": false,
3636
+ "type": "option"
3607
3637
  },
3608
3638
  "name": {
3609
3639
  "char": "n",
3610
- "description": "Task name (defaults to first 50 chars of goal)",
3640
+ "description": "New name for the organization",
3611
3641
  "name": "name",
3612
3642
  "hasDynamicHelp": false,
3613
3643
  "multiple": false,
@@ -3616,35 +3646,34 @@
3616
3646
  },
3617
3647
  "hasDynamicHelp": false,
3618
3648
  "hiddenAliases": [],
3619
- "id": "persona:delegate-task",
3649
+ "id": "org:update",
3620
3650
  "pluginAlias": "@formant/formant-cli",
3621
3651
  "pluginName": "@formant/formant-cli",
3622
3652
  "pluginType": "core",
3623
3653
  "strict": true,
3624
- "summary": "Delegate an async task to a persona",
3654
+ "summary": "Update your organization",
3625
3655
  "enableJsonFlag": true,
3626
3656
  "isESM": true,
3627
3657
  "relativePath": [
3628
3658
  "dist",
3629
3659
  "commands",
3630
- "persona",
3631
- "delegate-task.js"
3660
+ "org",
3661
+ "update.js"
3632
3662
  ]
3633
3663
  },
3634
- "persona:get": {
3664
+ "user:get": {
3635
3665
  "aliases": [],
3636
3666
  "args": {
3637
3667
  "id": {
3638
- "description": "Persona ID (UUID)",
3668
+ "description": "User ID (UUID)",
3639
3669
  "name": "id",
3640
3670
  "required": true
3641
3671
  }
3642
3672
  },
3643
- "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.",
3673
+ "description": "Get detailed information about a user.\n\nShows user details including email, name, roles, and account settings.",
3644
3674
  "examples": [
3645
- "<%= config.bin %> personas get <persona-id>",
3646
- "<%= config.bin %> personas get <persona-id> --json",
3647
- "<%= config.bin %> personas get <persona-id> --dev"
3675
+ "<%= config.bin %> user get <user-id>",
3676
+ "<%= config.bin %> user get <user-id> --json"
3648
3677
  ],
3649
3678
  "flags": {
3650
3679
  "json": {
@@ -3677,29 +3706,28 @@
3677
3706
  },
3678
3707
  "hasDynamicHelp": false,
3679
3708
  "hiddenAliases": [],
3680
- "id": "persona:get",
3709
+ "id": "user:get",
3681
3710
  "pluginAlias": "@formant/formant-cli",
3682
3711
  "pluginName": "@formant/formant-cli",
3683
3712
  "pluginType": "core",
3684
3713
  "strict": true,
3685
- "summary": "Get persona details and tools",
3714
+ "summary": "Get user details",
3686
3715
  "enableJsonFlag": true,
3687
3716
  "isESM": true,
3688
3717
  "relativePath": [
3689
3718
  "dist",
3690
3719
  "commands",
3691
- "persona",
3720
+ "user",
3692
3721
  "get.js"
3693
3722
  ]
3694
3723
  },
3695
- "persona:list": {
3724
+ "user:list": {
3696
3725
  "aliases": [],
3697
3726
  "args": {},
3698
- "description": "List AI personas available in your organization.\n\nShows both built-in and custom personas with their ID, name, and description.",
3727
+ "description": "List all users in your organization.\n\nShows user accounts, their email addresses, and account status.",
3699
3728
  "examples": [
3700
- "<%= config.bin %> personas list",
3701
- "<%= config.bin %> personas list --json",
3702
- "<%= config.bin %> personas list --dev"
3729
+ "<%= config.bin %> user list",
3730
+ "<%= config.bin %> user list --json"
3703
3731
  ],
3704
3732
  "flags": {
3705
3733
  "json": {
@@ -3732,95 +3760,34 @@
3732
3760
  },
3733
3761
  "hasDynamicHelp": false,
3734
3762
  "hiddenAliases": [],
3735
- "id": "persona:list",
3763
+ "id": "user:list",
3736
3764
  "pluginAlias": "@formant/formant-cli",
3737
3765
  "pluginName": "@formant/formant-cli",
3738
3766
  "pluginType": "core",
3739
3767
  "strict": true,
3740
- "summary": "List AI personas",
3768
+ "summary": "List users",
3741
3769
  "enableJsonFlag": true,
3742
3770
  "isESM": true,
3743
3771
  "relativePath": [
3744
3772
  "dist",
3745
3773
  "commands",
3746
- "persona",
3774
+ "user",
3747
3775
  "list.js"
3748
3776
  ]
3749
3777
  },
3750
- "persona:task-status": {
3751
- "aliases": [],
3752
- "args": {
3753
- "taskId": {
3754
- "description": "Task ID (from delegate-task output)",
3755
- "name": "taskId",
3756
- "required": true
3757
- }
3758
- },
3759
- "description": "Check the status and results of a delegated task.\n\nShows all runs for a task including their status, result summary, and timestamps.",
3760
- "examples": [
3761
- "<%= config.bin %> persona task-status <task-id>",
3762
- "<%= config.bin %> persona task-status <task-id> --json",
3763
- "<%= config.bin %> persona task-status <task-id> --dev"
3764
- ],
3765
- "flags": {
3766
- "json": {
3767
- "description": "Format output as json.",
3768
- "helpGroup": "GLOBAL",
3769
- "name": "json",
3770
- "allowNo": false,
3771
- "type": "boolean"
3772
- },
3773
- "dev": {
3774
- "description": "Target the dev environment",
3775
- "exclusive": [
3776
- "stage"
3777
- ],
3778
- "helpGroup": "GLOBAL",
3779
- "name": "dev",
3780
- "allowNo": false,
3781
- "type": "boolean"
3782
- },
3783
- "stage": {
3784
- "description": "Target the stage environment",
3785
- "exclusive": [
3786
- "dev"
3787
- ],
3788
- "helpGroup": "GLOBAL",
3789
- "name": "stage",
3790
- "allowNo": false,
3791
- "type": "boolean"
3792
- }
3793
- },
3794
- "hasDynamicHelp": false,
3795
- "hiddenAliases": [],
3796
- "id": "persona:task-status",
3797
- "pluginAlias": "@formant/formant-cli",
3798
- "pluginName": "@formant/formant-cli",
3799
- "pluginType": "core",
3800
- "strict": true,
3801
- "summary": "Check status of a delegated task",
3802
- "enableJsonFlag": true,
3803
- "isESM": true,
3804
- "relativePath": [
3805
- "dist",
3806
- "commands",
3807
- "persona",
3808
- "task-status.js"
3809
- ]
3810
- },
3811
- "user:get": {
3778
+ "schedule:get": {
3812
3779
  "aliases": [],
3813
3780
  "args": {
3814
3781
  "id": {
3815
- "description": "User ID (UUID)",
3782
+ "description": "Schedule ID (UUID)",
3816
3783
  "name": "id",
3817
3784
  "required": true
3818
3785
  }
3819
3786
  },
3820
- "description": "Get detailed information about a user.\n\nShows user details including email, name, roles, and account settings.",
3787
+ "description": "Get detailed information about a schedule.\n\nShows the full schedule configuration including cron expression, command template,\ninvestigation link, and execution settings.",
3821
3788
  "examples": [
3822
- "<%= config.bin %> user get <user-id>",
3823
- "<%= config.bin %> user get <user-id> --json"
3789
+ "<%= config.bin %> schedule get <schedule-id>",
3790
+ "<%= config.bin %> schedule get <schedule-id> --json"
3824
3791
  ],
3825
3792
  "flags": {
3826
3793
  "json": {
@@ -3853,28 +3820,28 @@
3853
3820
  },
3854
3821
  "hasDynamicHelp": false,
3855
3822
  "hiddenAliases": [],
3856
- "id": "user:get",
3823
+ "id": "schedule:get",
3857
3824
  "pluginAlias": "@formant/formant-cli",
3858
3825
  "pluginName": "@formant/formant-cli",
3859
3826
  "pluginType": "core",
3860
3827
  "strict": true,
3861
- "summary": "Get user details",
3828
+ "summary": "Get schedule details",
3862
3829
  "enableJsonFlag": true,
3863
3830
  "isESM": true,
3864
3831
  "relativePath": [
3865
3832
  "dist",
3866
3833
  "commands",
3867
- "user",
3834
+ "schedule",
3868
3835
  "get.js"
3869
3836
  ]
3870
3837
  },
3871
- "user:list": {
3838
+ "schedule:list": {
3872
3839
  "aliases": [],
3873
3840
  "args": {},
3874
- "description": "List all users in your organization.\n\nShows user accounts, their email addresses, and account status.",
3841
+ "description": "List all schedules in your organization.\n\nSchedules can trigger commands or investigations on a recurring (cron) or one-time basis.",
3875
3842
  "examples": [
3876
- "<%= config.bin %> user list",
3877
- "<%= config.bin %> user list --json"
3843
+ "<%= config.bin %> schedule list",
3844
+ "<%= config.bin %> schedule list --json"
3878
3845
  ],
3879
3846
  "flags": {
3880
3847
  "json": {
@@ -3907,18 +3874,18 @@
3907
3874
  },
3908
3875
  "hasDynamicHelp": false,
3909
3876
  "hiddenAliases": [],
3910
- "id": "user:list",
3877
+ "id": "schedule:list",
3911
3878
  "pluginAlias": "@formant/formant-cli",
3912
3879
  "pluginName": "@formant/formant-cli",
3913
3880
  "pluginType": "core",
3914
3881
  "strict": true,
3915
- "summary": "List users",
3882
+ "summary": "List schedules",
3916
3883
  "enableJsonFlag": true,
3917
3884
  "isESM": true,
3918
3885
  "relativePath": [
3919
3886
  "dist",
3920
3887
  "commands",
3921
- "user",
3888
+ "schedule",
3922
3889
  "list.js"
3923
3890
  ]
3924
3891
  },
@@ -4382,5 +4349,5 @@
4382
4349
  ]
4383
4350
  }
4384
4351
  },
4385
- "version": "0.4.2"
4352
+ "version": "0.4.4"
4386
4353
  }