@formant/formant-cli 0.3.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/README.md +152 -124
  2. package/dist/commands/{commands → command}/for-device.js +2 -2
  3. package/dist/commands/command/for-device.js.map +1 -0
  4. package/dist/commands/{commands → command}/get.js +2 -2
  5. package/dist/commands/command/get.js.map +1 -0
  6. package/dist/commands/{commands → command}/history.js +3 -3
  7. package/dist/commands/command/history.js.map +1 -0
  8. package/dist/commands/{commands → command}/list.js +2 -2
  9. package/dist/commands/command/list.js.map +1 -0
  10. package/dist/commands/{commands → command}/send.js +5 -5
  11. package/dist/commands/command/send.js.map +1 -0
  12. package/dist/commands/{devices → device}/config.js +2 -2
  13. package/dist/commands/device/config.js.map +1 -0
  14. package/dist/commands/{devices → device}/create.js +3 -3
  15. package/dist/commands/device/create.js.map +1 -0
  16. package/dist/commands/{devices → device}/delete.js +2 -2
  17. package/dist/commands/device/delete.js.map +1 -0
  18. package/dist/commands/{devices → device}/get.js +2 -2
  19. package/dist/commands/device/get.js.map +1 -0
  20. package/dist/commands/{devices → device}/last-seen.js +2 -2
  21. package/dist/commands/device/last-seen.js.map +1 -0
  22. package/dist/commands/{devices → device}/list.js +5 -5
  23. package/dist/commands/device/list.js.map +1 -0
  24. package/dist/commands/{devices → device}/rename.js +2 -2
  25. package/dist/commands/device/rename.js.map +1 -0
  26. package/dist/commands/{devices → device}/streams.js +3 -3
  27. package/dist/commands/device/streams.js.map +1 -0
  28. package/dist/commands/{devices → device}/tag.js +3 -3
  29. package/dist/commands/device/tag.js.map +1 -0
  30. package/dist/commands/{devices → device}/untag.js +3 -3
  31. package/dist/commands/device/untag.js.map +1 -0
  32. package/dist/commands/{events → event}/get.js +2 -2
  33. package/dist/commands/event/get.js.map +1 -0
  34. package/dist/commands/{events → event}/list.js +4 -4
  35. package/dist/commands/event/list.js.map +1 -0
  36. package/dist/commands/{event-triggers → event-trigger}/get.js +2 -2
  37. package/dist/commands/event-trigger/get.js.map +1 -0
  38. package/dist/commands/{event-triggers → event-trigger}/list.js +2 -2
  39. package/dist/commands/event-trigger/list.js.map +1 -0
  40. package/dist/commands/{fleets → fleet}/get.js +2 -2
  41. package/dist/commands/fleet/get.js.map +1 -0
  42. package/dist/commands/{fleets → fleet}/list.js +2 -2
  43. package/dist/commands/fleet/list.js.map +1 -0
  44. package/dist/commands/{investigations → investigation}/analytics.js +3 -3
  45. package/dist/commands/investigation/analytics.js.map +1 -0
  46. package/dist/commands/{investigations → investigation}/get.js +2 -2
  47. package/dist/commands/investigation/get.js.map +1 -0
  48. package/dist/commands/{investigations → investigation}/list.js +3 -3
  49. package/dist/commands/investigation/list.js.map +1 -0
  50. package/dist/commands/{investigations → investigation}/run.js +3 -3
  51. package/dist/commands/investigation/run.js.map +1 -0
  52. package/dist/commands/{investigations → investigation}/runs-list.js +3 -3
  53. package/dist/commands/investigation/runs-list.js.map +1 -0
  54. package/dist/commands/{investigations → investigation}/runs.js +2 -2
  55. package/dist/commands/investigation/runs.js.map +1 -0
  56. package/dist/commands/{investigations → investigation}/stats.js +2 -2
  57. package/dist/commands/investigation/stats.js.map +1 -0
  58. package/dist/commands/{investigations → investigation}/trigger.js +2 -2
  59. package/dist/commands/investigation/trigger.js.map +1 -0
  60. package/dist/commands/persona/delegate-task.d.ts +14 -0
  61. package/dist/commands/persona/delegate-task.js +50 -0
  62. package/dist/commands/persona/delegate-task.js.map +1 -0
  63. package/dist/commands/persona/get.d.ts +10 -0
  64. package/dist/commands/persona/get.js +98 -0
  65. package/dist/commands/persona/get.js.map +1 -0
  66. package/dist/commands/{signals → persona}/list.d.ts +1 -1
  67. package/dist/commands/persona/list.js +31 -0
  68. package/dist/commands/persona/list.js.map +1 -0
  69. package/dist/commands/persona/task-status.d.ts +12 -0
  70. package/dist/commands/persona/task-status.js +57 -0
  71. package/dist/commands/persona/task-status.js.map +1 -0
  72. package/dist/commands/{schedules → schedule}/get.js +2 -2
  73. package/dist/commands/schedule/get.js.map +1 -0
  74. package/dist/commands/{schedules → schedule}/list.js +2 -2
  75. package/dist/commands/schedule/list.js.map +1 -0
  76. package/dist/commands/{signals → signal}/count.js +3 -3
  77. package/dist/commands/signal/count.js.map +1 -0
  78. package/dist/commands/signal/create.d.ts +16 -0
  79. package/dist/commands/signal/create.js +95 -0
  80. package/dist/commands/signal/create.js.map +1 -0
  81. package/dist/commands/{signals → signal}/get.js +3 -3
  82. package/dist/commands/signal/get.js.map +1 -0
  83. package/dist/commands/signal/list.d.ts +12 -0
  84. package/dist/commands/signal/list.js +85 -0
  85. package/dist/commands/signal/list.js.map +1 -0
  86. package/dist/commands/{signals → signal}/query.d.ts +1 -0
  87. package/dist/commands/signal/query.js +100 -0
  88. package/dist/commands/signal/query.js.map +1 -0
  89. package/dist/commands/signal/set-ground-truth.d.ts +12 -0
  90. package/dist/commands/signal/set-ground-truth.js +46 -0
  91. package/dist/commands/signal/set-ground-truth.js.map +1 -0
  92. package/dist/commands/{users → user}/get.js +2 -2
  93. package/dist/commands/user/get.js.map +1 -0
  94. package/dist/commands/{users → user}/list.js +2 -2
  95. package/dist/commands/user/list.js.map +1 -0
  96. package/dist/help.js +53 -47
  97. package/dist/help.js.map +1 -1
  98. package/dist/lib/api.d.ts +1 -1
  99. package/dist/lib/api.js +3 -0
  100. package/dist/lib/api.js.map +1 -1
  101. package/dist/lib/config.d.ts +1 -0
  102. package/dist/lib/config.js +3 -0
  103. package/dist/lib/config.js.map +1 -1
  104. package/oclif.manifest.json +1484 -1047
  105. package/package.json +28 -25
  106. package/dist/commands/commands/for-device.js.map +0 -1
  107. package/dist/commands/commands/get.js.map +0 -1
  108. package/dist/commands/commands/history.js.map +0 -1
  109. package/dist/commands/commands/list.js.map +0 -1
  110. package/dist/commands/commands/send.js.map +0 -1
  111. package/dist/commands/devices/config.js.map +0 -1
  112. package/dist/commands/devices/create.js.map +0 -1
  113. package/dist/commands/devices/delete.js.map +0 -1
  114. package/dist/commands/devices/get.js.map +0 -1
  115. package/dist/commands/devices/last-seen.js.map +0 -1
  116. package/dist/commands/devices/list.js.map +0 -1
  117. package/dist/commands/devices/rename.js.map +0 -1
  118. package/dist/commands/devices/streams.js.map +0 -1
  119. package/dist/commands/devices/tag.js.map +0 -1
  120. package/dist/commands/devices/untag.js.map +0 -1
  121. package/dist/commands/event-triggers/get.js.map +0 -1
  122. package/dist/commands/event-triggers/list.js.map +0 -1
  123. package/dist/commands/events/get.js.map +0 -1
  124. package/dist/commands/events/list.js.map +0 -1
  125. package/dist/commands/fleets/get.js.map +0 -1
  126. package/dist/commands/fleets/list.js.map +0 -1
  127. package/dist/commands/investigations/analytics.js.map +0 -1
  128. package/dist/commands/investigations/get.js.map +0 -1
  129. package/dist/commands/investigations/list.js.map +0 -1
  130. package/dist/commands/investigations/run.js.map +0 -1
  131. package/dist/commands/investigations/runs-list.js.map +0 -1
  132. package/dist/commands/investigations/runs.js.map +0 -1
  133. package/dist/commands/investigations/stats.js.map +0 -1
  134. package/dist/commands/investigations/trigger.js.map +0 -1
  135. package/dist/commands/schedules/get.js.map +0 -1
  136. package/dist/commands/schedules/list.js.map +0 -1
  137. package/dist/commands/signals/count.js.map +0 -1
  138. package/dist/commands/signals/get.js.map +0 -1
  139. package/dist/commands/signals/list.js +0 -30
  140. package/dist/commands/signals/list.js.map +0 -1
  141. package/dist/commands/signals/query.js +0 -52
  142. package/dist/commands/signals/query.js.map +0 -1
  143. package/dist/commands/users/get.js.map +0 -1
  144. package/dist/commands/users/list.js.map +0 -1
  145. /package/dist/commands/{commands → command}/for-device.d.ts +0 -0
  146. /package/dist/commands/{commands → command}/get.d.ts +0 -0
  147. /package/dist/commands/{commands → command}/history.d.ts +0 -0
  148. /package/dist/commands/{commands → command}/list.d.ts +0 -0
  149. /package/dist/commands/{commands → command}/send.d.ts +0 -0
  150. /package/dist/commands/{devices → device}/config.d.ts +0 -0
  151. /package/dist/commands/{devices → device}/create.d.ts +0 -0
  152. /package/dist/commands/{devices → device}/delete.d.ts +0 -0
  153. /package/dist/commands/{devices → device}/get.d.ts +0 -0
  154. /package/dist/commands/{devices → device}/last-seen.d.ts +0 -0
  155. /package/dist/commands/{devices → device}/list.d.ts +0 -0
  156. /package/dist/commands/{devices → device}/rename.d.ts +0 -0
  157. /package/dist/commands/{devices → device}/streams.d.ts +0 -0
  158. /package/dist/commands/{devices → device}/tag.d.ts +0 -0
  159. /package/dist/commands/{devices → device}/untag.d.ts +0 -0
  160. /package/dist/commands/{events → event}/get.d.ts +0 -0
  161. /package/dist/commands/{events → event}/list.d.ts +0 -0
  162. /package/dist/commands/{event-triggers → event-trigger}/get.d.ts +0 -0
  163. /package/dist/commands/{event-triggers → event-trigger}/list.d.ts +0 -0
  164. /package/dist/commands/{fleets → fleet}/get.d.ts +0 -0
  165. /package/dist/commands/{fleets → fleet}/list.d.ts +0 -0
  166. /package/dist/commands/{investigations → investigation}/analytics.d.ts +0 -0
  167. /package/dist/commands/{investigations → investigation}/get.d.ts +0 -0
  168. /package/dist/commands/{investigations → investigation}/list.d.ts +0 -0
  169. /package/dist/commands/{investigations → investigation}/run.d.ts +0 -0
  170. /package/dist/commands/{investigations → investigation}/runs-list.d.ts +0 -0
  171. /package/dist/commands/{investigations → investigation}/runs.d.ts +0 -0
  172. /package/dist/commands/{investigations → investigation}/stats.d.ts +0 -0
  173. /package/dist/commands/{investigations → investigation}/trigger.d.ts +0 -0
  174. /package/dist/commands/{schedules → schedule}/get.d.ts +0 -0
  175. /package/dist/commands/{schedules → schedule}/list.d.ts +0 -0
  176. /package/dist/commands/{signals → signal}/count.d.ts +0 -0
  177. /package/dist/commands/{signals → signal}/get.d.ts +0 -0
  178. /package/dist/commands/{users → user}/get.d.ts +0 -0
  179. /package/dist/commands/{users → user}/list.d.ts +0 -0
@@ -140,79 +140,19 @@
140
140
  "tables.js"
141
141
  ]
142
142
  },
