faces-cli 1.5.0 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -53,10 +53,23 @@
53
53
  "state.js"
54
54
  ]
55
55
  },
56
- "billing:balance": {
56
+ "auth:connect": {
57
57
  "aliases": [],
58
- "args": {},
59
- "description": "Show credit balance and payment method status",
58
+ "args": {
59
+ "provider": {
60
+ "description": "OAuth provider to connect",
61
+ "name": "provider",
62
+ "options": [
63
+ "openai"
64
+ ],
65
+ "required": true
66
+ }
67
+ },
68
+ "description": "Connect an OAuth provider account to Faces (e.g. ChatGPT Plus/Pro)",
69
+ "examples": [
70
+ "<%= config.bin %> auth connect openai",
71
+ "<%= config.bin %> auth connect openai --manual"
72
+ ],
60
73
  "flags": {
61
74
  "json": {
62
75
  "description": "Format output as json.",
@@ -88,11 +101,17 @@
88
101
  "hasDynamicHelp": false,
89
102
  "multiple": false,
90
103
  "type": "option"
104
+ },
105
+ "manual": {
106
+ "description": "Manual mode for headless environments: prints the authorize URL and prompts you to paste the callback URL after approving in any browser.",
107
+ "name": "manual",
108
+ "allowNo": false,
109
+ "type": "boolean"
91
110
  }
92
111
  },
93
112
  "hasDynamicHelp": false,
94
113
  "hiddenAliases": [],
95
- "id": "billing:balance",
114
+ "id": "auth:connect",
96
115
  "pluginAlias": "faces-cli",
97
116
  "pluginName": "faces-cli",
98
117
  "pluginType": "core",
@@ -102,14 +121,18 @@
102
121
  "relativePath": [
103
122
  "dist",
104
123
  "commands",
105
- "billing",
106
- "balance.js"
124
+ "auth",
125
+ "connect.js"
107
126
  ]
108
127
  },
109
- "billing:card-setup": {
128
+ "auth:connections": {
110
129
  "aliases": [],
111
130
  "args": {},
112
- "description": "Get a Stripe card setup URL to save a payment method",
131
+ "description": "List connected OAuth provider accounts",
132
+ "examples": [
133
+ "<%= config.bin %> auth connections",
134
+ "<%= config.bin %> auth connections --json"
135
+ ],
113
136
  "flags": {
114
137
  "json": {
115
138
  "description": "Format output as json.",
@@ -145,7 +168,7 @@
145
168
  },
146
169
  "hasDynamicHelp": false,
147
170
  "hiddenAliases": [],
148
- "id": "billing:card-setup",
171
+ "id": "auth:connections",
149
172
  "pluginAlias": "faces-cli",
150
173
  "pluginName": "faces-cli",
151
174
  "pluginType": "core",
@@ -155,14 +178,26 @@
155
178
  "relativePath": [
156
179
  "dist",
157
180
  "commands",
158
- "billing",
159
- "card-setup.js"
181
+ "auth",
182
+ "connections.js"
160
183
  ]
161
184
  },
162
- "billing:checkout": {
185
+ "auth:disconnect": {
163
186
  "aliases": [],
164
- "args": {},
165
- "description": "Get a Stripe checkout URL to upgrade your subscription plan",
187
+ "args": {
188
+ "provider": {
189
+ "description": "OAuth provider to disconnect",
190
+ "name": "provider",
191
+ "options": [
192
+ "openai"
193
+ ],
194
+ "required": true
195
+ }
196
+ },
197
+ "description": "Disconnect a linked OAuth provider account",
198
+ "examples": [
199
+ "<%= config.bin %> auth disconnect openai"
200
+ ],
166
201
  "flags": {
167
202
  "json": {
168
203
  "description": "Format output as json.",
@@ -194,22 +229,11 @@
194
229
  "hasDynamicHelp": false,
195
230
  "multiple": false,
196
231
  "type": "option"
197
- },
198
- "plan": {
199
- "description": "Plan to subscribe to",
200
- "name": "plan",
201
- "default": "connect",
202
- "hasDynamicHelp": false,
203
- "multiple": false,
204
- "options": [
205
- "connect"
206
- ],
207
- "type": "option"
208
232
  }
209
233
  },
210
234
  "hasDynamicHelp": false,
211
235
  "hiddenAliases": [],
212
- "id": "billing:checkout",
236
+ "id": "auth:disconnect",
213
237
  "pluginAlias": "faces-cli",
214
238
  "pluginName": "faces-cli",
215
239
  "pluginType": "core",
@@ -219,14 +243,14 @@
219
243
  "relativePath": [
220
244
  "dist",
221
245
  "commands",
222
- "billing",
223
- "checkout.js"
246
+ "auth",
247
+ "disconnect.js"
224
248
  ]
225
249
  },
226
- "billing:llm-costs": {
250
+ "auth:login": {
227
251
  "aliases": [],
228
252
  "args": {},
229
- "description": "List available LLMs and their per-token costs",
253
+ "description": "Login and save JWT credentials",
230
254
  "flags": {
231
255
  "json": {
232
256
  "description": "Format output as json.",
@@ -259,9 +283,18 @@
259
283
  "multiple": false,
260
284
  "type": "option"
261
285
  },
262
- "provider": {
263
- "description": "Filter by provider (e.g. openai, anthropic)",
264
- "name": "provider",
286
+ "email": {
287
+ "description": "Account email",
288
+ "name": "email",
289
+ "required": true,
290
+ "hasDynamicHelp": false,
291
+ "multiple": false,
292
+ "type": "option"
293
+ },
294
+ "password": {
295
+ "description": "Account password",
296
+ "name": "password",
297
+ "required": true,
265
298
  "hasDynamicHelp": false,
266
299
  "multiple": false,
267
300
  "type": "option"
@@ -269,7 +302,7 @@
269
302
  },
270
303
  "hasDynamicHelp": false,
271
304
  "hiddenAliases": [],
272
- "id": "billing:llm-costs",
305
+ "id": "auth:login",
273
306
  "pluginAlias": "faces-cli",
274
307
  "pluginName": "faces-cli",
275
308
  "pluginType": "core",
@@ -279,14 +312,14 @@
279
312
  "relativePath": [
280
313
  "dist",
281
314
  "commands",
282
- "billing",
283
- "llm-costs.js"
315
+ "auth",
316
+ "login.js"
284
317
  ]
285
318
  },
286
- "billing:quota": {
319
+ "auth:logout": {
287
320
  "aliases": [],
288
321
  "args": {},
289
- "description": "Show compile token quota and per-face stats",
322
+ "description": "Clear saved credentials",
290
323
  "flags": {
291
324
  "json": {
292
325
  "description": "Format output as json.",
@@ -322,7 +355,7 @@
322
355
  },
323
356
  "hasDynamicHelp": false,
324
357
  "hiddenAliases": [],
325
- "id": "billing:quota",
358
+ "id": "auth:logout",
326
359
  "pluginAlias": "faces-cli",
327
360
  "pluginName": "faces-cli",
328
361
  "pluginType": "core",
@@ -332,14 +365,14 @@
332
365
  "relativePath": [
333
366
  "dist",
334
367
  "commands",
335
- "billing",
336
- "quota.js"
368
+ "auth",
369
+ "logout.js"
337
370
  ]
338
371
  },
339
- "billing:subscription": {
372
+ "auth:refresh": {
340
373
  "aliases": [],
341
374
  "args": {},
342
- "description": "Show current plan, face count, and renewal date",
375
+ "description": "Exchange current JWT for a fresh one",
343
376
  "flags": {
344
377
  "json": {
345
378
  "description": "Format output as json.",
@@ -375,7 +408,7 @@
375
408
  },
376
409
  "hasDynamicHelp": false,
377
410
  "hiddenAliases": [],
378
- "id": "billing:subscription",
411
+ "id": "auth:refresh",
379
412
  "pluginAlias": "faces-cli",
380
413
  "pluginName": "faces-cli",
381
414
  "pluginType": "core",
@@ -385,14 +418,14 @@
385
418
  "relativePath": [
386
419
  "dist",
387
420
  "commands",
388
- "billing",
389
- "subscription.js"
421
+ "auth",
422
+ "refresh.js"
390
423
  ]
391
424
  },
392
- "billing:topup": {
425
+ "auth:register": {
393
426
  "aliases": [],
394
427
  "args": {},
395
- "description": "Top up credit balance using saved payment method",
428
+ "description": "Create a new Faces account",
396
429
  "flags": {
397
430
  "json": {
398
431
  "description": "Format output as json.",
@@ -425,17 +458,40 @@
425
458
  "multiple": false,
426
459
  "type": "option"
427
460
  },
428
- "amount": {
429
- "description": "Top-up amount in USD (min $1)",
430
- "name": "amount",
461
+ "email": {
462
+ "description": "Email address",
463
+ "name": "email",
431
464
  "required": true,
432
465
  "hasDynamicHelp": false,
433
466
  "multiple": false,
434
467
  "type": "option"
435
468
  },
436
- "payment-ref": {
437
- "description": "Payment reference (admin/test path)",
438
- "name": "payment-ref",
469
+ "password": {
470
+ "description": "Password",
471
+ "name": "password",
472
+ "required": true,
473
+ "hasDynamicHelp": false,
474
+ "multiple": false,
475
+ "type": "option"
476
+ },
477
+ "name": {
478
+ "description": "Display name (defaults to username)",
479
+ "name": "name",
480
+ "hasDynamicHelp": false,
481
+ "multiple": false,
482
+ "type": "option"
483
+ },
484
+ "username": {
485
+ "description": "Username (lowercase, dashes, numbers)",
486
+ "name": "username",
487
+ "required": true,
488
+ "hasDynamicHelp": false,
489
+ "multiple": false,
490
+ "type": "option"
491
+ },
492
+ "invite-key": {
493
+ "description": "Invite key (if required)",
494
+ "name": "invite-key",
439
495
  "hasDynamicHelp": false,
440
496
  "multiple": false,
441
497
  "type": "option"
@@ -443,7 +499,7 @@
443
499
  },
444
500
  "hasDynamicHelp": false,
445
501
  "hiddenAliases": [],
446
- "id": "billing:topup",
502
+ "id": "auth:register",
447
503
  "pluginAlias": "faces-cli",
448
504
  "pluginName": "faces-cli",
449
505
  "pluginType": "core",
@@ -453,14 +509,14 @@
453
509
  "relativePath": [
454
510
  "dist",
455
511
  "commands",
456
- "billing",
457
- "topup.js"
512
+ "auth",
513
+ "register.js"
458
514
  ]
459
515
  },
460
- "billing:usage": {
516
+ "auth:whoami": {
461
517
  "aliases": [],
462
518
  "args": {},
463
- "description": "Aggregated usage analytics",
519
+ "description": "Print current user profile",
464
520
  "flags": {
465
521
  "json": {
466
522
  "description": "Format output as json.",
@@ -492,38 +548,11 @@
492
548
  "hasDynamicHelp": false,
493
549
  "multiple": false,
494
550
  "type": "option"
495
- },
496
- "group-by": {
497
- "description": "Group results",
498
- "name": "group-by",
499
- "hasDynamicHelp": false,
500
- "multiple": false,
501
- "options": [
502
- "api_key",
503
- "model",
504
- "llm",
505
- "date"
506
- ],
507
- "type": "option"
508
- },
509
- "from": {
510
- "description": "Start date (YYYY-MM-DD)",
511
- "name": "from",
512
- "hasDynamicHelp": false,
513
- "multiple": false,
514
- "type": "option"
515
- },
516
- "to": {
517
- "description": "End date (YYYY-MM-DD)",
518
- "name": "to",
519
- "hasDynamicHelp": false,
520
- "multiple": false,
521
- "type": "option"
522
551
  }
523
552
  },
524
553
  "hasDynamicHelp": false,
525
554
  "hiddenAliases": [],
526
- "id": "billing:usage",
555
+ "id": "auth:whoami",
527
556
  "pluginAlias": "faces-cli",
528
557
  "pluginName": "faces-cli",
529
558
  "pluginType": "core",
@@ -533,27 +562,14 @@
533
562
  "relativePath": [
534
563
  "dist",
535
564
  "commands",
536
- "billing",
537
- "usage.js"
565
+ "auth",
566
+ "whoami.js"
538
567
  ]
539
568
  },
540
- "auth:connect": {
569
+ "catalog:doctor": {
541
570
  "aliases": [],
542
- "args": {
543
- "provider": {
544
- "description": "OAuth provider to connect",
545
- "name": "provider",
546
- "options": [
547
- "openai"
548
- ],
549
- "required": true
550
- }
551
- },
552
- "description": "Connect an OAuth provider account to Faces (e.g. ChatGPT Plus/Pro)",
553
- "examples": [
554
- "<%= config.bin %> auth connect openai",
555
- "<%= config.bin %> auth connect openai --manual"
556
- ],
571
+ "args": {},
572
+ "description": "Diagnose and repair the local face catalog",
557
573
  "flags": {
558
574
  "json": {
559
575
  "description": "Format output as json.",
@@ -586,16 +602,22 @@
586
602
  "multiple": false,
587
603
  "type": "option"
588
604
  },
589
- "manual": {
590
- "description": "Manual mode for headless environments: prints the authorize URL and prompts you to paste the callback URL after approving in any browser.",
591
- "name": "manual",
605
+ "fix": {
606
+ "description": "Rebuild missing or stale catalog entries from API",
607
+ "name": "fix",
608
+ "allowNo": false,
609
+ "type": "boolean"
610
+ },
611
+ "generate": {
612
+ "description": "Fix + generate missing descriptions via LLM",
613
+ "name": "generate",
592
614
  "allowNo": false,
593
615
  "type": "boolean"
594
616
  }
595
617
  },
596
618
  "hasDynamicHelp": false,
597
619
  "hiddenAliases": [],
598
- "id": "auth:connect",
620
+ "id": "catalog:doctor",
599
621
  "pluginAlias": "faces-cli",
600
622
  "pluginName": "faces-cli",
601
623
  "pluginType": "core",
@@ -605,18 +627,14 @@
605
627
  "relativePath": [
606
628
  "dist",
607
629
  "commands",
608
- "auth",
609
- "connect.js"
630
+ "catalog",
631
+ "doctor.js"
610
632
  ]
611
633
  },
612
- "auth:connections": {
634
+ "catalog:list": {
613
635
  "aliases": [],
614
636
  "args": {},
615
- "description": "List connected OAuth provider accounts",
616
- "examples": [
617
- "<%= config.bin %> auth connections",
618
- "<%= config.bin %> auth connections --json"
619
- ],
637
+ "description": "List all faces in the local catalog",
620
638
  "flags": {
621
639
  "json": {
622
640
  "description": "Format output as json.",
@@ -652,7 +670,7 @@
652
670
  },
653
671
  "hasDynamicHelp": false,
654
672
  "hiddenAliases": [],
655
- "id": "auth:connections",
673
+ "id": "catalog:list",
656
674
  "pluginAlias": "faces-cli",
657
675
  "pluginName": "faces-cli",
658
676
  "pluginType": "core",
@@ -662,26 +680,14 @@
662
680
  "relativePath": [
663
681
  "dist",
664
682
  "commands",
665
- "auth",
666
- "connections.js"
683
+ "catalog",
684
+ "list.js"
667
685
  ]
668
686
  },
669
- "auth:disconnect": {
687
+ "billing:balance": {
670
688
  "aliases": [],
671
- "args": {
672
- "provider": {
673
- "description": "OAuth provider to disconnect",
674
- "name": "provider",
675
- "options": [
676
- "openai"
677
- ],
678
- "required": true
679
- }
680
- },
681
- "description": "Disconnect a linked OAuth provider account",
682
- "examples": [
683
- "<%= config.bin %> auth disconnect openai"
684
- ],
689
+ "args": {},
690
+ "description": "Show credit balance and payment method status",
685
691
  "flags": {
686
692
  "json": {
687
693
  "description": "Format output as json.",
@@ -717,7 +723,7 @@
717
723
  },
718
724
  "hasDynamicHelp": false,
719
725
  "hiddenAliases": [],
720
- "id": "auth:disconnect",
726
+ "id": "billing:balance",
721
727
  "pluginAlias": "faces-cli",
722
728
  "pluginName": "faces-cli",
723
729
  "pluginType": "core",
@@ -727,14 +733,14 @@
727
733
  "relativePath": [
728
734
  "dist",
729
735
  "commands",
730
- "auth",
731
- "disconnect.js"
736
+ "billing",
737
+ "balance.js"
732
738
  ]
733
739
  },
734
- "auth:login": {
740
+ "billing:card-setup": {
735
741
  "aliases": [],
736
742
  "args": {},
737
- "description": "Login and save JWT credentials",
743
+ "description": "Get a Stripe card setup URL to save a payment method",
738
744
  "flags": {
739
745
  "json": {
740
746
  "description": "Format output as json.",
@@ -766,27 +772,11 @@
766
772
  "hasDynamicHelp": false,
767
773
  "multiple": false,
768
774
  "type": "option"
769
- },
770
- "email": {
771
- "description": "Account email",
772
- "name": "email",
773
- "required": true,
774
- "hasDynamicHelp": false,
775
- "multiple": false,
776
- "type": "option"
777
- },
778
- "password": {
779
- "description": "Account password",
780
- "name": "password",
781
- "required": true,
782
- "hasDynamicHelp": false,
783
- "multiple": false,
784
- "type": "option"
785
775
  }
786
776
  },
787
777
  "hasDynamicHelp": false,
788
778
  "hiddenAliases": [],
789
- "id": "auth:login",
779
+ "id": "billing:card-setup",
790
780
  "pluginAlias": "faces-cli",
791
781
  "pluginName": "faces-cli",
792
782
  "pluginType": "core",
@@ -796,14 +786,14 @@
796
786
  "relativePath": [
797
787
  "dist",
798
788
  "commands",
799
- "auth",
800
- "login.js"
789
+ "billing",
790
+ "card-setup.js"
801
791
  ]
802
792
  },
803
- "auth:logout": {
793
+ "billing:checkout": {
804
794
  "aliases": [],
805
795
  "args": {},
806
- "description": "Clear saved credentials",
796
+ "description": "Get a Stripe checkout URL to upgrade your subscription plan",
807
797
  "flags": {
808
798
  "json": {
809
799
  "description": "Format output as json.",
@@ -835,11 +825,22 @@
835
825
  "hasDynamicHelp": false,
836
826
  "multiple": false,
837
827
  "type": "option"
828
+ },
829
+ "plan": {
830
+ "description": "Plan to subscribe to",
831
+ "name": "plan",
832
+ "default": "connect",
833
+ "hasDynamicHelp": false,
834
+ "multiple": false,
835
+ "options": [
836
+ "connect"
837
+ ],
838
+ "type": "option"
838
839
  }
839
840
  },
840
841
  "hasDynamicHelp": false,
841
842
  "hiddenAliases": [],
842
- "id": "auth:logout",
843
+ "id": "billing:checkout",
843
844
  "pluginAlias": "faces-cli",
844
845
  "pluginName": "faces-cli",
845
846
  "pluginType": "core",
@@ -849,14 +850,14 @@
849
850
  "relativePath": [
850
851
  "dist",
851
852
  "commands",
852
- "auth",
853
- "logout.js"
853
+ "billing",
854
+ "checkout.js"
854
855
  ]
855
856
  },
856
- "auth:refresh": {
857
+ "billing:llm-costs": {
857
858
  "aliases": [],
858
859
  "args": {},
859
- "description": "Exchange current JWT for a fresh one",
860
+ "description": "List available LLMs and their per-token costs",
860
861
  "flags": {
861
862
  "json": {
862
863
  "description": "Format output as json.",
@@ -888,11 +889,18 @@
888
889
  "hasDynamicHelp": false,
889
890
  "multiple": false,
890
891
  "type": "option"
892
+ },
893
+ "provider": {
894
+ "description": "Filter by provider (e.g. openai, anthropic)",
895
+ "name": "provider",
896
+ "hasDynamicHelp": false,
897
+ "multiple": false,
898
+ "type": "option"
891
899
  }
892
900
  },
893
901
  "hasDynamicHelp": false,
894
902
  "hiddenAliases": [],
895
- "id": "auth:refresh",
903
+ "id": "billing:llm-costs",
896
904
  "pluginAlias": "faces-cli",
897
905
  "pluginName": "faces-cli",
898
906
  "pluginType": "core",
@@ -902,14 +910,14 @@
902
910
  "relativePath": [
903
911
  "dist",
904
912
  "commands",
905
- "auth",
906
- "refresh.js"
913
+ "billing",
914
+ "llm-costs.js"
907
915
  ]
908
916
  },
909
- "auth:register": {
917
+ "billing:quota": {
910
918
  "aliases": [],
911
919
  "args": {},
912
- "description": "Create a new Faces account",
920
+ "description": "Show compile token quota and per-face stats",
913
921
  "flags": {
914
922
  "json": {
915
923
  "description": "Format output as json.",
@@ -941,49 +949,11 @@
941
949
  "hasDynamicHelp": false,
942
950
  "multiple": false,
943
951
  "type": "option"
944
- },
945
- "email": {
946
- "description": "Email address",
947
- "name": "email",
948
- "required": true,
949
- "hasDynamicHelp": false,
950
- "multiple": false,
951
- "type": "option"
952
- },
953
- "password": {
954
- "description": "Password",
955
- "name": "password",
956
- "required": true,
957
- "hasDynamicHelp": false,
958
- "multiple": false,
959
- "type": "option"
960
- },
961
- "name": {
962
- "description": "Display name (defaults to username)",
963
- "name": "name",
964
- "hasDynamicHelp": false,
965
- "multiple": false,
966
- "type": "option"
967
- },
968
- "username": {
969
- "description": "Username (lowercase, dashes, numbers)",
970
- "name": "username",
971
- "required": true,
972
- "hasDynamicHelp": false,
973
- "multiple": false,
974
- "type": "option"
975
- },
976
- "invite-key": {
977
- "description": "Invite key (if required)",
978
- "name": "invite-key",
979
- "hasDynamicHelp": false,
980
- "multiple": false,
981
- "type": "option"
982
952
  }
983
953
  },
984
954
  "hasDynamicHelp": false,
985
955
  "hiddenAliases": [],
986
- "id": "auth:register",
956
+ "id": "billing:quota",
987
957
  "pluginAlias": "faces-cli",
988
958
  "pluginName": "faces-cli",
989
959
  "pluginType": "core",
@@ -993,14 +963,14 @@
993
963
  "relativePath": [
994
964
  "dist",
995
965
  "commands",
996
- "auth",
997
- "register.js"
966
+ "billing",
967
+ "quota.js"
998
968
  ]
999
969
  },
1000
- "auth:whoami": {
970
+ "billing:subscription": {
1001
971
  "aliases": [],
1002
972
  "args": {},
1003
- "description": "Print current user profile",
973
+ "description": "Show current plan, face count, and renewal date",
1004
974
  "flags": {
1005
975
  "json": {
1006
976
  "description": "Format output as json.",
@@ -1036,7 +1006,7 @@
1036
1006
  },
1037
1007
  "hasDynamicHelp": false,
1038
1008
  "hiddenAliases": [],
1039
- "id": "auth:whoami",
1009
+ "id": "billing:subscription",
1040
1010
  "pluginAlias": "faces-cli",
1041
1011
  "pluginName": "faces-cli",
1042
1012
  "pluginType": "core",
@@ -1046,14 +1016,14 @@
1046
1016
  "relativePath": [
1047
1017
  "dist",
1048
1018
  "commands",
1049
- "auth",
1050
- "whoami.js"
1019
+ "billing",
1020
+ "subscription.js"
1051
1021
  ]
1052
1022
  },
1053
- "catalog:doctor": {
1023
+ "billing:topup": {
1054
1024
  "aliases": [],
1055
1025
  "args": {},
1056
- "description": "Diagnose and repair the local face catalog",
1026
+ "description": "Top up credit balance using saved payment method",
1057
1027
  "flags": {
1058
1028
  "json": {
1059
1029
  "description": "Format output as json.",
@@ -1086,22 +1056,25 @@
1086
1056
  "multiple": false,
1087
1057
  "type": "option"
1088
1058
  },
1089
- "fix": {
1090
- "description": "Rebuild missing or stale catalog entries from API",
1091
- "name": "fix",
1092
- "allowNo": false,
1093
- "type": "boolean"
1059
+ "amount": {
1060
+ "description": "Top-up amount in USD (min $1)",
1061
+ "name": "amount",
1062
+ "required": true,
1063
+ "hasDynamicHelp": false,
1064
+ "multiple": false,
1065
+ "type": "option"
1094
1066
  },
1095
- "generate": {
1096
- "description": "Fix + generate missing descriptions via LLM",
1097
- "name": "generate",
1098
- "allowNo": false,
1099
- "type": "boolean"
1067
+ "payment-ref": {
1068
+ "description": "Payment reference (admin/test path)",
1069
+ "name": "payment-ref",
1070
+ "hasDynamicHelp": false,
1071
+ "multiple": false,
1072
+ "type": "option"
1100
1073
  }
1101
1074
  },
1102
1075
  "hasDynamicHelp": false,
1103
1076
  "hiddenAliases": [],
1104
- "id": "catalog:doctor",
1077
+ "id": "billing:topup",
1105
1078
  "pluginAlias": "faces-cli",
1106
1079
  "pluginName": "faces-cli",
1107
1080
  "pluginType": "core",
@@ -1111,14 +1084,14 @@
1111
1084
  "relativePath": [
1112
1085
  "dist",
1113
1086
  "commands",
1114
- "catalog",
1115
- "doctor.js"
1087
+ "billing",
1088
+ "topup.js"
1116
1089
  ]
1117
1090
  },
1118
- "catalog:list": {
1091
+ "billing:usage": {
1119
1092
  "aliases": [],
1120
1093
  "args": {},
1121
- "description": "List all faces in the local catalog",
1094
+ "description": "Aggregated usage analytics",
1122
1095
  "flags": {
1123
1096
  "json": {
1124
1097
  "description": "Format output as json.",
@@ -1150,11 +1123,38 @@
1150
1123
  "hasDynamicHelp": false,
1151
1124
  "multiple": false,
1152
1125
  "type": "option"
1126
+ },
1127
+ "group-by": {
1128
+ "description": "Group results",
1129
+ "name": "group-by",
1130
+ "hasDynamicHelp": false,
1131
+ "multiple": false,
1132
+ "options": [
1133
+ "api_key",
1134
+ "model",
1135
+ "llm",
1136
+ "date"
1137
+ ],
1138
+ "type": "option"
1139
+ },
1140
+ "from": {
1141
+ "description": "Start date (YYYY-MM-DD)",
1142
+ "name": "from",
1143
+ "hasDynamicHelp": false,
1144
+ "multiple": false,
1145
+ "type": "option"
1146
+ },
1147
+ "to": {
1148
+ "description": "End date (YYYY-MM-DD)",
1149
+ "name": "to",
1150
+ "hasDynamicHelp": false,
1151
+ "multiple": false,
1152
+ "type": "option"
1153
1153
  }
1154
1154
  },
1155
1155
  "hasDynamicHelp": false,
1156
1156
  "hiddenAliases": [],
1157
- "id": "catalog:list",
1157
+ "id": "billing:usage",
1158
1158
  "pluginAlias": "faces-cli",
1159
1159
  "pluginName": "faces-cli",
1160
1160
  "pluginType": "core",
@@ -1164,8 +1164,8 @@
1164
1164
  "relativePath": [
1165
1165
  "dist",
1166
1166
  "commands",
1167
- "catalog",
1168
- "list.js"
1167
+ "billing",
1168
+ "usage.js"
1169
1169
  ]
1170
1170
  },
1171
1171
  "chat:chat": {
@@ -1453,16 +1453,10 @@
1453
1453
  "responses.js"
1454
1454
  ]
1455
1455
  },
1456
- "compile:import": {
1456
+ "config:clear": {
1457
1457
  "aliases": [],
1458
- "args": {
1459
- "face_id": {
1460
- "description": "Face alias",
1461
- "name": "face_id",
1462
- "required": true
1463
- }
1464
- },
1465
- "description": "Import a YouTube video into a face via server-side download and transcription",
1458
+ "args": {},
1459
+ "description": "Delete all saved credentials and config",
1466
1460
  "flags": {
1467
1461
  "json": {
1468
1462
  "description": "Format output as json.",
@@ -1495,49 +1489,16 @@
1495
1489
  "multiple": false,
1496
1490
  "type": "option"
1497
1491
  },
1498
- "url": {
1499
- "description": "YouTube URL (youtube.com/watch?v=... or youtu.be/...)",
1500
- "name": "url",
1501
- "required": true,
1502
- "hasDynamicHelp": false,
1503
- "multiple": false,
1504
- "type": "option"
1505
- },
1506
- "type": {
1507
- "description": "\"document\" for solo talks, lectures, monologues; \"thread\" for interviews or multi-speaker conversations",
1508
- "name": "type",
1509
- "default": "document",
1510
- "hasDynamicHelp": false,
1511
- "multiple": false,
1512
- "options": [
1513
- "document",
1514
- "thread"
1515
- ],
1516
- "type": "option"
1517
- },
1518
- "perspective": {
1519
- "description": "\"first-person\" if the face is the speaker; \"third-person\" if the video is about the face",
1520
- "name": "perspective",
1521
- "default": "third-person",
1522
- "hasDynamicHelp": false,
1523
- "multiple": false,
1524
- "options": [
1525
- "first-person",
1526
- "third-person"
1527
- ],
1528
- "type": "option"
1529
- },
1530
- "face-speaker": {
1531
- "description": "For --type thread: AssemblyAI speaker label (e.g. \"A\") that corresponds to the face. Defaults to first detected speaker.",
1532
- "name": "face-speaker",
1533
- "hasDynamicHelp": false,
1534
- "multiple": false,
1535
- "type": "option"
1492
+ "yes": {
1493
+ "description": "Skip confirmation",
1494
+ "name": "yes",
1495
+ "allowNo": false,
1496
+ "type": "boolean"
1536
1497
  }
1537
1498
  },
1538
1499
  "hasDynamicHelp": false,
1539
1500
  "hiddenAliases": [],
1540
- "id": "compile:import",
1501
+ "id": "config:clear",
1541
1502
  "pluginAlias": "faces-cli",
1542
1503
  "pluginName": "faces-cli",
1543
1504
  "pluginType": "core",
@@ -1547,20 +1508,25 @@
1547
1508
  "relativePath": [
1548
1509
  "dist",
1549
1510
  "commands",
1550
- "compile",
1551
- "import.js"
1511
+ "config",
1512
+ "clear.js"
1552
1513
  ]
1553
1514
  },
1554
- "compile:upload": {
1515
+ "config:set": {
1555
1516
  "aliases": [],
1556
1517
  "args": {
1557
- "alias": {
1558
- "description": "Face alias",
1559
- "name": "alias",
1518
+ "key": {
1519
+ "description": "Config key",
1520
+ "name": "key",
1521
+ "required": true
1522
+ },
1523
+ "value": {
1524
+ "description": "Config value",
1525
+ "name": "value",
1560
1526
  "required": true
1561
1527
  }
1562
1528
  },
1563
- "description": "Upload a file (text/PDF/audio/video) to compile into a face",
1529
+ "description": "Set a config value (e.g. base_url, api_key, token)",
1564
1530
  "flags": {
1565
1531
  "json": {
1566
1532
  "description": "Format output as json.",
@@ -1592,50 +1558,11 @@
1592
1558
  "hasDynamicHelp": false,
1593
1559
  "multiple": false,
1594
1560
  "type": "option"
1595
- },
1596
- "file": {
1597
- "description": "File to upload",
1598
- "name": "file",
1599
- "required": true,
1600
- "hasDynamicHelp": false,
1601
- "multiple": false,
1602
- "type": "option"
1603
- },
1604
- "kind": {
1605
- "description": "Upload kind: document or thread",
1606
- "name": "kind",
1607
- "default": "document",
1608
- "hasDynamicHelp": false,
1609
- "multiple": false,
1610
- "options": [
1611
- "document",
1612
- "thread"
1613
- ],
1614
- "type": "option"
1615
- },
1616
- "perspective": {
1617
- "description": "Perspective (document only)",
1618
- "name": "perspective",
1619
- "default": "third-person",
1620
- "hasDynamicHelp": false,
1621
- "multiple": false,
1622
- "options": [
1623
- "first-person",
1624
- "third-person"
1625
- ],
1626
- "type": "option"
1627
- },
1628
- "face-speaker": {
1629
- "description": "Speaker name to map to the face (thread only). If omitted, auto-detected from face name.",
1630
- "name": "face-speaker",
1631
- "hasDynamicHelp": false,
1632
- "multiple": false,
1633
- "type": "option"
1634
1561
  }
1635
1562
  },
1636
1563
  "hasDynamicHelp": false,
1637
1564
  "hiddenAliases": [],
1638
- "id": "compile:upload",
1565
+ "id": "config:set",
1639
1566
  "pluginAlias": "faces-cli",
1640
1567
  "pluginName": "faces-cli",
1641
1568
  "pluginType": "core",
@@ -1645,14 +1572,14 @@
1645
1572
  "relativePath": [
1646
1573
  "dist",
1647
1574
  "commands",
1648
- "compile",
1649
- "upload.js"
1575
+ "config",
1576
+ "set.js"
1650
1577
  ]
1651
1578
  },
1652
- "config:clear": {
1579
+ "config:show": {
1653
1580
  "aliases": [],
1654
1581
  "args": {},
1655
- "description": "Delete all saved credentials and config",
1582
+ "description": "Print current config (credentials are masked)",
1656
1583
  "flags": {
1657
1584
  "json": {
1658
1585
  "description": "Format output as json.",
@@ -1684,17 +1611,11 @@
1684
1611
  "hasDynamicHelp": false,
1685
1612
  "multiple": false,
1686
1613
  "type": "option"
1687
- },
1688
- "yes": {
1689
- "description": "Skip confirmation",
1690
- "name": "yes",
1691
- "allowNo": false,
1692
- "type": "boolean"
1693
1614
  }
1694
1615
  },
1695
1616
  "hasDynamicHelp": false,
1696
1617
  "hiddenAliases": [],
1697
- "id": "config:clear",
1618
+ "id": "config:show",
1698
1619
  "pluginAlias": "faces-cli",
1699
1620
  "pluginName": "faces-cli",
1700
1621
  "pluginType": "core",
@@ -1705,24 +1626,19 @@
1705
1626
  "dist",
1706
1627
  "commands",
1707
1628
  "config",
1708
- "clear.js"
1629
+ "show.js"
1709
1630
  ]
1710
1631
  },
1711
- "config:set": {
1632
+ "compile:import": {
1712
1633
  "aliases": [],
1713
1634
  "args": {
1714
- "key": {
1715
- "description": "Config key",
1716
- "name": "key",
1717
- "required": true
1718
- },
1719
- "value": {
1720
- "description": "Config value",
1721
- "name": "value",
1635
+ "face_id": {
1636
+ "description": "Face alias",
1637
+ "name": "face_id",
1722
1638
  "required": true
1723
1639
  }
1724
1640
  },
1725
- "description": "Set a config value (e.g. base_url, api_key, token)",
1641
+ "description": "Import a YouTube video into a face via server-side download and transcription",
1726
1642
  "flags": {
1727
1643
  "json": {
1728
1644
  "description": "Format output as json.",
@@ -1754,11 +1670,56 @@
1754
1670
  "hasDynamicHelp": false,
1755
1671
  "multiple": false,
1756
1672
  "type": "option"
1673
+ },
1674
+ "url": {
1675
+ "description": "YouTube URL (youtube.com/watch?v=... or youtu.be/...)",
1676
+ "name": "url",
1677
+ "required": true,
1678
+ "hasDynamicHelp": false,
1679
+ "multiple": false,
1680
+ "type": "option"
1681
+ },
1682
+ "type": {
1683
+ "description": "\"document\" for solo talks, lectures, monologues; \"thread\" for interviews or multi-speaker conversations",
1684
+ "name": "type",
1685
+ "default": "document",
1686
+ "hasDynamicHelp": false,
1687
+ "multiple": false,
1688
+ "options": [
1689
+ "document",
1690
+ "thread"
1691
+ ],
1692
+ "type": "option"
1693
+ },
1694
+ "perspective": {
1695
+ "description": "\"first-person\" if the face is the speaker; \"third-person\" if the video is about the face",
1696
+ "name": "perspective",
1697
+ "default": "third-person",
1698
+ "hasDynamicHelp": false,
1699
+ "multiple": false,
1700
+ "options": [
1701
+ "first-person",
1702
+ "third-person"
1703
+ ],
1704
+ "type": "option"
1705
+ },
1706
+ "face-speaker": {
1707
+ "description": "For --type thread: AssemblyAI speaker label (e.g. \"A\") that corresponds to the face. Defaults to first detected speaker.",
1708
+ "name": "face-speaker",
1709
+ "hasDynamicHelp": false,
1710
+ "multiple": false,
1711
+ "type": "option"
1712
+ },
1713
+ "no-wait": {
1714
+ "description": "Return immediately after import starts (do not poll for transcription). Prints the ID for manual polling.",
1715
+ "name": "no-wait",
1716
+ "allowNo": false,
1717
+ "type": "boolean"
1757
1718
  }
1758
1719
  },
1759
1720
  "hasDynamicHelp": false,
1760
1721
  "hiddenAliases": [],
1761
- "id": "config:set",
1722
+ "id": "compile:import",
1762
1723
  "pluginAlias": "faces-cli",
1763
1724
  "pluginName": "faces-cli",
1764
1725
  "pluginType": "core",
@@ -1768,14 +1729,20 @@
1768
1729
  "relativePath": [
1769
1730
  "dist",
1770
1731
  "commands",
1771
- "config",
1772
- "set.js"
1732
+ "compile",
1733
+ "import.js"
1773
1734
  ]
1774
1735
  },
1775
- "config:show": {
1736
+ "compile:upload": {
1776
1737
  "aliases": [],
1777
- "args": {},
1778
- "description": "Print current config (credentials are masked)",
1738
+ "args": {
1739
+ "alias": {
1740
+ "description": "Face alias",
1741
+ "name": "alias",
1742
+ "required": true
1743
+ }
1744
+ },
1745
+ "description": "Upload a file (text/PDF/audio/video) to compile into a face",
1779
1746
  "flags": {
1780
1747
  "json": {
1781
1748
  "description": "Format output as json.",
@@ -1807,11 +1774,56 @@
1807
1774
  "hasDynamicHelp": false,
1808
1775
  "multiple": false,
1809
1776
  "type": "option"
1777
+ },
1778
+ "file": {
1779
+ "description": "File to upload",
1780
+ "name": "file",
1781
+ "required": true,
1782
+ "hasDynamicHelp": false,
1783
+ "multiple": false,
1784
+ "type": "option"
1785
+ },
1786
+ "kind": {
1787
+ "description": "Upload kind: document or thread",
1788
+ "name": "kind",
1789
+ "default": "document",
1790
+ "hasDynamicHelp": false,
1791
+ "multiple": false,
1792
+ "options": [
1793
+ "document",
1794
+ "thread"
1795
+ ],
1796
+ "type": "option"
1797
+ },
1798
+ "perspective": {
1799
+ "description": "Perspective (document only)",
1800
+ "name": "perspective",
1801
+ "default": "third-person",
1802
+ "hasDynamicHelp": false,
1803
+ "multiple": false,
1804
+ "options": [
1805
+ "first-person",
1806
+ "third-person"
1807
+ ],
1808
+ "type": "option"
1809
+ },
1810
+ "face-speaker": {
1811
+ "description": "Speaker name to map to the face (thread only). If omitted, auto-detected from face name.",
1812
+ "name": "face-speaker",
1813
+ "hasDynamicHelp": false,
1814
+ "multiple": false,
1815
+ "type": "option"
1816
+ },
1817
+ "no-wait": {
1818
+ "description": "Return immediately after upload (do not poll for transcription). Prints the ID for manual polling.",
1819
+ "name": "no-wait",
1820
+ "allowNo": false,
1821
+ "type": "boolean"
1810
1822
  }
1811
1823
  },
1812
1824
  "hasDynamicHelp": false,
1813
1825
  "hiddenAliases": [],
1814
- "id": "config:show",
1826
+ "id": "compile:upload",
1815
1827
  "pluginAlias": "faces-cli",
1816
1828
  "pluginName": "faces-cli",
1817
1829
  "pluginType": "core",
@@ -1821,14 +1833,14 @@
1821
1833
  "relativePath": [
1822
1834
  "dist",
1823
1835
  "commands",
1824
- "config",
1825
- "show.js"
1836
+ "compile",
1837
+ "upload.js"
1826
1838
  ]
1827
1839
  },
1828
- "keys:create": {
1840
+ "face:create": {
1829
1841
  "aliases": [],
1830
1842
  "args": {},
1831
- "description": "Create a new API key (JWT required)",
1843
+ "description": "Create a new face",
1832
1844
  "flags": {
1833
1845
  "json": {
1834
1846
  "description": "Format output as json.",
@@ -1862,37 +1874,52 @@
1862
1874
  "type": "option"
1863
1875
  },
1864
1876
  "name": {
1865
- "description": "Key name/label",
1877
+ "description": "Display name",
1866
1878
  "name": "name",
1867
1879
  "required": true,
1868
1880
  "hasDynamicHelp": false,
1869
1881
  "multiple": false,
1870
1882
  "type": "option"
1871
1883
  },
1872
- "expires-days": {
1873
- "description": "Expiry in days (omit for no expiry)",
1874
- "name": "expires-days",
1884
+ "alias": {
1885
+ "description": "Unique alias slug",
1886
+ "name": "alias",
1887
+ "required": true,
1875
1888
  "hasDynamicHelp": false,
1876
1889
  "multiple": false,
1877
1890
  "type": "option"
1878
1891
  },
1879
- "budget": {
1880
- "description": "Spend budget in USD",
1881
- "name": "budget",
1892
+ "description": {
1893
+ "description": "Description for local catalog",
1894
+ "name": "description",
1882
1895
  "hasDynamicHelp": false,
1883
1896
  "multiple": false,
1884
1897
  "type": "option"
1885
1898
  },
1886
- "face": {
1887
- "description": "Allowed face alias (repeatable)",
1888
- "name": "face",
1899
+ "default-model": {
1900
+ "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
1901
+ "name": "default-model",
1902
+ "hasDynamicHelp": false,
1903
+ "multiple": false,
1904
+ "type": "option"
1905
+ },
1906
+ "formula": {
1907
+ "description": "Boolean formula over owned concrete face aliases (e.g. \"a | b\", \"(a | b) - c\"). Creates a composite face.",
1908
+ "name": "formula",
1909
+ "hasDynamicHelp": false,
1910
+ "multiple": false,
1911
+ "type": "option"
1912
+ },
1913
+ "attr": {
1914
+ "description": "Attribute KEY=VALUE (repeatable)",
1915
+ "name": "attr",
1889
1916
  "hasDynamicHelp": false,
1890
1917
  "multiple": true,
1891
1918
  "type": "option"
1892
1919
  },
1893
- "model": {
1894
- "description": "Allowed model name (repeatable)",
1895
- "name": "model",
1920
+ "tool": {
1921
+ "description": "Tool name to enable (repeatable)",
1922
+ "name": "tool",
1896
1923
  "hasDynamicHelp": false,
1897
1924
  "multiple": true,
1898
1925
  "type": "option"
@@ -1900,7 +1927,7 @@
1900
1927
  },
1901
1928
  "hasDynamicHelp": false,
1902
1929
  "hiddenAliases": [],
1903
- "id": "keys:create",
1930
+ "id": "face:create",
1904
1931
  "pluginAlias": "faces-cli",
1905
1932
  "pluginName": "faces-cli",
1906
1933
  "pluginType": "core",
@@ -1910,14 +1937,20 @@
1910
1937
  "relativePath": [
1911
1938
  "dist",
1912
1939
  "commands",
1913
- "keys",
1940
+ "face",
1914
1941
  "create.js"
1915
1942
  ]
1916
1943
  },
1917
- "keys:list": {
1944
+ "face:delete": {
1918
1945
  "aliases": [],
1919
- "args": {},
1920
- "description": "List all API keys (JWT required)",
1946
+ "args": {
1947
+ "face_id": {
1948
+ "description": "Face alias",
1949
+ "name": "face_id",
1950
+ "required": true
1951
+ }
1952
+ },
1953
+ "description": "Delete a face permanently",
1921
1954
  "flags": {
1922
1955
  "json": {
1923
1956
  "description": "Format output as json.",
@@ -1949,11 +1982,17 @@
1949
1982
  "hasDynamicHelp": false,
1950
1983
  "multiple": false,
1951
1984
  "type": "option"
1985
+ },
1986
+ "yes": {
1987
+ "description": "Skip confirmation",
1988
+ "name": "yes",
1989
+ "allowNo": false,
1990
+ "type": "boolean"
1952
1991
  }
1953
1992
  },
1954
1993
  "hasDynamicHelp": false,
1955
1994
  "hiddenAliases": [],
1956
- "id": "keys:list",
1995
+ "id": "face:delete",
1957
1996
  "pluginAlias": "faces-cli",
1958
1997
  "pluginName": "faces-cli",
1959
1998
  "pluginType": "core",
@@ -1963,20 +2002,14 @@
1963
2002
  "relativePath": [
1964
2003
  "dist",
1965
2004
  "commands",
1966
- "keys",
1967
- "list.js"
2005
+ "face",
2006
+ "delete.js"
1968
2007
  ]
1969
2008
  },
1970
- "keys:revoke": {
2009
+ "face:diff": {
1971
2010
  "aliases": [],
1972
- "args": {
1973
- "key_id": {
1974
- "description": "Key ID",
1975
- "name": "key_id",
1976
- "required": true
1977
- }
1978
- },
1979
- "description": "Revoke an API key (JWT required)",
2011
+ "args": {},
2012
+ "description": "Compare owned faces pairwise across all centroid components",
1980
2013
  "flags": {
1981
2014
  "json": {
1982
2015
  "description": "Format output as json.",
@@ -2009,16 +2042,18 @@
2009
2042
  "multiple": false,
2010
2043
  "type": "option"
2011
2044
  },
2012
- "yes": {
2013
- "description": "Skip confirmation",
2014
- "name": "yes",
2015
- "allowNo": false,
2016
- "type": "boolean"
2045
+ "face": {
2046
+ "description": "Face alias to include (repeatable, min 2)",
2047
+ "name": "face",
2048
+ "required": true,
2049
+ "hasDynamicHelp": false,
2050
+ "multiple": true,
2051
+ "type": "option"
2017
2052
  }
2018
2053
  },
2019
2054
  "hasDynamicHelp": false,
2020
2055
  "hiddenAliases": [],
2021
- "id": "keys:revoke",
2056
+ "id": "face:diff",
2022
2057
  "pluginAlias": "faces-cli",
2023
2058
  "pluginName": "faces-cli",
2024
2059
  "pluginType": "core",
@@ -2028,20 +2063,20 @@
2028
2063
  "relativePath": [
2029
2064
  "dist",
2030
2065
  "commands",
2031
- "keys",
2032
- "revoke.js"
2066
+ "face",
2067
+ "diff.js"
2033
2068
  ]
2034
2069
  },
2035
- "keys:update": {
2070
+ "face:get": {
2036
2071
  "aliases": [],
2037
2072
  "args": {
2038
- "key_id": {
2039
- "description": "Key ID",
2040
- "name": "key_id",
2073
+ "face_id": {
2074
+ "description": "Face alias",
2075
+ "name": "face_id",
2041
2076
  "required": true
2042
2077
  }
2043
2078
  },
2044
- "description": "Update API key metadata (JWT required)",
2079
+ "description": "Get details for a face by alias",
2045
2080
  "flags": {
2046
2081
  "json": {
2047
2082
  "description": "Format output as json.",
@@ -2073,31 +2108,11 @@
2073
2108
  "hasDynamicHelp": false,
2074
2109
  "multiple": false,
2075
2110
  "type": "option"
2076
- },
2077
- "name": {
2078
- "description": "New key name",
2079
- "name": "name",
2080
- "hasDynamicHelp": false,
2081
- "multiple": false,
2082
- "type": "option"
2083
- },
2084
- "budget": {
2085
- "description": "New spend budget in USD",
2086
- "name": "budget",
2087
- "hasDynamicHelp": false,
2088
- "multiple": false,
2089
- "type": "option"
2090
- },
2091
- "reset-spent": {
2092
- "description": "Reset spent amount to zero",
2093
- "name": "reset-spent",
2094
- "allowNo": false,
2095
- "type": "boolean"
2096
2111
  }
2097
2112
  },
2098
2113
  "hasDynamicHelp": false,
2099
2114
  "hiddenAliases": [],
2100
- "id": "keys:update",
2115
+ "id": "face:get",
2101
2116
  "pluginAlias": "faces-cli",
2102
2117
  "pluginName": "faces-cli",
2103
2118
  "pluginType": "core",
@@ -2107,14 +2122,14 @@
2107
2122
  "relativePath": [
2108
2123
  "dist",
2109
2124
  "commands",
2110
- "keys",
2111
- "update.js"
2125
+ "face",
2126
+ "get.js"
2112
2127
  ]
2113
2128
  },
2114
- "face:create": {
2129
+ "face:list": {
2115
2130
  "aliases": [],
2116
2131
  "args": {},
2117
- "description": "Create a new face",
2132
+ "description": "List all owned faces",
2118
2133
  "flags": {
2119
2134
  "json": {
2120
2135
  "description": "Format output as json.",
@@ -2146,62 +2161,11 @@
2146
2161
  "hasDynamicHelp": false,
2147
2162
  "multiple": false,
2148
2163
  "type": "option"
2149
- },
2150
- "name": {
2151
- "description": "Display name",
2152
- "name": "name",
2153
- "required": true,
2154
- "hasDynamicHelp": false,
2155
- "multiple": false,
2156
- "type": "option"
2157
- },
2158
- "alias": {
2159
- "description": "Unique alias slug",
2160
- "name": "alias",
2161
- "required": true,
2162
- "hasDynamicHelp": false,
2163
- "multiple": false,
2164
- "type": "option"
2165
- },
2166
- "description": {
2167
- "description": "Description for local catalog",
2168
- "name": "description",
2169
- "hasDynamicHelp": false,
2170
- "multiple": false,
2171
- "type": "option"
2172
- },
2173
- "default-model": {
2174
- "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
2175
- "name": "default-model",
2176
- "hasDynamicHelp": false,
2177
- "multiple": false,
2178
- "type": "option"
2179
- },
2180
- "formula": {
2181
- "description": "Boolean formula over owned concrete face aliases (e.g. \"a | b\", \"(a | b) - c\"). Creates a composite face.",
2182
- "name": "formula",
2183
- "hasDynamicHelp": false,
2184
- "multiple": false,
2185
- "type": "option"
2186
- },
2187
- "attr": {
2188
- "description": "Attribute KEY=VALUE (repeatable)",
2189
- "name": "attr",
2190
- "hasDynamicHelp": false,
2191
- "multiple": true,
2192
- "type": "option"
2193
- },
2194
- "tool": {
2195
- "description": "Tool name to enable (repeatable)",
2196
- "name": "tool",
2197
- "hasDynamicHelp": false,
2198
- "multiple": true,
2199
- "type": "option"
2200
2164
  }
2201
2165
  },
2202
2166
  "hasDynamicHelp": false,
2203
2167
  "hiddenAliases": [],
2204
- "id": "face:create",
2168
+ "id": "face:list",
2205
2169
  "pluginAlias": "faces-cli",
2206
2170
  "pluginName": "faces-cli",
2207
2171
  "pluginType": "core",
@@ -2212,10 +2176,10 @@
2212
2176
  "dist",
2213
2177
  "commands",
2214
2178
  "face",
2215
- "create.js"
2179
+ "list.js"
2216
2180
  ]
2217
2181
  },
2218
- "face:delete": {
2182
+ "face:neighbors": {
2219
2183
  "aliases": [],
2220
2184
  "args": {
2221
2185
  "face_id": {
@@ -2224,7 +2188,7 @@
2224
2188
  "required": true
2225
2189
  }
2226
2190
  },
2227
- "description": "Delete a face permanently",
2191
+ "description": "Find the most similar or dissimilar owned faces to a given face",
2228
2192
  "flags": {
2229
2193
  "json": {
2230
2194
  "description": "Format output as json.",
@@ -2257,16 +2221,44 @@
2257
2221
  "multiple": false,
2258
2222
  "type": "option"
2259
2223
  },
2260
- "yes": {
2261
- "description": "Skip confirmation",
2262
- "name": "yes",
2263
- "allowNo": false,
2264
- "type": "boolean"
2224
+ "k": {
2225
+ "description": "Number of results (1–20)",
2226
+ "name": "k",
2227
+ "default": 5,
2228
+ "hasDynamicHelp": false,
2229
+ "multiple": false,
2230
+ "type": "option"
2231
+ },
2232
+ "component": {
2233
+ "description": "Centroid component to rank on (beta, delta, epsilon are the principal components of a face; face is their composite)",
2234
+ "name": "component",
2235
+ "default": "face",
2236
+ "hasDynamicHelp": false,
2237
+ "multiple": false,
2238
+ "options": [
2239
+ "face",
2240
+ "beta",
2241
+ "delta",
2242
+ "epsilon"
2243
+ ],
2244
+ "type": "option"
2245
+ },
2246
+ "direction": {
2247
+ "description": "nearest (most similar) or furthest (most dissimilar)",
2248
+ "name": "direction",
2249
+ "default": "nearest",
2250
+ "hasDynamicHelp": false,
2251
+ "multiple": false,
2252
+ "options": [
2253
+ "nearest",
2254
+ "furthest"
2255
+ ],
2256
+ "type": "option"
2265
2257
  }
2266
2258
  },
2267
2259
  "hasDynamicHelp": false,
2268
2260
  "hiddenAliases": [],
2269
- "id": "face:delete",
2261
+ "id": "face:neighbors",
2270
2262
  "pluginAlias": "faces-cli",
2271
2263
  "pluginName": "faces-cli",
2272
2264
  "pluginType": "core",
@@ -2277,13 +2269,13 @@
2277
2269
  "dist",
2278
2270
  "commands",
2279
2271
  "face",
2280
- "delete.js"
2272
+ "neighbors.js"
2281
2273
  ]
2282
2274
  },
2283
- "face:diff": {
2275
+ "face:stats": {
2284
2276
  "aliases": [],
2285
2277
  "args": {},
2286
- "description": "Compare owned faces pairwise across all centroid components",
2278
+ "description": "Compile and chat stats for all owned faces",
2287
2279
  "flags": {
2288
2280
  "json": {
2289
2281
  "description": "Format output as json.",
@@ -2315,19 +2307,11 @@
2315
2307
  "hasDynamicHelp": false,
2316
2308
  "multiple": false,
2317
2309
  "type": "option"
2318
- },
2319
- "face": {
2320
- "description": "Face alias to include (repeatable, min 2)",
2321
- "name": "face",
2322
- "required": true,
2323
- "hasDynamicHelp": false,
2324
- "multiple": true,
2325
- "type": "option"
2326
2310
  }
2327
2311
  },
2328
2312
  "hasDynamicHelp": false,
2329
2313
  "hiddenAliases": [],
2330
- "id": "face:diff",
2314
+ "id": "face:stats",
2331
2315
  "pluginAlias": "faces-cli",
2332
2316
  "pluginName": "faces-cli",
2333
2317
  "pluginType": "core",
@@ -2338,10 +2322,10 @@
2338
2322
  "dist",
2339
2323
  "commands",
2340
2324
  "face",
2341
- "diff.js"
2325
+ "stats.js"
2342
2326
  ]
2343
2327
  },
2344
- "face:get": {
2328
+ "face:update": {
2345
2329
  "aliases": [],
2346
2330
  "args": {
2347
2331
  "face_id": {
@@ -2350,7 +2334,7 @@
2350
2334
  "required": true
2351
2335
  }
2352
2336
  },
2353
- "description": "Get details for a face by alias",
2337
+ "description": "Update a face's metadata",
2354
2338
  "flags": {
2355
2339
  "json": {
2356
2340
  "description": "Format output as json.",
@@ -2382,11 +2366,53 @@
2382
2366
  "hasDynamicHelp": false,
2383
2367
  "multiple": false,
2384
2368
  "type": "option"
2369
+ },
2370
+ "name": {
2371
+ "description": "New display name",
2372
+ "name": "name",
2373
+ "hasDynamicHelp": false,
2374
+ "multiple": false,
2375
+ "type": "option"
2376
+ },
2377
+ "description": {
2378
+ "description": "Description for local catalog",
2379
+ "name": "description",
2380
+ "hasDynamicHelp": false,
2381
+ "multiple": false,
2382
+ "type": "option"
2383
+ },
2384
+ "default-model": {
2385
+ "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
2386
+ "name": "default-model",
2387
+ "hasDynamicHelp": false,
2388
+ "multiple": false,
2389
+ "type": "option"
2390
+ },
2391
+ "formula": {
2392
+ "description": "New boolean formula (synthetic faces only)",
2393
+ "name": "formula",
2394
+ "hasDynamicHelp": false,
2395
+ "multiple": false,
2396
+ "type": "option"
2397
+ },
2398
+ "attr": {
2399
+ "description": "Update attribute KEY=VALUE (repeatable)",
2400
+ "name": "attr",
2401
+ "hasDynamicHelp": false,
2402
+ "multiple": true,
2403
+ "type": "option"
2404
+ },
2405
+ "tool": {
2406
+ "description": "Tool names to set (replaces list, repeatable)",
2407
+ "name": "tool",
2408
+ "hasDynamicHelp": false,
2409
+ "multiple": true,
2410
+ "type": "option"
2385
2411
  }
2386
2412
  },
2387
2413
  "hasDynamicHelp": false,
2388
2414
  "hiddenAliases": [],
2389
- "id": "face:get",
2415
+ "id": "face:update",
2390
2416
  "pluginAlias": "faces-cli",
2391
2417
  "pluginName": "faces-cli",
2392
2418
  "pluginType": "core",
@@ -2397,13 +2423,19 @@
2397
2423
  "dist",
2398
2424
  "commands",
2399
2425
  "face",
2400
- "get.js"
2426
+ "update.js"
2401
2427
  ]
2402
2428
  },
2403
- "face:list": {
2429
+ "face:upload": {
2404
2430
  "aliases": [],
2405
- "args": {},
2406
- "description": "List all owned faces",
2431
+ "args": {
2432
+ "face_id": {
2433
+ "description": "Face alias",
2434
+ "name": "face_id",
2435
+ "required": true
2436
+ }
2437
+ },
2438
+ "description": "Upload a file (text/PDF/audio/video) to a face",
2407
2439
  "flags": {
2408
2440
  "json": {
2409
2441
  "description": "Format output as json.",
@@ -2435,11 +2467,50 @@
2435
2467
  "hasDynamicHelp": false,
2436
2468
  "multiple": false,
2437
2469
  "type": "option"
2470
+ },
2471
+ "file": {
2472
+ "description": "File to upload",
2473
+ "name": "file",
2474
+ "required": true,
2475
+ "hasDynamicHelp": false,
2476
+ "multiple": false,
2477
+ "type": "option"
2478
+ },
2479
+ "kind": {
2480
+ "description": "Upload kind: document or thread",
2481
+ "name": "kind",
2482
+ "default": "document",
2483
+ "hasDynamicHelp": false,
2484
+ "multiple": false,
2485
+ "options": [
2486
+ "document",
2487
+ "thread"
2488
+ ],
2489
+ "type": "option"
2490
+ },
2491
+ "perspective": {
2492
+ "description": "Perspective (document only)",
2493
+ "name": "perspective",
2494
+ "default": "third-person",
2495
+ "hasDynamicHelp": false,
2496
+ "multiple": false,
2497
+ "options": [
2498
+ "first-person",
2499
+ "third-person"
2500
+ ],
2501
+ "type": "option"
2502
+ },
2503
+ "face-speaker": {
2504
+ "description": "Speaker name to map to the face (thread only). If omitted, first speaker is used.",
2505
+ "name": "face-speaker",
2506
+ "hasDynamicHelp": false,
2507
+ "multiple": false,
2508
+ "type": "option"
2438
2509
  }
2439
2510
  },
2440
2511
  "hasDynamicHelp": false,
2441
2512
  "hiddenAliases": [],
2442
- "id": "face:list",
2513
+ "id": "face:upload",
2443
2514
  "pluginAlias": "faces-cli",
2444
2515
  "pluginName": "faces-cli",
2445
2516
  "pluginType": "core",
@@ -2450,19 +2521,13 @@
2450
2521
  "dist",
2451
2522
  "commands",
2452
2523
  "face",
2453
- "list.js"
2524
+ "upload.js"
2454
2525
  ]
2455
2526
  },
2456
- "face:neighbors": {
2527
+ "keys:create": {
2457
2528
  "aliases": [],
2458
- "args": {
2459
- "face_id": {
2460
- "description": "Face alias",
2461
- "name": "face_id",
2462
- "required": true
2463
- }
2464
- },
2465
- "description": "Find the most similar or dissimilar owned faces to a given face",
2529
+ "args": {},
2530
+ "description": "Create a new API key (JWT required)",
2466
2531
  "flags": {
2467
2532
  "json": {
2468
2533
  "description": "Format output as json.",
@@ -2495,44 +2560,46 @@
2495
2560
  "multiple": false,
2496
2561
  "type": "option"
2497
2562
  },
2498
- "k": {
2499
- "description": "Number of results (1–20)",
2500
- "name": "k",
2501
- "default": 5,
2563
+ "name": {
2564
+ "description": "Key name/label",
2565
+ "name": "name",
2566
+ "required": true,
2502
2567
  "hasDynamicHelp": false,
2503
2568
  "multiple": false,
2504
2569
  "type": "option"
2505
2570
  },
2506
- "component": {
2507
- "description": "Centroid component to rank on (beta, delta, epsilon are the principal components of a face; face is their composite)",
2508
- "name": "component",
2509
- "default": "face",
2571
+ "expires-days": {
2572
+ "description": "Expiry in days (omit for no expiry)",
2573
+ "name": "expires-days",
2510
2574
  "hasDynamicHelp": false,
2511
2575
  "multiple": false,
2512
- "options": [
2513
- "face",
2514
- "beta",
2515
- "delta",
2516
- "epsilon"
2517
- ],
2518
2576
  "type": "option"
2519
2577
  },
2520
- "direction": {
2521
- "description": "nearest (most similar) or furthest (most dissimilar)",
2522
- "name": "direction",
2523
- "default": "nearest",
2578
+ "budget": {
2579
+ "description": "Spend budget in USD",
2580
+ "name": "budget",
2524
2581
  "hasDynamicHelp": false,
2525
2582
  "multiple": false,
2526
- "options": [
2527
- "nearest",
2528
- "furthest"
2529
- ],
2583
+ "type": "option"
2584
+ },
2585
+ "face": {
2586
+ "description": "Allowed face alias (repeatable)",
2587
+ "name": "face",
2588
+ "hasDynamicHelp": false,
2589
+ "multiple": true,
2590
+ "type": "option"
2591
+ },
2592
+ "model": {
2593
+ "description": "Allowed model name (repeatable)",
2594
+ "name": "model",
2595
+ "hasDynamicHelp": false,
2596
+ "multiple": true,
2530
2597
  "type": "option"
2531
2598
  }
2532
2599
  },
2533
2600
  "hasDynamicHelp": false,
2534
2601
  "hiddenAliases": [],
2535
- "id": "face:neighbors",
2602
+ "id": "keys:create",
2536
2603
  "pluginAlias": "faces-cli",
2537
2604
  "pluginName": "faces-cli",
2538
2605
  "pluginType": "core",
@@ -2542,14 +2609,14 @@
2542
2609
  "relativePath": [
2543
2610
  "dist",
2544
2611
  "commands",
2545
- "face",
2546
- "neighbors.js"
2612
+ "keys",
2613
+ "create.js"
2547
2614
  ]
2548
2615
  },
2549
- "face:stats": {
2616
+ "keys:list": {
2550
2617
  "aliases": [],
2551
2618
  "args": {},
2552
- "description": "Compile and chat stats for all owned faces",
2619
+ "description": "List all API keys (JWT required)",
2553
2620
  "flags": {
2554
2621
  "json": {
2555
2622
  "description": "Format output as json.",
@@ -2585,7 +2652,7 @@
2585
2652
  },
2586
2653
  "hasDynamicHelp": false,
2587
2654
  "hiddenAliases": [],
2588
- "id": "face:stats",
2655
+ "id": "keys:list",
2589
2656
  "pluginAlias": "faces-cli",
2590
2657
  "pluginName": "faces-cli",
2591
2658
  "pluginType": "core",
@@ -2595,20 +2662,20 @@
2595
2662
  "relativePath": [
2596
2663
  "dist",
2597
2664
  "commands",
2598
- "face",
2599
- "stats.js"
2665
+ "keys",
2666
+ "list.js"
2600
2667
  ]
2601
2668
  },
2602
- "face:update": {
2669
+ "keys:revoke": {
2603
2670
  "aliases": [],
2604
2671
  "args": {
2605
- "face_id": {
2606
- "description": "Face alias",
2607
- "name": "face_id",
2672
+ "key_id": {
2673
+ "description": "Key ID",
2674
+ "name": "key_id",
2608
2675
  "required": true
2609
2676
  }
2610
2677
  },
2611
- "description": "Update a face's metadata",
2678
+ "description": "Revoke an API key (JWT required)",
2612
2679
  "flags": {
2613
2680
  "json": {
2614
2681
  "description": "Format output as json.",
@@ -2641,52 +2708,16 @@
2641
2708
  "multiple": false,
2642
2709
  "type": "option"
2643
2710
  },
2644
- "name": {
2645
- "description": "New display name",
2646
- "name": "name",
2647
- "hasDynamicHelp": false,
2648
- "multiple": false,
2649
- "type": "option"
2650
- },
2651
- "description": {
2652
- "description": "Description for local catalog",
2653
- "name": "description",
2654
- "hasDynamicHelp": false,
2655
- "multiple": false,
2656
- "type": "option"
2657
- },
2658
- "default-model": {
2659
- "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
2660
- "name": "default-model",
2661
- "hasDynamicHelp": false,
2662
- "multiple": false,
2663
- "type": "option"
2664
- },
2665
- "formula": {
2666
- "description": "New boolean formula (synthetic faces only)",
2667
- "name": "formula",
2668
- "hasDynamicHelp": false,
2669
- "multiple": false,
2670
- "type": "option"
2671
- },
2672
- "attr": {
2673
- "description": "Update attribute KEY=VALUE (repeatable)",
2674
- "name": "attr",
2675
- "hasDynamicHelp": false,
2676
- "multiple": true,
2677
- "type": "option"
2678
- },
2679
- "tool": {
2680
- "description": "Tool names to set (replaces list, repeatable)",
2681
- "name": "tool",
2682
- "hasDynamicHelp": false,
2683
- "multiple": true,
2684
- "type": "option"
2711
+ "yes": {
2712
+ "description": "Skip confirmation",
2713
+ "name": "yes",
2714
+ "allowNo": false,
2715
+ "type": "boolean"
2685
2716
  }
2686
2717
  },
2687
2718
  "hasDynamicHelp": false,
2688
2719
  "hiddenAliases": [],
2689
- "id": "face:update",
2720
+ "id": "keys:revoke",
2690
2721
  "pluginAlias": "faces-cli",
2691
2722
  "pluginName": "faces-cli",
2692
2723
  "pluginType": "core",
@@ -2696,20 +2727,20 @@
2696
2727
  "relativePath": [
2697
2728
  "dist",
2698
2729
  "commands",
2699
- "face",
2700
- "update.js"
2730
+ "keys",
2731
+ "revoke.js"
2701
2732
  ]
2702
2733
  },
2703
- "face:upload": {
2734
+ "keys:update": {
2704
2735
  "aliases": [],
2705
2736
  "args": {
2706
- "face_id": {
2707
- "description": "Face alias",
2708
- "name": "face_id",
2737
+ "key_id": {
2738
+ "description": "Key ID",
2739
+ "name": "key_id",
2709
2740
  "required": true
2710
2741
  }
2711
2742
  },
2712
- "description": "Upload a file (text/PDF/audio/video) to a face",
2743
+ "description": "Update API key metadata (JWT required)",
2713
2744
  "flags": {
2714
2745
  "json": {
2715
2746
  "description": "Format output as json.",
@@ -2742,49 +2773,30 @@
2742
2773
  "multiple": false,
2743
2774
  "type": "option"
2744
2775
  },
2745
- "file": {
2746
- "description": "File to upload",
2747
- "name": "file",
2748
- "required": true,
2749
- "hasDynamicHelp": false,
2750
- "multiple": false,
2751
- "type": "option"
2752
- },
2753
- "kind": {
2754
- "description": "Upload kind: document or thread",
2755
- "name": "kind",
2756
- "default": "document",
2776
+ "name": {
2777
+ "description": "New key name",
2778
+ "name": "name",
2757
2779
  "hasDynamicHelp": false,
2758
2780
  "multiple": false,
2759
- "options": [
2760
- "document",
2761
- "thread"
2762
- ],
2763
2781
  "type": "option"
2764
2782
  },
2765
- "perspective": {
2766
- "description": "Perspective (document only)",
2767
- "name": "perspective",
2768
- "default": "third-person",
2783
+ "budget": {
2784
+ "description": "New spend budget in USD",
2785
+ "name": "budget",
2769
2786
  "hasDynamicHelp": false,
2770
2787
  "multiple": false,
2771
- "options": [
2772
- "first-person",
2773
- "third-person"
2774
- ],
2775
2788
  "type": "option"
2776
2789
  },
2777
- "face-speaker": {
2778
- "description": "Speaker name to map to the face (thread only). If omitted, first speaker is used.",
2779
- "name": "face-speaker",
2780
- "hasDynamicHelp": false,
2781
- "multiple": false,
2782
- "type": "option"
2790
+ "reset-spent": {
2791
+ "description": "Reset spent amount to zero",
2792
+ "name": "reset-spent",
2793
+ "allowNo": false,
2794
+ "type": "boolean"
2783
2795
  }
2784
2796
  },
2785
2797
  "hasDynamicHelp": false,
2786
2798
  "hiddenAliases": [],
2787
- "id": "face:upload",
2799
+ "id": "keys:update",
2788
2800
  "pluginAlias": "faces-cli",
2789
2801
  "pluginName": "faces-cli",
2790
2802
  "pluginType": "core",
@@ -2794,8 +2806,8 @@
2794
2806
  "relativePath": [
2795
2807
  "dist",
2796
2808
  "commands",
2797
- "face",
2798
- "upload.js"
2809
+ "keys",
2810
+ "update.js"
2799
2811
  ]
2800
2812
  },
2801
2813
  "compile:doc:create": {
@@ -3313,6 +3325,12 @@
3313
3325
  "hasDynamicHelp": false,
3314
3326
  "multiple": false,
3315
3327
  "type": "option"
3328
+ },
3329
+ "no-wait": {
3330
+ "description": "Return immediately after triggering compilation. Prints the document ID for manual polling.",
3331
+ "name": "no-wait",
3332
+ "allowNo": false,
3333
+ "type": "boolean"
3316
3334
  }
3317
3335
  },
3318
3336
  "hasDynamicHelp": false,
@@ -3474,7 +3492,7 @@
3474
3492
  "required": true
3475
3493
  }
3476
3494
  },
3477
- "description": "Edit a thread (label)",
3495
+ "description": "Edit a thread (label and/or reassign face speaker)",
3478
3496
  "flags": {
3479
3497
  "json": {
3480
3498
  "description": "Format output as json.",
@@ -3510,7 +3528,13 @@
3510
3528
  "label": {
3511
3529
  "description": "New thread label",
3512
3530
  "name": "label",
3513
- "required": true,
3531
+ "hasDynamicHelp": false,
3532
+ "multiple": false,
3533
+ "type": "option"
3534
+ },
3535
+ "face-speaker": {
3536
+ "description": "Reassign face speaker: set this speaker to role=user, all others to role=assistant",
3537
+ "name": "face-speaker",
3514
3538
  "hasDynamicHelp": false,
3515
3539
  "multiple": false,
3516
3540
  "type": "option"
@@ -3702,6 +3726,12 @@
3702
3726
  "hasDynamicHelp": false,
3703
3727
  "multiple": false,
3704
3728
  "type": "option"
3729
+ },
3730
+ "no-wait": {
3731
+ "description": "Return immediately after triggering compilation. Prints the thread ID for manual polling.",
3732
+ "name": "no-wait",
3733
+ "allowNo": false,
3734
+ "type": "boolean"
3705
3735
  }
3706
3736
  },
3707
3737
  "hasDynamicHelp": false,
@@ -3851,5 +3881,5 @@
3851
3881
  ]
3852
3882
  }
3853
3883
  },
3854
- "version": "1.5.0"
3884
+ "version": "1.5.2"
3855
3885
  }