@formant/formant-cli 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -140,19 +140,19 @@
140
140
  "tables.js"
141
141
  ]
142
142
  },
143
- "event-triggers:get": {
143
+ "events:get": {
144
144
  "aliases": [],
145
145
  "args": {
146
146
  "id": {
147
- "description": "Event trigger ID (UUID)",
147
+ "description": "Event ID (UUID)",
148
148
  "name": "id",
149
149
  "required": true
150
150
  }
151
151
  },
152
- "description": "Get detailed information about an event trigger.\n\nShows the full trigger configuration including conditions, exit conditions, commands\nit executes, and device targeting filters.",
152
+ "description": "Get detailed information about a specific event by its ID.",
153
153
  "examples": [
154
- "<%= config.bin %> event-triggers get <trigger-id>",
155
- "<%= config.bin %> event-triggers get <trigger-id> --json"
154
+ "<%= config.bin %> events get <event-id>",
155
+ "<%= config.bin %> events get <event-id> --json"
156
156
  ],
157
157
  "flags": {
158
158
  "json": {
@@ -185,28 +185,30 @@
185
185
  },
186
186
  "hasDynamicHelp": false,
187
187
  "hiddenAliases": [],
188
- "id": "event-triggers:get",
188
+ "id": "events:get",
189
189
  "pluginAlias": "@formant/formant-cli",
190
190
  "pluginName": "@formant/formant-cli",
191
191
  "pluginType": "core",
192
192
  "strict": true,
193
- "summary": "Get event trigger details",
193
+ "summary": "Get an event by ID",
194
194
  "enableJsonFlag": true,
195
195
  "isESM": true,
196
196
  "relativePath": [
197
197
  "dist",
198
198
  "commands",
199
- "event-triggers",
199
+ "events",
200
200
  "get.js"
201
201
  ]
202
202
  },
203
- "event-triggers:list": {
203
+ "events:list": {
204
204
  "aliases": [],
205
205
  "args": {},
206
- "description": "List all event trigger rules in your organization.\n\nEvent triggers monitor device data and generate events/signals when conditions are met.\nThey can trigger investigations, send notifications, or execute commands.",
206
+ "description": "View important events emitted by devices with optional filters.\n\nEvents are significant occurrences from robots and sensors (e.g., device online/offline,\nerrors, state changes, commands). They can trigger signals for investigation.\n\nEvent types include: triggered-event, datapoint-event, device-online, device-offline,\nintervention-request, intervention-response, teleop-session-record, command-request,\ncommand-response, custom, comment, system, annotation, task-summary, stateful.\n\nSeverities: info, warning, error, critical.",
207
207
  "examples": [
208
- "<%= config.bin %> event-triggers list",
209
- "<%= config.bin %> event-triggers list --json"
208
+ "<%= config.bin %> events list",
209
+ "<%= config.bin %> events list --device <id> --severity critical",
210
+ "<%= config.bin %> events list --type device-offline --start 2026-01-01 --end 2026-01-02",
211
+ "<%= config.bin %> events list --limit 100 --json"
210
212
  ],
211
213
  "flags": {
212
214
  "json": {
@@ -235,22 +237,73 @@
235
237
  "name": "stage",
236
238
  "allowNo": false,
237
239
  "type": "boolean"
240
+ },
241
+ "device": {
242
+ "char": "d",
243
+ "description": "Filter by device ID",
244
+ "name": "device",
245
+ "hasDynamicHelp": false,
246
+ "multiple": false,
247
+ "type": "option"
248
+ },
249
+ "end": {
250
+ "description": "End time (ISO 8601)",
251
+ "name": "end",
252
+ "hasDynamicHelp": false,
253
+ "multiple": false,
254
+ "type": "option"
255
+ },
256
+ "limit": {
257
+ "char": "l",
258
+ "description": "Maximum number of events to return",
259
+ "name": "limit",
260
+ "default": 25,
261
+ "hasDynamicHelp": false,
262
+ "multiple": false,
263
+ "type": "option"
264
+ },
265
+ "severity": {
266
+ "description": "Filter by severity",
267
+ "name": "severity",
268
+ "hasDynamicHelp": false,
269
+ "multiple": false,
270
+ "options": [
271
+ "info",
272
+ "warning",
273
+ "error",
274
+ "critical"
275
+ ],
276
+ "type": "option"
277
+ },
278
+ "start": {
279
+ "description": "Start time (ISO 8601)",
280
+ "name": "start",
281
+ "hasDynamicHelp": false,
282
+ "multiple": false,
283
+ "type": "option"
284
+ },
285
+ "type": {
286
+ "description": "Filter by event type",
287
+ "name": "type",
288
+ "hasDynamicHelp": false,
289
+ "multiple": false,
290
+ "type": "option"
238
291
  }
239
292
  },
240
293
  "hasDynamicHelp": false,
241
294
  "hiddenAliases": [],
242
- "id": "event-triggers:list",
295
+ "id": "events:list",
243
296
  "pluginAlias": "@formant/formant-cli",
244
297
  "pluginName": "@formant/formant-cli",
245
298
  "pluginType": "core",
246
299
  "strict": true,
247
- "summary": "List event trigger rules",
300
+ "summary": "View events emitted by devices",
248
301
  "enableJsonFlag": true,
249
302
  "isESM": true,
250
303
  "relativePath": [
251
304
  "dist",
252
305
  "commands",
253
- "event-triggers",
306
+ "events",
254
307
  "list.js"
255
308
  ]
256
309
  },
@@ -704,19 +757,19 @@
704
757
  "list.js"
705
758
  ]
706
759
  },
707
- "devices:config": {
760
+ "event-triggers:get": {
708
761
  "aliases": [],
709
762
  "args": {
710
763
  "id": {
711
- "description": "Device ID (UUID)",
764
+ "description": "Event trigger ID (UUID)",
712
765
  "name": "id",
713
766
  "required": true
714
767
  }
715
768
  },
716
- "description": "Get the device configuration including stream definitions.\n\nShows the device's current configuration including telemetry streams, commands,\nand other settings.",
769
+ "description": "Get detailed information about an event trigger.\n\nShows the full trigger configuration including conditions, exit conditions, commands\nit executes, and device targeting filters.",
717
770
  "examples": [
718
- "<%= config.bin %> devices config <device-id>",
719
- "<%= config.bin %> devices config <device-id> --json"
771
+ "<%= config.bin %> event-triggers get <trigger-id>",
772
+ "<%= config.bin %> event-triggers get <trigger-id> --json"
720
773
  ],
721
774
  "flags": {
722
775
  "json": {
@@ -749,35 +802,28 @@
749
802
  },
750
803
  "hasDynamicHelp": false,
751
804
  "hiddenAliases": [],
752
- "id": "devices:config",
805
+ "id": "event-triggers:get",
753
806
  "pluginAlias": "@formant/formant-cli",
754
807
  "pluginName": "@formant/formant-cli",
755
808
  "pluginType": "core",
756
809
  "strict": true,
757
- "summary": "Get device configuration",
810
+ "summary": "Get event trigger details",
758
811
  "enableJsonFlag": true,
759
812
  "isESM": true,
760
813
  "relativePath": [
761
814
  "dist",
762
815
  "commands",
763
- "devices",
764
- "config.js"
816
+ "event-triggers",
817
+ "get.js"
765
818
  ]
766
819
  },
767
- "devices:create": {
820
+ "event-triggers:list": {
768
821
  "aliases": [],
769
- "args": {
770
- "name": {
771
- "description": "Name for the new device",
772
- "name": "name",
773
- "required": true
774
- }
775
- },
776
- "description": "Create a new device in your fleet.\n\nThe device is created as enabled by default. You can optionally specify tags.",
822
+ "args": {},
823
+ "description": "List all event trigger rules in your organization.\n\nEvent triggers monitor device data and generate events/signals when conditions are met.\nThey can trigger investigations, send notifications, or execute commands.",
777
824
  "examples": [
778
- "<%= config.bin %> devices create my-robot",
779
- "<%= config.bin %> devices create my-robot --tag location=warehouse --tag env=prod",
780
- "<%= config.bin %> devices create my-robot --json"
825
+ "<%= config.bin %> event-triggers list",
826
+ "<%= config.bin %> event-triggers list --json"
781
827
  ],
782
828
  "flags": {
783
829
  "json": {
@@ -806,46 +852,34 @@
806
852
  "name": "stage",
807
853
  "allowNo": false,
808
854
  "type": "boolean"
809
- },
810
- "tag": {
811
- "char": "t",
812
- "description": "Tag to apply (key=value), can be specified multiple times",
813
- "name": "tag",
814
- "hasDynamicHelp": false,
815
- "multiple": true,
816
- "type": "option"
817
855
  }
818
856
  },
819
857
  "hasDynamicHelp": false,
820
858
  "hiddenAliases": [],
821
- "id": "devices:create",
859
+ "id": "event-triggers:list",
822
860
  "pluginAlias": "@formant/formant-cli",
823
861
  "pluginName": "@formant/formant-cli",
824
862
  "pluginType": "core",
825
863
  "strict": true,
826
- "summary": "Create a new device",
864
+ "summary": "List event trigger rules",
827
865
  "enableJsonFlag": true,
828
866
  "isESM": true,
829
867
  "relativePath": [
830
868
  "dist",
831
869
  "commands",
832
- "devices",
833
- "create.js"
870
+ "event-triggers",
871
+ "list.js"
834
872
  ]
835
873
  },
836
- "devices:delete": {
874
+ "ingest:batch": {
837
875
  "aliases": [],
838
- "args": {
839
- "id": {
840
- "description": "Device ID (UUID)",
841
- "name": "id",
842
- "required": true
843
- }
844
- },
845
- "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.",
876
+ "args": {},
877
+ "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).",
846
878
  "examples": [
847
- "<%= config.bin %> devices delete <device-id>",
848
- "<%= config.bin %> devices delete <device-id> --json"
879
+ "<%= config.bin %> ingest batch --file data.json",
880
+ "<%= config.bin %> ingest batch --stdin < data.json",
881
+ "cat payload.json | <%= config.bin %> ingest batch --stdin",
882
+ "# 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}"
849
883
  ],
850
884
  "flags": {
851
885
  "json": {
@@ -874,38 +908,53 @@
874
908
  "name": "stage",
875
909
  "allowNo": false,
876
910
  "type": "boolean"
911
+ },
912
+ "file": {
913
+ "char": "f",
914
+ "description": "Path to JSON file containing batch payload",
915
+ "exclusive": [
916
+ "stdin"
917
+ ],
918
+ "name": "file",
919
+ "hasDynamicHelp": false,
920
+ "multiple": false,
921
+ "type": "option"
922
+ },
923
+ "stdin": {
924
+ "description": "Read JSON payload from stdin",
925
+ "exclusive": [
926
+ "file"
927
+ ],
928
+ "name": "stdin",
929
+ "allowNo": false,
930
+ "type": "boolean"
877
931
  }
878
932
  },
879
933
  "hasDynamicHelp": false,
880
934
  "hiddenAliases": [],
881
- "id": "devices:delete",
935
+ "id": "ingest:batch",
882
936
  "pluginAlias": "@formant/formant-cli",
883
937
  "pluginName": "@formant/formant-cli",
884
938
  "pluginType": "core",
885
939
  "strict": true,
886
- "summary": "Delete (disable) a device",
940
+ "summary": "Ingest batch data from file or stdin",
887
941
  "enableJsonFlag": true,
888
942
  "isESM": true,
889
943
  "relativePath": [
890
944
  "dist",
891
945
  "commands",
892
- "devices",
893
- "delete.js"
946
+ "ingest",
947
+ "batch.js"
894
948
  ]
895
949
  },
896
- "devices:get": {
950
+ "ingest:bitset": {
897
951
  "aliases": [],
898
- "args": {
899
- "id": {
900
- "description": "Device ID (UUID)",
901
- "name": "id",
902
- "required": true
903
- }
904
- },
905
- "description": "Get detailed information about a specific device by its ID.",
952
+ "args": {},
953
+ "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",
906
954
  "examples": [
907
- "<%= config.bin %> devices get <device-id>",
908
- "<%= config.bin %> devices get <device-id> --json"
955
+ "<%= config.bin %> ingest bitset --device <device-id> --stream sensors --keys \"door,window,motion\" --values \"true,false,true\"",
956
+ "<%= config.bin %> ingest bitset --device <device-id> --stream flags --keys \"active,paused,error\" --values \"true,false,false\" --tag system=main",
957
+ "<%= config.bin %> ingest bitset --device <device-id> --stream states --keys \"a,b\" --values \"false,true\""
909
958
  ],
910
959
  "flags": {
911
960
  "json": {
@@ -934,38 +983,84 @@
934
983
  "name": "stage",
935
984
  "allowNo": false,
936
985
  "type": "boolean"
986
+ },
987
+ "device": {
988
+ "char": "d",
989
+ "description": "Device ID (UUID)",
990
+ "name": "device",
991
+ "required": true,
992
+ "hasDynamicHelp": false,
993
+ "multiple": false,
994
+ "type": "option"
995
+ },
996
+ "stream": {
997
+ "char": "s",
998
+ "description": "Stream name",
999
+ "name": "stream",
1000
+ "required": true,
1001
+ "hasDynamicHelp": false,
1002
+ "multiple": false,
1003
+ "type": "option"
1004
+ },
1005
+ "keys": {
1006
+ "char": "k",
1007
+ "description": "Comma-separated list of key names (1-1000 keys, max 255 chars each)",
1008
+ "name": "keys",
1009
+ "required": true,
1010
+ "hasDynamicHelp": false,
1011
+ "multiple": false,
1012
+ "type": "option"
1013
+ },
1014
+ "values": {
1015
+ "char": "v",
1016
+ "description": "Comma-separated list of boolean values (true/false, must match key count)",
1017
+ "name": "values",
1018
+ "required": true,
1019
+ "hasDynamicHelp": false,
1020
+ "multiple": false,
1021
+ "type": "option"
1022
+ },
1023
+ "tag": {
1024
+ "char": "t",
1025
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1026
+ "name": "tag",
1027
+ "hasDynamicHelp": false,
1028
+ "multiple": true,
1029
+ "type": "option"
1030
+ },
1031
+ "timestamp": {
1032
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1033
+ "name": "timestamp",
1034
+ "hasDynamicHelp": false,
1035
+ "multiple": false,
1036
+ "type": "option"
937
1037
  }
938
1038
  },
939
1039
  "hasDynamicHelp": false,
940
1040
  "hiddenAliases": [],
941
- "id": "devices:get",
1041
+ "id": "ingest:bitset",
942
1042
  "pluginAlias": "@formant/formant-cli",
943
1043
  "pluginName": "@formant/formant-cli",
944
1044
  "pluginType": "core",
945
1045
  "strict": true,
946
- "summary": "Get a device by ID",
1046
+ "summary": "Ingest bitset data",
947
1047
  "enableJsonFlag": true,
948
1048
  "isESM": true,
949
1049
  "relativePath": [
950
1050
  "dist",
951
1051
  "commands",
952
- "devices",
953
- "get.js"
1052
+ "ingest",
1053
+ "bitset.js"
954
1054
  ]
955
1055
  },
956
- "devices:last-seen": {
1056
+ "ingest:health": {
957
1057
  "aliases": [],
958
- "args": {
959
- "id": {
960
- "description": "Device ID (UUID)",
961
- "name": "id",
962
- "required": true
963
- }
964
- },
965
- "description": "Get when a device was last seen online.\n\nShows the most recent timestamp when the device was detected as online.",
1058
+ "args": {},
1059
+ "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.",
966
1060
  "examples": [
967
- "<%= config.bin %> devices last-seen <device-id>",
968
- "<%= config.bin %> devices last-seen <device-id> --json"
1061
+ "<%= config.bin %> ingest health --device <device-id> --stream system_health --status operational",
1062
+ "<%= config.bin %> ingest health --device <device-id> --stream health --status error --tag component=motor",
1063
+ "<%= config.bin %> ingest health --device <device-id> --stream sync --status operational --clock-skew 150"
969
1064
  ],
970
1065
  "flags": {
971
1066
  "json": {
@@ -994,35 +1089,87 @@
994
1089
  "name": "stage",
995
1090
  "allowNo": false,
996
1091
  "type": "boolean"
997
- }
998
- },
999
- "hasDynamicHelp": false,
1000
- "hiddenAliases": [],
1001
- "id": "devices:last-seen",
1002
- "pluginAlias": "@formant/formant-cli",
1003
- "pluginName": "@formant/formant-cli",
1004
- "pluginType": "core",
1005
- "strict": true,
1006
- "summary": "Get device last seen timestamp",
1007
- "enableJsonFlag": true,
1008
- "isESM": true,
1009
- "relativePath": [
1010
- "dist",
1011
- "commands",
1012
- "devices",
1013
- "last-seen.js"
1014
- ]
1015
- },
1016
- "devices:list": {
1017
- "aliases": [],
1018
- "args": {},
1019
- "description": "List robots and sensors in your fleet. Shows only online devices by default.\n\nUse --all to include offline devices.",
1020
- "examples": [
1021
- "<%= config.bin %> devices list",
1022
- "<%= config.bin %> devices list --all",
1023
- "<%= config.bin %> devices list --all --limit 100",
1024
- "<%= config.bin %> devices list --tag location=warehouse",
1025
- "<%= config.bin %> devices list --name robot --dev --json"
1092
+ },
1093
+ "device": {
1094
+ "char": "d",
1095
+ "description": "Device ID (UUID)",
1096
+ "name": "device",
1097
+ "required": true,
1098
+ "hasDynamicHelp": false,
1099
+ "multiple": false,
1100
+ "type": "option"
1101
+ },
1102
+ "stream": {
1103
+ "char": "s",
1104
+ "description": "Stream name",
1105
+ "name": "stream",
1106
+ "required": true,
1107
+ "hasDynamicHelp": false,
1108
+ "multiple": false,
1109
+ "type": "option"
1110
+ },
1111
+ "status": {
1112
+ "description": "Health status (unknown, operational, offline, or error)",
1113
+ "name": "status",
1114
+ "required": true,
1115
+ "hasDynamicHelp": false,
1116
+ "multiple": false,
1117
+ "options": [
1118
+ "unknown",
1119
+ "operational",
1120
+ "offline",
1121
+ "error"
1122
+ ],
1123
+ "type": "option"
1124
+ },
1125
+ "clock-skew": {
1126
+ "description": "Clock skew in milliseconds (optional)",
1127
+ "name": "clock-skew",
1128
+ "hasDynamicHelp": false,
1129
+ "multiple": false,
1130
+ "type": "option"
1131
+ },
1132
+ "tag": {
1133
+ "char": "t",
1134
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1135
+ "name": "tag",
1136
+ "hasDynamicHelp": false,
1137
+ "multiple": true,
1138
+ "type": "option"
1139
+ },
1140
+ "timestamp": {
1141
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1142
+ "name": "timestamp",
1143
+ "hasDynamicHelp": false,
1144
+ "multiple": false,
1145
+ "type": "option"
1146
+ }
1147
+ },
1148
+ "hasDynamicHelp": false,
1149
+ "hiddenAliases": [],
1150
+ "id": "ingest:health",
1151
+ "pluginAlias": "@formant/formant-cli",
1152
+ "pluginName": "@formant/formant-cli",
1153
+ "pluginType": "core",
1154
+ "strict": true,
1155
+ "summary": "Ingest health status data",
1156
+ "enableJsonFlag": true,
1157
+ "isESM": true,
1158
+ "relativePath": [
1159
+ "dist",
1160
+ "commands",
1161
+ "ingest",
1162
+ "health.js"
1163
+ ]
1164
+ },
1165
+ "ingest:image": {
1166
+ "aliases": [],
1167
+ "args": {},
1168
+ "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.",
1169
+ "examples": [
1170
+ "<%= config.bin %> ingest image --device <device-id> --stream camera_front --url https://example.com/image.jpg",
1171
+ "<%= config.bin %> ingest image --device <device-id> --stream snapshot --url https://example.com/snap.png --size 1024000",
1172
+ "<%= config.bin %> ingest image --device <device-id> --stream detection --url https://example.com/detect.jpg --tag frame=123"
1026
1173
  ],
1027
1174
  "flags": {
1028
1175
  "json": {
@@ -1052,74 +1199,87 @@
1052
1199
  "allowNo": false,
1053
1200
  "type": "boolean"
1054
1201
  },
1055
- "all": {
1056
- "char": "a",
1057
- "description": "Show all devices (online and offline)",
1058
- "name": "all",
1059
- "allowNo": false,
1060
- "type": "boolean"
1202
+ "device": {
1203
+ "char": "d",
1204
+ "description": "Device ID (UUID)",
1205
+ "name": "device",
1206
+ "required": true,
1207
+ "hasDynamicHelp": false,
1208
+ "multiple": false,
1209
+ "type": "option"
1061
1210
  },
1062
- "limit": {
1063
- "char": "l",
1064
- "description": "Maximum number of devices to return",
1065
- "name": "limit",
1066
- "default": 50,
1211
+ "stream": {
1212
+ "char": "s",
1213
+ "description": "Stream name",
1214
+ "name": "stream",
1215
+ "required": true,
1067
1216
  "hasDynamicHelp": false,
1068
1217
  "multiple": false,
1069
1218
  "type": "option"
1070
1219
  },
1071
- "name": {
1072
- "char": "n",
1073
- "description": "Filter devices by name (search)",
1074
- "name": "name",
1220
+ "url": {
1221
+ "char": "u",
1222
+ "description": "Image URL (must be http:// or https://)",
1223
+ "name": "url",
1224
+ "required": true,
1225
+ "hasDynamicHelp": false,
1226
+ "multiple": false,
1227
+ "type": "option"
1228
+ },
1229
+ "size": {
1230
+ "description": "Image size in bytes (optional)",
1231
+ "name": "size",
1075
1232
  "hasDynamicHelp": false,
1076
1233
  "multiple": false,
1077
1234
  "type": "option"
1078
1235
  },
1079
1236
  "tag": {
1080
1237
  "char": "t",
1081
- "description": "Filter by tag (key=value), can be specified multiple times",
1238
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1082
1239
  "name": "tag",
1083
1240
  "hasDynamicHelp": false,
1084
1241
  "multiple": true,
1085
1242
  "type": "option"
1243
+ },
1244
+ "timestamp": {
1245
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1246
+ "name": "timestamp",
1247
+ "hasDynamicHelp": false,
1248
+ "multiple": false,
1249
+ "type": "option"
1086
1250
  }
1087
1251
  },
1088
1252
  "hasDynamicHelp": false,
1089
1253
  "hiddenAliases": [],
1090
- "id": "devices:list",
1254
+ "id": "ingest:image",
1091
1255
  "pluginAlias": "@formant/formant-cli",
1092
1256
  "pluginName": "@formant/formant-cli",
1093
1257
  "pluginType": "core",
1094
1258
  "strict": true,
1095
- "summary": "List robots and sensors in your fleet",
1259
+ "summary": "Ingest image data",
1096
1260
  "enableJsonFlag": true,
1097
1261
  "isESM": true,
1098
1262
  "relativePath": [
1099
1263
  "dist",
1100
1264
  "commands",
1101
- "devices",
1102
- "list.js"
1265
+ "ingest",
1266
+ "image.js"
1103
1267
  ]
1104
1268
  },
1105
- "devices:rename": {
1269
+ "ingest:json": {
1106
1270
  "aliases": [],
1107
1271
  "args": {
1108
- "id": {
1109
- "description": "Device ID (UUID)",
1110
- "name": "id",
1111
- "required": true
1112
- },
1113
- "name": {
1114
- "description": "New name for the device",
1115
- "name": "name",
1272
+ "value": {
1273
+ "description": "JSON value to ingest (as a JSON string)",
1274
+ "name": "value",
1116
1275
  "required": true
1117
1276
  }
1118
1277
  },
1119
- "description": "Rename a device by updating its name.",
1278
+ "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.",
1120
1279
  "examples": [
1121
- "<%= config.bin %> devices rename <device-id> new-robot-name",
1122
- "<%= config.bin %> devices rename <device-id> new-robot-name --json"
1280
+ "<%= config.bin %> ingest json '{\"x\":1,\"y\":2}' --device <device-id> --stream position",
1281
+ "<%= config.bin %> ingest json '{\"status\":\"active\",\"mode\":\"auto\"}' --device <device-id> --stream config",
1282
+ "<%= config.bin %> ingest json '[1,2,3,4,5]' --device <device-id> --stream array_data"
1123
1283
  ],
1124
1284
  "flags": {
1125
1285
  "json": {
@@ -1148,38 +1308,72 @@
1148
1308
  "name": "stage",
1149
1309
  "allowNo": false,
1150
1310
  "type": "boolean"
1311
+ },
1312
+ "device": {
1313
+ "char": "d",
1314
+ "description": "Device ID (UUID)",
1315
+ "name": "device",
1316
+ "required": true,
1317
+ "hasDynamicHelp": false,
1318
+ "multiple": false,
1319
+ "type": "option"
1320
+ },
1321
+ "stream": {
1322
+ "char": "s",
1323
+ "description": "Stream name",
1324
+ "name": "stream",
1325
+ "required": true,
1326
+ "hasDynamicHelp": false,
1327
+ "multiple": false,
1328
+ "type": "option"
1329
+ },
1330
+ "tag": {
1331
+ "char": "t",
1332
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1333
+ "name": "tag",
1334
+ "hasDynamicHelp": false,
1335
+ "multiple": true,
1336
+ "type": "option"
1337
+ },
1338
+ "timestamp": {
1339
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1340
+ "name": "timestamp",
1341
+ "hasDynamicHelp": false,
1342
+ "multiple": false,
1343
+ "type": "option"
1151
1344
  }
1152
1345
  },
1153
1346
  "hasDynamicHelp": false,
1154
1347
  "hiddenAliases": [],
1155
- "id": "devices:rename",
1348
+ "id": "ingest:json",
1156
1349
  "pluginAlias": "@formant/formant-cli",
1157
1350
  "pluginName": "@formant/formant-cli",
1158
1351
  "pluginType": "core",
1159
1352
  "strict": true,
1160
- "summary": "Rename a device",
1353
+ "summary": "Ingest JSON data",
1161
1354
  "enableJsonFlag": true,
1162
1355
  "isESM": true,
1163
1356
  "relativePath": [
1164
1357
  "dist",
1165
1358
  "commands",
1166
- "devices",
1167
- "rename.js"
1359
+ "ingest",
1360
+ "json.js"
1168
1361
  ]
1169
1362
  },
1170
- "devices:streams": {
1363
+ "ingest:numeric": {
1171
1364
  "aliases": [],
1172
1365
  "args": {
1173
- "id": {
1174
- "description": "Device ID (UUID)",
1175
- "name": "id",
1366
+ "value": {
1367
+ "description": "Numeric value to ingest",
1368
+ "name": "value",
1176
1369
  "required": true
1177
1370
  }
1178
1371
  },
1179
- "description": "List telemetry streams configured on a device.\n\nShows a clean view of stream definitions parsed from the device configuration,\nincluding stream names, types, topics, and quality settings.",
1372
+ "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.",
1180
1373
  "examples": [
1181
- "<%= config.bin %> devices streams <device-id>",
1182
- "<%= config.bin %> devices streams <device-id> --json"
1374
+ "<%= config.bin %> ingest numeric 42.5 --device <device-id> --stream battery_level",
1375
+ "<%= config.bin %> ingest numeric 98.6 --device <device-id> --stream temperature --tag unit=fahrenheit",
1376
+ "<%= config.bin %> ingest numeric 1500 --device <device-id> --stream rpm --timestamp 1700000000000"
1183
1377
  ],
1184
1378
  "flags": {
1185
1379
  "json": {
@@ -1208,39 +1402,72 @@
1208
1402
  "name": "stage",
1209
1403
  "allowNo": false,
1210
1404
  "type": "boolean"
1405
+ },
1406
+ "device": {
1407
+ "char": "d",
1408
+ "description": "Device ID (UUID)",
1409
+ "name": "device",
1410
+ "required": true,
1411
+ "hasDynamicHelp": false,
1412
+ "multiple": false,
1413
+ "type": "option"
1414
+ },
1415
+ "stream": {
1416
+ "char": "s",
1417
+ "description": "Stream name",
1418
+ "name": "stream",
1419
+ "required": true,
1420
+ "hasDynamicHelp": false,
1421
+ "multiple": false,
1422
+ "type": "option"
1423
+ },
1424
+ "tag": {
1425
+ "char": "t",
1426
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1427
+ "name": "tag",
1428
+ "hasDynamicHelp": false,
1429
+ "multiple": true,
1430
+ "type": "option"
1431
+ },
1432
+ "timestamp": {
1433
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1434
+ "name": "timestamp",
1435
+ "hasDynamicHelp": false,
1436
+ "multiple": false,
1437
+ "type": "option"
1211
1438
  }
1212
1439
  },
1213
1440
  "hasDynamicHelp": false,
1214
1441
  "hiddenAliases": [],
1215
- "id": "devices:streams",
1442
+ "id": "ingest:numeric",
1216
1443
  "pluginAlias": "@formant/formant-cli",
1217
1444
  "pluginName": "@formant/formant-cli",
1218
1445
  "pluginType": "core",
1219
1446
  "strict": true,
1220
- "summary": "List device streams",
1447
+ "summary": "Ingest numeric data",
1221
1448
  "enableJsonFlag": true,
1222
1449
  "isESM": true,
1223
1450
  "relativePath": [
1224
1451
  "dist",
1225
1452
  "commands",
1226
- "devices",
1227
- "streams.js"
1453
+ "ingest",
1454
+ "numeric.js"
1228
1455
  ]
1229
1456
  },
1230
- "devices:tag": {
1457
+ "ingest:text": {
1231
1458
  "aliases": [],
1232
1459
  "args": {
1233
- "id": {
1234
- "description": "Device ID (UUID)",
1235
- "name": "id",
1460
+ "value": {
1461
+ "description": "Text value to ingest",
1462
+ "name": "value",
1236
1463
  "required": true
1237
1464
  }
1238
1465
  },
1239
- "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.",
1466
+ "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.",
1240
1467
  "examples": [
1241
- "<%= config.bin %> devices tag <device-id> --tag location=warehouse",
1242
- "<%= config.bin %> devices tag <device-id> --tag env=prod --tag region=us-east",
1243
- "<%= config.bin %> devices tag <device-id> --tag location=factory --json"
1468
+ "<%= config.bin %> ingest text \"Robot started successfully\" --device <device-id> --stream status",
1469
+ "<%= config.bin %> ingest text \"Error: sensor offline\" --device <device-id> --stream errors --tag severity=high",
1470
+ "<%= config.bin %> ingest text \"Checkpoint A reached\" --device <device-id> --stream waypoints"
1244
1471
  ],
1245
1472
  "flags": {
1246
1473
  "json": {
@@ -1270,47 +1497,500 @@
1270
1497
  "allowNo": false,
1271
1498
  "type": "boolean"
1272
1499
  },
1500
+ "device": {
1501
+ "char": "d",
1502
+ "description": "Device ID (UUID)",
1503
+ "name": "device",
1504
+ "required": true,
1505
+ "hasDynamicHelp": false,
1506
+ "multiple": false,
1507
+ "type": "option"
1508
+ },
1509
+ "stream": {
1510
+ "char": "s",
1511
+ "description": "Stream name",
1512
+ "name": "stream",
1513
+ "required": true,
1514
+ "hasDynamicHelp": false,
1515
+ "multiple": false,
1516
+ "type": "option"
1517
+ },
1273
1518
  "tag": {
1274
1519
  "char": "t",
1275
- "description": "Tag to add or update (key=value), can be specified multiple times",
1520
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1276
1521
  "name": "tag",
1277
- "required": true,
1278
1522
  "hasDynamicHelp": false,
1279
1523
  "multiple": true,
1280
1524
  "type": "option"
1525
+ },
1526
+ "timestamp": {
1527
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1528
+ "name": "timestamp",
1529
+ "hasDynamicHelp": false,
1530
+ "multiple": false,
1531
+ "type": "option"
1281
1532
  }
1282
1533
  },
1283
1534
  "hasDynamicHelp": false,
1284
1535
  "hiddenAliases": [],
1285
- "id": "devices:tag",
1536
+ "id": "ingest:text",
1286
1537
  "pluginAlias": "@formant/formant-cli",
1287
1538
  "pluginName": "@formant/formant-cli",
1288
1539
  "pluginType": "core",
1289
1540
  "strict": true,
1290
- "summary": "Add or update tags on a device",
1541
+ "summary": "Ingest text data",
1291
1542
  "enableJsonFlag": true,
1292
1543
  "isESM": true,
1293
1544
  "relativePath": [
1294
1545
  "dist",
1295
1546
  "commands",
1296
- "devices",
1297
- "tag.js"
1547
+ "ingest",
1548
+ "text.js"
1298
1549
  ]
1299
1550
  },
1300
- "devices:untag": {
1551
+ "ingest:video": {
1301
1552
  "aliases": [],
1302
- "args": {
1303
- "id": {
1304
- "description": "Device ID (UUID)",
1305
- "name": "id",
1306
- "required": true
1307
- }
1308
- },
1309
- "description": "Remove tags from a device.\n\nSpecify one or more tag keys to remove with --key.",
1553
+ "args": {},
1554
+ "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).",
1555
+ "examples": [
1556
+ "<%= config.bin %> ingest video --device <device-id> --stream recordings --url https://example.com/video.mp4 --duration 5000",
1557
+ "<%= config.bin %> ingest video --device <device-id> --stream clips --url https://example.com/clip.webm --duration 3500 --size 2048000",
1558
+ "<%= config.bin %> ingest video --device <device-id> --stream event_video --url https://example.com/event.mov --duration 10000 --tag event=collision"
1559
+ ],
1560
+ "flags": {
1561
+ "json": {
1562
+ "description": "Format output as json.",
1563
+ "helpGroup": "GLOBAL",
1564
+ "name": "json",
1565
+ "allowNo": false,
1566
+ "type": "boolean"
1567
+ },
1568
+ "dev": {
1569
+ "description": "Target the dev environment",
1570
+ "exclusive": [
1571
+ "stage"
1572
+ ],
1573
+ "helpGroup": "GLOBAL",
1574
+ "name": "dev",
1575
+ "allowNo": false,
1576
+ "type": "boolean"
1577
+ },
1578
+ "stage": {
1579
+ "description": "Target the stage environment",
1580
+ "exclusive": [
1581
+ "dev"
1582
+ ],
1583
+ "helpGroup": "GLOBAL",
1584
+ "name": "stage",
1585
+ "allowNo": false,
1586
+ "type": "boolean"
1587
+ },
1588
+ "device": {
1589
+ "char": "d",
1590
+ "description": "Device ID (UUID)",
1591
+ "name": "device",
1592
+ "required": true,
1593
+ "hasDynamicHelp": false,
1594
+ "multiple": false,
1595
+ "type": "option"
1596
+ },
1597
+ "stream": {
1598
+ "char": "s",
1599
+ "description": "Stream name",
1600
+ "name": "stream",
1601
+ "required": true,
1602
+ "hasDynamicHelp": false,
1603
+ "multiple": false,
1604
+ "type": "option"
1605
+ },
1606
+ "url": {
1607
+ "char": "u",
1608
+ "description": "Video URL (must be http:// or https://)",
1609
+ "name": "url",
1610
+ "required": true,
1611
+ "hasDynamicHelp": false,
1612
+ "multiple": false,
1613
+ "type": "option"
1614
+ },
1615
+ "duration": {
1616
+ "description": "Video duration in milliseconds (required)",
1617
+ "name": "duration",
1618
+ "required": true,
1619
+ "hasDynamicHelp": false,
1620
+ "multiple": false,
1621
+ "type": "option"
1622
+ },
1623
+ "size": {
1624
+ "description": "Video size in bytes (optional)",
1625
+ "name": "size",
1626
+ "hasDynamicHelp": false,
1627
+ "multiple": false,
1628
+ "type": "option"
1629
+ },
1630
+ "tag": {
1631
+ "char": "t",
1632
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1633
+ "name": "tag",
1634
+ "hasDynamicHelp": false,
1635
+ "multiple": true,
1636
+ "type": "option"
1637
+ },
1638
+ "timestamp": {
1639
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1640
+ "name": "timestamp",
1641
+ "hasDynamicHelp": false,
1642
+ "multiple": false,
1643
+ "type": "option"
1644
+ }
1645
+ },
1646
+ "hasDynamicHelp": false,
1647
+ "hiddenAliases": [],
1648
+ "id": "ingest:video",
1649
+ "pluginAlias": "@formant/formant-cli",
1650
+ "pluginName": "@formant/formant-cli",
1651
+ "pluginType": "core",
1652
+ "strict": true,
1653
+ "summary": "Ingest video data",
1654
+ "enableJsonFlag": true,
1655
+ "isESM": true,
1656
+ "relativePath": [
1657
+ "dist",
1658
+ "commands",
1659
+ "ingest",
1660
+ "video.js"
1661
+ ]
1662
+ },
1663
+ "org:get": {
1664
+ "aliases": [],
1665
+ "args": {},
1666
+ "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.",
1667
+ "examples": [
1668
+ "<%= config.bin %> org get",
1669
+ "<%= config.bin %> org get --json"
1670
+ ],
1671
+ "flags": {
1672
+ "json": {
1673
+ "description": "Format output as json.",
1674
+ "helpGroup": "GLOBAL",
1675
+ "name": "json",
1676
+ "allowNo": false,
1677
+ "type": "boolean"
1678
+ },
1679
+ "dev": {
1680
+ "description": "Target the dev environment",
1681
+ "exclusive": [
1682
+ "stage"
1683
+ ],
1684
+ "helpGroup": "GLOBAL",
1685
+ "name": "dev",
1686
+ "allowNo": false,
1687
+ "type": "boolean"
1688
+ },
1689
+ "stage": {
1690
+ "description": "Target the stage environment",
1691
+ "exclusive": [
1692
+ "dev"
1693
+ ],
1694
+ "helpGroup": "GLOBAL",
1695
+ "name": "stage",
1696
+ "allowNo": false,
1697
+ "type": "boolean"
1698
+ }
1699
+ },
1700
+ "hasDynamicHelp": false,
1701
+ "hiddenAliases": [],
1702
+ "id": "org:get",
1703
+ "pluginAlias": "@formant/formant-cli",
1704
+ "pluginName": "@formant/formant-cli",
1705
+ "pluginType": "core",
1706
+ "strict": true,
1707
+ "summary": "Get your organization",
1708
+ "enableJsonFlag": true,
1709
+ "isESM": true,
1710
+ "relativePath": [
1711
+ "dist",
1712
+ "commands",
1713
+ "org",
1714
+ "get.js"
1715
+ ]
1716
+ },
1717
+ "org:update": {
1718
+ "aliases": [],
1719
+ "args": {},
1720
+ "description": "Update your organization's details.\n\nAt least one of --name or --description must be provided.",
1721
+ "examples": [
1722
+ "<%= config.bin %> org update --name \"My Fleet\"",
1723
+ "<%= config.bin %> org update --description \"Production robot fleet\"",
1724
+ "<%= config.bin %> org update --name \"My Fleet\" --description \"Production robot fleet\"",
1725
+ "<%= config.bin %> org update --name \"My Fleet\" --json"
1726
+ ],
1727
+ "flags": {
1728
+ "json": {
1729
+ "description": "Format output as json.",
1730
+ "helpGroup": "GLOBAL",
1731
+ "name": "json",
1732
+ "allowNo": false,
1733
+ "type": "boolean"
1734
+ },
1735
+ "dev": {
1736
+ "description": "Target the dev environment",
1737
+ "exclusive": [
1738
+ "stage"
1739
+ ],
1740
+ "helpGroup": "GLOBAL",
1741
+ "name": "dev",
1742
+ "allowNo": false,
1743
+ "type": "boolean"
1744
+ },
1745
+ "stage": {
1746
+ "description": "Target the stage environment",
1747
+ "exclusive": [
1748
+ "dev"
1749
+ ],
1750
+ "helpGroup": "GLOBAL",
1751
+ "name": "stage",
1752
+ "allowNo": false,
1753
+ "type": "boolean"
1754
+ },
1755
+ "description": {
1756
+ "char": "d",
1757
+ "description": "New description for the organization",
1758
+ "name": "description",
1759
+ "hasDynamicHelp": false,
1760
+ "multiple": false,
1761
+ "type": "option"
1762
+ },
1763
+ "name": {
1764
+ "char": "n",
1765
+ "description": "New name for the organization",
1766
+ "name": "name",
1767
+ "hasDynamicHelp": false,
1768
+ "multiple": false,
1769
+ "type": "option"
1770
+ }
1771
+ },
1772
+ "hasDynamicHelp": false,
1773
+ "hiddenAliases": [],
1774
+ "id": "org:update",
1775
+ "pluginAlias": "@formant/formant-cli",
1776
+ "pluginName": "@formant/formant-cli",
1777
+ "pluginType": "core",
1778
+ "strict": true,
1779
+ "summary": "Update your organization",
1780
+ "enableJsonFlag": true,
1781
+ "isESM": true,
1782
+ "relativePath": [
1783
+ "dist",
1784
+ "commands",
1785
+ "org",
1786
+ "update.js"
1787
+ ]
1788
+ },
1789
+ "kv:get": {
1790
+ "aliases": [],
1791
+ "args": {
1792
+ "key": {
1793
+ "description": "Key to retrieve",
1794
+ "name": "key",
1795
+ "required": true
1796
+ }
1797
+ },
1798
+ "description": "Get a value from the key-value store.\n\nThe key-value store allows devices and applications to store metadata.",
1799
+ "examples": [
1800
+ "<%= config.bin %> kv get my-key",
1801
+ "<%= config.bin %> kv get my-key --json"
1802
+ ],
1803
+ "flags": {
1804
+ "json": {
1805
+ "description": "Format output as json.",
1806
+ "helpGroup": "GLOBAL",
1807
+ "name": "json",
1808
+ "allowNo": false,
1809
+ "type": "boolean"
1810
+ },
1811
+ "dev": {
1812
+ "description": "Target the dev environment",
1813
+ "exclusive": [
1814
+ "stage"
1815
+ ],
1816
+ "helpGroup": "GLOBAL",
1817
+ "name": "dev",
1818
+ "allowNo": false,
1819
+ "type": "boolean"
1820
+ },
1821
+ "stage": {
1822
+ "description": "Target the stage environment",
1823
+ "exclusive": [
1824
+ "dev"
1825
+ ],
1826
+ "helpGroup": "GLOBAL",
1827
+ "name": "stage",
1828
+ "allowNo": false,
1829
+ "type": "boolean"
1830
+ }
1831
+ },
1832
+ "hasDynamicHelp": false,
1833
+ "hiddenAliases": [],
1834
+ "id": "kv:get",
1835
+ "pluginAlias": "@formant/formant-cli",
1836
+ "pluginName": "@formant/formant-cli",
1837
+ "pluginType": "core",
1838
+ "strict": true,
1839
+ "summary": "Get key-value",
1840
+ "enableJsonFlag": true,
1841
+ "isESM": true,
1842
+ "relativePath": [
1843
+ "dist",
1844
+ "commands",
1845
+ "kv",
1846
+ "get.js"
1847
+ ]
1848
+ },
1849
+ "kv:list": {
1850
+ "aliases": [],
1851
+ "args": {},
1852
+ "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.",
1853
+ "examples": [
1854
+ "<%= config.bin %> kv list",
1855
+ "<%= config.bin %> kv list --prefix config",
1856
+ "<%= config.bin %> kv list --keys key1 --keys key2 --keys key3",
1857
+ "<%= config.bin %> kv list --json"
1858
+ ],
1859
+ "flags": {
1860
+ "json": {
1861
+ "description": "Format output as json.",
1862
+ "helpGroup": "GLOBAL",
1863
+ "name": "json",
1864
+ "allowNo": false,
1865
+ "type": "boolean"
1866
+ },
1867
+ "dev": {
1868
+ "description": "Target the dev environment",
1869
+ "exclusive": [
1870
+ "stage"
1871
+ ],
1872
+ "helpGroup": "GLOBAL",
1873
+ "name": "dev",
1874
+ "allowNo": false,
1875
+ "type": "boolean"
1876
+ },
1877
+ "stage": {
1878
+ "description": "Target the stage environment",
1879
+ "exclusive": [
1880
+ "dev"
1881
+ ],
1882
+ "helpGroup": "GLOBAL",
1883
+ "name": "stage",
1884
+ "allowNo": false,
1885
+ "type": "boolean"
1886
+ },
1887
+ "keys": {
1888
+ "char": "k",
1889
+ "description": "Specific keys to query (can be specified multiple times)",
1890
+ "name": "keys",
1891
+ "hasDynamicHelp": false,
1892
+ "multiple": true,
1893
+ "type": "option"
1894
+ },
1895
+ "prefix": {
1896
+ "char": "p",
1897
+ "description": "Filter keys by prefix",
1898
+ "name": "prefix",
1899
+ "hasDynamicHelp": false,
1900
+ "multiple": false,
1901
+ "type": "option"
1902
+ }
1903
+ },
1904
+ "hasDynamicHelp": false,
1905
+ "hiddenAliases": [],
1906
+ "id": "kv:list",
1907
+ "pluginAlias": "@formant/formant-cli",
1908
+ "pluginName": "@formant/formant-cli",
1909
+ "pluginType": "core",
1910
+ "strict": true,
1911
+ "summary": "List key-value keys",
1912
+ "enableJsonFlag": true,
1913
+ "isESM": true,
1914
+ "relativePath": [
1915
+ "dist",
1916
+ "commands",
1917
+ "kv",
1918
+ "list.js"
1919
+ ]
1920
+ },
1921
+ "kv:set": {
1922
+ "aliases": [],
1923
+ "args": {
1924
+ "key": {
1925
+ "description": "Key to set",
1926
+ "name": "key",
1927
+ "required": true
1928
+ },
1929
+ "value": {
1930
+ "description": "Value to store (JSON string)",
1931
+ "name": "value",
1932
+ "required": true
1933
+ }
1934
+ },
1935
+ "description": "Set a value in the key-value store.\n\nStores a value associated with a key. The value should be a JSON string.",
1936
+ "examples": [
1937
+ "<%= config.bin %> kv set my-key '{\"data\": \"value\"}'",
1938
+ "<%= config.bin %> kv set config '{\"setting\": true}'"
1939
+ ],
1940
+ "flags": {
1941
+ "json": {
1942
+ "description": "Format output as json.",
1943
+ "helpGroup": "GLOBAL",
1944
+ "name": "json",
1945
+ "allowNo": false,
1946
+ "type": "boolean"
1947
+ },
1948
+ "dev": {
1949
+ "description": "Target the dev environment",
1950
+ "exclusive": [
1951
+ "stage"
1952
+ ],
1953
+ "helpGroup": "GLOBAL",
1954
+ "name": "dev",
1955
+ "allowNo": false,
1956
+ "type": "boolean"
1957
+ },
1958
+ "stage": {
1959
+ "description": "Target the stage environment",
1960
+ "exclusive": [
1961
+ "dev"
1962
+ ],
1963
+ "helpGroup": "GLOBAL",
1964
+ "name": "stage",
1965
+ "allowNo": false,
1966
+ "type": "boolean"
1967
+ }
1968
+ },
1969
+ "hasDynamicHelp": false,
1970
+ "hiddenAliases": [],
1971
+ "id": "kv:set",
1972
+ "pluginAlias": "@formant/formant-cli",
1973
+ "pluginName": "@formant/formant-cli",
1974
+ "pluginType": "core",
1975
+ "strict": true,
1976
+ "summary": "Set key-value",
1977
+ "enableJsonFlag": true,
1978
+ "isESM": true,
1979
+ "relativePath": [
1980
+ "dist",
1981
+ "commands",
1982
+ "kv",
1983
+ "set.js"
1984
+ ]
1985
+ },
1986
+ "investigations:analytics": {
1987
+ "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.",
1310
1990
  "examples": [
1311
- "<%= config.bin %> devices untag <device-id> --key location",
1312
- "<%= config.bin %> devices untag <device-id> --key env --key region",
1313
- "<%= config.bin %> devices untag <device-id> --key location --json"
1991
+ "<%= config.bin %> investigations analytics --start 2026-01-01 --end 2026-02-01",
1992
+ "<%= config.bin %> investigations analytics --start 2026-01-01 --end 2026-02-01 --interval hourly",
1993
+ "<%= config.bin %> investigations analytics --start 2026-01-01 --end 2026-02-01 --group-by resultType --json"
1314
1994
  ],
1315
1995
  "flags": {
1316
1996
  "json": {
@@ -1340,46 +2020,76 @@
1340
2020
  "allowNo": false,
1341
2021
  "type": "boolean"
1342
2022
  },
1343
- "key": {
1344
- "char": "k",
1345
- "description": "Tag key to remove, can be specified multiple times",
1346
- "name": "key",
2023
+ "end": {
2024
+ "description": "End time (ISO 8601)",
2025
+ "name": "end",
1347
2026
  "required": true,
1348
2027
  "hasDynamicHelp": false,
1349
- "multiple": true,
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,
1350
2060
  "type": "option"
1351
2061
  }
1352
2062
  },
1353
2063
  "hasDynamicHelp": false,
1354
2064
  "hiddenAliases": [],
1355
- "id": "devices:untag",
2065
+ "id": "investigations:analytics",
1356
2066
  "pluginAlias": "@formant/formant-cli",
1357
2067
  "pluginName": "@formant/formant-cli",
1358
2068
  "pluginType": "core",
1359
2069
  "strict": true,
1360
- "summary": "Remove tags from a device",
2070
+ "summary": "Get investigation analytics",
1361
2071
  "enableJsonFlag": true,
1362
2072
  "isESM": true,
1363
2073
  "relativePath": [
1364
2074
  "dist",
1365
2075
  "commands",
1366
- "devices",
1367
- "untag.js"
2076
+ "investigations",
2077
+ "analytics.js"
1368
2078
  ]
1369
2079
  },
1370
- "kv:get": {
2080
+ "investigations:get": {
1371
2081
  "aliases": [],
1372
2082
  "args": {
1373
- "key": {
1374
- "description": "Key to retrieve",
1375
- "name": "key",
2083
+ "id": {
2084
+ "description": "Investigation (taskflow) ID",
2085
+ "name": "id",
1376
2086
  "required": true
1377
2087
  }
1378
2088
  },
1379
- "description": "Get a value from the key-value store.\n\nThe key-value store allows devices and applications to store metadata.",
2089
+ "description": "Get detailed information about a specific investigation by ID.",
1380
2090
  "examples": [
1381
- "<%= config.bin %> kv get my-key",
1382
- "<%= config.bin %> kv get my-key --json"
2091
+ "<%= config.bin %> investigations get <id>",
2092
+ "<%= config.bin %> investigations get <id> --json"
1383
2093
  ],
1384
2094
  "flags": {
1385
2095
  "json": {
@@ -1412,30 +2122,29 @@
1412
2122
  },
1413
2123
  "hasDynamicHelp": false,
1414
2124
  "hiddenAliases": [],
1415
- "id": "kv:get",
2125
+ "id": "investigations:get",
1416
2126
  "pluginAlias": "@formant/formant-cli",
1417
2127
  "pluginName": "@formant/formant-cli",
1418
2128
  "pluginType": "core",
1419
2129
  "strict": true,
1420
- "summary": "Get key-value",
2130
+ "summary": "Get an investigation by ID",
1421
2131
  "enableJsonFlag": true,
1422
2132
  "isESM": true,
1423
2133
  "relativePath": [
1424
2134
  "dist",
1425
2135
  "commands",
1426
- "kv",
2136
+ "investigations",
1427
2137
  "get.js"
1428
2138
  ]
1429
2139
  },
1430
- "kv:list": {
2140
+ "investigations:list": {
1431
2141
  "aliases": [],
1432
2142
  "args": {},
1433
- "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.",
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.",
1434
2144
  "examples": [
1435
- "<%= config.bin %> kv list",
1436
- "<%= config.bin %> kv list --prefix config",
1437
- "<%= config.bin %> kv list --keys key1 --keys key2 --keys key3",
1438
- "<%= config.bin %> kv list --json"
2145
+ "<%= config.bin %> investigations list",
2146
+ "<%= config.bin %> investigations list --signal-handler",
2147
+ "<%= config.bin %> investigations list --json"
1439
2148
  ],
1440
2149
  "flags": {
1441
2150
  "json": {
@@ -1465,58 +2174,49 @@
1465
2174
  "allowNo": false,
1466
2175
  "type": "boolean"
1467
2176
  },
1468
- "keys": {
1469
- "char": "k",
1470
- "description": "Specific keys to query (can be specified multiple times)",
1471
- "name": "keys",
1472
- "hasDynamicHelp": false,
1473
- "multiple": true,
1474
- "type": "option"
1475
- },
1476
- "prefix": {
1477
- "char": "p",
1478
- "description": "Filter keys by prefix",
1479
- "name": "prefix",
1480
- "hasDynamicHelp": false,
1481
- "multiple": false,
1482
- "type": "option"
2177
+ "signal-handler": {
2178
+ "description": "Only show investigations that handle signals",
2179
+ "name": "signal-handler",
2180
+ "allowNo": false,
2181
+ "type": "boolean"
1483
2182
  }
1484
2183
  },
1485
2184
  "hasDynamicHelp": false,
1486
2185
  "hiddenAliases": [],
1487
- "id": "kv:list",
2186
+ "id": "investigations:list",
1488
2187
  "pluginAlias": "@formant/formant-cli",
1489
2188
  "pluginName": "@formant/formant-cli",
1490
2189
  "pluginType": "core",
1491
2190
  "strict": true,
1492
- "summary": "List key-value keys",
2191
+ "summary": "List investigations",
1493
2192
  "enableJsonFlag": true,
1494
2193
  "isESM": true,
1495
2194
  "relativePath": [
1496
2195
  "dist",
1497
2196
  "commands",
1498
- "kv",
2197
+ "investigations",
1499
2198
  "list.js"
1500
2199
  ]
1501
2200
  },
1502
- "kv:set": {
2201
+ "investigations:run": {
1503
2202
  "aliases": [],
1504
2203
  "args": {
1505
- "key": {
1506
- "description": "Key to set",
1507
- "name": "key",
2204
+ "investigationId": {
2205
+ "description": "Investigation (taskflow) ID",
2206
+ "name": "investigationId",
1508
2207
  "required": true
1509
2208
  },
1510
- "value": {
1511
- "description": "Value to store (JSON string)",
1512
- "name": "value",
2209
+ "runId": {
2210
+ "description": "Run ID",
2211
+ "name": "runId",
1513
2212
  "required": true
1514
2213
  }
1515
2214
  },
1516
- "description": "Set a value in the key-value store.\n\nStores a value associated with a key. The value should be a JSON string.",
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.",
1517
2216
  "examples": [
1518
- "<%= config.bin %> kv set my-key '{\"data\": \"value\"}'",
1519
- "<%= config.bin %> kv set config '{\"setting\": true}'"
2217
+ "<%= config.bin %> investigations run <investigation-id> <run-id>",
2218
+ "<%= config.bin %> investigations run <investigation-id> <run-id> --log-only",
2219
+ "<%= config.bin %> investigations run <investigation-id> <run-id> --json"
1520
2220
  ],
1521
2221
  "flags": {
1522
2222
  "json": {
@@ -1545,32 +2245,51 @@
1545
2245
  "name": "stage",
1546
2246
  "allowNo": false,
1547
2247
  "type": "boolean"
2248
+ },
2249
+ "log-only": {
2250
+ "description": "Only show the execution log (skip run details)",
2251
+ "name": "log-only",
2252
+ "allowNo": false,
2253
+ "type": "boolean"
2254
+ },
2255
+ "trace-signal": {
2256
+ "description": "Fetch and display the signal and event information for this run",
2257
+ "name": "trace-signal",
2258
+ "allowNo": false,
2259
+ "type": "boolean"
1548
2260
  }
1549
2261
  },
1550
2262
  "hasDynamicHelp": false,
1551
2263
  "hiddenAliases": [],
1552
- "id": "kv:set",
2264
+ "id": "investigations:run",
1553
2265
  "pluginAlias": "@formant/formant-cli",
1554
2266
  "pluginName": "@formant/formant-cli",
1555
2267
  "pluginType": "core",
1556
2268
  "strict": true,
1557
- "summary": "Set key-value",
2269
+ "summary": "Get investigation run details and execution log",
1558
2270
  "enableJsonFlag": true,
1559
2271
  "isESM": true,
1560
2272
  "relativePath": [
1561
2273
  "dist",
1562
2274
  "commands",
1563
- "kv",
1564
- "set.js"
2275
+ "investigations",
2276
+ "run.js"
1565
2277
  ]
1566
2278
  },
1567
- "org:get": {
2279
+ "investigations:runs-list": {
1568
2280
  "aliases": [],
1569
- "args": {},
1570
- "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.",
2281
+ "args": {
2282
+ "id": {
2283
+ "description": "Investigation (taskflow) ID",
2284
+ "name": "id",
2285
+ "required": true
2286
+ }
2287
+ },
2288
+ "description": "List actual investigation runs (not evaluation runs) for a specific investigation.\n\nShows runs with their status, signal IDs, and timestamps. Use 'investigations run' to see\ndetailed execution logs for a specific run.",
1571
2289
  "examples": [
1572
- "<%= config.bin %> org get",
1573
- "<%= config.bin %> org get --json"
2290
+ "<%= config.bin %> investigations runs-list <id>",
2291
+ "<%= config.bin %> investigations runs-list <id> --limit 50",
2292
+ "<%= config.bin %> investigations runs-list <id> --details --json"
1574
2293
  ],
1575
2294
  "flags": {
1576
2295
  "json": {
@@ -1599,34 +2318,62 @@
1599
2318
  "name": "stage",
1600
2319
  "allowNo": false,
1601
2320
  "type": "boolean"
2321
+ },
2322
+ "details": {
2323
+ "description": "Include detailed information about each run",
2324
+ "name": "details",
2325
+ "allowNo": false,
2326
+ "type": "boolean"
2327
+ },
2328
+ "limit": {
2329
+ "char": "l",
2330
+ "description": "Maximum number of runs to return",
2331
+ "name": "limit",
2332
+ "default": 20,
2333
+ "hasDynamicHelp": false,
2334
+ "multiple": false,
2335
+ "type": "option"
2336
+ },
2337
+ "offset": {
2338
+ "char": "o",
2339
+ "description": "Offset for pagination",
2340
+ "name": "offset",
2341
+ "default": 0,
2342
+ "hasDynamicHelp": false,
2343
+ "multiple": false,
2344
+ "type": "option"
1602
2345
  }
1603
2346
  },
1604
2347
  "hasDynamicHelp": false,
1605
2348
  "hiddenAliases": [],
1606
- "id": "org:get",
2349
+ "id": "investigations:runs-list",
1607
2350
  "pluginAlias": "@formant/formant-cli",
1608
2351
  "pluginName": "@formant/formant-cli",
1609
2352
  "pluginType": "core",
1610
2353
  "strict": true,
1611
- "summary": "Get your organization",
2354
+ "summary": "List actual investigation runs",
1612
2355
  "enableJsonFlag": true,
1613
2356
  "isESM": true,
1614
2357
  "relativePath": [
1615
2358
  "dist",
1616
2359
  "commands",
1617
- "org",
1618
- "get.js"
2360
+ "investigations",
2361
+ "runs-list.js"
1619
2362
  ]
1620
2363
  },
1621
- "org:update": {
2364
+ "investigations:runs": {
1622
2365
  "aliases": [],
1623
- "args": {},
1624
- "description": "Update your organization's details.\n\nAt least one of --name or --description must be provided.",
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.",
1625
2374
  "examples": [
1626
- "<%= config.bin %> org update --name \"My Fleet\"",
1627
- "<%= config.bin %> org update --description \"Production robot fleet\"",
1628
- "<%= config.bin %> org update --name \"My Fleet\" --description \"Production robot fleet\"",
1629
- "<%= config.bin %> org update --name \"My Fleet\" --json"
2375
+ "<%= config.bin %> investigations runs <id>",
2376
+ "<%= config.bin %> investigations runs <id> --json"
1630
2377
  ],
1631
2378
  "flags": {
1632
2379
  "json": {
@@ -1655,54 +2402,32 @@
1655
2402
  "name": "stage",
1656
2403
  "allowNo": false,
1657
2404
  "type": "boolean"
1658
- },
1659
- "description": {
1660
- "char": "d",
1661
- "description": "New description for the organization",
1662
- "name": "description",
1663
- "hasDynamicHelp": false,
1664
- "multiple": false,
1665
- "type": "option"
1666
- },
1667
- "name": {
1668
- "char": "n",
1669
- "description": "New name for the organization",
1670
- "name": "name",
1671
- "hasDynamicHelp": false,
1672
- "multiple": false,
1673
- "type": "option"
1674
2405
  }
1675
2406
  },
1676
2407
  "hasDynamicHelp": false,
1677
2408
  "hiddenAliases": [],
1678
- "id": "org:update",
2409
+ "id": "investigations:runs",
1679
2410
  "pluginAlias": "@formant/formant-cli",
1680
2411
  "pluginName": "@formant/formant-cli",
1681
2412
  "pluginType": "core",
1682
2413
  "strict": true,
1683
- "summary": "Update your organization",
2414
+ "summary": "List runs for an investigation",
1684
2415
  "enableJsonFlag": true,
1685
2416
  "isESM": true,
1686
2417
  "relativePath": [
1687
2418
  "dist",
1688
2419
  "commands",
1689
- "org",
1690
- "update.js"
2420
+ "investigations",
2421
+ "runs.js"
1691
2422
  ]
1692
2423
  },
1693
- "events:get": {
2424
+ "investigations:stats": {
1694
2425
  "aliases": [],
1695
- "args": {
1696
- "id": {
1697
- "description": "Event ID (UUID)",
1698
- "name": "id",
1699
- "required": true
1700
- }
1701
- },
1702
- "description": "Get detailed information about a specific event by its ID.",
2426
+ "args": {},
2427
+ "description": "Get investigation statistics for a time range.",
1703
2428
  "examples": [
1704
- "<%= config.bin %> events get <event-id>",
1705
- "<%= config.bin %> events get <event-id> --json"
2429
+ "<%= config.bin %> investigations stats --start 2026-01-01 --end 2026-02-01",
2430
+ "<%= config.bin %> investigations stats --start 2026-01-01 --end 2026-02-01 --json"
1706
2431
  ],
1707
2432
  "flags": {
1708
2433
  "json": {
@@ -1731,34 +2456,54 @@
1731
2456
  "name": "stage",
1732
2457
  "allowNo": false,
1733
2458
  "type": "boolean"
2459
+ },
2460
+ "end": {
2461
+ "description": "End time (ISO 8601)",
2462
+ "name": "end",
2463
+ "required": true,
2464
+ "hasDynamicHelp": false,
2465
+ "multiple": false,
2466
+ "type": "option"
2467
+ },
2468
+ "start": {
2469
+ "description": "Start time (ISO 8601)",
2470
+ "name": "start",
2471
+ "required": true,
2472
+ "hasDynamicHelp": false,
2473
+ "multiple": false,
2474
+ "type": "option"
1734
2475
  }
1735
2476
  },
1736
2477
  "hasDynamicHelp": false,
1737
2478
  "hiddenAliases": [],
1738
- "id": "events:get",
2479
+ "id": "investigations:stats",
1739
2480
  "pluginAlias": "@formant/formant-cli",
1740
2481
  "pluginName": "@formant/formant-cli",
1741
2482
  "pluginType": "core",
1742
2483
  "strict": true,
1743
- "summary": "Get an event by ID",
2484
+ "summary": "Get investigation stats",
1744
2485
  "enableJsonFlag": true,
1745
2486
  "isESM": true,
1746
2487
  "relativePath": [
1747
2488
  "dist",
1748
2489
  "commands",
1749
- "events",
1750
- "get.js"
2490
+ "investigations",
2491
+ "stats.js"
1751
2492
  ]
1752
2493
  },
1753
- "events:list": {
2494
+ "investigations:trigger": {
1754
2495
  "aliases": [],
1755
- "args": {},
1756
- "description": "View important events emitted by devices with optional filters.\n\nEvents are significant occurrences from robots and sensors (e.g., device online/offline,\nerrors, state changes, commands). They can trigger signals for investigation.\n\nEvent types include: triggered-event, datapoint-event, device-online, device-offline,\nintervention-request, intervention-response, teleop-session-record, command-request,\ncommand-response, custom, comment, system, annotation, task-summary, stateful.\n\nSeverities: info, warning, error, critical.",
2496
+ "args": {
2497
+ "id": {
2498
+ "description": "Investigation (taskflow) ID",
2499
+ "name": "id",
2500
+ "required": true
2501
+ }
2502
+ },
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.",
1757
2504
  "examples": [
1758
- "<%= config.bin %> events list",
1759
- "<%= config.bin %> events list --device <id> --severity critical",
1760
- "<%= config.bin %> events list --type device-offline --start 2026-01-01 --end 2026-01-02",
1761
- "<%= config.bin %> events list --limit 100 --json"
2505
+ "<%= config.bin %> investigations trigger <id> --input \"Robot stopped responding\"",
2506
+ "<%= config.bin %> investigations trigger <id> --input \"Battery draining fast on device X\" --json"
1762
2507
  ],
1763
2508
  "flags": {
1764
2509
  "json": {
@@ -1788,53 +2533,18 @@
1788
2533
  "allowNo": false,
1789
2534
  "type": "boolean"
1790
2535
  },
1791
- "device": {
1792
- "char": "d",
1793
- "description": "Filter by device ID",
1794
- "name": "device",
1795
- "hasDynamicHelp": false,
1796
- "multiple": false,
1797
- "type": "option"
1798
- },
1799
- "end": {
1800
- "description": "End time (ISO 8601)",
1801
- "name": "end",
1802
- "hasDynamicHelp": false,
1803
- "multiple": false,
1804
- "type": "option"
1805
- },
1806
- "limit": {
1807
- "char": "l",
1808
- "description": "Maximum number of events to return",
1809
- "name": "limit",
1810
- "default": 25,
1811
- "hasDynamicHelp": false,
1812
- "multiple": false,
1813
- "type": "option"
1814
- },
1815
- "severity": {
1816
- "description": "Filter by severity",
1817
- "name": "severity",
1818
- "hasDynamicHelp": false,
1819
- "multiple": false,
1820
- "options": [
1821
- "info",
1822
- "warning",
1823
- "error",
1824
- "critical"
1825
- ],
1826
- "type": "option"
1827
- },
1828
- "start": {
1829
- "description": "Start time (ISO 8601)",
1830
- "name": "start",
2536
+ "input": {
2537
+ "char": "i",
2538
+ "description": "Input text / problem description for the investigation",
2539
+ "name": "input",
2540
+ "required": true,
1831
2541
  "hasDynamicHelp": false,
1832
2542
  "multiple": false,
1833
2543
  "type": "option"
1834
2544
  },
1835
- "type": {
1836
- "description": "Filter by event type",
1837
- "name": "type",
2545
+ "signal-id": {
2546
+ "description": "Optional signal ID to associate with this run",
2547
+ "name": "signal-id",
1838
2548
  "hasDynamicHelp": false,
1839
2549
  "multiple": false,
1840
2550
  "type": "option"
@@ -1842,19 +2552,19 @@
1842
2552
  },
1843
2553
  "hasDynamicHelp": false,
1844
2554
  "hiddenAliases": [],
1845
- "id": "events:list",
2555
+ "id": "investigations:trigger",
1846
2556
  "pluginAlias": "@formant/formant-cli",
1847
2557
  "pluginName": "@formant/formant-cli",
1848
2558
  "pluginType": "core",
1849
2559
  "strict": true,
1850
- "summary": "View events emitted by devices",
2560
+ "summary": "Trigger an investigation",
1851
2561
  "enableJsonFlag": true,
1852
2562
  "isESM": true,
1853
2563
  "relativePath": [
1854
2564
  "dist",
1855
2565
  "commands",
1856
- "events",
1857
- "list.js"
2566
+ "investigations",
2567
+ "trigger.js"
1858
2568
  ]
1859
2569
  },
1860
2570
  "query": {
@@ -2053,14 +2763,19 @@
2053
2763
  "latest-values.js"
2054
2764
  ]
2055
2765
  },
2056
- "investigations:analytics": {
2766
+ "schedules:get": {
2057
2767
  "aliases": [],
2058
- "args": {},
2059
- "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.",
2768
+ "args": {
2769
+ "id": {
2770
+ "description": "Schedule ID (UUID)",
2771
+ "name": "id",
2772
+ "required": true
2773
+ }
2774
+ },
2775
+ "description": "Get detailed information about a schedule.\n\nShows the full schedule configuration including cron expression, command template,\ninvestigation link, and execution settings.",
2060
2776
  "examples": [
2061
- "<%= config.bin %> investigations analytics --start 2026-01-01 --end 2026-02-01",
2062
- "<%= config.bin %> investigations analytics --start 2026-01-01 --end 2026-02-01 --interval hourly",
2063
- "<%= config.bin %> investigations analytics --start 2026-01-01 --end 2026-02-01 --group-by resultType --json"
2777
+ "<%= config.bin %> schedules get <schedule-id>",
2778
+ "<%= config.bin %> schedules get <schedule-id> --json"
2064
2779
  ],
2065
2780
  "flags": {
2066
2781
  "json": {
@@ -2089,77 +2804,92 @@
2089
2804
  "name": "stage",
2090
2805
  "allowNo": false,
2091
2806
  "type": "boolean"
2807
+ }
2808
+ },
2809
+ "hasDynamicHelp": false,
2810
+ "hiddenAliases": [],
2811
+ "id": "schedules:get",
2812
+ "pluginAlias": "@formant/formant-cli",
2813
+ "pluginName": "@formant/formant-cli",
2814
+ "pluginType": "core",
2815
+ "strict": true,
2816
+ "summary": "Get schedule details",
2817
+ "enableJsonFlag": true,
2818
+ "isESM": true,
2819
+ "relativePath": [
2820
+ "dist",
2821
+ "commands",
2822
+ "schedules",
2823
+ "get.js"
2824
+ ]
2825
+ },
2826
+ "schedules:list": {
2827
+ "aliases": [],
2828
+ "args": {},
2829
+ "description": "List all schedules in your organization.\n\nSchedules can trigger commands or investigations on a recurring (cron) or one-time basis.",
2830
+ "examples": [
2831
+ "<%= config.bin %> schedules list",
2832
+ "<%= config.bin %> schedules list --json"
2833
+ ],
2834
+ "flags": {
2835
+ "json": {
2836
+ "description": "Format output as json.",
2837
+ "helpGroup": "GLOBAL",
2838
+ "name": "json",
2839
+ "allowNo": false,
2840
+ "type": "boolean"
2092
2841
  },
2093
- "end": {
2094
- "description": "End time (ISO 8601)",
2095
- "name": "end",
2096
- "required": true,
2097
- "hasDynamicHelp": false,
2098
- "multiple": false,
2099
- "type": "option"
2100
- },
2101
- "group-by": {
2102
- "description": "Group results by",
2103
- "name": "group-by",
2104
- "hasDynamicHelp": false,
2105
- "multiple": false,
2106
- "options": [
2107
- "resultType",
2108
- "signalType"
2842
+ "dev": {
2843
+ "description": "Target the dev environment",
2844
+ "exclusive": [
2845
+ "stage"
2109
2846
  ],
2110
- "type": "option"
2847
+ "helpGroup": "GLOBAL",
2848
+ "name": "dev",
2849
+ "allowNo": false,
2850
+ "type": "boolean"
2111
2851
  },
2112
- "interval": {
2113
- "description": "Time interval for aggregation",
2114
- "name": "interval",
2115
- "default": "daily",
2116
- "hasDynamicHelp": false,
2117
- "multiple": false,
2118
- "options": [
2119
- "daily",
2120
- "hourly"
2852
+ "stage": {
2853
+ "description": "Target the stage environment",
2854
+ "exclusive": [
2855
+ "dev"
2121
2856
  ],
2122
- "type": "option"
2123
- },
2124
- "start": {
2125
- "description": "Start time (ISO 8601)",
2126
- "name": "start",
2127
- "required": true,
2128
- "hasDynamicHelp": false,
2129
- "multiple": false,
2130
- "type": "option"
2857
+ "helpGroup": "GLOBAL",
2858
+ "name": "stage",
2859
+ "allowNo": false,
2860
+ "type": "boolean"
2131
2861
  }
2132
2862
  },
2133
2863
  "hasDynamicHelp": false,
2134
2864
  "hiddenAliases": [],
2135
- "id": "investigations:analytics",
2865
+ "id": "schedules:list",
2136
2866
  "pluginAlias": "@formant/formant-cli",
2137
2867
  "pluginName": "@formant/formant-cli",
2138
2868
  "pluginType": "core",
2139
2869
  "strict": true,
2140
- "summary": "Get investigation analytics",
2870
+ "summary": "List schedules",
2141
2871
  "enableJsonFlag": true,
2142
2872
  "isESM": true,
2143
2873
  "relativePath": [
2144
2874
  "dist",
2145
2875
  "commands",
2146
- "investigations",
2147
- "analytics.js"
2876
+ "schedules",
2877
+ "list.js"
2148
2878
  ]
2149
2879
  },
2150
- "investigations:get": {
2880
+ "users:get": {
2151
2881
  "aliases": [],
2152
2882
  "args": {
2153
2883
  "id": {
2154
- "description": "Investigation (taskflow) ID",
2884
+ "description": "User ID (UUID)",
2155
2885
  "name": "id",
2156
2886
  "required": true
2157
2887
  }
2158
2888
  },
2159
- "description": "Get detailed information about a specific investigation by ID.",
2889
+ "description": "Get detailed information about a user.\n\nShows user details including email, name, roles, and account settings.",
2160
2890
  "examples": [
2161
- "<%= config.bin %> investigations get <id>",
2162
- "<%= config.bin %> investigations get <id> --json"
2891
+ "<%= config.bin %> users get <user-id>",
2892
+ "<%= config.bin %> users get <user-id> --json"
2163
2893
  ],
2164
2894
  "flags": {
2165
2895
  "json": {
@@ -2192,29 +2922,28 @@
2192
2922
  },
2193
2923
  "hasDynamicHelp": false,
2194
2924
  "hiddenAliases": [],
2195
- "id": "investigations:get",
2925
+ "id": "users:get",
2196
2926
  "pluginAlias": "@formant/formant-cli",
2197
2927
  "pluginName": "@formant/formant-cli",
2198
2928
  "pluginType": "core",
2199
2929
  "strict": true,
2200
- "summary": "Get an investigation by ID",
2930
+ "summary": "Get user details",
2201
2931
  "enableJsonFlag": true,
2202
2932
  "isESM": true,
2203
2933
  "relativePath": [
2204
2934
  "dist",
2205
2935
  "commands",
2206
- "investigations",
2936
+ "users",
2207
2937
  "get.js"
2208
2938
  ]
2209
2939
  },
2210
- "investigations:list": {
2940
+ "users:list": {
2211
2941
  "aliases": [],
2212
2942
  "args": {},
2213
- "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.",
2943
+ "description": "List all users in your organization.\n\nShows user accounts, their email addresses, and account status.",
2214
2944
  "examples": [
2215
- "<%= config.bin %> investigations list",
2216
- "<%= config.bin %> investigations list --signal-handler",
2217
- "<%= config.bin %> investigations list --json"
2945
+ "<%= config.bin %> users list",
2946
+ "<%= config.bin %> users list --json"
2218
2947
  ],
2219
2948
  "flags": {
2220
2949
  "json": {
@@ -2243,50 +2972,33 @@
2243
2972
  "name": "stage",
2244
2973
  "allowNo": false,
2245
2974
  "type": "boolean"
2246
- },
2247
- "signal-handler": {
2248
- "description": "Only show investigations that handle signals",
2249
- "name": "signal-handler",
2250
- "allowNo": false,
2251
- "type": "boolean"
2252
2975
  }
2253
2976
  },
2254
2977
  "hasDynamicHelp": false,
2255
2978
  "hiddenAliases": [],
2256
- "id": "investigations:list",
2979
+ "id": "users:list",
2257
2980
  "pluginAlias": "@formant/formant-cli",
2258
2981
  "pluginName": "@formant/formant-cli",
2259
2982
  "pluginType": "core",
2260
2983
  "strict": true,
2261
- "summary": "List investigations",
2984
+ "summary": "List users",
2262
2985
  "enableJsonFlag": true,
2263
2986
  "isESM": true,
2264
2987
  "relativePath": [
2265
2988
  "dist",
2266
2989
  "commands",
2267
- "investigations",
2990
+ "users",
2268
2991
  "list.js"
2269
2992
  ]
2270
2993
  },
2271
- "investigations:run": {
2994
+ "signals:count": {
2272
2995
  "aliases": [],
2273
- "args": {
2274
- "investigationId": {
2275
- "description": "Investigation (taskflow) ID",
2276
- "name": "investigationId",
2277
- "required": true
2278
- },
2279
- "runId": {
2280
- "description": "Run ID",
2281
- "name": "runId",
2282
- "required": true
2283
- }
2284
- },
2285
- "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.",
2996
+ "args": {},
2997
+ "description": "Get counts of signals grouped by type.\n\nReturns total counts and per-type breakdowns (manual, eventTrigger, schedule, slack).",
2286
2998
  "examples": [
2287
- "<%= config.bin %> investigations run <investigation-id> <run-id>",
2288
- "<%= config.bin %> investigations run <investigation-id> <run-id> --log-only",
2289
- "<%= config.bin %> investigations run <investigation-id> <run-id> --json"
2999
+ "<%= config.bin %> signals count",
3000
+ "<%= config.bin %> signals count --start 2026-01-01 --end 2026-02-01",
3001
+ "<%= config.bin %> signals count --json"
2290
3002
  ],
2291
3003
  "flags": {
2292
3004
  "json": {
@@ -2316,50 +3028,52 @@
2316
3028
  "allowNo": false,
2317
3029
  "type": "boolean"
2318
3030
  },
2319
- "log-only": {
2320
- "description": "Only show the execution log (skip run details)",
2321
- "name": "log-only",
2322
- "allowNo": false,
2323
- "type": "boolean"
3031
+ "end": {
3032
+ "description": "End time (ISO 8601)",
3033
+ "name": "end",
3034
+ "hasDynamicHelp": false,
3035
+ "multiple": false,
3036
+ "type": "option"
2324
3037
  },
2325
- "trace-signal": {
2326
- "description": "Fetch and display the signal and event information for this run",
2327
- "name": "trace-signal",
2328
- "allowNo": false,
2329
- "type": "boolean"
3038
+ "start": {
3039
+ "description": "Start time (ISO 8601)",
3040
+ "name": "start",
3041
+ "hasDynamicHelp": false,
3042
+ "multiple": false,
3043
+ "type": "option"
2330
3044
  }
2331
3045
  },
2332
3046
  "hasDynamicHelp": false,
2333
3047
  "hiddenAliases": [],
2334
- "id": "investigations:run",
3048
+ "id": "signals:count",
2335
3049
  "pluginAlias": "@formant/formant-cli",
2336
3050
  "pluginName": "@formant/formant-cli",
2337
3051
  "pluginType": "core",
2338
3052
  "strict": true,
2339
- "summary": "Get investigation run details and execution log",
3053
+ "summary": "Get signal counts by type",
2340
3054
  "enableJsonFlag": true,
2341
3055
  "isESM": true,
2342
3056
  "relativePath": [
2343
3057
  "dist",
2344
3058
  "commands",
2345
- "investigations",
2346
- "run.js"
3059
+ "signals",
3060
+ "count.js"
2347
3061
  ]
2348
3062
  },
2349
- "investigations:runs-list": {
3063
+ "signals:get": {
2350
3064
  "aliases": [],
2351
3065
  "args": {
2352
3066
  "id": {
2353
- "description": "Investigation (taskflow) ID",
3067
+ "description": "Signal ID (UUID)",
2354
3068
  "name": "id",
2355
3069
  "required": true
2356
3070
  }
2357
3071
  },
2358
- "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.",
3072
+ "description": "Get detailed information about a specific signal by its ID.\n\nShows signal details including the triggering event, goal, status, and type (manual, \neventTrigger, schedule, slack). Use --trace to also fetch the event and event trigger \ninformation.",
2359
3073
  "examples": [
2360
- "<%= config.bin %> investigations runs-list <id>",
2361
- "<%= config.bin %> investigations runs-list <id> --limit 50",
2362
- "<%= config.bin %> investigations runs-list <id> --details --json"
3074
+ "<%= config.bin %> signals get <signal-id>",
3075
+ "<%= config.bin %> signals get <signal-id> --trace",
3076
+ "<%= config.bin %> signals get <signal-id> --json"
2363
3077
  ],
2364
3078
  "flags": {
2365
3079
  "json": {
@@ -2389,61 +3103,37 @@
2389
3103
  "allowNo": false,
2390
3104
  "type": "boolean"
2391
3105
  },
2392
- "details": {
2393
- "description": "Include detailed information about each run",
2394
- "name": "details",
3106
+ "trace": {
3107
+ "description": "Fetch and display the triggering event and event trigger information",
3108
+ "name": "trace",
2395
3109
  "allowNo": false,
2396
3110
  "type": "boolean"
2397
- },
2398
- "limit": {
2399
- "char": "l",
2400
- "description": "Maximum number of runs to return",
2401
- "name": "limit",
2402
- "default": 20,
2403
- "hasDynamicHelp": false,
2404
- "multiple": false,
2405
- "type": "option"
2406
- },
2407
- "offset": {
2408
- "char": "o",
2409
- "description": "Offset for pagination",
2410
- "name": "offset",
2411
- "default": 0,
2412
- "hasDynamicHelp": false,
2413
- "multiple": false,
2414
- "type": "option"
2415
3111
  }
2416
3112
  },
2417
3113
  "hasDynamicHelp": false,
2418
3114
  "hiddenAliases": [],
2419
- "id": "investigations:runs-list",
3115
+ "id": "signals:get",
2420
3116
  "pluginAlias": "@formant/formant-cli",
2421
3117
  "pluginName": "@formant/formant-cli",
2422
3118
  "pluginType": "core",
2423
3119
  "strict": true,
2424
- "summary": "List actual investigation runs",
3120
+ "summary": "Get a signal by ID",
2425
3121
  "enableJsonFlag": true,
2426
3122
  "isESM": true,
2427
3123
  "relativePath": [
2428
3124
  "dist",
2429
3125
  "commands",
2430
- "investigations",
2431
- "runs-list.js"
3126
+ "signals",
3127
+ "get.js"
2432
3128
  ]
2433
3129
  },
2434
- "investigations:runs": {
3130
+ "signals:list": {
2435
3131
  "aliases": [],
2436
- "args": {
2437
- "id": {
2438
- "description": "Investigation (taskflow) ID",
2439
- "name": "id",
2440
- "required": true
2441
- }
2442
- },
2443
- "description": "List evaluation runs for a specific investigation.",
3132
+ "args": {},
3133
+ "description": "List all signals in your organization.\n\nSignals are points of interest that trigger AI-powered investigations. They can be\ncreated manually, generated from device events, scheduled, or from Slack/Teams integrations.",
2444
3134
  "examples": [
2445
- "<%= config.bin %> investigations runs <id>",
2446
- "<%= config.bin %> investigations runs <id> --json"
3135
+ "<%= config.bin %> signals list",
3136
+ "<%= config.bin %> signals list --json"
2447
3137
  ],
2448
3138
  "flags": {
2449
3139
  "json": {
@@ -2476,28 +3166,29 @@
2476
3166
  },
2477
3167
  "hasDynamicHelp": false,
2478
3168
  "hiddenAliases": [],
2479
- "id": "investigations:runs",
3169
+ "id": "signals:list",
2480
3170
  "pluginAlias": "@formant/formant-cli",
2481
3171
  "pluginName": "@formant/formant-cli",
2482
3172
  "pluginType": "core",
2483
3173
  "strict": true,
2484
- "summary": "List runs for an investigation",
3174
+ "summary": "List all signals",
2485
3175
  "enableJsonFlag": true,
2486
3176
  "isESM": true,
2487
3177
  "relativePath": [
2488
3178
  "dist",
2489
3179
  "commands",
2490
- "investigations",
2491
- "runs.js"
3180
+ "signals",
3181
+ "list.js"
2492
3182
  ]
2493
3183
  },
2494
- "investigations:stats": {
3184
+ "signals:query": {
2495
3185
  "aliases": [],
2496
3186
  "args": {},
2497
- "description": "Get investigation statistics for a time range.",
3187
+ "description": "Query signals by time range and type.\n\nSignal types: manual, eventTrigger, schedule, slack.",
2498
3188
  "examples": [
2499
- "<%= config.bin %> investigations stats --start 2026-01-01 --end 2026-02-01",
2500
- "<%= config.bin %> investigations stats --start 2026-01-01 --end 2026-02-01 --json"
3189
+ "<%= config.bin %> signals query --start 2026-01-01",
3190
+ "<%= config.bin %> signals query --start 2026-01-01 --end 2026-02-01 --type eventTrigger",
3191
+ "<%= config.bin %> signals query --start 2026-01-01 --json"
2501
3192
  ],
2502
3193
  "flags": {
2503
3194
  "json": {
@@ -2530,7 +3221,6 @@
2530
3221
  "end": {
2531
3222
  "description": "End time (ISO 8601)",
2532
3223
  "name": "end",
2533
- "required": true,
2534
3224
  "hasDynamicHelp": false,
2535
3225
  "multiple": false,
2536
3226
  "type": "option"
@@ -2542,38 +3232,51 @@
2542
3232
  "hasDynamicHelp": false,
2543
3233
  "multiple": false,
2544
3234
  "type": "option"
3235
+ },
3236
+ "type": {
3237
+ "description": "Filter by signal type",
3238
+ "name": "type",
3239
+ "hasDynamicHelp": false,
3240
+ "multiple": false,
3241
+ "options": [
3242
+ "manual",
3243
+ "eventTrigger",
3244
+ "schedule",
3245
+ "slack"
3246
+ ],
3247
+ "type": "option"
2545
3248
  }
2546
3249
  },
2547
3250
  "hasDynamicHelp": false,
2548
3251
  "hiddenAliases": [],
2549
- "id": "investigations:stats",
3252
+ "id": "signals:query",
2550
3253
  "pluginAlias": "@formant/formant-cli",
2551
3254
  "pluginName": "@formant/formant-cli",
2552
3255
  "pluginType": "core",
2553
3256
  "strict": true,
2554
- "summary": "Get investigation stats",
3257
+ "summary": "Query signals by time range",
2555
3258
  "enableJsonFlag": true,
2556
3259
  "isESM": true,
2557
3260
  "relativePath": [
2558
3261
  "dist",
2559
3262
  "commands",
2560
- "investigations",
2561
- "stats.js"
3263
+ "signals",
3264
+ "query.js"
2562
3265
  ]
2563
3266
  },
2564
- "investigations:trigger": {
3267
+ "devices:config": {
2565
3268
  "aliases": [],
2566
3269
  "args": {
2567
3270
  "id": {
2568
- "description": "Investigation (taskflow) ID",
3271
+ "description": "Device ID (UUID)",
2569
3272
  "name": "id",
2570
3273
  "required": true
2571
3274
  }
2572
3275
  },
2573
- "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.",
3276
+ "description": "Get the device configuration including stream definitions.\n\nShows the device's current configuration including telemetry streams, commands,\nand other settings.",
2574
3277
  "examples": [
2575
- "<%= config.bin %> investigations trigger <id> --input \"Robot stopped responding\"",
2576
- "<%= config.bin %> investigations trigger <id> --input \"Battery draining fast on device X\" --json"
3278
+ "<%= config.bin %> devices config <device-id>",
3279
+ "<%= config.bin %> devices config <device-id> --json"
2577
3280
  ],
2578
3281
  "flags": {
2579
3282
  "json": {
@@ -2602,54 +3305,107 @@
2602
3305
  "name": "stage",
2603
3306
  "allowNo": false,
2604
3307
  "type": "boolean"
3308
+ }
3309
+ },
3310
+ "hasDynamicHelp": false,
3311
+ "hiddenAliases": [],
3312
+ "id": "devices:config",
3313
+ "pluginAlias": "@formant/formant-cli",
3314
+ "pluginName": "@formant/formant-cli",
3315
+ "pluginType": "core",
3316
+ "strict": true,
3317
+ "summary": "Get device configuration",
3318
+ "enableJsonFlag": true,
3319
+ "isESM": true,
3320
+ "relativePath": [
3321
+ "dist",
3322
+ "commands",
3323
+ "devices",
3324
+ "config.js"
3325
+ ]
3326
+ },
3327
+ "devices:create": {
3328
+ "aliases": [],
3329
+ "args": {
3330
+ "name": {
3331
+ "description": "Name for the new device",
3332
+ "name": "name",
3333
+ "required": true
3334
+ }
3335
+ },
3336
+ "description": "Create a new device in your fleet.\n\nThe device is created as enabled by default. You can optionally specify tags.",
3337
+ "examples": [
3338
+ "<%= config.bin %> devices create my-robot",
3339
+ "<%= config.bin %> devices create my-robot --tag location=warehouse --tag env=prod",
3340
+ "<%= config.bin %> devices create my-robot --json"
3341
+ ],
3342
+ "flags": {
3343
+ "json": {
3344
+ "description": "Format output as json.",
3345
+ "helpGroup": "GLOBAL",
3346
+ "name": "json",
3347
+ "allowNo": false,
3348
+ "type": "boolean"
2605
3349
  },
2606
- "input": {
2607
- "char": "i",
2608
- "description": "Input text / problem description for the investigation",
2609
- "name": "input",
2610
- "required": true,
2611
- "hasDynamicHelp": false,
2612
- "multiple": false,
2613
- "type": "option"
3350
+ "dev": {
3351
+ "description": "Target the dev environment",
3352
+ "exclusive": [
3353
+ "stage"
3354
+ ],
3355
+ "helpGroup": "GLOBAL",
3356
+ "name": "dev",
3357
+ "allowNo": false,
3358
+ "type": "boolean"
2614
3359
  },
2615
- "signal-id": {
2616
- "description": "Optional signal ID to associate with this run",
2617
- "name": "signal-id",
3360
+ "stage": {
3361
+ "description": "Target the stage environment",
3362
+ "exclusive": [
3363
+ "dev"
3364
+ ],
3365
+ "helpGroup": "GLOBAL",
3366
+ "name": "stage",
3367
+ "allowNo": false,
3368
+ "type": "boolean"
3369
+ },
3370
+ "tag": {
3371
+ "char": "t",
3372
+ "description": "Tag to apply (key=value), can be specified multiple times",
3373
+ "name": "tag",
2618
3374
  "hasDynamicHelp": false,
2619
- "multiple": false,
3375
+ "multiple": true,
2620
3376
  "type": "option"
2621
3377
  }
2622
3378
  },
2623
3379
  "hasDynamicHelp": false,
2624
3380
  "hiddenAliases": [],
2625
- "id": "investigations:trigger",
3381
+ "id": "devices:create",
2626
3382
  "pluginAlias": "@formant/formant-cli",
2627
3383
  "pluginName": "@formant/formant-cli",
2628
3384
  "pluginType": "core",
2629
3385
  "strict": true,
2630
- "summary": "Trigger an investigation",
3386
+ "summary": "Create a new device",
2631
3387
  "enableJsonFlag": true,
2632
3388
  "isESM": true,
2633
3389
  "relativePath": [
2634
3390
  "dist",
2635
3391
  "commands",
2636
- "investigations",
2637
- "trigger.js"
3392
+ "devices",
3393
+ "create.js"
2638
3394
  ]
2639
3395
  },
2640
- "schedules:get": {
3396
+ "devices:delete": {
2641
3397
  "aliases": [],
2642
3398
  "args": {
2643
3399
  "id": {
2644
- "description": "Schedule ID (UUID)",
3400
+ "description": "Device ID (UUID)",
2645
3401
  "name": "id",
2646
3402
  "required": true
2647
3403
  }
2648
3404
  },
2649
- "description": "Get detailed information about a schedule.\n\nShows the full schedule configuration including cron expression, command template,\ninvestigation link, and execution settings.",
3405
+ "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.",
2650
3406
  "examples": [
2651
- "<%= config.bin %> schedules get <schedule-id>",
2652
- "<%= config.bin %> schedules get <schedule-id> --json"
3407
+ "<%= config.bin %> devices delete <device-id>",
3408
+ "<%= config.bin %> devices delete <device-id> --json"
2653
3409
  ],
2654
3410
  "flags": {
2655
3411
  "json": {
@@ -2682,28 +3438,34 @@
2682
3438
  },
2683
3439
  "hasDynamicHelp": false,
2684
3440
  "hiddenAliases": [],
2685
- "id": "schedules:get",
3441
+ "id": "devices:delete",
2686
3442
  "pluginAlias": "@formant/formant-cli",
2687
3443
  "pluginName": "@formant/formant-cli",
2688
3444
  "pluginType": "core",
2689
3445
  "strict": true,
2690
- "summary": "Get schedule details",
3446
+ "summary": "Delete (disable) a device",
2691
3447
  "enableJsonFlag": true,
2692
3448
  "isESM": true,
2693
3449
  "relativePath": [
2694
3450
  "dist",
2695
3451
  "commands",
2696
- "schedules",
2697
- "get.js"
3452
+ "devices",
3453
+ "delete.js"
2698
3454
  ]
2699
3455
  },
2700
- "schedules:list": {
3456
+ "devices:get": {
2701
3457
  "aliases": [],
2702
- "args": {},
2703
- "description": "List all schedules in your organization.\n\nSchedules can trigger commands or investigations on a recurring (cron) or one-time basis.",
3458
+ "args": {
3459
+ "id": {
3460
+ "description": "Device ID (UUID)",
3461
+ "name": "id",
3462
+ "required": true
3463
+ }
3464
+ },
3465
+ "description": "Get detailed information about a specific device by its ID.",
2704
3466
  "examples": [
2705
- "<%= config.bin %> schedules list",
2706
- "<%= config.bin %> schedules list --json"
3467
+ "<%= config.bin %> devices get <device-id>",
3468
+ "<%= config.bin %> devices get <device-id> --json"
2707
3469
  ],
2708
3470
  "flags": {
2709
3471
  "json": {
@@ -2736,34 +3498,34 @@
2736
3498
  },
2737
3499
  "hasDynamicHelp": false,
2738
3500
  "hiddenAliases": [],
2739
- "id": "schedules:list",
3501
+ "id": "devices:get",
2740
3502
  "pluginAlias": "@formant/formant-cli",
2741
3503
  "pluginName": "@formant/formant-cli",
2742
3504
  "pluginType": "core",
2743
3505
  "strict": true,
2744
- "summary": "List schedules",
3506
+ "summary": "Get a device by ID",
2745
3507
  "enableJsonFlag": true,
2746
3508
  "isESM": true,
2747
3509
  "relativePath": [
2748
3510
  "dist",
2749
3511
  "commands",
2750
- "schedules",
2751
- "list.js"
3512
+ "devices",
3513
+ "get.js"
2752
3514
  ]
2753
3515
  },
2754
- "users:get": {
3516
+ "devices:last-seen": {
2755
3517
  "aliases": [],
2756
3518
  "args": {
2757
3519
  "id": {
2758
- "description": "User ID (UUID)",
3520
+ "description": "Device ID (UUID)",
2759
3521
  "name": "id",
2760
3522
  "required": true
2761
3523
  }
2762
3524
  },
2763
- "description": "Get detailed information about a user.\n\nShows user details including email, name, roles, and account settings.",
3525
+ "description": "Get when a device was last seen online.\n\nShows the most recent timestamp when the device was detected as online.",
2764
3526
  "examples": [
2765
- "<%= config.bin %> users get <user-id>",
2766
- "<%= config.bin %> users get <user-id> --json"
3527
+ "<%= config.bin %> devices last-seen <device-id>",
3528
+ "<%= config.bin %> devices last-seen <device-id> --json"
2767
3529
  ],
2768
3530
  "flags": {
2769
3531
  "json": {
@@ -2796,28 +3558,31 @@
2796
3558
  },
2797
3559
  "hasDynamicHelp": false,
2798
3560
  "hiddenAliases": [],
2799
- "id": "users:get",
3561
+ "id": "devices:last-seen",
2800
3562
  "pluginAlias": "@formant/formant-cli",
2801
3563
  "pluginName": "@formant/formant-cli",
2802
3564
  "pluginType": "core",
2803
3565
  "strict": true,
2804
- "summary": "Get user details",
3566
+ "summary": "Get device last seen timestamp",
2805
3567
  "enableJsonFlag": true,
2806
3568
  "isESM": true,
2807
3569
  "relativePath": [
2808
3570
  "dist",
2809
3571
  "commands",
2810
- "users",
2811
- "get.js"
3572
+ "devices",
3573
+ "last-seen.js"
2812
3574
  ]
2813
3575
  },
2814
- "users:list": {
3576
+ "devices:list": {
2815
3577
  "aliases": [],
2816
3578
  "args": {},
2817
- "description": "List all users in your organization.\n\nShows user accounts, their email addresses, and account status.",
3579
+ "description": "List robots and sensors in your fleet. Shows only online devices by default.\n\nUse --all to include offline devices.",
2818
3580
  "examples": [
2819
- "<%= config.bin %> users list",
2820
- "<%= config.bin %> users list --json"
3581
+ "<%= config.bin %> devices list",
3582
+ "<%= config.bin %> devices list --all",
3583
+ "<%= config.bin %> devices list --all --limit 100",
3584
+ "<%= config.bin %> devices list --tag location=warehouse",
3585
+ "<%= config.bin %> devices list --name robot --dev --json"
2821
3586
  ],
2822
3587
  "flags": {
2823
3588
  "json": {
@@ -2846,33 +3611,75 @@
2846
3611
  "name": "stage",
2847
3612
  "allowNo": false,
2848
3613
  "type": "boolean"
3614
+ },
3615
+ "all": {
3616
+ "char": "a",
3617
+ "description": "Show all devices (online and offline)",
3618
+ "name": "all",
3619
+ "allowNo": false,
3620
+ "type": "boolean"
3621
+ },
3622
+ "limit": {
3623
+ "char": "l",
3624
+ "description": "Maximum number of devices to return",
3625
+ "name": "limit",
3626
+ "default": 50,
3627
+ "hasDynamicHelp": false,
3628
+ "multiple": false,
3629
+ "type": "option"
3630
+ },
3631
+ "name": {
3632
+ "char": "n",
3633
+ "description": "Filter devices by name (search)",
3634
+ "name": "name",
3635
+ "hasDynamicHelp": false,
3636
+ "multiple": false,
3637
+ "type": "option"
3638
+ },
3639
+ "tag": {
3640
+ "char": "t",
3641
+ "description": "Filter by tag (key=value), can be specified multiple times",
3642
+ "name": "tag",
3643
+ "hasDynamicHelp": false,
3644
+ "multiple": true,
3645
+ "type": "option"
2849
3646
  }
2850
3647
  },
2851
3648
  "hasDynamicHelp": false,
2852
3649
  "hiddenAliases": [],
2853
- "id": "users:list",
3650
+ "id": "devices:list",
2854
3651
  "pluginAlias": "@formant/formant-cli",
2855
3652
  "pluginName": "@formant/formant-cli",
2856
3653
  "pluginType": "core",
2857
3654
  "strict": true,
2858
- "summary": "List users",
3655
+ "summary": "List robots and sensors in your fleet",
2859
3656
  "enableJsonFlag": true,
2860
3657
  "isESM": true,
2861
3658
  "relativePath": [
2862
3659
  "dist",
2863
3660
  "commands",
2864
- "users",
3661
+ "devices",
2865
3662
  "list.js"
2866
3663
  ]
2867
3664
  },
2868
- "signals:count": {
3665
+ "devices:rename": {
2869
3666
  "aliases": [],
2870
- "args": {},
2871
- "description": "Get counts of signals grouped by type.\n\nReturns total counts and per-type breakdowns (manual, eventTrigger, schedule, slack).",
3667
+ "args": {
3668
+ "id": {
3669
+ "description": "Device ID (UUID)",
3670
+ "name": "id",
3671
+ "required": true
3672
+ },
3673
+ "name": {
3674
+ "description": "New name for the device",
3675
+ "name": "name",
3676
+ "required": true
3677
+ }
3678
+ },
3679
+ "description": "Rename a device by updating its name.",
2872
3680
  "examples": [
2873
- "<%= config.bin %> signals count",
2874
- "<%= config.bin %> signals count --start 2026-01-01 --end 2026-02-01",
2875
- "<%= config.bin %> signals count --json"
3681
+ "<%= config.bin %> devices rename <device-id> new-robot-name",
3682
+ "<%= config.bin %> devices rename <device-id> new-robot-name --json"
2876
3683
  ],
2877
3684
  "flags": {
2878
3685
  "json": {
@@ -2901,53 +3708,38 @@
2901
3708
  "name": "stage",
2902
3709
  "allowNo": false,
2903
3710
  "type": "boolean"
2904
- },
2905
- "end": {
2906
- "description": "End time (ISO 8601)",
2907
- "name": "end",
2908
- "hasDynamicHelp": false,
2909
- "multiple": false,
2910
- "type": "option"
2911
- },
2912
- "start": {
2913
- "description": "Start time (ISO 8601)",
2914
- "name": "start",
2915
- "hasDynamicHelp": false,
2916
- "multiple": false,
2917
- "type": "option"
2918
3711
  }
2919
3712
  },
2920
3713
  "hasDynamicHelp": false,
2921
3714
  "hiddenAliases": [],
2922
- "id": "signals:count",
3715
+ "id": "devices:rename",
2923
3716
  "pluginAlias": "@formant/formant-cli",
2924
3717
  "pluginName": "@formant/formant-cli",
2925
3718
  "pluginType": "core",
2926
3719
  "strict": true,
2927
- "summary": "Get signal counts by type",
3720
+ "summary": "Rename a device",
2928
3721
  "enableJsonFlag": true,
2929
3722
  "isESM": true,
2930
3723
  "relativePath": [
2931
3724
  "dist",
2932
3725
  "commands",
2933
- "signals",
2934
- "count.js"
3726
+ "devices",
3727
+ "rename.js"
2935
3728
  ]
2936
3729
  },
2937
- "signals:get": {
3730
+ "devices:streams": {
2938
3731
  "aliases": [],
2939
3732
  "args": {
2940
3733
  "id": {
2941
- "description": "Signal ID (UUID)",
3734
+ "description": "Device ID (UUID)",
2942
3735
  "name": "id",
2943
3736
  "required": true
2944
3737
  }
2945
3738
  },
2946
- "description": "Get detailed information about a specific signal by its ID.\n\nShows signal details including the triggering event, goal, status, and type (manual, \neventTrigger, schedule, slack). Use --trace to also fetch the event and event trigger \ninformation.",
3739
+ "description": "List telemetry streams configured on a device.\n\nShows a clean view of stream definitions parsed from the device configuration,\nincluding stream names, types, topics, and quality settings.",
2947
3740
  "examples": [
2948
- "<%= config.bin %> signals get <signal-id>",
2949
- "<%= config.bin %> signals get <signal-id> --trace",
2950
- "<%= config.bin %> signals get <signal-id> --json"
3741
+ "<%= config.bin %> devices streams <device-id>",
3742
+ "<%= config.bin %> devices streams <device-id> --json"
2951
3743
  ],
2952
3744
  "flags": {
2953
3745
  "json": {
@@ -2976,38 +3768,39 @@
2976
3768
  "name": "stage",
2977
3769
  "allowNo": false,
2978
3770
  "type": "boolean"
2979
- },
2980
- "trace": {
2981
- "description": "Fetch and display the triggering event and event trigger information",
2982
- "name": "trace",
2983
- "allowNo": false,
2984
- "type": "boolean"
2985
3771
  }
2986
3772
  },
2987
3773
  "hasDynamicHelp": false,
2988
3774
  "hiddenAliases": [],
2989
- "id": "signals:get",
3775
+ "id": "devices:streams",
2990
3776
  "pluginAlias": "@formant/formant-cli",
2991
3777
  "pluginName": "@formant/formant-cli",
2992
3778
  "pluginType": "core",
2993
3779
  "strict": true,
2994
- "summary": "Get a signal by ID",
3780
+ "summary": "List device streams",
2995
3781
  "enableJsonFlag": true,
2996
3782
  "isESM": true,
2997
3783
  "relativePath": [
2998
3784
  "dist",
2999
3785
  "commands",
3000
- "signals",
3001
- "get.js"
3786
+ "devices",
3787
+ "streams.js"
3002
3788
  ]
3003
3789
  },
3004
- "signals:list": {
3790
+ "devices:tag": {
3005
3791
  "aliases": [],
3006
- "args": {},
3007
- "description": "List all signals in your organization.\n\nSignals are points of interest that trigger AI-powered investigations. They can be\ncreated manually, generated from device events, scheduled, or from Slack/Teams integrations.",
3792
+ "args": {
3793
+ "id": {
3794
+ "description": "Device ID (UUID)",
3795
+ "name": "id",
3796
+ "required": true
3797
+ }
3798
+ },
3799
+ "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.",
3008
3800
  "examples": [
3009
- "<%= config.bin %> signals list",
3010
- "<%= config.bin %> signals list --json"
3801
+ "<%= config.bin %> devices tag <device-id> --tag location=warehouse",
3802
+ "<%= config.bin %> devices tag <device-id> --tag env=prod --tag region=us-east",
3803
+ "<%= config.bin %> devices tag <device-id> --tag location=factory --json"
3011
3804
  ],
3012
3805
  "flags": {
3013
3806
  "json": {
@@ -3036,33 +3829,48 @@
3036
3829
  "name": "stage",
3037
3830
  "allowNo": false,
3038
3831
  "type": "boolean"
3832
+ },
3833
+ "tag": {
3834
+ "char": "t",
3835
+ "description": "Tag to add or update (key=value), can be specified multiple times",
3836
+ "name": "tag",
3837
+ "required": true,
3838
+ "hasDynamicHelp": false,
3839
+ "multiple": true,
3840
+ "type": "option"
3039
3841
  }
3040
3842
  },
3041
3843
  "hasDynamicHelp": false,
3042
3844
  "hiddenAliases": [],
3043
- "id": "signals:list",
3845
+ "id": "devices:tag",
3044
3846
  "pluginAlias": "@formant/formant-cli",
3045
3847
  "pluginName": "@formant/formant-cli",
3046
3848
  "pluginType": "core",
3047
3849
  "strict": true,
3048
- "summary": "List all signals",
3850
+ "summary": "Add or update tags on a device",
3049
3851
  "enableJsonFlag": true,
3050
3852
  "isESM": true,
3051
3853
  "relativePath": [
3052
3854
  "dist",
3053
3855
  "commands",
3054
- "signals",
3055
- "list.js"
3856
+ "devices",
3857
+ "tag.js"
3056
3858
  ]
3057
3859
  },
3058
- "signals:query": {
3860
+ "devices:untag": {
3059
3861
  "aliases": [],
3060
- "args": {},
3061
- "description": "Query signals by time range and type.\n\nSignal types: manual, eventTrigger, schedule, slack.",
3862
+ "args": {
3863
+ "id": {
3864
+ "description": "Device ID (UUID)",
3865
+ "name": "id",
3866
+ "required": true
3867
+ }
3868
+ },
3869
+ "description": "Remove tags from a device.\n\nSpecify one or more tag keys to remove with --key.",
3062
3870
  "examples": [
3063
- "<%= config.bin %> signals query --start 2026-01-01",
3064
- "<%= config.bin %> signals query --start 2026-01-01 --end 2026-02-01 --type eventTrigger",
3065
- "<%= config.bin %> signals query --start 2026-01-01 --json"
3871
+ "<%= config.bin %> devices untag <device-id> --key location",
3872
+ "<%= config.bin %> devices untag <device-id> --key env --key region",
3873
+ "<%= config.bin %> devices untag <device-id> --key location --json"
3066
3874
  ],
3067
3875
  "flags": {
3068
3876
  "json": {
@@ -3092,52 +3900,33 @@
3092
3900
  "allowNo": false,
3093
3901
  "type": "boolean"
3094
3902
  },
3095
- "end": {
3096
- "description": "End time (ISO 8601)",
3097
- "name": "end",
3098
- "hasDynamicHelp": false,
3099
- "multiple": false,
3100
- "type": "option"
3101
- },
3102
- "start": {
3103
- "description": "Start time (ISO 8601)",
3104
- "name": "start",
3903
+ "key": {
3904
+ "char": "k",
3905
+ "description": "Tag key to remove, can be specified multiple times",
3906
+ "name": "key",
3105
3907
  "required": true,
3106
3908
  "hasDynamicHelp": false,
3107
- "multiple": false,
3108
- "type": "option"
3109
- },
3110
- "type": {
3111
- "description": "Filter by signal type",
3112
- "name": "type",
3113
- "hasDynamicHelp": false,
3114
- "multiple": false,
3115
- "options": [
3116
- "manual",
3117
- "eventTrigger",
3118
- "schedule",
3119
- "slack"
3120
- ],
3909
+ "multiple": true,
3121
3910
  "type": "option"
3122
3911
  }
3123
3912
  },
3124
3913
  "hasDynamicHelp": false,
3125
3914
  "hiddenAliases": [],
3126
- "id": "signals:query",
3915
+ "id": "devices:untag",
3127
3916
  "pluginAlias": "@formant/formant-cli",
3128
3917
  "pluginName": "@formant/formant-cli",
3129
3918
  "pluginType": "core",
3130
3919
  "strict": true,
3131
- "summary": "Query signals by time range",
3920
+ "summary": "Remove tags from a device",
3132
3921
  "enableJsonFlag": true,
3133
3922
  "isESM": true,
3134
3923
  "relativePath": [
3135
3924
  "dist",
3136
3925
  "commands",
3137
- "signals",
3138
- "query.js"
3926
+ "devices",
3927
+ "untag.js"
3139
3928
  ]
3140
3929
  }
3141
3930
  },
3142
- "version": "0.2.0"
3931
+ "version": "0.3.0"
3143
3932
  }