143
- "commands:for-device": {
144
- "aliases": [],
145
- "args": {
146
- "deviceId": {
147
- "description": "Device ID (UUID)",
148
- "name": "deviceId",
149
- "required": true
150
- }
151
- },
152
- "description": "List command templates available for a specific device.\n\nReturns commands that match the device's tags and filters. Only enabled commands\nthat apply to this device are shown.",
153
- "examples": [
154
- "<%= config.bin %> commands for-device <device-id>",
155
- "<%= config.bin %> commands for-device <device-id> --json"
156
- ],
157
- "flags": {
158
- "json": {
159
- "description": "Format output as json.",
160
- "helpGroup": "GLOBAL",
161
- "name": "json",
162
- "allowNo": false,
163
- "type": "boolean"
164
- },
165
- "dev": {
166
- "description": "Target the dev environment",
167
- "exclusive": [
168
- "stage"
169
- ],
170
- "helpGroup": "GLOBAL",
171
- "name": "dev",
172
- "allowNo": false,
173
- "type": "boolean"
174
- },
175
- "stage": {
176
- "description": "Target the stage environment",
177
- "exclusive": [
178
- "dev"
179
- ],
180
- "helpGroup": "GLOBAL",
181
- "name": "stage",
182
- "allowNo": false,
183
- "type": "boolean"
184
- }
185
- },
186
- "hasDynamicHelp": false,
187
- "hiddenAliases": [],
188
- "id": "commands:for-device",
189
- "pluginAlias": "@formant/formant-cli",
190
- "pluginName": "@formant/formant-cli",
191
- "pluginType": "core",
192
- "strict": true,
193
- "summary": "List commands available for a device",
194
- "enableJsonFlag": true,
195
- "isESM": true,
196
- "relativePath": [
197
- "dist",
198
- "commands",
199
- "commands",
200
- "for-device.js"
201
- ]
202
- },
203
- "commands:get": {
143
+ "event:get": {
204
144
  "aliases": [],
205
145
  "args": {
206
146
  "id": {
207
- "description": "Command template ID (UUID)",
147
+ "description": "Event ID (UUID)",
208
148
  "name": "id",
209
149
  "required": true
210
150
  }
211
151
  },
212
- "description": "Get detailed information about a command template.\n\nShows the full template configuration including command string, parameter schema,\ndevice targeting filters, and delivery settings. If the template has structured\nparameters (schema), they are displayed in a readable format.",
152
+ "description": "Get detailed information about a specific event by its ID.",
213
153
  "examples": [
214
- "<%= config.bin %> commands get <template-id>",
215
- "<%= config.bin %> commands get <template-id> --json"
154
+ "<%= config.bin %> event get <event-id>",
155
+ "<%= config.bin %> event get <event-id> --json"
216
156
  ],
217
157
  "flags": {
218
158
  "json": {
@@ -245,29 +185,30 @@
245
185
  },
246
186
  "hasDynamicHelp": false,
247
187
  "hiddenAliases": [],
248
- "id": "commands:get",
188
+ "id": "event:get",
249
189
  "pluginAlias": "@formant/formant-cli",
250
190
  "pluginName": "@formant/formant-cli",
251
191
  "pluginType": "core",
252
192
  "strict": true,
253
- "summary": "Get command template details",
193
+ "summary": "Get an event by ID",
254
194
  "enableJsonFlag": true,
255
195
  "isESM": true,
256
196
  "relativePath": [
257
197
  "dist",
258
198
  "commands",
259
- "commands",
199
+ "event",
260
200
  "get.js"
261
201
  ]
262
202
  },
263
- "commands:history": {
203
+ "event:list": {
264
204
  "aliases": [],
265
205
  "args": {},
266
- "description": "Query command history for a device.\n\nShows commands that have been sent to a device, including delivery status and responses.\nUse this to check if commands were delivered and executed successfully.",
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.",
267
207
  "examples": [
268
- "<%= config.bin %> commands history --device <device-id>",
269
- "<%= config.bin %> commands history --device <device-id> --limit 50",
270
- "<%= config.bin %> commands history --device <device-id> --json"
208
+ "<%= config.bin %> event list",
209
+ "<%= config.bin %> event list --device <id> --severity critical",
210
+ "<%= config.bin %> event list --type device-offline --start 2026-01-01 --end 2026-01-02",
211
+ "<%= config.bin %> event list --limit 100 --json"
271
212
  ],
272
213
  "flags": {
273
214
  "json": {
@@ -299,47 +240,86 @@
299
240
  },
300
241
  "device": {
301
242
  "char": "d",
302
- "description": "Device ID (UUID)",
243
+ "description": "Filter by device ID",
303
244
  "name": "device",
304
- "required": true,
245
+ "hasDynamicHelp": false,
246
+ "multiple": false,
247
+ "type": "option"
248
+ },
249
+ "end": {
250
+ "description": "End time (ISO 8601)",
251
+ "name": "end",
305
252
  "hasDynamicHelp": false,
306
253
  "multiple": false,
307
254
  "type": "option"
308
255
  },
309
256
  "limit": {
310
257
  "char": "l",
311
- "description": "Maximum number of commands to return",
258
+ "description": "Maximum number of events to return",
312
259
  "name": "limit",
313
260
  "default": 25,
314
261
  "hasDynamicHelp": false,
315
262
  "multiple": false,
316
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"
317
291
  }
318
292
  },
319
293
  "hasDynamicHelp": false,
320
294
  "hiddenAliases": [],
321
- "id": "commands:history",
295
+ "id": "event:list",
322
296
  "pluginAlias": "@formant/formant-cli",
323
297
  "pluginName": "@formant/formant-cli",
324
298
  "pluginType": "core",
325
299
  "strict": true,
326
- "summary": "Query command history",
300
+ "summary": "View events emitted by devices",
327
301
  "enableJsonFlag": true,
328
302
  "isESM": true,
329
303
  "relativePath": [
330
304
  "dist",
331
305
  "commands",
332
- "commands",
333
- "history.js"
306
+ "event",
307
+ "list.js"
334
308
  ]
335
309
  },
336
- "commands:list": {
310
+ "event-trigger:get": {
337
311
  "aliases": [],
338
- "args": {},
339
- "description": "List all command templates defined in your organization.\n\nCommand templates define the commands that can be sent to devices. Each template\nspecifies the command string, parameters, delivery settings, and device targeting.",
312
+ "args": {
313
+ "id": {
314
+ "description": "Event trigger ID (UUID)",
315
+ "name": "id",
316
+ "required": true
317
+ }
318
+ },
319
+ "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.",
340
320
  "examples": [
341
- "<%= config.bin %> commands list",
342
- "<%= config.bin %> commands list --json"
321
+ "<%= config.bin %> event-trigger get <trigger-id>",
322
+ "<%= config.bin %> event-trigger get <trigger-id> --json"
343
323
  ],
344
324
  "flags": {
345
325
  "json": {
@@ -372,42 +352,28 @@
372
352
  },
373
353
  "hasDynamicHelp": false,
374
354
  "hiddenAliases": [],
375
- "id": "commands:list",
355
+ "id": "event-trigger:get",
376
356
  "pluginAlias": "@formant/formant-cli",
377
357
  "pluginName": "@formant/formant-cli",
378
358
  "pluginType": "core",
379
359
  "strict": true,
380
- "summary": "List command templates",
360
+ "summary": "Get event trigger details",
381
361
  "enableJsonFlag": true,
382
362
  "isESM": true,
383
363
  "relativePath": [
384
364
  "dist",
385
365
  "commands",
386
- "commands",
387
- "list.js"
366
+ "event-trigger",
367
+ "get.js"
388
368
  ]
389
369
  },
390
- "commands:send": {
370
+ "event-trigger:list": {
391
371
  "aliases": [],
392
- "args": {
393
- "deviceId": {
394
- "description": "Device ID (UUID)",
395
- "name": "deviceId",
396
- "required": true
397
- },
398
- "templateId": {
399
- "description": "Command template ID (UUID)",
400
- "name": "templateId",
401
- "required": true
402
- }
403
- },
404
- "description": "Send a command to a device using a command template.\n\nFetches the template, validates parameters against its schema, and sends the command\nto the specified device. Use --param flags to override parameter values.\n\nFor templates with structured parameters (schema), parameter names and types are\nvalidated. For unstructured parameters, the raw value is sent as-is.\n\nUse --dry-run to preview the payload without actually sending.",
372
+ "args": {},
373
+ "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.",
405
374
  "examples": [
406
- "<%= config.bin %> commands send <device-id> <template-id>",
407
- "<%= config.bin %> commands send <device-id> <template-id> --param speed=5 --param mode=fast",
408
- "<%= config.bin %> commands send <device-id> <template-id> --dry-run",
409
- "<%= config.bin %> commands send <device-id> <template-id> --raw-value '{\"x\":1,\"y\":2}'",
410
- "<%= config.bin %> commands send <device-id> <template-id> --json"
375
+ "<%= config.bin %> event-trigger list",
376
+ "<%= config.bin %> event-trigger list --json"
411
377
  ],
412
378
  "flags": {
413
379
  "json": {
@@ -436,59 +402,38 @@
436
402
  "name": "stage",
437
403
  "allowNo": false,
438
404
  "type": "boolean"
439
- },
440
- "dry-run": {
441
- "description": "Preview the command payload without sending",
442
- "name": "dry-run",
443
- "allowNo": false,
444
- "type": "boolean"
445
- },
446
- "param": {
447
- "char": "p",
448
- "description": "Parameter override (name=value), can be specified multiple times",
449
- "name": "param",
450
- "hasDynamicHelp": false,
451
- "multiple": true,
452
- "type": "option"
453
- },
454
- "raw-value": {
455
- "description": "Send a raw parameter value string (bypasses schema validation)",
456
- "name": "raw-value",
457
- "hasDynamicHelp": false,
458
- "multiple": false,
459
- "type": "option"
460
405
  }
461
406
  },
462
407
  "hasDynamicHelp": false,
463
408
  "hiddenAliases": [],
464
- "id": "commands:send",
409
+ "id": "event-trigger:list",
465
410
  "pluginAlias": "@formant/formant-cli",
466
411
  "pluginName": "@formant/formant-cli",
467
412
  "pluginType": "core",
468
413
  "strict": true,
469
- "summary": "Send a command to a device",
414
+ "summary": "List event trigger rules",
470
415
  "enableJsonFlag": true,
471
416
  "isESM": true,
472
417
  "relativePath": [
473
418
  "dist",
474
419
  "commands",
475
- "commands",
476
- "send.js"
420
+ "event-trigger",
421
+ "list.js"
477
422
  ]
478
423
  },
479
- "devices:config": {
424
+ "fleet:get": {
480
425
  "aliases": [],
481
426
  "args": {
482
427
  "id": {
483
- "description": "Device ID (UUID)",
428
+ "description": "Fleet (group) ID (UUID)",
484
429
  "name": "id",
485
430
  "required": true
486
431
  }
487
432
  },
488
- "description": "Get the device configuration including stream definitions.\n\nShows the device's current configuration including telemetry streams, commands,\nand other settings.",
433
+ "description": "Get detailed information about a device group (fleet).\n\nShows the full fleet configuration including member devices and settings.",
489
434
  "examples": [
490
- "<%= config.bin %> devices config <device-id>",
491
- "<%= config.bin %> devices config <device-id> --json"
435
+ "<%= config.bin %> fleet get <fleet-id>",
436
+ "<%= config.bin %> fleet get <fleet-id> --json"
492
437
  ],
493
438
  "flags": {
494
439
  "json": {
@@ -521,35 +466,28 @@
521
466
  },
522
467
  "hasDynamicHelp": false,
523
468
  "hiddenAliases": [],
524
- "id": "devices:config",
469
+ "id": "fleet:get",
525
470
  "pluginAlias": "@formant/formant-cli",
526
471
  "pluginName": "@formant/formant-cli",
527
472
  "pluginType": "core",
528
473
  "strict": true,
529
- "summary": "Get device configuration",
474
+ "summary": "Get fleet details",
530
475
  "enableJsonFlag": true,
531
476
  "isESM": true,
532
477
  "relativePath": [
533
478
  "dist",
534
479
  "commands",
535
- "devices",
536
- "config.js"
480
+ "fleet",
481
+ "get.js"
537
482
  ]
538
483
  },
539
- "devices:create": {
484
+ "fleet:list": {
540
485
  "aliases": [],
541
- "args": {
542
- "name": {
543
- "description": "Name for the new device",
544
- "name": "name",
545
- "required": true
546
- }
547
- },
548
- "description": "Create a new device in your fleet.\n\nThe device is created as enabled by default. You can optionally specify tags.",
486
+ "args": {},
487
+ "description": "List all device groups (fleets) in your organization.\n\nDevice groups allow you to organize and manage sets of devices together.",
549
488
  "examples": [
550
- "<%= config.bin %> devices create my-robot",
551
- "<%= config.bin %> devices create my-robot --tag location=warehouse --tag env=prod",
552
- "<%= config.bin %> devices create my-robot --json"
489
+ "<%= config.bin %> fleet list",
490
+ "<%= config.bin %> fleet list --json"
553
491
  ],
554
492
  "flags": {
555
493
  "json": {
@@ -578,46 +516,38 @@
578
516
  "name": "stage",
579
517
  "allowNo": false,
580
518
  "type": "boolean"
581
- },
582
- "tag": {
583
- "char": "t",
584
- "description": "Tag to apply (key=value), can be specified multiple times",
585
- "name": "tag",
586
- "hasDynamicHelp": false,
587
- "multiple": true,
588
- "type": "option"
589
519
  }
590
520
  },
591
521
  "hasDynamicHelp": false,
592
522
  "hiddenAliases": [],
593
- "id": "devices:create",
523
+ "id": "fleet:list",
594
524
  "pluginAlias": "@formant/formant-cli",
595
525
  "pluginName": "@formant/formant-cli",
596
526
  "pluginType": "core",
597
527
  "strict": true,
598
- "summary": "Create a new device",
528
+ "summary": "List device groups",
599
529
  "enableJsonFlag": true,
600
530
  "isESM": true,
601
531
  "relativePath": [
602
532
  "dist",
603
533
  "commands",
604
- "devices",
605
- "create.js"
534
+ "fleet",
535
+ "list.js"
606
536
  ]
607
537
  },
608
- "devices:delete": {
538
+ "command:for-device": {
609
539
  "aliases": [],
610
540
  "args": {
611
- "id": {
541
+ "deviceId": {
612
542
  "description": "Device ID (UUID)",
613
- "name": "id",
543
+ "name": "deviceId",
614
544
  "required": true
615
545
  }
616
546
  },
617
- "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.",
547
+ "description": "List command templates available for a specific device.\n\nReturns commands that match the device's tags and filters. Only enabled commands\nthat apply to this device are shown.",
618
548
  "examples": [
619
- "<%= config.bin %> devices delete <device-id>",
620
- "<%= config.bin %> devices delete <device-id> --json"
549
+ "<%= config.bin %> command for-device <device-id>",
550
+ "<%= config.bin %> command for-device <device-id> --json"
621
551
  ],
622
552
  "flags": {
623
553
  "json": {
@@ -650,34 +580,34 @@
650
580
  },
651
581
  "hasDynamicHelp": false,
652
582
  "hiddenAliases": [],
653
- "id": "devices:delete",
583
+ "id": "command:for-device",
654
584
  "pluginAlias": "@formant/formant-cli",
655
585
  "pluginName": "@formant/formant-cli",
656
586
  "pluginType": "core",
657
587
  "strict": true,
658
- "summary": "Delete (disable) a device",
588
+ "summary": "List commands available for a device",
659
589
  "enableJsonFlag": true,
660
590
  "isESM": true,
661
591
  "relativePath": [
662
592
  "dist",
663
593
  "commands",
664
- "devices",
665
- "delete.js"
594
+ "command",
595
+ "for-device.js"
666
596
  ]
667
597
  },
668
- "devices:get": {
598
+ "command:get": {
669
599
  "aliases": [],
670
600
  "args": {
671
601
  "id": {
672
- "description": "Device ID (UUID)",
602
+ "description": "Command template ID (UUID)",
673
603
  "name": "id",
674
604
  "required": true
675
605
  }
676
606
  },
677
- "description": "Get detailed information about a specific device by its ID.",
607
+ "description": "Get detailed information about a command template.\n\nShows the full template configuration including command string, parameter schema,\ndevice targeting filters, and delivery settings. If the template has structured\nparameters (schema), they are displayed in a readable format.",
678
608
  "examples": [
679
- "<%= config.bin %> devices get <device-id>",
680
- "<%= config.bin %> devices get <device-id> --json"
609
+ "<%= config.bin %> command get <template-id>",
610
+ "<%= config.bin %> command get <template-id> --json"
681
611
  ],
682
612
  "flags": {
683
613
  "json": {
@@ -710,34 +640,29 @@
710
640
  },
711
641
  "hasDynamicHelp": false,
712
642
  "hiddenAliases": [],
713
- "id": "devices:get",
643
+ "id": "command:get",
714
644
  "pluginAlias": "@formant/formant-cli",
715
645
  "pluginName": "@formant/formant-cli",
716
646
  "pluginType": "core",
717
647
  "strict": true,
718
- "summary": "Get a device by ID",
648
+ "summary": "Get command template details",
719
649
  "enableJsonFlag": true,
720
650
  "isESM": true,
721
651
  "relativePath": [
722
652
  "dist",
723
653
  "commands",
724
- "devices",
654
+ "command",
725
655
  "get.js"
726
656
  ]
727
657
  },
728
- "devices:last-seen": {
658
+ "command:history": {
729
659
  "aliases": [],
730
- "args": {
731
- "id": {
732
- "description": "Device ID (UUID)",
733
- "name": "id",
734
- "required": true
735
- }
736
- },
737
- "description": "Get when a device was last seen online.\n\nShows the most recent timestamp when the device was detected as online.",
660
+ "args": {},
661
+ "description": "Query command history for a device.\n\nShows commands that have been sent to a device, including delivery status and responses.\nUse this to check if commands were delivered and executed successfully.",
738
662
  "examples": [
739
- "<%= config.bin %> devices last-seen <device-id>",
740
- "<%= config.bin %> devices last-seen <device-id> --json"
663
+ "<%= config.bin %> command history --device <device-id>",
664
+ "<%= config.bin %> command history --device <device-id> --limit 50",
665
+ "<%= config.bin %> command history --device <device-id> --json"
741
666
  ],
742
667
  "flags": {
743
668
  "json": {
@@ -766,35 +691,50 @@
766
691
  "name": "stage",
767
692
  "allowNo": false,
768
693
  "type": "boolean"
694
+ },
695
+ "device": {
696
+ "char": "d",
697
+ "description": "Device ID (UUID)",
698
+ "name": "device",
699
+ "required": true,
700
+ "hasDynamicHelp": false,
701
+ "multiple": false,
702
+ "type": "option"
703
+ },
704
+ "limit": {
705
+ "char": "l",
706
+ "description": "Maximum number of commands to return",
707
+ "name": "limit",
708
+ "default": 25,
709
+ "hasDynamicHelp": false,
710
+ "multiple": false,
711
+ "type": "option"
769
712
  }
770
713
  },
771
714
  "hasDynamicHelp": false,
772
715
  "hiddenAliases": [],
773
- "id": "devices:last-seen",
716
+ "id": "command:history",
774
717
  "pluginAlias": "@formant/formant-cli",
775
718
  "pluginName": "@formant/formant-cli",
776
719
  "pluginType": "core",
777
720
  "strict": true,
778
- "summary": "Get device last seen timestamp",
721
+ "summary": "Query command history",
779
722
  "enableJsonFlag": true,
780
723
  "isESM": true,
781
724
  "relativePath": [
782
725
  "dist",
783
726
  "commands",
784
- "devices",
785
- "last-seen.js"
727
+ "command",
728
+ "history.js"
786
729
  ]
787
730
  },
788
- "devices:list": {
731
+ "command:list": {
789
732
  "aliases": [],
790
733
  "args": {},
791
- "description": "List robots and sensors in your fleet. Shows only online devices by default.\n\nUse --all to include offline devices.",
734
+ "description": "List all command templates defined in your organization.\n\nCommand templates define the commands that can be sent to devices. Each template\nspecifies the command string, parameters, delivery settings, and device targeting.",
792
735
  "examples": [
793
- "<%= config.bin %> devices list",
794
- "<%= config.bin %> devices list --all",
795
- "<%= config.bin %> devices list --all --limit 100",
796
- "<%= config.bin %> devices list --tag location=warehouse",
797
- "<%= config.bin %> devices list --name robot --dev --json"
736
+ "<%= config.bin %> command list",
737
+ "<%= config.bin %> command list --json"
798
738
  ],
799
739
  "flags": {
800
740
  "json": {
@@ -823,75 +763,46 @@
823
763
  "name": "stage",
824
764
  "allowNo": false,
825
765
  "type": "boolean"
826
- },
827
- "all": {
828
- "char": "a",
829
- "description": "Show all devices (online and offline)",
830
- "name": "all",
831
- "allowNo": false,
832
- "type": "boolean"
833
- },
834
- "limit": {
835
- "char": "l",
836
- "description": "Maximum number of devices to return",
837
- "name": "limit",
838
- "default": 50,
839
- "hasDynamicHelp": false,
840
- "multiple": false,
841
- "type": "option"
842
- },
843
- "name": {
844
- "char": "n",
845
- "description": "Filter devices by name (search)",
846
- "name": "name",
847
- "hasDynamicHelp": false,
848
- "multiple": false,
849
- "type": "option"
850
- },
851
- "tag": {
852
- "char": "t",
853
- "description": "Filter by tag (key=value), can be specified multiple times",
854
- "name": "tag",
855
- "hasDynamicHelp": false,
856
- "multiple": true,
857
- "type": "option"
858
766
  }
859
767
  },
860
768
  "hasDynamicHelp": false,
861
769
  "hiddenAliases": [],
862
- "id": "devices:list",
770
+ "id": "command:list",
863
771
  "pluginAlias": "@formant/formant-cli",
864
772
  "pluginName": "@formant/formant-cli",
865
773
  "pluginType": "core",
866
774
  "strict": true,
867
- "summary": "List robots and sensors in your fleet",
775
+ "summary": "List command templates",
868
776
  "enableJsonFlag": true,
869
777
  "isESM": true,
870
778
  "relativePath": [
871
779
  "dist",
872
780
  "commands",
873
- "devices",
781
+ "command",
874
782
  "list.js"
875
783
  ]
876
784
  },
877
- "devices:rename": {
785
+ "command:send": {
878
786
  "aliases": [],
879
787
  "args": {
880
- "id": {
788
+ "deviceId": {
881
789
  "description": "Device ID (UUID)",
882
- "name": "id",
790
+ "name": "deviceId",
883
791
  "required": true
884
792
  },
885
- "name": {
886
- "description": "New name for the device",
887
- "name": "name",
793
+ "templateId": {
794
+ "description": "Command template ID (UUID)",
795
+ "name": "templateId",
888
796
  "required": true
889
797
  }
890
798
  },
891
- "description": "Rename a device by updating its name.",
799
+ "description": "Send a command to a device using a command template.\n\nFetches the template, validates parameters against its schema, and sends the command\nto the specified device. Use --param flags to override parameter values.\n\nFor templates with structured parameters (schema), parameter names and types are\nvalidated. For unstructured parameters, the raw value is sent as-is.\n\nUse --dry-run to preview the payload without actually sending.",
892
800
  "examples": [
893
- "<%= config.bin %> devices rename <device-id> new-robot-name",
894
- "<%= config.bin %> devices rename <device-id> new-robot-name --json"
801
+ "<%= config.bin %> command send <device-id> <template-id>",
802
+ "<%= config.bin %> command send <device-id> <template-id> --param speed=5 --param mode=fast",
803
+ "<%= config.bin %> command send <device-id> <template-id> --dry-run",
804
+ "<%= config.bin %> command send <device-id> <template-id> --raw-value '{\"x\":1,\"y\":2}'",
805
+ "<%= config.bin %> command send <device-id> <template-id> --json"
895
806
  ],
896
807
  "flags": {
897
808
  "json": {
@@ -920,39 +831,59 @@
920
831
  "name": "stage",
921
832
  "allowNo": false,
922
833
  "type": "boolean"
834
+ },
835
+ "dry-run": {
836
+ "description": "Preview the command payload without sending",
837
+ "name": "dry-run",
838
+ "allowNo": false,
839
+ "type": "boolean"
840
+ },
841
+ "param": {
842
+ "char": "p",
843
+ "description": "Parameter override (name=value), can be specified multiple times",
844
+ "name": "param",
845
+ "hasDynamicHelp": false,
846
+ "multiple": true,
847
+ "type": "option"
848
+ },
849
+ "raw-value": {
850
+ "description": "Send a raw parameter value string (bypasses schema validation)",
851
+ "name": "raw-value",
852
+ "hasDynamicHelp": false,
853
+ "multiple": false,
854
+ "type": "option"
923
855
  }
924
856
  },
925
857
  "hasDynamicHelp": false,
926
858
  "hiddenAliases": [],
927
- "id": "devices:rename",
859
+ "id": "command:send",
928
860
  "pluginAlias": "@formant/formant-cli",
929
861
  "pluginName": "@formant/formant-cli",
930
862
  "pluginType": "core",
931
863
  "strict": true,
932
- "summary": "Rename a device",
864
+ "summary": "Send a command to a device",
933
865
  "enableJsonFlag": true,
934
866
  "isESM": true,
935
867
  "relativePath": [
936
868
  "dist",
937
869
  "commands",
938
- "devices",
939
- "rename.js"
870
+ "command",
871
+ "send.js"
940
872
  ]
941
873
  },
942
- "devices:streams": {
874
+ "kv:get": {
943
875
  "aliases": [],
944
876
  "args": {
945
- "id": {
946
- "description": "Device ID (UUID)",
947
- "name": "id",
877
+ "key": {
878
+ "description": "Key to retrieve",
879
+ "name": "key",
948
880
  "required": true
949
881
  }
950
882
  },
951
- "description": "List telemetry streams for a device.\n\nShows streams parsed from the device configuration as well as any streams\ndiscovered from actual ingested data (even if not explicitly configured).\nUnconfigured streams are marked with a SOURCE of \"data\" in the output.",
883
+ "description": "Get a value from the key-value store.\n\nThe key-value store allows devices and applications to store metadata.",
952
884
  "examples": [
953
- "<%= config.bin %> devices streams <device-id>",
954
- "<%= config.bin %> devices streams <device-id> --json",
955
- "<%= config.bin %> devices streams <device-id> --days 30"
885
+ "<%= config.bin %> kv get my-key",
886
+ "<%= config.bin %> kv get my-key --json"
956
887
  ],
957
888
  "flags": {
958
889
  "json": {
@@ -981,47 +912,34 @@
981
912
  "name": "stage",
982
913
  "allowNo": false,
983
914
  "type": "boolean"
984
- },
985
- "days": {
986
- "description": "How many days back to look for unconfigured streams in ingested data",
987
- "name": "days",
988
- "default": 14,
989
- "hasDynamicHelp": false,
990
- "multiple": false,
991
- "type": "option"
992
915
  }
993
916
  },
994
917
  "hasDynamicHelp": false,
995
918
  "hiddenAliases": [],
996
- "id": "devices:streams",
919
+ "id": "kv:get",
997
920
  "pluginAlias": "@formant/formant-cli",
998
921
  "pluginName": "@formant/formant-cli",
999
922
  "pluginType": "core",
1000
923
  "strict": true,
1001
- "summary": "List device streams",
924
+ "summary": "Get key-value",
1002
925
  "enableJsonFlag": true,
1003
926
  "isESM": true,
1004
927
  "relativePath": [
1005
928
  "dist",
1006
929
  "commands",
1007
- "devices",
1008
- "streams.js"
930
+ "kv",
931
+ "get.js"
1009
932
  ]
1010
933
  },
1011
- "devices:tag": {
934
+ "kv:list": {
1012
935
  "aliases": [],
1013
- "args": {
1014
- "id": {
1015
- "description": "Device ID (UUID)",
1016
- "name": "id",
1017
- "required": true
1018
- }
1019
- },
1020
- "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.",
936
+ "args": {},
937
+ "description": "List all keys in the key-value store.\n\nShows all stored keys in the organization's key-value store. Use --prefix to filter\nkeys that start with a specific prefix, or --keys to query specific keys.",
1021
938
  "examples": [
1022
- "<%= config.bin %> devices tag <device-id> --tag location=warehouse",
1023
- "<%= config.bin %> devices tag <device-id> --tag env=prod --tag region=us-east",
1024
- "<%= config.bin %> devices tag <device-id> --tag location=factory --json"
939
+ "<%= config.bin %> kv list",
940
+ "<%= config.bin %> kv list --prefix config",
941
+ "<%= config.bin %> kv list --keys key1 --keys key2 --keys key3",
942
+ "<%= config.bin %> kv list --json"
1025
943
  ],
1026
944
  "flags": {
1027
945
  "json": {
@@ -1051,47 +969,58 @@
1051
969
  "allowNo": false,
1052
970
  "type": "boolean"
1053
971
  },
1054
- "tag": {
1055
- "char": "t",
1056
- "description": "Tag to add or update (key=value), can be specified multiple times",
1057
- "name": "tag",
1058
- "required": true,
972
+ "keys": {
973
+ "char": "k",
974
+ "description": "Specific keys to query (can be specified multiple times)",
975
+ "name": "keys",
1059
976
  "hasDynamicHelp": false,
1060
977
  "multiple": true,
1061
978
  "type": "option"
979
+ },
980
+ "prefix": {
981
+ "char": "p",
982
+ "description": "Filter keys by prefix",
983
+ "name": "prefix",
984
+ "hasDynamicHelp": false,
985
+ "multiple": false,
986
+ "type": "option"
1062
987
  }
1063
988
  },
1064
989
  "hasDynamicHelp": false,
1065
990
  "hiddenAliases": [],
1066
- "id": "devices:tag",
991
+ "id": "kv:list",
1067
992
  "pluginAlias": "@formant/formant-cli",
1068
993
  "pluginName": "@formant/formant-cli",
1069
994
  "pluginType": "core",
1070
995
  "strict": true,
1071
- "summary": "Add or update tags on a device",
996
+ "summary": "List key-value keys",
1072
997
  "enableJsonFlag": true,
1073
998
  "isESM": true,
1074
999
  "relativePath": [
1075
1000
  "dist",
1076
1001
  "commands",
1077
- "devices",
1078
- "tag.js"
1002
+ "kv",
1003
+ "list.js"
1079
1004
  ]
1080
1005
  },
1081
- "devices:untag": {
1006
+ "kv:set": {
1082
1007
  "aliases": [],
1083
1008
  "args": {
1084
- "id": {
1085
- "description": "Device ID (UUID)",
1086
- "name": "id",
1009
+ "key": {
1010
+ "description": "Key to set",
1011
+ "name": "key",
1012
+ "required": true
1013
+ },
1014
+ "value": {
1015
+ "description": "Value to store (JSON string)",
1016
+ "name": "value",
1087
1017
  "required": true
1088
1018
  }
1089
1019
  },
1090
- "description": "Remove tags from a device.\n\nSpecify one or more tag keys to remove with --key.",
1020
+ "description": "Set a value in the key-value store.\n\nStores a value associated with a key. The value should be a JSON string.",
1091
1021
  "examples": [
1092
- "<%= config.bin %> devices untag <device-id> --key location",
1093
- "<%= config.bin %> devices untag <device-id> --key env --key region",
1094
- "<%= config.bin %> devices untag <device-id> --key location --json"
1022
+ "<%= config.bin %> kv set my-key '{\"data\": \"value\"}'",
1023
+ "<%= config.bin %> kv set config '{\"setting\": true}'"
1095
1024
  ],
1096
1025
  "flags": {
1097
1026
  "json": {
@@ -1120,47 +1049,34 @@
1120
1049
  "name": "stage",
1121
1050
  "allowNo": false,
1122
1051
  "type": "boolean"
1123
- },
1124
- "key": {
1125
- "char": "k",
1126
- "description": "Tag key to remove, can be specified multiple times",
1127
- "name": "key",
1128
- "required": true,
1129
- "hasDynamicHelp": false,
1130
- "multiple": true,
1131
- "type": "option"
1132
1052
  }
1133
1053
  },
1134
1054
  "hasDynamicHelp": false,
1135
1055
  "hiddenAliases": [],
1136
- "id": "devices:untag",
1056
+ "id": "kv:set",
1137
1057
  "pluginAlias": "@formant/formant-cli",
1138
1058
  "pluginName": "@formant/formant-cli",
1139
1059
  "pluginType": "core",
1140
1060
  "strict": true,
1141
- "summary": "Remove tags from a device",
1061
+ "summary": "Set key-value",
1142
1062
  "enableJsonFlag": true,
1143
1063
  "isESM": true,
1144
1064
  "relativePath": [
1145
1065
  "dist",
1146
1066
  "commands",
1147
- "devices",
1148
- "untag.js"
1067
+ "kv",
1068
+ "set.js"
1149
1069
  ]
1150
1070
  },
1151
- "event-triggers:get": {
1071
+ "ingest:batch": {
1152
1072
  "aliases": [],
1153
- "args": {
1154
- "id": {
1155
- "description": "Event trigger ID (UUID)",
1156
- "name": "id",
1157
- "required": true
1158
- }
1159
- },
1160
- "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.",
1073
+ "args": {},
1074
+ "description": "Ingest multiple data points in a single batch request.\n\nReads a JSON file (or stdin) containing a batch ingestion payload and sends all data points\nin a single API request. This is more efficient than sending individual data points when you\nhave multiple values to ingest.\n\nINPUT FORMAT:\nThe input JSON must have the following structure:\n{\n \"items\": [\n {\n \"deviceId\": \"device-uuid\", // Required: Device ID (UUID)\n \"name\": \"stream-name\", // Required: Stream name\n \"type\": \"numeric|text|json|...\", // Required: Data type (see below)\n \"tags\": {\"key\": \"value\"}, // Optional: Tags object (string key-value pairs)\n \"points\": [[timestamp_ms, value]] // Required: Array of [timestamp, value] pairs\n }\n ]\n}\n\nSUPPORTED TYPES AND VALUE FORMATS:\n- numeric: Number value\n Example: \"points\": [[1708272000000, 42.5]]\n\n- text: String value\n Example: \"points\": [[1708272000000, \"hello world\"]]\n\n- json: JSON object encoded as string\n Example: \"points\": [[1708272000000, \"{\\\"x\\\":10,\\\"y\\\":20}\"]]\n\n- image: Object with url (required), size and annotations (optional)\n Example: \"points\": [[1708272000000, {\"url\": \"https://example.com/img.jpg\", \"size\": 102400}]]\n\n- video: Object with url, duration, mimeType (required), size (optional)\n Example: \"points\": [[1708272000000, {\"url\": \"https://example.com/vid.mp4\", \"duration\": 30000, \"mimeType\": \"video/mp4\"}]]\n\n- bitset: Object with keys array and values array (1-1000 pairs)\n Example: \"points\": [[1708272000000, {\"keys\": [\"door\", \"window\"], \"values\": [true, false]}]]\n\n- health: Object with status (required) and clockSkewMs (optional)\n Example: \"points\": [[1708272000000, {\"status\": \"operational\", \"clockSkewMs\": 150}]]\n Valid status values: \"unknown\", \"operational\", \"offline\", \"error\"\n\nEach item can have multiple points (timestamp/value pairs) for the same stream.\nTimestamps are Unix milliseconds (use Date.now() for current time).",
1161
1075
  "examples": [
1162
- "<%= config.bin %> event-triggers get <trigger-id>",
1163
- "<%= config.bin %> event-triggers get <trigger-id> --json"
1076
+ "<%= config.bin %> ingest batch --file data.json",
1077
+ "<%= config.bin %> ingest batch --stdin < data.json",
1078
+ "cat payload.json | <%= config.bin %> ingest batch --stdin",
1079
+ "# Example payload.json with multiple types:\n{\n \"items\": [\n {\n \"deviceId\": \"abc-123\",\n \"name\": \"battery_level\",\n \"type\": \"numeric\",\n \"tags\": {\"env\": \"prod\"},\n \"points\": [[1708272000000, 42.5], [1708272060000, 41.8]]\n },\n {\n \"deviceId\": \"abc-123\",\n \"name\": \"status\",\n \"type\": \"text\",\n \"tags\": {\"env\": \"prod\"},\n \"points\": [[1708272000000, \"operational\"]]\n },\n {\n \"deviceId\": \"abc-123\",\n \"name\": \"health\",\n \"type\": \"health\",\n \"tags\": {},\n \"points\": [[1708272000000, {\"status\": \"operational\"}]]\n }\n ]\n}"
1164
1080
  ],
1165
1081
  "flags": {
1166
1082
  "json": {
@@ -1189,32 +1105,53 @@
1189
1105
  "name": "stage",
1190
1106
  "allowNo": false,
1191
1107
  "type": "boolean"
1108
+ },
1109
+ "file": {
1110
+ "char": "f",
1111
+ "description": "Path to JSON file containing batch payload",
1112
+ "exclusive": [
1113
+ "stdin"
1114
+ ],
1115
+ "name": "file",
1116
+ "hasDynamicHelp": false,
1117
+ "multiple": false,
1118
+ "type": "option"
1119
+ },
1120
+ "stdin": {
1121
+ "description": "Read JSON payload from stdin",
1122
+ "exclusive": [
1123
+ "file"
1124
+ ],
1125
+ "name": "stdin",
1126
+ "allowNo": false,
1127
+ "type": "boolean"
1192
1128
  }
1193
1129
  },
1194
1130
  "hasDynamicHelp": false,
1195
1131
  "hiddenAliases": [],
1196
- "id": "event-triggers:get",
1132
+ "id": "ingest:batch",
1197
1133
  "pluginAlias": "@formant/formant-cli",
1198
1134
  "pluginName": "@formant/formant-cli",
1199
1135
  "pluginType": "core",
1200
1136
  "strict": true,
1201
- "summary": "Get event trigger details",
1137
+ "summary": "Ingest batch data from file or stdin",
1202
1138
  "enableJsonFlag": true,
1203
1139
  "isESM": true,
1204
1140
  "relativePath": [
1205
1141
  "dist",
1206
1142
  "commands",
1207
- "event-triggers",
1208
- "get.js"
1143
+ "ingest",
1144
+ "batch.js"
1209
1145
  ]
1210
1146
  },
1211
- "event-triggers:list": {
1147
+ "ingest:bitset": {
1212
1148
  "aliases": [],
1213
1149
  "args": {},
1214
- "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.",
1150
+ "description": "Ingest a bitset data point to a device stream.\n\nSends a bitset (array of named boolean values) to the specified device stream. A bitset\nconsists of parallel arrays of keys (strings) and values (booleans).\n\nBitsets are useful for representing sets of binary states, flags, or boolean sensor readings\nwhere you have multiple named on/off states.\n\nConstraints:\n- Must have 1-1000 key/value pairs\n- Keys must be max 255 characters each\n- Keys and values arrays must have the same length",
1215
1151
  "examples": [
1216
- "<%= config.bin %> event-triggers list",
1217
- "<%= config.bin %> event-triggers list --json"
1152
+ "<%= config.bin %> ingest bitset --device <device-id> --stream sensors --keys \"door,window,motion\" --values \"true,false,true\"",
1153
+ "<%= config.bin %> ingest bitset --device <device-id> --stream flags --keys \"active,paused,error\" --values \"true,false,false\" --tag system=main",
1154
+ "<%= config.bin %> ingest bitset --device <device-id> --stream states --keys \"a,b\" --values \"false,true\""
1218
1155
  ],
1219
1156
  "flags": {
1220
1157
  "json": {
@@ -1243,38 +1180,84 @@
1243
1180
  "name": "stage",
1244
1181
  "allowNo": false,
1245
1182
  "type": "boolean"
1183
+ },
1184
+ "device": {
1185
+ "char": "d",
1186
+ "description": "Device ID (UUID)",
1187
+ "name": "device",
1188
+ "required": true,
1189
+ "hasDynamicHelp": false,
1190
+ "multiple": false,
1191
+ "type": "option"
1192
+ },
1193
+ "stream": {
1194
+ "char": "s",
1195
+ "description": "Stream name",
1196
+ "name": "stream",
1197
+ "required": true,
1198
+ "hasDynamicHelp": false,
1199
+ "multiple": false,
1200
+ "type": "option"
1201
+ },
1202
+ "keys": {
1203
+ "char": "k",
1204
+ "description": "Comma-separated list of key names (1-1000 keys, max 255 chars each)",
1205
+ "name": "keys",
1206
+ "required": true,
1207
+ "hasDynamicHelp": false,
1208
+ "multiple": false,
1209
+ "type": "option"
1210
+ },
1211
+ "values": {
1212
+ "char": "v",
1213
+ "description": "Comma-separated list of boolean values (true/false, must match key count)",
1214
+ "name": "values",
1215
+ "required": true,
1216
+ "hasDynamicHelp": false,
1217
+ "multiple": false,
1218
+ "type": "option"
1219
+ },
1220
+ "tag": {
1221
+ "char": "t",
1222
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1223
+ "name": "tag",
1224
+ "hasDynamicHelp": false,
1225
+ "multiple": true,
1226
+ "type": "option"
1227
+ },
1228
+ "timestamp": {
1229
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1230
+ "name": "timestamp",
1231
+ "hasDynamicHelp": false,
1232
+ "multiple": false,
1233
+ "type": "option"
1246
1234
  }
1247
1235
  },
1248
1236
  "hasDynamicHelp": false,
1249
1237
  "hiddenAliases": [],
1250
- "id": "event-triggers:list",
1238
+ "id": "ingest:bitset",
1251
1239
  "pluginAlias": "@formant/formant-cli",
1252
1240
  "pluginName": "@formant/formant-cli",
1253
1241
  "pluginType": "core",
1254
1242
  "strict": true,
1255
- "summary": "List event trigger rules",
1243
+ "summary": "Ingest bitset data",
1256
1244
  "enableJsonFlag": true,
1257
1245
  "isESM": true,
1258
1246
  "relativePath": [
1259
1247
  "dist",
1260
1248
  "commands",
1261
- "event-triggers",
1262
- "list.js"
1249
+ "ingest",
1250
+ "bitset.js"
1263
1251
  ]
1264
1252
  },
1265
- "events:get": {
1253
+ "ingest:health": {
1266
1254
  "aliases": [],
1267
- "args": {
1268
- "id": {
1269
- "description": "Event ID (UUID)",
1270
- "name": "id",
1271
- "required": true
1272
- }
1273
- },
1274
- "description": "Get detailed information about a specific event by its ID.",
1255
+ "args": {},
1256
+ "description": "Ingest a health status data point to a device stream.\n\nSends device health status information to the specified stream. Health data consists of:\n- status: One of \"unknown\", \"operational\", \"offline\", or \"error\"\n- clockSkewMs (optional): Clock skew in milliseconds between device and server\n\nHealth streams are used to track device operational state, system health, and time synchronization.",
1275
1257
  "examples": [
1276
- "<%= config.bin %> events get <event-id>",
1277
- "<%= config.bin %> events get <event-id> --json"
1258
+ "<%= config.bin %> ingest health --device <device-id> --stream system_health --status operational",
1259
+ "<%= config.bin %> ingest health --device <device-id> --stream health --status error --tag component=motor",
1260
+ "<%= config.bin %> ingest health --device <device-id> --stream sync --status operational --clock-skew 150"
1278
1261
  ],
1279
1262
  "flags": {
1280
1263
  "json": {
@@ -1303,34 +1286,87 @@
1303
1286
  "name": "stage",
1304
1287
  "allowNo": false,
1305
1288
  "type": "boolean"
1289
+ },
1290
+ "device": {
1291
+ "char": "d",
1292
+ "description": "Device ID (UUID)",
1293
+ "name": "device",
1294
+ "required": true,
1295
+ "hasDynamicHelp": false,
1296
+ "multiple": false,
1297
+ "type": "option"
1298
+ },
1299
+ "stream": {
1300
+ "char": "s",
1301
+ "description": "Stream name",
1302
+ "name": "stream",
1303
+ "required": true,
1304
+ "hasDynamicHelp": false,
1305
+ "multiple": false,
1306
+ "type": "option"
1307
+ },
1308
+ "status": {
1309
+ "description": "Health status (unknown, operational, offline, or error)",
1310
+ "name": "status",
1311
+ "required": true,
1312
+ "hasDynamicHelp": false,
1313
+ "multiple": false,
1314
+ "options": [
1315
+ "unknown",
1316
+ "operational",
1317
+ "offline",
1318
+ "error"
1319
+ ],
1320
+ "type": "option"
1321
+ },
1322
+ "clock-skew": {
1323
+ "description": "Clock skew in milliseconds (optional)",
1324
+ "name": "clock-skew",
1325
+ "hasDynamicHelp": false,
1326
+ "multiple": false,
1327
+ "type": "option"
1328
+ },
1329
+ "tag": {
1330
+ "char": "t",
1331
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1332
+ "name": "tag",
1333
+ "hasDynamicHelp": false,
1334
+ "multiple": true,
1335
+ "type": "option"
1336
+ },
1337
+ "timestamp": {
1338
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1339
+ "name": "timestamp",
1340
+ "hasDynamicHelp": false,
1341
+ "multiple": false,
1342
+ "type": "option"
1306
1343
  }
1307
1344
  },
1308
1345
  "hasDynamicHelp": false,
1309
1346
  "hiddenAliases": [],
1310
- "id": "events:get",
1347
+ "id": "ingest:health",
1311
1348
  "pluginAlias": "@formant/formant-cli",
1312
1349
  "pluginName": "@formant/formant-cli",
1313
1350
  "pluginType": "core",
1314
1351
  "strict": true,
1315
- "summary": "Get an event by ID",
1352
+ "summary": "Ingest health status data",
1316
1353
  "enableJsonFlag": true,
1317
1354
  "isESM": true,
1318
1355
  "relativePath": [
1319
1356
  "dist",
1320
1357
  "commands",
1321
- "events",
1322
- "get.js"
1358
+ "ingest",
1359
+ "health.js"
1323
1360
  ]
1324
1361
  },
1325
- "events:list": {
1362
+ "ingest:image": {
1326
1363
  "aliases": [],
1327
1364
  "args": {},
1328
- "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.",
1365
+ "description": "Ingest an image URL to a device stream.\n\nSends an image reference (by URL) to the specified device stream. The image must be accessible\nvia HTTP/HTTPS. Formant will fetch and store the image from the provided URL.\n\nImage streams are used for camera feeds, snapshots, diagnostic images, etc.",
1329
1366
  "examples": [
1330
- "<%= config.bin %> events list",
1331
- "<%= config.bin %> events list --device <id> --severity critical",
1332
- "<%= config.bin %> events list --type device-offline --start 2026-01-01 --end 2026-01-02",
1333
- "<%= config.bin %> events list --limit 100 --json"
1367
+ "<%= config.bin %> ingest image --device <device-id> --stream camera_front --url https://example.com/image.jpg",
1368
+ "<%= config.bin %> ingest image --device <device-id> --stream snapshot --url https://example.com/snap.png --size 1024000",
1369
+ "<%= config.bin %> ingest image --device <device-id> --stream detection --url https://example.com/detect.jpg --tag frame=123"
1334
1370
  ],
1335
1371
  "flags": {
1336
1372
  "json": {
@@ -1362,51 +1398,49 @@
1362
1398
  },
1363
1399
  "device": {
1364
1400
  "char": "d",
1365
- "description": "Filter by device ID",
1401
+ "description": "Device ID (UUID)",
1366
1402
  "name": "device",
1403
+ "required": true,
1367
1404
  "hasDynamicHelp": false,
1368
1405
  "multiple": false,
1369
1406
  "type": "option"
1370
1407
  },
1371
- "end": {
1372
- "description": "End time (ISO 8601)",
1373
- "name": "end",
1408
+ "stream": {
1409
+ "char": "s",
1410
+ "description": "Stream name",
1411
+ "name": "stream",
1412
+ "required": true,
1374
1413
  "hasDynamicHelp": false,
1375
1414
  "multiple": false,
1376
1415
  "type": "option"
1377
1416
  },
1378
- "limit": {
1379
- "char": "l",
1380
- "description": "Maximum number of events to return",
1381
- "name": "limit",
1382
- "default": 25,
1417
+ "url": {
1418
+ "char": "u",
1419
+ "description": "Image URL (must be http:// or https://)",
1420
+ "name": "url",
1421
+ "required": true,
1383
1422
  "hasDynamicHelp": false,
1384
1423
  "multiple": false,
1385
1424
  "type": "option"
1386
1425
  },
1387
- "severity": {
1388
- "description": "Filter by severity",
1389
- "name": "severity",
1426
+ "size": {
1427
+ "description": "Image size in bytes (optional)",
1428
+ "name": "size",
1390
1429
  "hasDynamicHelp": false,
1391
1430
  "multiple": false,
1392
- "options": [
1393
- "info",
1394
- "warning",
1395
- "error",
1396
- "critical"
1397
- ],
1398
1431
  "type": "option"
1399
1432
  },
1400
- "start": {
1401
- "description": "Start time (ISO 8601)",
1402
- "name": "start",
1433
+ "tag": {
1434
+ "char": "t",
1435
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1436
+ "name": "tag",
1403
1437
  "hasDynamicHelp": false,
1404
- "multiple": false,
1438
+ "multiple": true,
1405
1439
  "type": "option"
1406
1440
  },
1407
- "type": {
1408
- "description": "Filter by event type",
1409
- "name": "type",
1441
+ "timestamp": {
1442
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1443
+ "name": "timestamp",
1410
1444
  "hasDynamicHelp": false,
1411
1445
  "multiple": false,
1412
1446
  "type": "option"
@@ -1414,30 +1448,35 @@
1414
1448
  },
1415
1449
  "hasDynamicHelp": false,
1416
1450
  "hiddenAliases": [],
1417
- "id": "events:list",
1451
+ "id": "ingest:image",
1418
1452
  "pluginAlias": "@formant/formant-cli",
1419
1453
  "pluginName": "@formant/formant-cli",
1420
1454
  "pluginType": "core",
1421
1455
  "strict": true,
1422
- "summary": "View events emitted by devices",
1456
+ "summary": "Ingest image data",
1423
1457
  "enableJsonFlag": true,
1424
1458
  "isESM": true,
1425
1459
  "relativePath": [
1426
1460
  "dist",
1427
1461
  "commands",
1428
- "events",
1429
- "list.js"
1462
+ "ingest",
1463
+ "image.js"
1430
1464
  ]
1431
1465
  },
1432
- "ingest:batch": {
1466
+ "ingest:json": {
1433
1467
  "aliases": [],
1434
- "args": {},
1435
- "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).",
1468
+ "args": {
1469
+ "value": {
1470
+ "description": "JSON value to ingest (as a JSON string)",
1471
+ "name": "value",
1472
+ "required": true
1473
+ }
1474
+ },
1475
+ "description": "Ingest a JSON data point to a device stream.\n\nSends structured JSON data to the specified device stream. The value must be valid JSON.\nJSON streams are used for complex structured data like configuration objects, state machines,\nnested telemetry, etc.\n\nNote: The JSON is sent as a JSON-encoded string to Formant.",
1436
1476
  "examples": [
1437
- "<%= config.bin %> ingest batch --file data.json",
1438
- "<%= config.bin %> ingest batch --stdin < data.json",
1439
- "cat payload.json | <%= config.bin %> ingest batch --stdin",
1440
- "# 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}"
1477
+ "<%= config.bin %> ingest json '{\"x\":1,\"y\":2}' --device <device-id> --stream position",
1478
+ "<%= config.bin %> ingest json '{\"status\":\"active\",\"mode\":\"auto\"}' --device <device-id> --stream config",
1479
+ "<%= config.bin %> ingest json '[1,2,3,4,5]' --device <device-id> --stream array_data"
1441
1480
  ],
1442
1481
  "flags": {
1443
1482
  "json": {
@@ -1467,52 +1506,71 @@
1467
1506
  "allowNo": false,
1468
1507
  "type": "boolean"
1469
1508
  },
1470
- "file": {
1471
- "char": "f",
1472
- "description": "Path to JSON file containing batch payload",
1473
- "exclusive": [
1474
- "stdin"
1475
- ],
1476
- "name": "file",
1509
+ "device": {
1510
+ "char": "d",
1511
+ "description": "Device ID (UUID)",
1512
+ "name": "device",
1513
+ "required": true,
1477
1514
  "hasDynamicHelp": false,
1478
1515
  "multiple": false,
1479
1516
  "type": "option"
1480
1517
  },
1481
- "stdin": {
1482
- "description": "Read JSON payload from stdin",
1483
- "exclusive": [
1484
- "file"
1485
- ],
1486
- "name": "stdin",
1487
- "allowNo": false,
1488
- "type": "boolean"
1518
+ "stream": {
1519
+ "char": "s",
1520
+ "description": "Stream name",
1521
+ "name": "stream",
1522
+ "required": true,
1523
+ "hasDynamicHelp": false,
1524
+ "multiple": false,
1525
+ "type": "option"
1526
+ },
1527
+ "tag": {
1528
+ "char": "t",
1529
+ "description": "Tag as key=value where both are strings (can be specified multiple times)",
1530
+ "name": "tag",
1531
+ "hasDynamicHelp": false,
1532
+ "multiple": true,
1533
+ "type": "option"
1534
+ },
1535
+ "timestamp": {
1536
+ "description": "Unix timestamp in milliseconds (defaults to now)",
1537
+ "name": "timestamp",
1538
+ "hasDynamicHelp": false,
1539
+ "multiple": false,
1540
+ "type": "option"
1489
1541
  }
1490
1542
  },
1491
1543
  "hasDynamicHelp": false,
1492
1544
  "hiddenAliases": [],
1493
- "id": "ingest:batch",
1545
+ "id": "ingest:json",
1494
1546
  "pluginAlias": "@formant/formant-cli",
1495
1547
  "pluginName": "@formant/formant-cli",
1496
1548
  "pluginType": "core",
1497
1549
  "strict": true,
1498
- "summary": "Ingest batch data from file or stdin",
1550
+ "summary": "Ingest JSON data",
1499
1551
  "enableJsonFlag": true,
1500
1552
  "isESM": true,
1501
1553
  "relativePath": [
1502
1554
  "dist",
1503
1555
  "commands",
1504
1556
  "ingest",
1505
- "batch.js"
1557
+ "json.js"
1506
1558
  ]
1507
1559
  },
1508
- "ingest:bitset": {
1560
+ "ingest:numeric": {
1509
1561
  "aliases": [],
1510
- "args": {},
1511
- "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",
1562
+ "args": {
1563
+ "value": {
1564
+ "description": "Numeric value to ingest",
1565
+ "name": "value",
1566
+ "required": true
1567
+ }
1568
+ },
1569
+ "description": "Ingest a numeric data point to a device stream.\n\nSends a single numeric value to the specified device stream. The value must be a valid number.\nNumeric streams are commonly used for sensor readings like battery level, temperature, speed, etc.",
1512
1570
  "examples": [
1513
- "<%= config.bin %> ingest bitset --device <device-id> --stream sensors --keys \"door,window,motion\" --values \"true,false,true\"",
1514
- "<%= config.bin %> ingest bitset --device <device-id> --stream flags --keys \"active,paused,error\" --values \"true,false,false\" --tag system=main",
1515
- "<%= config.bin %> ingest bitset --device <device-id> --stream states --keys \"a,b\" --values \"false,true\""
1571
+ "<%= config.bin %> ingest numeric 42.5 --device <device-id> --stream battery_level",
1572
+ "<%= config.bin %> ingest numeric 98.6 --device <device-id> --stream temperature --tag unit=fahrenheit",
1573
+ "<%= config.bin %> ingest numeric 1500 --device <device-id> --stream rpm --timestamp 1700000000000"
1516
1574
  ],
1517
1575
  "flags": {
1518
1576
  "json": {
@@ -1560,24 +1618,6 @@
1560
1618
  "multiple": false,
1561
1619
  "type": "option"
1562
1620
  },
1563
- "keys": {
1564
- "char": "k",
1565
- "description": "Comma-separated list of key names (1-1000 keys, max 255 chars each)",
1566
- "name": "keys",
1567
- "required": true,
1568
- "hasDynamicHelp": false,
1569
- "multiple": false,
1570
- "type": "option"
1571
- },
1572
- "values": {
1573
- "char": "v",
1574
- "description": "Comma-separated list of boolean values (true/false, must match key count)",
1575
- "name": "values",
1576
- "required": true,
1577
- "hasDynamicHelp": false,
1578
- "multiple": false,
1579
- "type": "option"
1580
- },
1581
1621
  "tag": {
1582
1622
  "char": "t",
1583
1623
  "description": "Tag as key=value where both are strings (can be specified multiple times)",
@@ -1596,31 +1636,37 @@
1596
1636
  },
1597
1637
  "hasDynamicHelp": false,
1598
1638
  "hiddenAliases": [],
1599
- "id": "ingest:bitset",
1639
+ "id": "ingest:numeric",
1600
1640
  "pluginAlias": "@formant/formant-cli",
1601
1641
  "pluginName": "@formant/formant-cli",
1602
1642
  "pluginType": "core",
1603
1643
  "strict": true,
1604
- "summary": "Ingest bitset data",
1644
+ "summary": "Ingest numeric data",
1605
1645
  "enableJsonFlag": true,
1606
1646
  "isESM": true,
1607
1647
  "relativePath": [
1608
1648
  "dist",
1609
1649
  "commands",
1610
1650
  "ingest",
1611
- "bitset.js"
1651
+ "numeric.js"
1612
1652
  ]
1613
1653
  },
1614
- "ingest:health": {
1654
+ "ingest:text": {
1615
1655
  "aliases": [],
1616
- "args": {},
1617
- "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.",
1618
- "examples": [
1619
- "<%= config.bin %> ingest health --device <device-id> --stream system_health --status operational",
1620
- "<%= config.bin %> ingest health --device <device-id> --stream health --status error --tag component=motor",
1621
- "<%= config.bin %> ingest health --device <device-id> --stream sync --status operational --clock-skew 150"
1622
- ],
1623
- "flags": {
1656
+ "args": {
1657
+ "value": {
1658
+ "description": "Text value to ingest",
1659
+ "name": "value",
1660
+ "required": true
1661
+ }
1662
+ },
1663
+ "description": "Ingest a text data point to a device stream.\n\nSends a single text/string value to the specified device stream. Text streams are commonly\nused for logs, status messages, error messages, and other string data.",
1664
+ "examples": [
1665
+ "<%= config.bin %> ingest text \"Robot started successfully\" --device <device-id> --stream status",
1666
+ "<%= config.bin %> ingest text \"Error: sensor offline\" --device <device-id> --stream errors --tag severity=high",
1667
+ "<%= config.bin %> ingest text \"Checkpoint A reached\" --device <device-id> --stream waypoints"
1668
+ ],
1669
+ "flags": {
1624
1670
  "json": {
1625
1671
  "description": "Format output as json.",
1626
1672
  "helpGroup": "GLOBAL",
@@ -1666,27 +1712,6 @@
1666
1712
  "multiple": false,
1667
1713
  "type": "option"
1668
1714
  },
1669
- "status": {
1670
- "description": "Health status (unknown, operational, offline, or error)",
1671
- "name": "status",
1672
- "required": true,
1673
- "hasDynamicHelp": false,
1674
- "multiple": false,
1675
- "options": [
1676
- "unknown",
1677
- "operational",
1678
- "offline",
1679
- "error"
1680
- ],
1681
- "type": "option"
1682
- },
1683
- "clock-skew": {
1684
- "description": "Clock skew in milliseconds (optional)",
1685
- "name": "clock-skew",
1686
- "hasDynamicHelp": false,
1687
- "multiple": false,
1688
- "type": "option"
1689
- },
1690
1715
  "tag": {
1691
1716
  "char": "t",
1692
1717
  "description": "Tag as key=value where both are strings (can be specified multiple times)",
@@ -1705,29 +1730,29 @@
1705
1730
  },
1706
1731
  "hasDynamicHelp": false,
1707
1732
  "hiddenAliases": [],
1708
- "id": "ingest:health",
1733
+ "id": "ingest:text",
1709
1734
  "pluginAlias": "@formant/formant-cli",
1710
1735
  "pluginName": "@formant/formant-cli",
1711
1736
  "pluginType": "core",
1712
1737
  "strict": true,
1713
- "summary": "Ingest health status data",
1738
+ "summary": "Ingest text data",
1714
1739
  "enableJsonFlag": true,
1715
1740
  "isESM": true,
1716
1741
  "relativePath": [
1717
1742
  "dist",
1718
1743
  "commands",
1719
1744
  "ingest",
1720
- "health.js"
1745
+ "text.js"
1721
1746
  ]
1722
1747
  },
1723
- "ingest:image": {
1748
+ "ingest:video": {
1724
1749
  "aliases": [],
1725
1750
  "args": {},
1726
- "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.",
1751
+ "description": "Ingest a video URL to a device stream.\n\nSends a video reference (by URL) to the specified device stream. The video must be accessible\nvia HTTP/HTTPS. You must provide the video duration in milliseconds.\n\nVideo streams are used for recorded video clips, timelapse videos, event recordings, etc.\n\nThe MIME type is auto-detected from the file extension (.mp4, .webm, .mov).",
1727
1752
  "examples": [
1728
- "<%= config.bin %> ingest image --device <device-id> --stream camera_front --url https://example.com/image.jpg",
1729
- "<%= config.bin %> ingest image --device <device-id> --stream snapshot --url https://example.com/snap.png --size 1024000",
1730
- "<%= config.bin %> ingest image --device <device-id> --stream detection --url https://example.com/detect.jpg --tag frame=123"
1753
+ "<%= config.bin %> ingest video --device <device-id> --stream recordings --url https://example.com/video.mp4 --duration 5000",
1754
+ "<%= config.bin %> ingest video --device <device-id> --stream clips --url https://example.com/clip.webm --duration 3500 --size 2048000",
1755
+ "<%= config.bin %> ingest video --device <device-id> --stream event_video --url https://example.com/event.mov --duration 10000 --tag event=collision"
1731
1756
  ],
1732
1757
  "flags": {
1733
1758
  "json": {
@@ -1777,15 +1802,23 @@
1777
1802
  },
1778
1803
  "url": {
1779
1804
  "char": "u",
1780
- "description": "Image URL (must be http:// or https://)",
1805
+ "description": "Video URL (must be http:// or https://)",
1781
1806
  "name": "url",
1782
1807
  "required": true,
1783
1808
  "hasDynamicHelp": false,
1784
1809
  "multiple": false,
1785
1810
  "type": "option"
1786
1811
  },
1812
+ "duration": {
1813
+ "description": "Video duration in milliseconds (required)",
1814
+ "name": "duration",
1815
+ "required": true,
1816
+ "hasDynamicHelp": false,
1817
+ "multiple": false,
1818
+ "type": "option"
1819
+ },
1787
1820
  "size": {
1788
- "description": "Image size in bytes (optional)",
1821
+ "description": "Video size in bytes (optional)",
1789
1822
  "name": "size",
1790
1823
  "hasDynamicHelp": false,
1791
1824
  "multiple": false,
@@ -1809,35 +1842,84 @@
1809
1842
  },
1810
1843
  "hasDynamicHelp": false,
1811
1844
  "hiddenAliases": [],
1812
- "id": "ingest:image",
1845
+ "id": "ingest:video",
1813
1846
  "pluginAlias": "@formant/formant-cli",
1814
1847
  "pluginName": "@formant/formant-cli",
1815
1848
  "pluginType": "core",
1816
1849
  "strict": true,
1817
- "summary": "Ingest image data",
1850
+ "summary": "Ingest video data",
1818
1851
  "enableJsonFlag": true,
1819
1852
  "isESM": true,
1820
1853
  "relativePath": [
1821
1854
  "dist",
1822
1855
  "commands",
1823
1856
  "ingest",
1824
- "image.js"
1857
+ "video.js"
1825
1858
  ]
1826
1859
  },
1827
- "ingest:json": {
1860
+ "org:get": {
1828
1861
  "aliases": [],
1829
- "args": {
1830
- "value": {
1831
- "description": "JSON value to ingest (as a JSON string)",
1832
- "name": "value",
1833
- "required": true
1862
+ "args": {},
1863
+ "description": "Get information about your organization.\n\nDisplays the organization associated with your authenticated account.\nNo ID is needed — it is resolved automatically from your credentials.",
1864
+ "examples": [
1865
+ "<%= config.bin %> org get",
1866
+ "<%= config.bin %> org get --json"
1867
+ ],
1868
+ "flags": {
1869
+ "json": {
1870
+ "description": "Format output as json.",
1871
+ "helpGroup": "GLOBAL",
1872
+ "name": "json",
1873
+ "allowNo": false,
1874
+ "type": "boolean"
1875
+ },
1876
+ "dev": {
1877
+ "description": "Target the dev environment",
1878
+ "exclusive": [
1879
+ "stage"
1880
+ ],
1881
+ "helpGroup": "GLOBAL",
1882
+ "name": "dev",
1883
+ "allowNo": false,
1884
+ "type": "boolean"
1885
+ },
1886
+ "stage": {
1887
+ "description": "Target the stage environment",
1888
+ "exclusive": [
1889
+ "dev"
1890
+ ],
1891
+ "helpGroup": "GLOBAL",
1892
+ "name": "stage",
1893
+ "allowNo": false,
1894
+ "type": "boolean"
1834
1895
  }
1835
1896
  },
1836
- "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.",
1897
+ "hasDynamicHelp": false,
1898
+ "hiddenAliases": [],
1899
+ "id": "org:get",
1900
+ "pluginAlias": "@formant/formant-cli",
1901
+ "pluginName": "@formant/formant-cli",
1902
+ "pluginType": "core",
1903
+ "strict": true,
1904
+ "summary": "Get your organization",
1905
+ "enableJsonFlag": true,
1906
+ "isESM": true,
1907
+ "relativePath": [
1908
+ "dist",
1909
+ "commands",
1910
+ "org",
1911
+ "get.js"
1912
+ ]
1913
+ },
1914
+ "org:update": {
1915
+ "aliases": [],
1916
+ "args": {},
1917
+ "description": "Update your organization's details.\n\nAt least one of --name or --description must be provided.",
1837
1918
  "examples": [
1838
- "<%= config.bin %> ingest json '{\"x\":1,\"y\":2}' --device <device-id> --stream position",
1839
- "<%= config.bin %> ingest json '{\"status\":\"active\",\"mode\":\"auto\"}' --device <device-id> --stream config",
1840
- "<%= config.bin %> ingest json '[1,2,3,4,5]' --device <device-id> --stream array_data"
1919
+ "<%= config.bin %> org update --name \"My Fleet\"",
1920
+ "<%= config.bin %> org update --description \"Production robot fleet\"",
1921
+ "<%= config.bin %> org update --name \"My Fleet\" --description \"Production robot fleet\"",
1922
+ "<%= config.bin %> org update --name \"My Fleet\" --json"
1841
1923
  ],
1842
1924
  "flags": {
1843
1925
  "json": {
@@ -1867,35 +1949,18 @@
1867
1949
  "allowNo": false,
1868
1950
  "type": "boolean"
1869
1951
  },
1870
- "device": {
1952
+ "description": {
1871
1953
  "char": "d",
1872
- "description": "Device ID (UUID)",
1873
- "name": "device",
1874
- "required": true,
1875
- "hasDynamicHelp": false,
1876
- "multiple": false,
1877
- "type": "option"
1878
- },
1879
- "stream": {
1880
- "char": "s",
1881
- "description": "Stream name",
1882
- "name": "stream",
1883
- "required": true,
1954
+ "description": "New description for the organization",
1955
+ "name": "description",
1884
1956
  "hasDynamicHelp": false,
1885
1957
  "multiple": false,
1886
1958
  "type": "option"
1887
1959
  },
1888
- "tag": {
1889
- "char": "t",
1890
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
1891
- "name": "tag",
1892
- "hasDynamicHelp": false,
1893
- "multiple": true,
1894
- "type": "option"
1895
- },
1896
- "timestamp": {
1897
- "description": "Unix timestamp in milliseconds (defaults to now)",
1898
- "name": "timestamp",
1960
+ "name": {
1961
+ "char": "n",
1962
+ "description": "New name for the organization",
1963
+ "name": "name",
1899
1964
  "hasDynamicHelp": false,
1900
1965
  "multiple": false,
1901
1966
  "type": "option"
@@ -1903,35 +1968,29 @@
1903
1968
  },
1904
1969
  "hasDynamicHelp": false,
1905
1970
  "hiddenAliases": [],
1906
- "id": "ingest:json",
1971
+ "id": "org:update",
1907
1972
  "pluginAlias": "@formant/formant-cli",
1908
1973
  "pluginName": "@formant/formant-cli",
1909
1974
  "pluginType": "core",
1910
1975
  "strict": true,
1911
- "summary": "Ingest JSON data",
1976
+ "summary": "Update your organization",
1912
1977
  "enableJsonFlag": true,
1913
1978
  "isESM": true,
1914
1979
  "relativePath": [
1915
1980
  "dist",
1916
1981
  "commands",
1917
- "ingest",
1918
- "json.js"
1982
+ "org",
1983
+ "update.js"
1919
1984
  ]
1920
1985
  },
1921
- "ingest:numeric": {
1986
+ "investigation:analytics": {
1922
1987
  "aliases": [],
1923
- "args": {
1924
- "value": {
1925
- "description": "Numeric value to ingest",
1926
- "name": "value",
1927
- "required": true
1928
- }
1929
- },
1930
- "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.",
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.",
1931
1990
  "examples": [
1932
- "<%= config.bin %> ingest numeric 42.5 --device <device-id> --stream battery_level",
1933
- "<%= config.bin %> ingest numeric 98.6 --device <device-id> --stream temperature --tag unit=fahrenheit",
1934
- "<%= config.bin %> ingest numeric 1500 --device <device-id> --stream rpm --timestamp 1700000000000"
1991
+ "<%= config.bin %> investigation analytics --start 2026-01-01 --end 2026-02-01",
1992
+ "<%= config.bin %> investigation analytics --start 2026-01-01 --end 2026-02-01 --interval hourly",
1993
+ "<%= config.bin %> investigation analytics --start 2026-01-01 --end 2026-02-01 --group-by resultType --json"
1935
1994
  ],
1936
1995
  "flags": {
1937
1996
  "json": {
@@ -1961,35 +2020,41 @@
1961
2020
  "allowNo": false,
1962
2021
  "type": "boolean"
1963
2022
  },
1964
- "device": {
1965
- "char": "d",
1966
- "description": "Device ID (UUID)",
1967
- "name": "device",
2023
+ "end": {
2024
+ "description": "End time (ISO 8601)",
2025
+ "name": "end",
1968
2026
  "required": true,
1969
2027
  "hasDynamicHelp": false,
1970
2028
  "multiple": false,
1971
2029
  "type": "option"
1972
2030
  },
1973
- "stream": {
1974
- "char": "s",
1975
- "description": "Stream name",
1976
- "name": "stream",
1977
- "required": true,
2031
+ "group-by": {
2032
+ "description": "Group results by",
2033
+ "name": "group-by",
1978
2034
  "hasDynamicHelp": false,
1979
2035
  "multiple": false,
2036
+ "options": [
2037
+ "resultType",
2038
+ "signalType"
2039
+ ],
1980
2040
  "type": "option"
1981
2041
  },
1982
- "tag": {
1983
- "char": "t",
1984
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
1985
- "name": "tag",
2042
+ "interval": {
2043
+ "description": "Time interval for aggregation",
2044
+ "name": "interval",
2045
+ "default": "daily",
1986
2046
  "hasDynamicHelp": false,
1987
- "multiple": true,
2047
+ "multiple": false,
2048
+ "options": [
2049
+ "daily",
2050
+ "hourly"
2051
+ ],
1988
2052
  "type": "option"
1989
2053
  },
1990
- "timestamp": {
1991
- "description": "Unix timestamp in milliseconds (defaults to now)",
1992
- "name": "timestamp",
2054
+ "start": {
2055
+ "description": "Start time (ISO 8601)",
2056
+ "name": "start",
2057
+ "required": true,
1993
2058
  "hasDynamicHelp": false,
1994
2059
  "multiple": false,
1995
2060
  "type": "option"
@@ -1997,35 +2062,34 @@
1997
2062
  },
1998
2063
  "hasDynamicHelp": false,
1999
2064
  "hiddenAliases": [],
2000
- "id": "ingest:numeric",
2065
+ "id": "investigation:analytics",
2001
2066
  "pluginAlias": "@formant/formant-cli",
2002
2067
  "pluginName": "@formant/formant-cli",
2003
2068
  "pluginType": "core",
2004
2069
  "strict": true,
2005
- "summary": "Ingest numeric data",
2070
+ "summary": "Get investigation analytics",
2006
2071
  "enableJsonFlag": true,
2007
2072
  "isESM": true,
2008
2073
  "relativePath": [
2009
2074
  "dist",
2010
2075
  "commands",
2011
- "ingest",
2012
- "numeric.js"
2076
+ "investigation",
2077
+ "analytics.js"
2013
2078
  ]
2014
2079
  },
2015
- "ingest:text": {
2080
+ "investigation:get": {
2016
2081
  "aliases": [],
2017
2082
  "args": {
2018
- "value": {
2019
- "description": "Text value to ingest",
2020
- "name": "value",
2083
+ "id": {
2084
+ "description": "Investigation (taskflow) ID",
2085
+ "name": "id",
2021
2086
  "required": true
2022
2087
  }
2023
2088
  },
2024
- "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.",
2089
+ "description": "Get detailed information about a specific investigation by ID.",
2025
2090
  "examples": [
2026
- "<%= config.bin %> ingest text \"Robot started successfully\" --device <device-id> --stream status",
2027
- "<%= config.bin %> ingest text \"Error: sensor offline\" --device <device-id> --stream errors --tag severity=high",
2028
- "<%= config.bin %> ingest text \"Checkpoint A reached\" --device <device-id> --stream waypoints"
2091
+ "<%= config.bin %> investigation get <id>",
2092
+ "<%= config.bin %> investigation get <id> --json"
2029
2093
  ],
2030
2094
  "flags": {
2031
2095
  "json": {
@@ -2054,66 +2118,105 @@
2054
2118
  "name": "stage",
2055
2119
  "allowNo": false,
2056
2120
  "type": "boolean"
2121
+ }
2122
+ },
2123
+ "hasDynamicHelp": false,
2124
+ "hiddenAliases": [],
2125
+ "id": "investigation:get",
2126
+ "pluginAlias": "@formant/formant-cli",
2127
+ "pluginName": "@formant/formant-cli",
2128
+ "pluginType": "core",
2129
+ "strict": true,
2130
+ "summary": "Get an investigation by ID",
2131
+ "enableJsonFlag": true,
2132
+ "isESM": true,
2133
+ "relativePath": [
2134
+ "dist",
2135
+ "commands",
2136
+ "investigation",
2137
+ "get.js"
2138
+ ]
2139
+ },
2140
+ "investigation:list": {
2141
+ "aliases": [],
2142
+ "args": {},
2143
+ "description": "List investigations (AI-powered analysis workflows) in your organization.\n\nInvestigations are automated AI workflows that analyze signals, diagnose problems,\nand produce reports. Use --signal-handler to filter for investigations that are\ntriggered automatically by signals.",
2144
+ "examples": [
2145
+ "<%= config.bin %> investigation list",
2146
+ "<%= config.bin %> investigation list --signal-handler",
2147
+ "<%= config.bin %> investigation list --json"
2148
+ ],
2149
+ "flags": {
2150
+ "json": {
2151
+ "description": "Format output as json.",
2152
+ "helpGroup": "GLOBAL",
2153
+ "name": "json",
2154
+ "allowNo": false,
2155
+ "type": "boolean"
2057
2156
  },
2058
- "device": {
2059
- "char": "d",
2060
- "description": "Device ID (UUID)",
2061
- "name": "device",
2062
- "required": true,
2063
- "hasDynamicHelp": false,
2064
- "multiple": false,
2065
- "type": "option"
2066
- },
2067
- "stream": {
2068
- "char": "s",
2069
- "description": "Stream name",
2070
- "name": "stream",
2071
- "required": true,
2072
- "hasDynamicHelp": false,
2073
- "multiple": false,
2074
- "type": "option"
2157
+ "dev": {
2158
+ "description": "Target the dev environment",
2159
+ "exclusive": [
2160
+ "stage"
2161
+ ],
2162
+ "helpGroup": "GLOBAL",
2163
+ "name": "dev",
2164
+ "allowNo": false,
2165
+ "type": "boolean"
2075
2166
  },
2076
- "tag": {
2077
- "char": "t",
2078
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
2079
- "name": "tag",
2080
- "hasDynamicHelp": false,
2081
- "multiple": true,
2082
- "type": "option"
2167
+ "stage": {
2168
+ "description": "Target the stage environment",
2169
+ "exclusive": [
2170
+ "dev"
2171
+ ],
2172
+ "helpGroup": "GLOBAL",
2173
+ "name": "stage",
2174
+ "allowNo": false,
2175
+ "type": "boolean"
2083
2176
  },
2084
- "timestamp": {
2085
- "description": "Unix timestamp in milliseconds (defaults to now)",
2086
- "name": "timestamp",
2087
- "hasDynamicHelp": false,
2088
- "multiple": false,
2089
- "type": "option"
2177
+ "signal-handler": {
2178
+ "description": "Only show investigations that handle signals",
2179
+ "name": "signal-handler",
2180
+ "allowNo": false,
2181
+ "type": "boolean"
2090
2182
  }
2091
2183
  },
2092
2184
  "hasDynamicHelp": false,
2093
2185
  "hiddenAliases": [],
2094
- "id": "ingest:text",
2186
+ "id": "investigation:list",
2095
2187
  "pluginAlias": "@formant/formant-cli",
2096
2188
  "pluginName": "@formant/formant-cli",
2097
2189
  "pluginType": "core",
2098
2190
  "strict": true,
2099
- "summary": "Ingest text data",
2191
+ "summary": "List investigations",
2100
2192
  "enableJsonFlag": true,
2101
2193
  "isESM": true,
2102
2194
  "relativePath": [
2103
2195
  "dist",
2104
2196
  "commands",
2105
- "ingest",
2106
- "text.js"
2197
+ "investigation",
2198
+ "list.js"
2107
2199
  ]
2108
2200
  },
2109
- "ingest:video": {
2201
+ "investigation:run": {
2110
2202
  "aliases": [],
2111
- "args": {},
2112
- "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).",
2203
+ "args": {
2204
+ "investigationId": {
2205
+ "description": "Investigation (taskflow) ID",
2206
+ "name": "investigationId",
2207
+ "required": true
2208
+ },
2209
+ "runId": {
2210
+ "description": "Run ID",
2211
+ "name": "runId",
2212
+ "required": true
2213
+ }
2214
+ },
2215
+ "description": "Get detailed information about a specific investigation run.\n\nShows run details including status, signal information, events, and the complete execution \nlog with node inputs/outputs, task messages, tool usage, and results.\n\nUse this to trace the investigation run back to its signal and triggering event.",
2113
2216
  "examples": [
2114
- "<%= config.bin %> ingest video --device <device-id> --stream recordings --url https://example.com/video.mp4 --duration 5000",
2115
- "<%= config.bin %> ingest video --device <device-id> --stream clips --url https://example.com/clip.webm --duration 3500 --size 2048000",
2116
- "<%= config.bin %> ingest video --device <device-id> --stream event_video --url https://example.com/event.mov --duration 10000 --tag event=collision"
2217
+ "<%= config.bin %> investigation run <investigation-id> <run-id>",
2218
+ "<%= config.bin %> investigation run <investigation-id> <run-id> --log-only",
2219
+ "<%= config.bin %> investigation run <investigation-id> <run-id> --json"
2117
2220
  ],
2118
2221
  "flags": {
2119
2222
  "json": {
@@ -2143,59 +2246,99 @@
2143
2246
  "allowNo": false,
2144
2247
  "type": "boolean"
2145
2248
  },
2146
- "device": {
2147
- "char": "d",
2148
- "description": "Device ID (UUID)",
2149
- "name": "device",
2150
- "required": true,
2151
- "hasDynamicHelp": false,
2152
- "multiple": false,
2153
- "type": "option"
2249
+ "log-only": {
2250
+ "description": "Only show the execution log (skip run details)",
2251
+ "name": "log-only",
2252
+ "allowNo": false,
2253
+ "type": "boolean"
2154
2254
  },
2155
- "stream": {
2156
- "char": "s",
2157
- "description": "Stream name",
2158
- "name": "stream",
2159
- "required": true,
2160
- "hasDynamicHelp": false,
2161
- "multiple": false,
2162
- "type": "option"
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"
2260
+ }
2261
+ },
2262
+ "hasDynamicHelp": false,
2263
+ "hiddenAliases": [],
2264
+ "id": "investigation:run",
2265
+ "pluginAlias": "@formant/formant-cli",
2266
+ "pluginName": "@formant/formant-cli",
2267
+ "pluginType": "core",
2268
+ "strict": true,
2269
+ "summary": "Get investigation run details and execution log",
2270
+ "enableJsonFlag": true,
2271
+ "isESM": true,
2272
+ "relativePath": [
2273
+ "dist",
2274
+ "commands",
2275
+ "investigation",
2276
+ "run.js"
2277
+ ]
2278
+ },
2279
+ "investigation:runs-list": {
2280
+ "aliases": [],
2281
+ "args": {
2282
+ "id": {
2283
+ "description": "Investigation (taskflow) ID",
2284
+ "name": "id",
2285
+ "required": true
2286
+ }
2287
+ },
2288
+ "description": "List actual investigation runs (not evaluation runs) for a specific investigation.\n\nShows runs with their status, signal IDs, and timestamps. Use 'investigations run' to see\ndetailed execution logs for a specific run.",
2289
+ "examples": [
2290
+ "<%= config.bin %> investigation runs-list <id>",
2291
+ "<%= config.bin %> investigation runs-list <id> --limit 50",
2292
+ "<%= config.bin %> investigation runs-list <id> --details --json"
2293
+ ],
2294
+ "flags": {
2295
+ "json": {
2296
+ "description": "Format output as json.",
2297
+ "helpGroup": "GLOBAL",
2298
+ "name": "json",
2299
+ "allowNo": false,
2300
+ "type": "boolean"
2163
2301
  },
2164
- "url": {
2165
- "char": "u",
2166
- "description": "Video URL (must be http:// or https://)",
2167
- "name": "url",
2168
- "required": true,
2169
- "hasDynamicHelp": false,
2170
- "multiple": false,
2171
- "type": "option"
2302
+ "dev": {
2303
+ "description": "Target the dev environment",
2304
+ "exclusive": [
2305
+ "stage"
2306
+ ],
2307
+ "helpGroup": "GLOBAL",
2308
+ "name": "dev",
2309
+ "allowNo": false,
2310
+ "type": "boolean"
2172
2311
  },
2173
- "duration": {
2174
- "description": "Video duration in milliseconds (required)",
2175
- "name": "duration",
2176
- "required": true,
2177
- "hasDynamicHelp": false,
2178
- "multiple": false,
2179
- "type": "option"
2312
+ "stage": {
2313
+ "description": "Target the stage environment",
2314
+ "exclusive": [
2315
+ "dev"
2316
+ ],
2317
+ "helpGroup": "GLOBAL",
2318
+ "name": "stage",
2319
+ "allowNo": false,
2320
+ "type": "boolean"
2180
2321
  },
2181
- "size": {
2182
- "description": "Video size in bytes (optional)",
2183
- "name": "size",
2184
- "hasDynamicHelp": false,
2185
- "multiple": false,
2186
- "type": "option"
2322
+ "details": {
2323
+ "description": "Include detailed information about each run",
2324
+ "name": "details",
2325
+ "allowNo": false,
2326
+ "type": "boolean"
2187
2327
  },
2188
- "tag": {
2189
- "char": "t",
2190
- "description": "Tag as key=value where both are strings (can be specified multiple times)",
2191
- "name": "tag",
2328
+ "limit": {
2329
+ "char": "l",
2330
+ "description": "Maximum number of runs to return",
2331
+ "name": "limit",
2332
+ "default": 20,
2192
2333
  "hasDynamicHelp": false,
2193
- "multiple": true,
2334
+ "multiple": false,
2194
2335
  "type": "option"
2195
2336
  },
2196
- "timestamp": {
2197
- "description": "Unix timestamp in milliseconds (defaults to now)",
2198
- "name": "timestamp",
2337
+ "offset": {
2338
+ "char": "o",
2339
+ "description": "Offset for pagination",
2340
+ "name": "offset",
2341
+ "default": 0,
2199
2342
  "hasDynamicHelp": false,
2200
2343
  "multiple": false,
2201
2344
  "type": "option"
@@ -2203,34 +2346,34 @@
2203
2346
  },
2204
2347
  "hasDynamicHelp": false,
2205
2348
  "hiddenAliases": [],
2206
- "id": "ingest:video",
2349
+ "id": "investigation:runs-list",
2207
2350
  "pluginAlias": "@formant/formant-cli",
2208
2351
  "pluginName": "@formant/formant-cli",
2209
2352
  "pluginType": "core",
2210
2353
  "strict": true,
2211
- "summary": "Ingest video data",
2354
+ "summary": "List actual investigation runs",
2212
2355
  "enableJsonFlag": true,
2213
2356
  "isESM": true,
2214
2357
  "relativePath": [
2215
2358
  "dist",
2216
2359
  "commands",
2217
- "ingest",
2218
- "video.js"
2360
+ "investigation",
2361
+ "runs-list.js"
2219
2362
  ]
2220
2363
  },
2221
- "kv:get": {
2364
+ "investigation:runs": {
2222
2365
  "aliases": [],
2223
2366
  "args": {
2224
- "key": {
2225
- "description": "Key to retrieve",
2226
- "name": "key",
2367
+ "id": {
2368
+ "description": "Investigation (taskflow) ID",
2369
+ "name": "id",
2227
2370
  "required": true
2228
2371
  }
2229
2372
  },
2230
- "description": "Get a value from the key-value store.\n\nThe key-value store allows devices and applications to store metadata.",
2373
+ "description": "List evaluation runs for a specific investigation.",
2231
2374
  "examples": [
2232
- "<%= config.bin %> kv get my-key",
2233
- "<%= config.bin %> kv get my-key --json"
2375
+ "<%= config.bin %> investigation runs <id>",
2376
+ "<%= config.bin %> investigation runs <id> --json"
2234
2377
  ],
2235
2378
  "flags": {
2236
2379
  "json": {
@@ -2263,30 +2406,28 @@
2263
2406
  },
2264
2407
  "hasDynamicHelp": false,
2265
2408
  "hiddenAliases": [],
2266
- "id": "kv:get",
2409
+ "id": "investigation:runs",
2267
2410
  "pluginAlias": "@formant/formant-cli",
2268
2411
  "pluginName": "@formant/formant-cli",
2269
2412
  "pluginType": "core",
2270
2413
  "strict": true,
2271
- "summary": "Get key-value",
2414
+ "summary": "List runs for an investigation",
2272
2415
  "enableJsonFlag": true,
2273
2416
  "isESM": true,
2274
2417
  "relativePath": [
2275
2418
  "dist",
2276
2419
  "commands",
2277
- "kv",
2278
- "get.js"
2420
+ "investigation",
2421
+ "runs.js"
2279
2422
  ]
2280
2423
  },
2281
- "kv:list": {
2424
+ "investigation:stats": {
2282
2425
  "aliases": [],
2283
2426
  "args": {},
2284
- "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.",
2427
+ "description": "Get investigation statistics for a time range.",
2285
2428
  "examples": [
2286
- "<%= config.bin %> kv list",
2287
- "<%= config.bin %> kv list --prefix config",
2288
- "<%= config.bin %> kv list --keys key1 --keys key2 --keys key3",
2289
- "<%= config.bin %> kv list --json"
2429
+ "<%= config.bin %> investigation stats --start 2026-01-01 --end 2026-02-01",
2430
+ "<%= config.bin %> investigation stats --start 2026-01-01 --end 2026-02-01 --json"
2290
2431
  ],
2291
2432
  "flags": {
2292
2433
  "json": {
@@ -2316,18 +2457,18 @@
2316
2457
  "allowNo": false,
2317
2458
  "type": "boolean"
2318
2459
  },
2319
- "keys": {
2320
- "char": "k",
2321
- "description": "Specific keys to query (can be specified multiple times)",
2322
- "name": "keys",
2460
+ "end": {
2461
+ "description": "End time (ISO 8601)",
2462
+ "name": "end",
2463
+ "required": true,
2323
2464
  "hasDynamicHelp": false,
2324
- "multiple": true,
2465
+ "multiple": false,
2325
2466
  "type": "option"
2326
2467
  },
2327
- "prefix": {
2328
- "char": "p",
2329
- "description": "Filter keys by prefix",
2330
- "name": "prefix",
2468
+ "start": {
2469
+ "description": "Start time (ISO 8601)",
2470
+ "name": "start",
2471
+ "required": true,
2331
2472
  "hasDynamicHelp": false,
2332
2473
  "multiple": false,
2333
2474
  "type": "option"
@@ -2335,39 +2476,34 @@
2335
2476
  },
2336
2477
  "hasDynamicHelp": false,
2337
2478
  "hiddenAliases": [],
2338
- "id": "kv:list",
2479
+ "id": "investigation:stats",
2339
2480
  "pluginAlias": "@formant/formant-cli",
2340
2481
  "pluginName": "@formant/formant-cli",
2341
2482
  "pluginType": "core",
2342
2483
  "strict": true,
2343
- "summary": "List key-value keys",
2484
+ "summary": "Get investigation stats",
2344
2485
  "enableJsonFlag": true,
2345
2486
  "isESM": true,
2346
2487
  "relativePath": [
2347
2488
  "dist",
2348
2489
  "commands",
2349
- "kv",
2350
- "list.js"
2490
+ "investigation",
2491
+ "stats.js"
2351
2492
  ]
2352
2493
  },
2353
- "kv:set": {
2494
+ "investigation:trigger": {
2354
2495
  "aliases": [],
2355
2496
  "args": {
2356
- "key": {
2357
- "description": "Key to set",
2358
- "name": "key",
2359
- "required": true
2360
- },
2361
- "value": {
2362
- "description": "Value to store (JSON string)",
2363
- "name": "value",
2497
+ "id": {
2498
+ "description": "Investigation (taskflow) ID",
2499
+ "name": "id",
2364
2500
  "required": true
2365
2501
  }
2366
2502
  },
2367
- "description": "Set a value in the key-value store.\n\nStores a value associated with a key. The value should be a JSON string.",
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.",
2368
2504
  "examples": [
2369
- "<%= config.bin %> kv set my-key '{\"data\": \"value\"}'",
2370
- "<%= config.bin %> kv set config '{\"setting\": true}'"
2505
+ "<%= config.bin %> investigation trigger <id> --input \"Robot stopped responding\"",
2506
+ "<%= config.bin %> investigation trigger <id> --input \"Battery draining fast on device X\" --json"
2371
2507
  ],
2372
2508
  "flags": {
2373
2509
  "json": {
@@ -2396,32 +2532,54 @@
2396
2532
  "name": "stage",
2397
2533
  "allowNo": false,
2398
2534
  "type": "boolean"
2535
+ },
2536
+ "input": {
2537
+ "char": "i",
2538
+ "description": "Input text / problem description for the investigation",
2539
+ "name": "input",
2540
+ "required": true,
2541
+ "hasDynamicHelp": false,
2542
+ "multiple": false,
2543
+ "type": "option"
2544
+ },
2545
+ "signal-id": {
2546
+ "description": "Optional signal ID to associate with this run",
2547
+ "name": "signal-id",
2548
+ "hasDynamicHelp": false,
2549
+ "multiple": false,
2550
+ "type": "option"
2399
2551
  }
2400
2552
  },
2401
2553
  "hasDynamicHelp": false,
2402
2554
  "hiddenAliases": [],
2403
- "id": "kv:set",
2555
+ "id": "investigation:trigger",
2404
2556
  "pluginAlias": "@formant/formant-cli",
2405
2557
  "pluginName": "@formant/formant-cli",
2406
2558
  "pluginType": "core",
2407
2559
  "strict": true,
2408
- "summary": "Set key-value",
2560
+ "summary": "Trigger an investigation",
2409
2561
  "enableJsonFlag": true,
2410
2562
  "isESM": true,
2411
2563
  "relativePath": [
2412
2564
  "dist",
2413
2565
  "commands",
2414
- "kv",
2415
- "set.js"
2566
+ "investigation",
2567
+ "trigger.js"
2416
2568
  ]
2417
2569
  },
2418
- "org:get": {
2570
+ "device:config": {
2419
2571
  "aliases": [],
2420
- "args": {},
2421
- "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.",
2572
+ "args": {
2573
+ "id": {
2574
+ "description": "Device ID (UUID)",
2575
+ "name": "id",
2576
+ "required": true
2577
+ }
2578
+ },
2579
+ "description": "Get the device configuration including stream definitions.\n\nShows the device's current configuration including telemetry streams, commands,\nand other settings.",
2422
2580
  "examples": [
2423
- "<%= config.bin %> org get",
2424
- "<%= config.bin %> org get --json"
2581
+ "<%= config.bin %> device config <device-id>",
2582
+ "<%= config.bin %> device config <device-id> --json"
2425
2583
  ],
2426
2584
  "flags": {
2427
2585
  "json": {
@@ -2454,30 +2612,35 @@
2454
2612
  },
2455
2613
  "hasDynamicHelp": false,
2456
2614
  "hiddenAliases": [],
2457
- "id": "org:get",
2615
+ "id": "device:config",
2458
2616
  "pluginAlias": "@formant/formant-cli",
2459
2617
  "pluginName": "@formant/formant-cli",
2460
2618
  "pluginType": "core",
2461
2619
  "strict": true,
2462
- "summary": "Get your organization",
2620
+ "summary": "Get device configuration",
2463
2621
  "enableJsonFlag": true,
2464
2622
  "isESM": true,
2465
2623
  "relativePath": [
2466
2624
  "dist",
2467
2625
  "commands",
2468
- "org",
2469
- "get.js"
2626
+ "device",
2627
+ "config.js"
2470
2628
  ]
2471
2629
  },
2472
- "org:update": {
2630
+ "device:create": {
2473
2631
  "aliases": [],
2474
- "args": {},
2475
- "description": "Update your organization's details.\n\nAt least one of --name or --description must be provided.",
2632
+ "args": {
2633
+ "name": {
2634
+ "description": "Name for the new device",
2635
+ "name": "name",
2636
+ "required": true
2637
+ }
2638
+ },
2639
+ "description": "Create a new device in your fleet.\n\nThe device is created as enabled by default. You can optionally specify tags.",
2476
2640
  "examples": [
2477
- "<%= config.bin %> org update --name \"My Fleet\"",
2478
- "<%= config.bin %> org update --description \"Production robot fleet\"",
2479
- "<%= config.bin %> org update --name \"My Fleet\" --description \"Production robot fleet\"",
2480
- "<%= config.bin %> org update --name \"My Fleet\" --json"
2641
+ "<%= config.bin %> device create my-robot",
2642
+ "<%= config.bin %> device create my-robot --tag location=warehouse --tag env=prod",
2643
+ "<%= config.bin %> device create my-robot --json"
2481
2644
  ],
2482
2645
  "flags": {
2483
2646
  "json": {
@@ -2507,48 +2670,45 @@
2507
2670
  "allowNo": false,
2508
2671
  "type": "boolean"
2509
2672
  },
2510
- "description": {
2511
- "char": "d",
2512
- "description": "New description for the organization",
2513
- "name": "description",
2514
- "hasDynamicHelp": false,
2515
- "multiple": false,
2516
- "type": "option"
2517
- },
2518
- "name": {
2519
- "char": "n",
2520
- "description": "New name for the organization",
2521
- "name": "name",
2673
+ "tag": {
2674
+ "char": "t",
2675
+ "description": "Tag to apply (key=value), can be specified multiple times",
2676
+ "name": "tag",
2522
2677
  "hasDynamicHelp": false,
2523
- "multiple": false,
2678
+ "multiple": true,
2524
2679
  "type": "option"
2525
2680
  }
2526
2681
  },
2527
2682
  "hasDynamicHelp": false,
2528
2683
  "hiddenAliases": [],
2529
- "id": "org:update",
2684
+ "id": "device:create",
2530
2685
  "pluginAlias": "@formant/formant-cli",
2531
2686
  "pluginName": "@formant/formant-cli",
2532
2687
  "pluginType": "core",
2533
2688
  "strict": true,
2534
- "summary": "Update your organization",
2689
+ "summary": "Create a new device",
2535
2690
  "enableJsonFlag": true,
2536
2691
  "isESM": true,
2537
2692
  "relativePath": [
2538
2693
  "dist",
2539
2694
  "commands",
2540
- "org",
2541
- "update.js"
2695
+ "device",
2696
+ "create.js"
2542
2697
  ]
2543
2698
  },
2544
- "investigations:analytics": {
2699
+ "device:delete": {
2545
2700
  "aliases": [],
2546
- "args": {},
2547
- "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.",
2701
+ "args": {
2702
+ "id": {
2703
+ "description": "Device ID (UUID)",
2704
+ "name": "id",
2705
+ "required": true
2706
+ }
2707
+ },
2708
+ "description": "Delete (disable) a device from your fleet.\n\nThis performs a soft-delete by disabling the device. The device and its telemetry\nhistory are preserved but it will no longer appear in device listings.",
2548
2709
  "examples": [
2549
- "<%= config.bin %> investigations analytics --start 2026-01-01 --end 2026-02-01",
2550
- "<%= config.bin %> investigations analytics --start 2026-01-01 --end 2026-02-01 --interval hourly",
2551
- "<%= config.bin %> investigations analytics --start 2026-01-01 --end 2026-02-01 --group-by resultType --json"
2710
+ "<%= config.bin %> device delete <device-id>",
2711
+ "<%= config.bin %> device delete <device-id> --json"
2552
2712
  ],
2553
2713
  "flags": {
2554
2714
  "json": {
@@ -2577,77 +2737,38 @@
2577
2737
  "name": "stage",
2578
2738
  "allowNo": false,
2579
2739
  "type": "boolean"
2580
- },
2581
- "end": {
2582
- "description": "End time (ISO 8601)",
2583
- "name": "end",
2584
- "required": true,
2585
- "hasDynamicHelp": false,
2586
- "multiple": false,
2587
- "type": "option"
2588
- },
2589
- "group-by": {
2590
- "description": "Group results by",
2591
- "name": "group-by",
2592
- "hasDynamicHelp": false,
2593
- "multiple": false,
2594
- "options": [
2595
- "resultType",
2596
- "signalType"
2597
- ],
2598
- "type": "option"
2599
- },
2600
- "interval": {
2601
- "description": "Time interval for aggregation",
2602
- "name": "interval",
2603
- "default": "daily",
2604
- "hasDynamicHelp": false,
2605
- "multiple": false,
2606
- "options": [
2607
- "daily",
2608
- "hourly"
2609
- ],
2610
- "type": "option"
2611
- },
2612
- "start": {
2613
- "description": "Start time (ISO 8601)",
2614
- "name": "start",
2615
- "required": true,
2616
- "hasDynamicHelp": false,
2617
- "multiple": false,
2618
- "type": "option"
2619
2740
  }
2620
2741
  },
2621
2742
  "hasDynamicHelp": false,
2622
2743
  "hiddenAliases": [],
2623
- "id": "investigations:analytics",
2744
+ "id": "device:delete",
2624
2745
  "pluginAlias": "@formant/formant-cli",
2625
2746
  "pluginName": "@formant/formant-cli",
2626
2747
  "pluginType": "core",
2627
2748
  "strict": true,
2628
- "summary": "Get investigation analytics",
2749
+ "summary": "Delete (disable) a device",
2629
2750
  "enableJsonFlag": true,
2630
2751
  "isESM": true,
2631
2752
  "relativePath": [
2632
2753
  "dist",
2633
2754
  "commands",
2634
- "investigations",
2635
- "analytics.js"
2755
+ "device",
2756
+ "delete.js"
2636
2757
  ]
2637
2758
  },
2638
- "investigations:get": {
2759
+ "device:get": {
2639
2760
  "aliases": [],
2640
2761
  "args": {
2641
2762
  "id": {
2642
- "description": "Investigation (taskflow) ID",
2763
+ "description": "Device ID (UUID)",
2643
2764
  "name": "id",
2644
2765
  "required": true
2645
2766
  }
2646
2767
  },
2647
- "description": "Get detailed information about a specific investigation by ID.",
2768
+ "description": "Get detailed information about a specific device by its ID.",
2648
2769
  "examples": [
2649
- "<%= config.bin %> investigations get <id>",
2650
- "<%= config.bin %> investigations get <id> --json"
2770
+ "<%= config.bin %> device get <device-id>",
2771
+ "<%= config.bin %> device get <device-id> --json"
2651
2772
  ],
2652
2773
  "flags": {
2653
2774
  "json": {
@@ -2680,29 +2801,34 @@
2680
2801
  },
2681
2802
  "hasDynamicHelp": false,
2682
2803
  "hiddenAliases": [],
2683
- "id": "investigations:get",
2804
+ "id": "device:get",
2684
2805
  "pluginAlias": "@formant/formant-cli",
2685
2806
  "pluginName": "@formant/formant-cli",
2686
2807
  "pluginType": "core",
2687
2808
  "strict": true,
2688
- "summary": "Get an investigation by ID",
2809
+ "summary": "Get a device by ID",
2689
2810
  "enableJsonFlag": true,
2690
2811
  "isESM": true,
2691
2812
  "relativePath": [
2692
2813
  "dist",
2693
2814
  "commands",
2694
- "investigations",
2815
+ "device",
2695
2816
  "get.js"
2696
2817
  ]
2697
2818
  },
2698
- "investigations:list": {
2819
+ "device:last-seen": {
2699
2820
  "aliases": [],
2700
- "args": {},
2701
- "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.",
2821
+ "args": {
2822
+ "id": {
2823
+ "description": "Device ID (UUID)",
2824
+ "name": "id",
2825
+ "required": true
2826
+ }
2827
+ },
2828
+ "description": "Get when a device was last seen online.\n\nShows the most recent timestamp when the device was detected as online.",
2702
2829
  "examples": [
2703
- "<%= config.bin %> investigations list",
2704
- "<%= config.bin %> investigations list --signal-handler",
2705
- "<%= config.bin %> investigations list --json"
2830
+ "<%= config.bin %> device last-seen <device-id>",
2831
+ "<%= config.bin %> device last-seen <device-id> --json"
2706
2832
  ],
2707
2833
  "flags": {
2708
2834
  "json": {
@@ -2731,50 +2857,35 @@
2731
2857
  "name": "stage",
2732
2858
  "allowNo": false,
2733
2859
  "type": "boolean"
2734
- },
2735
- "signal-handler": {
2736
- "description": "Only show investigations that handle signals",
2737
- "name": "signal-handler",
2738
- "allowNo": false,
2739
- "type": "boolean"
2740
2860
  }
2741
2861
  },
2742
2862
  "hasDynamicHelp": false,
2743
2863
  "hiddenAliases": [],
2744
- "id": "investigations:list",
2864
+ "id": "device:last-seen",
2745
2865
  "pluginAlias": "@formant/formant-cli",
2746
2866
  "pluginName": "@formant/formant-cli",
2747
2867
  "pluginType": "core",
2748
2868
  "strict": true,
2749
- "summary": "List investigations",
2869
+ "summary": "Get device last seen timestamp",
2750
2870
  "enableJsonFlag": true,
2751
2871
  "isESM": true,
2752
2872
  "relativePath": [
2753
2873
  "dist",
2754
2874
  "commands",
2755
- "investigations",
2756
- "list.js"
2875
+ "device",
2876
+ "last-seen.js"
2757
2877
  ]
2758
2878
  },
2759
- "investigations:run": {
2879
+ "device:list": {
2760
2880
  "aliases": [],
2761
- "args": {
2762
- "investigationId": {
2763
- "description": "Investigation (taskflow) ID",
2764
- "name": "investigationId",
2765
- "required": true
2766
- },
2767
- "runId": {
2768
- "description": "Run ID",
2769
- "name": "runId",
2770
- "required": true
2771
- }
2772
- },
2773
- "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.",
2881
+ "args": {},
2882
+ "description": "List robots and sensors in your fleet. Shows only online devices by default.\n\nUse --all to include offline devices.",
2774
2883
  "examples": [
2775
- "<%= config.bin %> investigations run <investigation-id> <run-id>",
2776
- "<%= config.bin %> investigations run <investigation-id> <run-id> --log-only",
2777
- "<%= config.bin %> investigations run <investigation-id> <run-id> --json"
2884
+ "<%= config.bin %> device list",
2885
+ "<%= config.bin %> device list --all",
2886
+ "<%= config.bin %> device list --all --limit 100",
2887
+ "<%= config.bin %> device list --tag location=warehouse",
2888
+ "<%= config.bin %> device list --name robot --dev --json"
2778
2889
  ],
2779
2890
  "flags": {
2780
2891
  "json": {
@@ -2804,50 +2915,74 @@
2804
2915
  "allowNo": false,
2805
2916
  "type": "boolean"
2806
2917
  },
2807
- "log-only": {
2808
- "description": "Only show the execution log (skip run details)",
2809
- "name": "log-only",
2918
+ "all": {
2919
+ "char": "a",
2920
+ "description": "Show all devices (online and offline)",
2921
+ "name": "all",
2810
2922
  "allowNo": false,
2811
2923
  "type": "boolean"
2812
2924
  },
2813
- "trace-signal": {
2814
- "description": "Fetch and display the signal and event information for this run",
2815
- "name": "trace-signal",
2816
- "allowNo": false,
2817
- "type": "boolean"
2925
+ "limit": {
2926
+ "char": "l",
2927
+ "description": "Maximum number of devices to return",
2928
+ "name": "limit",
2929
+ "default": 50,
2930
+ "hasDynamicHelp": false,
2931
+ "multiple": false,
2932
+ "type": "option"
2933
+ },
2934
+ "name": {
2935
+ "char": "n",
2936
+ "description": "Filter devices by name (search)",
2937
+ "name": "name",
2938
+ "hasDynamicHelp": false,
2939
+ "multiple": false,
2940
+ "type": "option"
2941
+ },
2942
+ "tag": {
2943
+ "char": "t",
2944
+ "description": "Filter by tag (key=value), can be specified multiple times",
2945
+ "name": "tag",
2946
+ "hasDynamicHelp": false,
2947
+ "multiple": true,
2948
+ "type": "option"
2818
2949
  }
2819
2950
  },
2820
2951
  "hasDynamicHelp": false,
2821
2952
  "hiddenAliases": [],
2822
- "id": "investigations:run",
2953
+ "id": "device:list",
2823
2954
  "pluginAlias": "@formant/formant-cli",
2824
2955
  "pluginName": "@formant/formant-cli",
2825
2956
  "pluginType": "core",
2826
2957
  "strict": true,
2827
- "summary": "Get investigation run details and execution log",
2958
+ "summary": "List robots and sensors in your fleet",
2828
2959
  "enableJsonFlag": true,
2829
2960
  "isESM": true,
2830
2961
  "relativePath": [
2831
2962
  "dist",
2832
2963
  "commands",
2833
- "investigations",
2834
- "run.js"
2964
+ "device",
2965
+ "list.js"
2835
2966
  ]
2836
2967
  },
2837
- "investigations:runs-list": {
2968
+ "device:rename": {
2838
2969
  "aliases": [],
2839
2970
  "args": {
2840
2971
  "id": {
2841
- "description": "Investigation (taskflow) ID",
2972
+ "description": "Device ID (UUID)",
2842
2973
  "name": "id",
2843
2974
  "required": true
2975
+ },
2976
+ "name": {
2977
+ "description": "New name for the device",
2978
+ "name": "name",
2979
+ "required": true
2844
2980
  }
2845
2981
  },
2846
- "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.",
2982
+ "description": "Rename a device by updating its name.",
2847
2983
  "examples": [
2848
- "<%= config.bin %> investigations runs-list <id>",
2849
- "<%= config.bin %> investigations runs-list <id> --limit 50",
2850
- "<%= config.bin %> investigations runs-list <id> --details --json"
2984
+ "<%= config.bin %> device rename <device-id> new-robot-name",
2985
+ "<%= config.bin %> device rename <device-id> new-robot-name --json"
2851
2986
  ],
2852
2987
  "flags": {
2853
2988
  "json": {
@@ -2876,62 +3011,39 @@
2876
3011
  "name": "stage",
2877
3012
  "allowNo": false,
2878
3013
  "type": "boolean"
2879
- },
2880
- "details": {
2881
- "description": "Include detailed information about each run",
2882
- "name": "details",
2883
- "allowNo": false,
2884
- "type": "boolean"
2885
- },
2886
- "limit": {
2887
- "char": "l",
2888
- "description": "Maximum number of runs to return",
2889
- "name": "limit",
2890
- "default": 20,
2891
- "hasDynamicHelp": false,
2892
- "multiple": false,
2893
- "type": "option"
2894
- },
2895
- "offset": {
2896
- "char": "o",
2897
- "description": "Offset for pagination",
2898
- "name": "offset",
2899
- "default": 0,
2900
- "hasDynamicHelp": false,
2901
- "multiple": false,
2902
- "type": "option"
2903
3014
  }
2904
3015
  },
2905
3016
  "hasDynamicHelp": false,
2906
3017
  "hiddenAliases": [],
2907
- "id": "investigations:runs-list",
3018
+ "id": "device:rename",
2908
3019
  "pluginAlias": "@formant/formant-cli",
2909
3020
  "pluginName": "@formant/formant-cli",
2910
3021
  "pluginType": "core",
2911
3022
  "strict": true,
2912
- "summary": "List actual investigation runs",
3023
+ "summary": "Rename a device",
2913
3024
  "enableJsonFlag": true,
2914
3025
  "isESM": true,
2915
3026
  "relativePath": [
2916
3027
  "dist",
2917
3028
  "commands",
2918
- "investigations",
2919
- "runs-list.js"
3029
+ "device",
3030
+ "rename.js"
2920
3031
  ]
2921
3032
  },
2922
- "investigations:runs": {
3033
+ "device:streams": {
2923
3034
  "aliases": [],
2924
3035
  "args": {
2925
3036
  "id": {
2926
- "description": "Investigation (taskflow) ID",
3037
+ "description": "Device ID (UUID)",
2927
3038
  "name": "id",
2928
3039
  "required": true
2929
3040
  }
2930
3041
  },
2931
- "description": "List evaluation runs for a specific investigation.",
3042
+ "description": "List telemetry streams for a device.\n\nShows streams parsed from the device configuration as well as any streams\ndiscovered from actual ingested data (even if not explicitly configured).\nUnconfigured streams are marked with a SOURCE of \"data\" in the output.",
2932
3043
  "examples": [
2933
- "<%= config.bin %> investigations runs <id>",
2934
- "<%= config.bin %> investigations runs <id> --json"
3044
+ "<%= config.bin %> device streams <device-id>",
3045
+ "<%= config.bin %> device streams <device-id> --json",
3046
+ "<%= config.bin %> device streams <device-id> --days 30"
2935
3047
  ],
2936
3048
  "flags": {
2937
3049
  "json": {
@@ -2960,32 +3072,47 @@
2960
3072
  "name": "stage",
2961
3073
  "allowNo": false,
2962
3074
  "type": "boolean"
3075
+ },
3076
+ "days": {
3077
+ "description": "How many days back to look for unconfigured streams in ingested data",
3078
+ "name": "days",
3079
+ "default": 14,
3080
+ "hasDynamicHelp": false,
3081
+ "multiple": false,
3082
+ "type": "option"
2963
3083
  }
2964
3084
  },
2965
3085
  "hasDynamicHelp": false,
2966
3086
  "hiddenAliases": [],
2967
- "id": "investigations:runs",
3087
+ "id": "device:streams",
2968
3088
  "pluginAlias": "@formant/formant-cli",
2969
3089
  "pluginName": "@formant/formant-cli",
2970
3090
  "pluginType": "core",
2971
3091
  "strict": true,
2972
- "summary": "List runs for an investigation",
3092
+ "summary": "List device streams",
2973
3093
  "enableJsonFlag": true,
2974
3094
  "isESM": true,
2975
3095
  "relativePath": [
2976
3096
  "dist",
2977
3097
  "commands",
2978
- "investigations",
2979
- "runs.js"
3098
+ "device",
3099
+ "streams.js"
2980
3100
  ]
2981
3101
  },
2982
- "investigations:stats": {
3102
+ "device:tag": {
2983
3103
  "aliases": [],
2984
- "args": {},
2985
- "description": "Get investigation statistics for a time range.",
3104
+ "args": {
3105
+ "id": {
3106
+ "description": "Device ID (UUID)",
3107
+ "name": "id",
3108
+ "required": true
3109
+ }
3110
+ },
3111
+ "description": "Add or update tags on a device.\n\nTags are key-value pairs. If a tag key already exists, its value will be updated.\nSpecify one or more tags with --tag key=value.",
2986
3112
  "examples": [
2987
- "<%= config.bin %> investigations stats --start 2026-01-01 --end 2026-02-01",
2988
- "<%= config.bin %> investigations stats --start 2026-01-01 --end 2026-02-01 --json"
3113
+ "<%= config.bin %> device tag <device-id> --tag location=warehouse",
3114
+ "<%= config.bin %> device tag <device-id> --tag env=prod --tag region=us-east",
3115
+ "<%= config.bin %> device tag <device-id> --tag location=factory --json"
2989
3116
  ],
2990
3117
  "flags": {
2991
3118
  "json": {
@@ -3015,53 +3142,47 @@
3015
3142
  "allowNo": false,
3016
3143
  "type": "boolean"
3017
3144
  },
3018
- "end": {
3019
- "description": "End time (ISO 8601)",
3020
- "name": "end",
3021
- "required": true,
3022
- "hasDynamicHelp": false,
3023
- "multiple": false,
3024
- "type": "option"
3025
- },
3026
- "start": {
3027
- "description": "Start time (ISO 8601)",
3028
- "name": "start",
3145
+ "tag": {
3146
+ "char": "t",
3147
+ "description": "Tag to add or update (key=value), can be specified multiple times",
3148
+ "name": "tag",
3029
3149
  "required": true,
3030
3150
  "hasDynamicHelp": false,
3031
- "multiple": false,
3151
+ "multiple": true,
3032
3152
  "type": "option"
3033
3153
  }
3034
3154
  },
3035
3155
  "hasDynamicHelp": false,
3036
3156
  "hiddenAliases": [],
3037
- "id": "investigations:stats",
3157
+ "id": "device:tag",
3038
3158
  "pluginAlias": "@formant/formant-cli",
3039
3159
  "pluginName": "@formant/formant-cli",
3040
3160
  "pluginType": "core",
3041
3161
  "strict": true,
3042
- "summary": "Get investigation stats",
3162
+ "summary": "Add or update tags on a device",
3043
3163
  "enableJsonFlag": true,
3044
3164
  "isESM": true,
3045
3165
  "relativePath": [
3046
3166
  "dist",
3047
3167
  "commands",
3048
- "investigations",
3049
- "stats.js"
3168
+ "device",
3169
+ "tag.js"
3050
3170
  ]
3051
3171
  },
3052
- "investigations:trigger": {
3172
+ "device:untag": {
3053
3173
  "aliases": [],
3054
3174
  "args": {
3055
3175
  "id": {
3056
- "description": "Investigation (taskflow) ID",
3176
+ "description": "Device ID (UUID)",
3057
3177
  "name": "id",
3058
3178
  "required": true
3059
3179
  }
3060
3180
  },
3061
- "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.",
3181
+ "description": "Remove tags from a device.\n\nSpecify one or more tag keys to remove with --key.",
3062
3182
  "examples": [
3063
- "<%= config.bin %> investigations trigger <id> --input \"Robot stopped responding\"",
3064
- "<%= config.bin %> investigations trigger <id> --input \"Battery draining fast on device X\" --json"
3183
+ "<%= config.bin %> device untag <device-id> --key location",
3184
+ "<%= config.bin %> device untag <device-id> --key env --key region",
3185
+ "<%= config.bin %> device untag <device-id> --key location --json"
3065
3186
  ],
3066
3187
  "flags": {
3067
3188
  "json": {
@@ -3091,38 +3212,31 @@
3091
3212
  "allowNo": false,
3092
3213
  "type": "boolean"
3093
3214
  },
3094
- "input": {
3095
- "char": "i",
3096
- "description": "Input text / problem description for the investigation",
3097
- "name": "input",
3215
+ "key": {
3216
+ "char": "k",
3217
+ "description": "Tag key to remove, can be specified multiple times",
3218
+ "name": "key",
3098
3219
  "required": true,
3099
3220
  "hasDynamicHelp": false,
3100
- "multiple": false,
3101
- "type": "option"
3102
- },
3103
- "signal-id": {
3104
- "description": "Optional signal ID to associate with this run",
3105
- "name": "signal-id",
3106
- "hasDynamicHelp": false,
3107
- "multiple": false,
3221
+ "multiple": true,
3108
3222
  "type": "option"
3109
3223
  }
3110
3224
  },
3111
3225
  "hasDynamicHelp": false,
3112
3226
  "hiddenAliases": [],
3113
- "id": "investigations:trigger",
3227
+ "id": "device:untag",
3114
3228
  "pluginAlias": "@formant/formant-cli",
3115
3229
  "pluginName": "@formant/formant-cli",
3116
3230
  "pluginType": "core",
3117
3231
  "strict": true,
3118
- "summary": "Trigger an investigation",
3232
+ "summary": "Remove tags from a device",
3119
3233
  "enableJsonFlag": true,
3120
3234
  "isESM": true,
3121
3235
  "relativePath": [
3122
3236
  "dist",
3123
3237
  "commands",
3124
- "investigations",
3125
- "trigger.js"
3238
+ "device",
3239
+ "untag.js"
3126
3240
  ]
3127
3241
  },
3128
3242
  "query": {
@@ -3217,40 +3331,185 @@
3217
3331
  "multiple": true,
3218
3332
  "type": "option"
3219
3333
  },
3220
- "type": {
3221
- "description": "Filter by stream type",
3222
- "name": "type",
3223
- "hasDynamicHelp": false,
3224
- "multiple": false,
3225
- "type": "option"
3334
+ "type": {
3335
+ "description": "Filter by stream type",
3336
+ "name": "type",
3337
+ "hasDynamicHelp": false,
3338
+ "multiple": false,
3339
+ "type": "option"
3340
+ }
3341
+ },
3342
+ "hasDynamicHelp": false,
3343
+ "hiddenAliases": [],
3344
+ "id": "query",
3345
+ "pluginAlias": "@formant/formant-cli",
3346
+ "pluginName": "@formant/formant-cli",
3347
+ "pluginType": "core",
3348
+ "strict": true,
3349
+ "summary": "Query telemetry stream data",
3350
+ "enableJsonFlag": true,
3351
+ "isESM": true,
3352
+ "relativePath": [
3353
+ "dist",
3354
+ "commands",
3355
+ "query",
3356
+ "index.js"
3357
+ ]
3358
+ },
3359
+ "query:latest-values": {
3360
+ "aliases": [],
3361
+ "args": {},
3362
+ "description": "Get the latest values for streams across devices.\n\nReturns the most recent value for specified streams without needing to specify\na time range. Useful for checking current sensor readings.\n\nUse --all-streams with a single device to automatically discover and query all\nstreams — both from the device configuration and from actual ingested data\n(unconfigured streams included).",
3363
+ "examples": [
3364
+ "<%= config.bin %> query latest-values --device <id> --stream battery_level",
3365
+ "<%= config.bin %> query latest-values --device <id> --stream temperature --stream humidity",
3366
+ "<%= config.bin %> query latest-values --device <id> --all-streams",
3367
+ "<%= config.bin %> query latest-values --device <id> --all-streams --json"
3368
+ ],
3369
+ "flags": {
3370
+ "json": {
3371
+ "description": "Format output as json.",
3372
+ "helpGroup": "GLOBAL",
3373
+ "name": "json",
3374
+ "allowNo": false,
3375
+ "type": "boolean"
3376
+ },
3377
+ "dev": {
3378
+ "description": "Target the dev environment",
3379
+ "exclusive": [
3380
+ "stage"
3381
+ ],
3382
+ "helpGroup": "GLOBAL",
3383
+ "name": "dev",
3384
+ "allowNo": false,
3385
+ "type": "boolean"
3386
+ },
3387
+ "stage": {
3388
+ "description": "Target the stage environment",
3389
+ "exclusive": [
3390
+ "dev"
3391
+ ],
3392
+ "helpGroup": "GLOBAL",
3393
+ "name": "stage",
3394
+ "allowNo": false,
3395
+ "type": "boolean"
3396
+ },
3397
+ "all-streams": {
3398
+ "description": "Query all streams for the device — from config and from ingested data (requires single --device)",
3399
+ "name": "all-streams",
3400
+ "allowNo": false,
3401
+ "type": "boolean"
3402
+ },
3403
+ "days": {
3404
+ "description": "How many days back to look for unconfigured streams when using --all-streams",
3405
+ "name": "days",
3406
+ "default": 14,
3407
+ "hasDynamicHelp": false,
3408
+ "multiple": false,
3409
+ "type": "option"
3410
+ },
3411
+ "device": {
3412
+ "char": "d",
3413
+ "description": "Device ID (UUID)",
3414
+ "name": "device",
3415
+ "required": true,
3416
+ "hasDynamicHelp": false,
3417
+ "multiple": true,
3418
+ "type": "option"
3419
+ },
3420
+ "stream": {
3421
+ "char": "s",
3422
+ "description": "Stream name(s), can be specified multiple times",
3423
+ "name": "stream",
3424
+ "hasDynamicHelp": false,
3425
+ "multiple": true,
3426
+ "type": "option"
3427
+ }
3428
+ },
3429
+ "hasDynamicHelp": false,
3430
+ "hiddenAliases": [],
3431
+ "id": "query:latest-values",
3432
+ "pluginAlias": "@formant/formant-cli",
3433
+ "pluginName": "@formant/formant-cli",
3434
+ "pluginType": "core",
3435
+ "strict": true,
3436
+ "summary": "Get latest stream values",
3437
+ "enableJsonFlag": true,
3438
+ "isESM": true,
3439
+ "relativePath": [
3440
+ "dist",
3441
+ "commands",
3442
+ "query",
3443
+ "latest-values.js"
3444
+ ]
3445
+ },
3446
+ "schedule:get": {
3447
+ "aliases": [],
3448
+ "args": {
3449
+ "id": {
3450
+ "description": "Schedule ID (UUID)",
3451
+ "name": "id",
3452
+ "required": true
3453
+ }
3454
+ },
3455
+ "description": "Get detailed information about a schedule.\n\nShows the full schedule configuration including cron expression, command template,\ninvestigation link, and execution settings.",
3456
+ "examples": [
3457
+ "<%= config.bin %> schedule get <schedule-id>",
3458
+ "<%= config.bin %> schedule get <schedule-id> --json"
3459
+ ],
3460
+ "flags": {
3461
+ "json": {
3462
+ "description": "Format output as json.",
3463
+ "helpGroup": "GLOBAL",
3464
+ "name": "json",
3465
+ "allowNo": false,
3466
+ "type": "boolean"
3467
+ },
3468
+ "dev": {
3469
+ "description": "Target the dev environment",
3470
+ "exclusive": [
3471
+ "stage"
3472
+ ],
3473
+ "helpGroup": "GLOBAL",
3474
+ "name": "dev",
3475
+ "allowNo": false,
3476
+ "type": "boolean"
3477
+ },
3478
+ "stage": {
3479
+ "description": "Target the stage environment",
3480
+ "exclusive": [
3481
+ "dev"
3482
+ ],
3483
+ "helpGroup": "GLOBAL",
3484
+ "name": "stage",
3485
+ "allowNo": false,
3486
+ "type": "boolean"
3226
3487
  }
3227
3488
  },
3228
3489
  "hasDynamicHelp": false,
3229
3490
  "hiddenAliases": [],
3230
- "id": "query",
3491
+ "id": "schedule:get",
3231
3492
  "pluginAlias": "@formant/formant-cli",
3232
3493
  "pluginName": "@formant/formant-cli",
3233
3494
  "pluginType": "core",
3234
3495
  "strict": true,
3235
- "summary": "Query telemetry stream data",
3496
+ "summary": "Get schedule details",
3236
3497
  "enableJsonFlag": true,
3237
3498
  "isESM": true,
3238
3499
  "relativePath": [
3239
3500
  "dist",
3240
3501
  "commands",
3241
- "query",
3242
- "index.js"
3502
+ "schedule",
3503
+ "get.js"
3243
3504
  ]
3244
3505
  },
3245
- "query:latest-values": {
3506
+ "schedule:list": {
3246
3507
  "aliases": [],
3247
3508
  "args": {},
3248
- "description": "Get the latest values for streams across devices.\n\nReturns the most recent value for specified streams without needing to specify\na time range. Useful for checking current sensor readings.\n\nUse --all-streams with a single device to automatically discover and query all\nstreams — both from the device configuration and from actual ingested data\n(unconfigured streams included).",
3509
+ "description": "List all schedules in your organization.\n\nSchedules can trigger commands or investigations on a recurring (cron) or one-time basis.",
3249
3510
  "examples": [
3250
- "<%= config.bin %> query latest-values --device <id> --stream battery_level",
3251
- "<%= config.bin %> query latest-values --device <id> --stream temperature --stream humidity",
3252
- "<%= config.bin %> query latest-values --device <id> --all-streams",
3253
- "<%= config.bin %> query latest-values --device <id> --all-streams --json"
3511
+ "<%= config.bin %> schedule list",
3512
+ "<%= config.bin %> schedule list --json"
3254
3513
  ],
3255
3514
  "flags": {
3256
3515
  "json": {
@@ -3279,69 +3538,44 @@
3279
3538
  "name": "stage",
3280
3539
  "allowNo": false,
3281
3540
  "type": "boolean"
3282
- },
3283
- "all-streams": {
3284
- "description": "Query all streams for the device — from config and from ingested data (requires single --device)",
3285
- "name": "all-streams",
3286
- "allowNo": false,
3287
- "type": "boolean"
3288
- },
3289
- "days": {
3290
- "description": "How many days back to look for unconfigured streams when using --all-streams",
3291
- "name": "days",
3292
- "default": 14,
3293
- "hasDynamicHelp": false,
3294
- "multiple": false,
3295
- "type": "option"
3296
- },
3297
- "device": {
3298
- "char": "d",
3299
- "description": "Device ID (UUID)",
3300
- "name": "device",
3301
- "required": true,
3302
- "hasDynamicHelp": false,
3303
- "multiple": true,
3304
- "type": "option"
3305
- },
3306
- "stream": {
3307
- "char": "s",
3308
- "description": "Stream name(s), can be specified multiple times",
3309
- "name": "stream",
3310
- "hasDynamicHelp": false,
3311
- "multiple": true,
3312
- "type": "option"
3313
3541
  }
3314
3542
  },
3315
3543
  "hasDynamicHelp": false,
3316
3544
  "hiddenAliases": [],
3317
- "id": "query:latest-values",
3545
+ "id": "schedule:list",
3318
3546
  "pluginAlias": "@formant/formant-cli",
3319
3547
  "pluginName": "@formant/formant-cli",
3320
3548
  "pluginType": "core",
3321
3549
  "strict": true,
3322
- "summary": "Get latest stream values",
3550
+ "summary": "List schedules",
3323
3551
  "enableJsonFlag": true,
3324
3552
  "isESM": true,
3325
3553
  "relativePath": [
3326
3554
  "dist",
3327
3555
  "commands",
3328
- "query",
3329
- "latest-values.js"
3556
+ "schedule",
3557
+ "list.js"
3330
3558
  ]
3331
3559
  },
3332
- "fleets:get": {
3560
+ "persona:delegate-task": {
3333
3561
  "aliases": [],
3334
3562
  "args": {
3335
3563
  "id": {
3336
- "description": "Fleet (group) ID (UUID)",
3564
+ "description": "Persona ID (UUID)",
3337
3565
  "name": "id",
3338
3566
  "required": true
3567
+ },
3568
+ "goal": {
3569
+ "description": "The task goal / instruction for the persona",
3570
+ "name": "goal",
3571
+ "required": true
3339
3572
  }
3340
3573
  },
3341
- "description": "Get detailed information about a device group (fleet).\n\nShows the full fleet configuration including member devices and settings.",
3574
+ "description": "Delegate a task to a persona for async execution.\n\nCreates a task with the given goal, assigns it to the persona, and queues it to run in the background. Returns immediately with a task ID you can use to check status later via \"persona task-status\".",
3342
3575
  "examples": [
3343
- "<%= config.bin %> fleets get <fleet-id>",
3344
- "<%= config.bin %> fleets get <fleet-id> --json"
3576
+ "<%= config.bin %> persona delegate-task <persona-id> \"Analyze recent device failures and summarize findings\"",
3577
+ "<%= config.bin %> persona delegate-task <persona-id> \"Generate a daily report of fleet health\" --name \"Daily Fleet Report\"",
3578
+ "<%= config.bin %> persona delegate-task <persona-id> \"Check all offline devices\" --dev"
3345
3579
  ],
3346
3580
  "flags": {
3347
3581
  "json": {
@@ -3370,32 +3604,47 @@
3370
3604
  "name": "stage",
3371
3605
  "allowNo": false,
3372
3606
  "type": "boolean"
3607
+ },
3608
+ "name": {
3609
+ "char": "n",
3610
+ "description": "Task name (defaults to first 50 chars of goal)",
3611
+ "name": "name",
3612
+ "hasDynamicHelp": false,
3613
+ "multiple": false,
3614
+ "type": "option"
3373
3615
  }
3374
3616
  },
3375
3617
  "hasDynamicHelp": false,
3376
3618
  "hiddenAliases": [],
3377
- "id": "fleets:get",
3619
+ "id": "persona:delegate-task",
3378
3620
  "pluginAlias": "@formant/formant-cli",
3379
3621
  "pluginName": "@formant/formant-cli",
3380
3622
  "pluginType": "core",
3381
3623
  "strict": true,
3382
- "summary": "Get fleet details",
3624
+ "summary": "Delegate an async task to a persona",
3383
3625
  "enableJsonFlag": true,
3384
3626
  "isESM": true,
3385
3627
  "relativePath": [
3386
3628
  "dist",
3387
3629
  "commands",
3388
- "fleets",
3389
- "get.js"
3630
+ "persona",
3631
+ "delegate-task.js"
3390
3632
  ]
3391
3633
  },
3392
- "fleets:list": {
3634
+ "persona:get": {
3393
3635
  "aliases": [],
3394
- "args": {},
3395
- "description": "List all device groups (fleets) in your organization.\n\nDevice groups allow you to organize and manage sets of devices together.",
3636
+ "args": {
3637
+ "id": {
3638
+ "description": "Persona ID (UUID)",
3639
+ "name": "id",
3640
+ "required": true
3641
+ }
3642
+ },
3643
+ "description": "Get detailed information about a persona including its integrations and available tools.\n\nUses the user-level persona endpoint which merges org, persona, and user configurations.",
3396
3644
  "examples": [
3397
- "<%= config.bin %> fleets list",
3398
- "<%= config.bin %> fleets list --json"
3645
+ "<%= config.bin %> personas get <persona-id>",
3646
+ "<%= config.bin %> personas get <persona-id> --json",
3647
+ "<%= config.bin %> personas get <persona-id> --dev"
3399
3648
  ],
3400
3649
  "flags": {
3401
3650
  "json": {
@@ -3428,34 +3677,29 @@
3428
3677
  },
3429
3678
  "hasDynamicHelp": false,
3430
3679
  "hiddenAliases": [],
3431
- "id": "fleets:list",
3680
+ "id": "persona:get",
3432
3681
  "pluginAlias": "@formant/formant-cli",
3433
3682
  "pluginName": "@formant/formant-cli",
3434
3683
  "pluginType": "core",
3435
3684
  "strict": true,
3436
- "summary": "List device groups",
3685
+ "summary": "Get persona details and tools",
3437
3686
  "enableJsonFlag": true,
3438
3687
  "isESM": true,
3439
3688
  "relativePath": [
3440
3689
  "dist",
3441
3690
  "commands",
3442
- "fleets",
3443
- "list.js"
3691
+ "persona",
3692
+ "get.js"
3444
3693
  ]
3445
3694
  },
3446
- "schedules:get": {
3695
+ "persona:list": {
3447
3696
  "aliases": [],
3448
- "args": {
3449
- "id": {
3450
- "description": "Schedule ID (UUID)",
3451
- "name": "id",
3452
- "required": true
3453
- }
3454
- },
3455
- "description": "Get detailed information about a schedule.\n\nShows the full schedule configuration including cron expression, command template,\ninvestigation link, and execution settings.",
3697
+ "args": {},
3698
+ "description": "List AI personas available in your organization.\n\nShows both built-in and custom personas with their ID, name, and description.",
3456
3699
  "examples": [
3457
- "<%= config.bin %> schedules get <schedule-id>",
3458
- "<%= config.bin %> schedules get <schedule-id> --json"
3700
+ "<%= config.bin %> personas list",
3701
+ "<%= config.bin %> personas list --json",
3702
+ "<%= config.bin %> personas list --dev"
3459
3703
  ],
3460
3704
  "flags": {
3461
3705
  "json": {
@@ -3488,28 +3732,35 @@
3488
3732
  },
3489
3733
  "hasDynamicHelp": false,
3490
3734
  "hiddenAliases": [],
3491
- "id": "schedules:get",
3735
+ "id": "persona:list",
3492
3736
  "pluginAlias": "@formant/formant-cli",
3493
3737
  "pluginName": "@formant/formant-cli",
3494
3738
  "pluginType": "core",
3495
3739
  "strict": true,
3496
- "summary": "Get schedule details",
3740
+ "summary": "List AI personas",
3497
3741
  "enableJsonFlag": true,
3498
3742
  "isESM": true,
3499
3743
  "relativePath": [
3500
3744
  "dist",
3501
3745
  "commands",
3502
- "schedules",
3503
- "get.js"
3746
+ "persona",
3747
+ "list.js"
3504
3748
  ]
3505
3749
  },
3506
- "schedules:list": {
3750
+ "persona:task-status": {
3507
3751
  "aliases": [],
3508
- "args": {},
3509
- "description": "List all schedules in your organization.\n\nSchedules can trigger commands or investigations on a recurring (cron) or one-time basis.",
3752
+ "args": {
3753
+ "taskId": {
3754
+ "description": "Task ID (from delegate-task output)",
3755
+ "name": "taskId",
3756
+ "required": true
3757
+ }
3758
+ },
3759
+ "description": "Check the status and results of a delegated task.\n\nShows all runs for a task including their status, result summary, and timestamps.",
3510
3760
  "examples": [
3511
- "<%= config.bin %> schedules list",
3512
- "<%= config.bin %> schedules list --json"
3761
+ "<%= config.bin %> persona task-status <task-id>",
3762
+ "<%= config.bin %> persona task-status <task-id> --json",
3763
+ "<%= config.bin %> persona task-status <task-id> --dev"
3513
3764
  ],
3514
3765
  "flags": {
3515
3766
  "json": {
@@ -3542,22 +3793,22 @@
3542
3793
  },
3543
3794
  "hasDynamicHelp": false,
3544
3795
  "hiddenAliases": [],
3545
- "id": "schedules:list",
3796
+ "id": "persona:task-status",
3546
3797
  "pluginAlias": "@formant/formant-cli",
3547
3798
  "pluginName": "@formant/formant-cli",
3548
3799
  "pluginType": "core",
3549
3800
  "strict": true,
3550
- "summary": "List schedules",
3801
+ "summary": "Check status of a delegated task",
3551
3802
  "enableJsonFlag": true,
3552
3803
  "isESM": true,
3553
3804
  "relativePath": [
3554
3805
  "dist",
3555
3806
  "commands",
3556
- "schedules",
3557
- "list.js"
3807
+ "persona",
3808
+ "task-status.js"
3558
3809
  ]
3559
3810
  },
3560
- "users:get": {
3811
+ "user:get": {
3561
3812
  "aliases": [],
3562
3813
  "args": {
3563
3814
  "id": {
@@ -3568,8 +3819,8 @@
3568
3819
  },
3569
3820
  "description": "Get detailed information about a user.\n\nShows user details including email, name, roles, and account settings.",
3570
3821
  "examples": [
3571
- "<%= config.bin %> users get <user-id>",
3572
- "<%= config.bin %> users get <user-id> --json"
3822
+ "<%= config.bin %> user get <user-id>",
3823
+ "<%= config.bin %> user get <user-id> --json"
3573
3824
  ],
3574
3825
  "flags": {
3575
3826
  "json": {
@@ -3602,7 +3853,7 @@
3602
3853
  },
3603
3854
  "hasDynamicHelp": false,
3604
3855
  "hiddenAliases": [],
3605
- "id": "users:get",
3856
+ "id": "user:get",
3606
3857
  "pluginAlias": "@formant/formant-cli",
3607
3858
  "pluginName": "@formant/formant-cli",
3608
3859
  "pluginType": "core",
@@ -3613,17 +3864,17 @@
3613
3864
  "relativePath": [
3614
3865
  "dist",
3615
3866
  "commands",
3616
- "users",
3867
+ "user",
3617
3868
  "get.js"
3618
3869
  ]
3619
3870
  },
3620
- "users:list": {
3871
+ "user:list": {
3621
3872
  "aliases": [],
3622
3873
  "args": {},
3623
3874
  "description": "List all users in your organization.\n\nShows user accounts, their email addresses, and account status.",
3624
3875
  "examples": [
3625
- "<%= config.bin %> users list",
3626
- "<%= config.bin %> users list --json"
3876
+ "<%= config.bin %> user list",
3877
+ "<%= config.bin %> user list --json"
3627
3878
  ],
3628
3879
  "flags": {
3629
3880
  "json": {
@@ -3656,7 +3907,7 @@
3656
3907
  },
3657
3908
  "hasDynamicHelp": false,
3658
3909
  "hiddenAliases": [],
3659
- "id": "users:list",
3910
+ "id": "user:list",
3660
3911
  "pluginAlias": "@formant/formant-cli",
3661
3912
  "pluginName": "@formant/formant-cli",
3662
3913
  "pluginType": "core",
@@ -3667,18 +3918,18 @@
3667
3918
  "relativePath": [
3668
3919
  "dist",
3669
3920
  "commands",
3670
- "users",
3921
+ "user",
3671
3922
  "list.js"
3672
3923
  ]
3673
3924
  },
3674
- "signals:count": {
3925
+ "signal:count": {
3675
3926
  "aliases": [],
3676
3927
  "args": {},
3677
3928
  "description": "Get counts of signals grouped by type.\n\nReturns total counts and per-type breakdowns (manual, eventTrigger, schedule, slack).",
3678
3929
  "examples": [
3679
- "<%= config.bin %> signals count",
3680
- "<%= config.bin %> signals count --start 2026-01-01 --end 2026-02-01",
3681
- "<%= config.bin %> signals count --json"
3930
+ "<%= config.bin %> signal count",
3931
+ "<%= config.bin %> signal count --start 2026-01-01 --end 2026-02-01",
3932
+ "<%= config.bin %> signal count --json"
3682
3933
  ],
3683
3934
  "flags": {
3684
3935
  "json": {
@@ -3725,7 +3976,7 @@
3725
3976
  },
3726
3977
  "hasDynamicHelp": false,
3727
3978
  "hiddenAliases": [],
3728
- "id": "signals:count",
3979
+ "id": "signal:count",
3729
3980
  "pluginAlias": "@formant/formant-cli",
3730
3981
  "pluginName": "@formant/formant-cli",
3731
3982
  "pluginType": "core",
@@ -3736,11 +3987,109 @@
3736
3987
  "relativePath": [
3737
3988
  "dist",
3738
3989
  "commands",
3739
- "signals",
3990
+ "signal",
3740
3991
  "count.js"
3741
3992
  ]
3742
3993
  },
3743
- "signals:get": {
3994
+ "signal:create": {
3995
+ "aliases": [],
3996
+ "args": {
3997
+ "goal": {
3998
+ "description": "Goal or description for the signal",
3999
+ "name": "goal",
4000
+ "required": true
4001
+ }
4002
+ },
4003
+ "description": "Create a manual signal.\n\nSignals are points of interest that can trigger AI-powered investigations. Use this to\nmanually create a signal with a goal description, optionally targeting a specific device\nor persona.",
4004
+ "examples": [
4005
+ "<%= config.bin %> signal create \"Robot arm jammed at joint 3\"",
4006
+ "<%= config.bin %> signal create \"Battery draining fast\" --device <device-id>",
4007
+ "<%= config.bin %> signal create \"Investigate sensor anomaly\" --persona <persona-id>",
4008
+ "<%= config.bin %> signal create \"Test alarm scenario\" --investigation <taskflow-id>",
4009
+ "<%= config.bin %> signal create \"Motor overheated\" --investigation <id> --ground-truth \"Should identify motor thermal fault\""
4010
+ ],
4011
+ "flags": {
4012
+ "json": {
4013
+ "description": "Format output as json.",
4014
+ "helpGroup": "GLOBAL",
4015
+ "name": "json",
4016
+ "allowNo": false,
4017
+ "type": "boolean"
4018
+ },
4019
+ "dev": {
4020
+ "description": "Target the dev environment",
4021
+ "exclusive": [
4022
+ "stage"
4023
+ ],
4024
+ "helpGroup": "GLOBAL",
4025
+ "name": "dev",
4026
+ "allowNo": false,
4027
+ "type": "boolean"
4028
+ },
4029
+ "stage": {
4030
+ "description": "Target the stage environment",
4031
+ "exclusive": [
4032
+ "dev"
4033
+ ],
4034
+ "helpGroup": "GLOBAL",
4035
+ "name": "stage",
4036
+ "allowNo": false,
4037
+ "type": "boolean"
4038
+ },
4039
+ "device": {
4040
+ "char": "d",
4041
+ "description": "Device ID to associate with this signal",
4042
+ "name": "device",
4043
+ "hasDynamicHelp": false,
4044
+ "multiple": false,
4045
+ "type": "option"
4046
+ },
4047
+ "ground-truth": {
4048
+ "char": "g",
4049
+ "dependsOn": [
4050
+ "investigation"
4051
+ ],
4052
+ "description": "Expected outcome (ground truth) for this signal — requires --investigation",
4053
+ "name": "ground-truth",
4054
+ "hasDynamicHelp": false,
4055
+ "multiple": false,
4056
+ "type": "option"
4057
+ },
4058
+ "investigation": {
4059
+ "char": "i",
4060
+ "description": "Investigation (taskflow) ID this signal targets",
4061
+ "name": "investigation",
4062
+ "hasDynamicHelp": false,
4063
+ "multiple": false,
4064
+ "type": "option"
4065
+ },
4066
+ "persona": {
4067
+ "char": "p",
4068
+ "description": "Persona ID to handle this signal",
4069
+ "name": "persona",
4070
+ "hasDynamicHelp": false,
4071
+ "multiple": false,
4072
+ "type": "option"
4073
+ }
4074
+ },
4075
+ "hasDynamicHelp": false,
4076
+ "hiddenAliases": [],
4077
+ "id": "signal:create",
4078
+ "pluginAlias": "@formant/formant-cli",
4079
+ "pluginName": "@formant/formant-cli",
4080
+ "pluginType": "core",
4081
+ "strict": true,
4082
+ "summary": "Create a manual signal",
4083
+ "enableJsonFlag": true,
4084
+ "isESM": true,
4085
+ "relativePath": [
4086
+ "dist",
4087
+ "commands",
4088
+ "signal",
4089
+ "create.js"
4090
+ ]
4091
+ },
4092
+ "signal:get": {
3744
4093
  "aliases": [],
3745
4094
  "args": {
3746
4095
  "id": {
@@ -3751,9 +4100,9 @@
3751
4100
  },
3752
4101
  "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.",
3753
4102
  "examples": [
3754
- "<%= config.bin %> signals get <signal-id>",
3755
- "<%= config.bin %> signals get <signal-id> --trace",
3756
- "<%= config.bin %> signals get <signal-id> --json"
4103
+ "<%= config.bin %> signal get <signal-id>",
4104
+ "<%= config.bin %> signal get <signal-id> --trace",
4105
+ "<%= config.bin %> signal get <signal-id> --json"
3757
4106
  ],
3758
4107
  "flags": {
3759
4108
  "json": {
@@ -3792,7 +4141,7 @@
3792
4141
  },
3793
4142
  "hasDynamicHelp": false,
3794
4143
  "hiddenAliases": [],
3795
- "id": "signals:get",
4144
+ "id": "signal:get",
3796
4145
  "pluginAlias": "@formant/formant-cli",
3797
4146
  "pluginName": "@formant/formant-cli",
3798
4147
  "pluginType": "core",
@@ -3803,17 +4152,18 @@
3803
4152
  "relativePath": [
3804
4153
  "dist",
3805
4154
  "commands",
3806
- "signals",
4155
+ "signal",
3807
4156
  "get.js"
3808
4157
  ]
3809
4158
  },
3810
- "signals:list": {
4159
+ "signal:list": {
3811
4160
  "aliases": [],
3812
4161
  "args": {},
3813
- "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.",
4162
+ "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.\n\nUse --investigation to also show ground truth (expected outcome) for each signal\nthat has one assigned for that investigation.",
3814
4163
  "examples": [
3815
- "<%= config.bin %> signals list",
3816
- "<%= config.bin %> signals list --json"
4164
+ "<%= config.bin %> signal list",
4165
+ "<%= config.bin %> signal list --investigation <taskflow-id>",
4166
+ "<%= config.bin %> signal list --json"
3817
4167
  ],
3818
4168
  "flags": {
3819
4169
  "json": {
@@ -3842,11 +4192,19 @@
3842
4192
  "name": "stage",
3843
4193
  "allowNo": false,
3844
4194
  "type": "boolean"
4195
+ },
4196
+ "investigation": {
4197
+ "char": "i",
4198
+ "description": "Investigation (taskflow) ID — shows ground truth for signals that have one",
4199
+ "name": "investigation",
4200
+ "hasDynamicHelp": false,
4201
+ "multiple": false,
4202
+ "type": "option"
3845
4203
  }
3846
4204
  },
3847
4205
  "hasDynamicHelp": false,
3848
4206
  "hiddenAliases": [],
3849
- "id": "signals:list",
4207
+ "id": "signal:list",
3850
4208
  "pluginAlias": "@formant/formant-cli",
3851
4209
  "pluginName": "@formant/formant-cli",
3852
4210
  "pluginType": "core",
@@ -3857,18 +4215,19 @@
3857
4215
  "relativePath": [
3858
4216
  "dist",
3859
4217
  "commands",
3860
- "signals",
4218
+ "signal",
3861
4219
  "list.js"
3862
4220
  ]
3863
4221
  },
3864
- "signals:query": {
4222
+ "signal:query": {
3865
4223
  "aliases": [],
3866
4224
  "args": {},
3867
- "description": "Query signals by time range and type.\n\nSignal types: manual, eventTrigger, schedule, slack.",
4225
+ "description": "Query signals by time range and type.\n\nSignal types: manual, eventTrigger, schedule, slack.\n\nUse --investigation to also show ground truth (expected outcome) for each signal.",
3868
4226
  "examples": [
3869
- "<%= config.bin %> signals query --start 2026-01-01",
3870
- "<%= config.bin %> signals query --start 2026-01-01 --end 2026-02-01 --type eventTrigger",
3871
- "<%= config.bin %> signals query --start 2026-01-01 --json"
4227
+ "<%= config.bin %> signal query --start 2026-01-01",
4228
+ "<%= config.bin %> signal query --start 2026-01-01 --end 2026-02-01 --type eventTrigger",
4229
+ "<%= config.bin %> signal query --start 2026-01-01 --investigation <taskflow-id>",
4230
+ "<%= config.bin %> signal query --start 2026-01-01 --json"
3872
4231
  ],
3873
4232
  "flags": {
3874
4233
  "json": {
@@ -3905,6 +4264,14 @@
3905
4264
  "multiple": false,
3906
4265
  "type": "option"
3907
4266
  },
4267
+ "investigation": {
4268
+ "char": "i",
4269
+ "description": "Investigation (taskflow) ID — shows ground truth for signals that have one",
4270
+ "name": "investigation",
4271
+ "hasDynamicHelp": false,
4272
+ "multiple": false,
4273
+ "type": "option"
4274
+ },
3908
4275
  "start": {
3909
4276
  "description": "Start time (ISO 8601)",
3910
4277
  "name": "start",
@@ -3929,7 +4296,7 @@
3929
4296
  },
3930
4297
  "hasDynamicHelp": false,
3931
4298
  "hiddenAliases": [],
3932
- "id": "signals:query",
4299
+ "id": "signal:query",
3933
4300
  "pluginAlias": "@formant/formant-cli",
3934
4301
  "pluginName": "@formant/formant-cli",
3935
4302
  "pluginType": "core",
@@ -3940,10 +4307,80 @@
3940
4307
  "relativePath": [
3941
4308
  "dist",
3942
4309
  "commands",
3943
- "signals",
4310
+ "signal",
3944
4311
  "query.js"
3945
4312
  ]
4313
+ },
4314
+ "signal:set-ground-truth": {
4315
+ "aliases": [],
4316
+ "args": {
4317
+ "signalId": {
4318
+ "description": "Signal ID (UUID)",
4319
+ "name": "signalId",
4320
+ "required": true
4321
+ },
4322
+ "investigationId": {
4323
+ "description": "Investigation (taskflow) ID",
4324
+ "name": "investigationId",
4325
+ "required": true
4326
+ },
4327
+ "expectedOutcome": {
4328
+ "description": "The expected outcome / ground truth for this signal",
4329
+ "name": "expectedOutcome",
4330
+ "required": true
4331
+ }
4332
+ },
4333
+ "description": "Assign a ground truth (expected outcome) to a signal for an investigation.\n\nGround truths define what the correct outcome should be when an investigation processes\na given signal. They are used for evaluation and quality measurement of investigation\nworkflows.",
4334
+ "examples": [
4335
+ "<%= config.bin %> signal set-ground-truth <signal-id> <investigation-id> \"The alarm should be dismissed as a false positive\"",
4336
+ "<%= config.bin %> signal set-ground-truth <signal-id> <investigation-id> \"Root cause: overheated motor in joint 3\" --json"
4337
+ ],
4338
+ "flags": {
4339
+ "json": {
4340
+ "description": "Format output as json.",
4341
+ "helpGroup": "GLOBAL",
4342
+ "name": "json",
4343
+ "allowNo": false,
4344
+ "type": "boolean"
4345
+ },
4346
+ "dev": {
4347
+ "description": "Target the dev environment",
4348
+ "exclusive": [
4349
+ "stage"
4350
+ ],
4351
+ "helpGroup": "GLOBAL",
4352
+ "name": "dev",
4353
+ "allowNo": false,
4354
+ "type": "boolean"
4355
+ },
4356
+ "stage": {
4357
+ "description": "Target the stage environment",
4358
+ "exclusive": [
4359
+ "dev"
4360
+ ],
4361
+ "helpGroup": "GLOBAL",
4362
+ "name": "stage",
4363
+ "allowNo": false,
4364
+ "type": "boolean"
4365
+ }
4366
+ },
4367
+ "hasDynamicHelp": false,
4368
+ "hiddenAliases": [],
4369
+ "id": "signal:set-ground-truth",
4370
+ "pluginAlias": "@formant/formant-cli",
4371
+ "pluginName": "@formant/formant-cli",
4372
+ "pluginType": "core",
4373
+ "strict": true,
4374
+ "summary": "Assign ground truth to a signal",
4375
+ "enableJsonFlag": true,
4376
+ "isESM": true,
4377
+ "relativePath": [
4378
+ "dist",
4379
+ "commands",
4380
+ "signal",
4381
+ "set-ground-truth.js"
4382
+ ]
3946
4383
  }
3947
4384
  },
3948
- "version": "0.3.1"
4385
+ "version": "0.4.2"
3949
4386
  }