faces-cli 1.6.15 → 1.6.17

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.
@@ -120,23 +120,10 @@
120
120
  "state.js"
121
121
  ]
122
122
  },
123
- "auth:connect": {
123
+ "billing:balance": {
124
124
  "aliases": [],
125
- "args": {
126
- "provider": {
127
- "description": "OAuth provider to connect",
128
- "name": "provider",
129
- "options": [
130
- "openai"
131
- ],
132
- "required": true
133
- }
134
- },
135
- "description": "Connect an OAuth provider account to Faces (e.g. ChatGPT Plus/Pro)",
136
- "examples": [
137
- "<%= config.bin %> auth connect openai",
138
- "<%= config.bin %> auth connect openai --manual"
139
- ],
125
+ "args": {},
126
+ "description": "Show credit balance and payment method status",
140
127
  "flags": {
141
128
  "json": {
142
129
  "description": "Format output as json.",
@@ -168,17 +155,11 @@
168
155
  "hasDynamicHelp": false,
169
156
  "multiple": false,
170
157
  "type": "option"
171
- },
172
- "manual": {
173
- "description": "Manual mode for headless environments: prints the authorize URL and prompts you to paste the callback URL after approving in any browser.",
174
- "name": "manual",
175
- "allowNo": false,
176
- "type": "boolean"
177
158
  }
178
159
  },
179
160
  "hasDynamicHelp": false,
180
161
  "hiddenAliases": [],
181
- "id": "auth:connect",
162
+ "id": "billing:balance",
182
163
  "pluginAlias": "faces-cli",
183
164
  "pluginName": "faces-cli",
184
165
  "pluginType": "core",
@@ -188,18 +169,14 @@
188
169
  "relativePath": [
189
170
  "dist",
190
171
  "commands",
191
- "auth",
192
- "connect.js"
172
+ "billing",
173
+ "balance.js"
193
174
  ]
194
175
  },
195
- "auth:connections": {
176
+ "billing:card-setup": {
196
177
  "aliases": [],
197
178
  "args": {},
198
- "description": "List connected OAuth provider accounts",
199
- "examples": [
200
- "<%= config.bin %> auth connections",
201
- "<%= config.bin %> auth connections --json"
202
- ],
179
+ "description": "Get a Stripe card setup URL to save a payment method",
203
180
  "flags": {
204
181
  "json": {
205
182
  "description": "Format output as json.",
@@ -235,7 +212,7 @@
235
212
  },
236
213
  "hasDynamicHelp": false,
237
214
  "hiddenAliases": [],
238
- "id": "auth:connections",
215
+ "id": "billing:card-setup",
239
216
  "pluginAlias": "faces-cli",
240
217
  "pluginName": "faces-cli",
241
218
  "pluginType": "core",
@@ -245,26 +222,14 @@
245
222
  "relativePath": [
246
223
  "dist",
247
224
  "commands",
248
- "auth",
249
- "connections.js"
225
+ "billing",
226
+ "card-setup.js"
250
227
  ]
251
228
  },
252
- "auth:disconnect": {
229
+ "billing:llm-costs": {
253
230
  "aliases": [],
254
- "args": {
255
- "provider": {
256
- "description": "OAuth provider to disconnect",
257
- "name": "provider",
258
- "options": [
259
- "openai"
260
- ],
261
- "required": true
262
- }
263
- },
264
- "description": "Disconnect a linked OAuth provider account",
265
- "examples": [
266
- "<%= config.bin %> auth disconnect openai"
267
- ],
231
+ "args": {},
232
+ "description": "List available LLMs and their per-token costs",
268
233
  "flags": {
269
234
  "json": {
270
235
  "description": "Format output as json.",
@@ -296,11 +261,18 @@
296
261
  "hasDynamicHelp": false,
297
262
  "multiple": false,
298
263
  "type": "option"
264
+ },
265
+ "provider": {
266
+ "description": "Filter by provider (e.g. openai, anthropic)",
267
+ "name": "provider",
268
+ "hasDynamicHelp": false,
269
+ "multiple": false,
270
+ "type": "option"
299
271
  }
300
272
  },
301
273
  "hasDynamicHelp": false,
302
274
  "hiddenAliases": [],
303
- "id": "auth:disconnect",
275
+ "id": "billing:llm-costs",
304
276
  "pluginAlias": "faces-cli",
305
277
  "pluginName": "faces-cli",
306
278
  "pluginType": "core",
@@ -310,14 +282,14 @@
310
282
  "relativePath": [
311
283
  "dist",
312
284
  "commands",
313
- "auth",
314
- "disconnect.js"
285
+ "billing",
286
+ "llm-costs.js"
315
287
  ]
316
288
  },
317
- "auth:login": {
289
+ "billing:quota": {
318
290
  "aliases": [],
319
291
  "args": {},
320
- "description": "Login and save JWT credentials",
292
+ "description": "Show compilation stats per face (deprecated — use compile:stats)",
321
293
  "flags": {
322
294
  "json": {
323
295
  "description": "Format output as json.",
@@ -349,27 +321,11 @@
349
321
  "hasDynamicHelp": false,
350
322
  "multiple": false,
351
323
  "type": "option"
352
- },
353
- "email": {
354
- "description": "Account email",
355
- "name": "email",
356
- "required": true,
357
- "hasDynamicHelp": false,
358
- "multiple": false,
359
- "type": "option"
360
- },
361
- "password": {
362
- "description": "Account password",
363
- "name": "password",
364
- "required": true,
365
- "hasDynamicHelp": false,
366
- "multiple": false,
367
- "type": "option"
368
324
  }
369
325
  },
370
326
  "hasDynamicHelp": false,
371
327
  "hiddenAliases": [],
372
- "id": "auth:login",
328
+ "id": "billing:quota",
373
329
  "pluginAlias": "faces-cli",
374
330
  "pluginName": "faces-cli",
375
331
  "pluginType": "core",
@@ -379,14 +335,14 @@
379
335
  "relativePath": [
380
336
  "dist",
381
337
  "commands",
382
- "auth",
383
- "login.js"
338
+ "billing",
339
+ "quota.js"
384
340
  ]
385
341
  },
386
- "auth:logout": {
342
+ "billing:subscription": {
387
343
  "aliases": [],
388
344
  "args": {},
389
- "description": "Clear saved credentials",
345
+ "description": "Show current plan, face count, and renewal date",
390
346
  "flags": {
391
347
  "json": {
392
348
  "description": "Format output as json.",
@@ -422,7 +378,7 @@
422
378
  },
423
379
  "hasDynamicHelp": false,
424
380
  "hiddenAliases": [],
425
- "id": "auth:logout",
381
+ "id": "billing:subscription",
426
382
  "pluginAlias": "faces-cli",
427
383
  "pluginName": "faces-cli",
428
384
  "pluginType": "core",
@@ -432,14 +388,14 @@
432
388
  "relativePath": [
433
389
  "dist",
434
390
  "commands",
435
- "auth",
436
- "logout.js"
391
+ "billing",
392
+ "subscription.js"
437
393
  ]
438
394
  },
439
- "auth:refresh": {
395
+ "billing:topup": {
440
396
  "aliases": [],
441
397
  "args": {},
442
- "description": "Exchange current JWT for a fresh one",
398
+ "description": "Top up credit balance using saved payment method",
443
399
  "flags": {
444
400
  "json": {
445
401
  "description": "Format output as json.",
@@ -471,11 +427,26 @@
471
427
  "hasDynamicHelp": false,
472
428
  "multiple": false,
473
429
  "type": "option"
430
+ },
431
+ "amount": {
432
+ "description": "Top-up amount in USD (min $1)",
433
+ "name": "amount",
434
+ "required": true,
435
+ "hasDynamicHelp": false,
436
+ "multiple": false,
437
+ "type": "option"
438
+ },
439
+ "payment-ref": {
440
+ "description": "Payment reference (admin/test path)",
441
+ "name": "payment-ref",
442
+ "hasDynamicHelp": false,
443
+ "multiple": false,
444
+ "type": "option"
474
445
  }
475
446
  },
476
447
  "hasDynamicHelp": false,
477
448
  "hiddenAliases": [],
478
- "id": "auth:refresh",
449
+ "id": "billing:topup",
479
450
  "pluginAlias": "faces-cli",
480
451
  "pluginName": "faces-cli",
481
452
  "pluginType": "core",
@@ -485,14 +456,14 @@
485
456
  "relativePath": [
486
457
  "dist",
487
458
  "commands",
488
- "auth",
489
- "refresh.js"
459
+ "billing",
460
+ "topup.js"
490
461
  ]
491
462
  },
492
- "auth:register": {
463
+ "billing:usage": {
493
464
  "aliases": [],
494
465
  "args": {},
495
- "description": "Create a new Faces account",
466
+ "description": "Aggregated usage analytics",
496
467
  "flags": {
497
468
  "json": {
498
469
  "description": "Format output as json.",
@@ -525,53 +496,37 @@
525
496
  "multiple": false,
526
497
  "type": "option"
527
498
  },
528
- "email": {
529
- "description": "Email address",
530
- "name": "email",
531
- "required": true,
532
- "hasDynamicHelp": false,
533
- "multiple": false,
534
- "type": "option"
535
- },
536
- "password": {
537
- "description": "Password",
538
- "name": "password",
539
- "required": true,
540
- "hasDynamicHelp": false,
541
- "multiple": false,
542
- "type": "option"
543
- },
544
- "username": {
545
- "description": "Username (lowercase, dashes, numbers)",
546
- "name": "username",
547
- "required": true,
499
+ "group-by": {
500
+ "description": "Group results",
501
+ "name": "group-by",
548
502
  "hasDynamicHelp": false,
549
503
  "multiple": false,
504
+ "options": [
505
+ "api_key",
506
+ "model",
507
+ "llm",
508
+ "date"
509
+ ],
550
510
  "type": "option"
551
511
  },
552
- "invite-key": {
553
- "description": "Invite key (if required)",
554
- "name": "invite-key",
512
+ "from": {
513
+ "description": "Start date (YYYY-MM-DD)",
514
+ "name": "from",
555
515
  "hasDynamicHelp": false,
556
516
  "multiple": false,
557
517
  "type": "option"
558
518
  },
559
- "plan": {
560
- "description": "Plan to subscribe to: \"free\" ($5 activation) or \"connect\" ($17/mo, no activation fee)",
561
- "name": "plan",
562
- "default": "free",
519
+ "to": {
520
+ "description": "End date (YYYY-MM-DD)",
521
+ "name": "to",
563
522
  "hasDynamicHelp": false,
564
523
  "multiple": false,
565
- "options": [
566
- "free",
567
- "connect"
568
- ],
569
524
  "type": "option"
570
525
  }
571
526
  },
572
527
  "hasDynamicHelp": false,
573
528
  "hiddenAliases": [],
574
- "id": "auth:register",
529
+ "id": "billing:usage",
575
530
  "pluginAlias": "faces-cli",
576
531
  "pluginName": "faces-cli",
577
532
  "pluginType": "core",
@@ -581,14 +536,27 @@
581
536
  "relativePath": [
582
537
  "dist",
583
538
  "commands",
584
- "auth",
585
- "register.js"
539
+ "billing",
540
+ "usage.js"
586
541
  ]
587
542
  },
588
- "auth:whoami": {
543
+ "auth:connect": {
589
544
  "aliases": [],
590
- "args": {},
591
- "description": "Print current user profile and auth diagnostic",
545
+ "args": {
546
+ "provider": {
547
+ "description": "OAuth provider to connect",
548
+ "name": "provider",
549
+ "options": [
550
+ "openai"
551
+ ],
552
+ "required": true
553
+ }
554
+ },
555
+ "description": "Connect an OAuth provider account to Faces (e.g. ChatGPT Plus/Pro)",
556
+ "examples": [
557
+ "<%= config.bin %> auth connect openai",
558
+ "<%= config.bin %> auth connect openai --manual"
559
+ ],
592
560
  "flags": {
593
561
  "json": {
594
562
  "description": "Format output as json.",
@@ -620,11 +588,17 @@
620
588
  "hasDynamicHelp": false,
621
589
  "multiple": false,
622
590
  "type": "option"
591
+ },
592
+ "manual": {
593
+ "description": "Manual mode for headless environments: prints the authorize URL and prompts you to paste the callback URL after approving in any browser.",
594
+ "name": "manual",
595
+ "allowNo": false,
596
+ "type": "boolean"
623
597
  }
624
598
  },
625
599
  "hasDynamicHelp": false,
626
600
  "hiddenAliases": [],
627
- "id": "auth:whoami",
601
+ "id": "auth:connect",
628
602
  "pluginAlias": "faces-cli",
629
603
  "pluginName": "faces-cli",
630
604
  "pluginType": "core",
@@ -635,13 +609,17 @@
635
609
  "dist",
636
610
  "commands",
637
611
  "auth",
638
- "whoami.js"
612
+ "connect.js"
639
613
  ]
640
614
  },
641
- "billing:balance": {
615
+ "auth:connections": {
642
616
  "aliases": [],
643
617
  "args": {},
644
- "description": "Show credit balance and payment method status",
618
+ "description": "List connected OAuth provider accounts",
619
+ "examples": [
620
+ "<%= config.bin %> auth connections",
621
+ "<%= config.bin %> auth connections --json"
622
+ ],
645
623
  "flags": {
646
624
  "json": {
647
625
  "description": "Format output as json.",
@@ -677,7 +655,7 @@
677
655
  },
678
656
  "hasDynamicHelp": false,
679
657
  "hiddenAliases": [],
680
- "id": "billing:balance",
658
+ "id": "auth:connections",
681
659
  "pluginAlias": "faces-cli",
682
660
  "pluginName": "faces-cli",
683
661
  "pluginType": "core",
@@ -687,14 +665,26 @@
687
665
  "relativePath": [
688
666
  "dist",
689
667
  "commands",
690
- "billing",
691
- "balance.js"
668
+ "auth",
669
+ "connections.js"
692
670
  ]
693
671
  },
694
- "billing:card-setup": {
672
+ "auth:disconnect": {
695
673
  "aliases": [],
696
- "args": {},
697
- "description": "Get a Stripe card setup URL to save a payment method",
674
+ "args": {
675
+ "provider": {
676
+ "description": "OAuth provider to disconnect",
677
+ "name": "provider",
678
+ "options": [
679
+ "openai"
680
+ ],
681
+ "required": true
682
+ }
683
+ },
684
+ "description": "Disconnect a linked OAuth provider account",
685
+ "examples": [
686
+ "<%= config.bin %> auth disconnect openai"
687
+ ],
698
688
  "flags": {
699
689
  "json": {
700
690
  "description": "Format output as json.",
@@ -730,7 +720,7 @@
730
720
  },
731
721
  "hasDynamicHelp": false,
732
722
  "hiddenAliases": [],
733
- "id": "billing:card-setup",
723
+ "id": "auth:disconnect",
734
724
  "pluginAlias": "faces-cli",
735
725
  "pluginName": "faces-cli",
736
726
  "pluginType": "core",
@@ -740,14 +730,14 @@
740
730
  "relativePath": [
741
731
  "dist",
742
732
  "commands",
743
- "billing",
744
- "card-setup.js"
733
+ "auth",
734
+ "disconnect.js"
745
735
  ]
746
736
  },
747
- "billing:llm-costs": {
737
+ "auth:login": {
748
738
  "aliases": [],
749
739
  "args": {},
750
- "description": "List available LLMs and their per-token costs",
740
+ "description": "Login and save JWT credentials",
751
741
  "flags": {
752
742
  "json": {
753
743
  "description": "Format output as json.",
@@ -780,9 +770,18 @@
780
770
  "multiple": false,
781
771
  "type": "option"
782
772
  },
783
- "provider": {
784
- "description": "Filter by provider (e.g. openai, anthropic)",
785
- "name": "provider",
773
+ "email": {
774
+ "description": "Account email",
775
+ "name": "email",
776
+ "required": true,
777
+ "hasDynamicHelp": false,
778
+ "multiple": false,
779
+ "type": "option"
780
+ },
781
+ "password": {
782
+ "description": "Account password",
783
+ "name": "password",
784
+ "required": true,
786
785
  "hasDynamicHelp": false,
787
786
  "multiple": false,
788
787
  "type": "option"
@@ -790,7 +789,7 @@
790
789
  },
791
790
  "hasDynamicHelp": false,
792
791
  "hiddenAliases": [],
793
- "id": "billing:llm-costs",
792
+ "id": "auth:login",
794
793
  "pluginAlias": "faces-cli",
795
794
  "pluginName": "faces-cli",
796
795
  "pluginType": "core",
@@ -800,14 +799,14 @@
800
799
  "relativePath": [
801
800
  "dist",
802
801
  "commands",
803
- "billing",
804
- "llm-costs.js"
802
+ "auth",
803
+ "login.js"
805
804
  ]
806
805
  },
807
- "billing:quota": {
806
+ "auth:logout": {
808
807
  "aliases": [],
809
808
  "args": {},
810
- "description": "Show compilation stats per face (deprecated — use compile:stats)",
809
+ "description": "Clear saved credentials",
811
810
  "flags": {
812
811
  "json": {
813
812
  "description": "Format output as json.",
@@ -843,7 +842,7 @@
843
842
  },
844
843
  "hasDynamicHelp": false,
845
844
  "hiddenAliases": [],
846
- "id": "billing:quota",
845
+ "id": "auth:logout",
847
846
  "pluginAlias": "faces-cli",
848
847
  "pluginName": "faces-cli",
849
848
  "pluginType": "core",
@@ -853,14 +852,14 @@
853
852
  "relativePath": [
854
853
  "dist",
855
854
  "commands",
856
- "billing",
857
- "quota.js"
855
+ "auth",
856
+ "logout.js"
858
857
  ]
859
858
  },
860
- "billing:subscription": {
859
+ "auth:refresh": {
861
860
  "aliases": [],
862
861
  "args": {},
863
- "description": "Show current plan, face count, and renewal date",
862
+ "description": "Exchange current JWT for a fresh one",
864
863
  "flags": {
865
864
  "json": {
866
865
  "description": "Format output as json.",
@@ -896,7 +895,7 @@
896
895
  },
897
896
  "hasDynamicHelp": false,
898
897
  "hiddenAliases": [],
899
- "id": "billing:subscription",
898
+ "id": "auth:refresh",
900
899
  "pluginAlias": "faces-cli",
901
900
  "pluginName": "faces-cli",
902
901
  "pluginType": "core",
@@ -906,14 +905,14 @@
906
905
  "relativePath": [
907
906
  "dist",
908
907
  "commands",
909
- "billing",
910
- "subscription.js"
908
+ "auth",
909
+ "refresh.js"
911
910
  ]
912
911
  },
913
- "billing:topup": {
912
+ "auth:register": {
914
913
  "aliases": [],
915
914
  "args": {},
916
- "description": "Top up credit balance using saved payment method",
915
+ "description": "Create a new Faces account",
917
916
  "flags": {
918
917
  "json": {
919
918
  "description": "Format output as json.",
@@ -946,25 +945,53 @@
946
945
  "multiple": false,
947
946
  "type": "option"
948
947
  },
949
- "amount": {
950
- "description": "Top-up amount in USD (min $1)",
951
- "name": "amount",
948
+ "email": {
949
+ "description": "Email address",
950
+ "name": "email",
952
951
  "required": true,
953
952
  "hasDynamicHelp": false,
954
953
  "multiple": false,
955
954
  "type": "option"
956
955
  },
957
- "payment-ref": {
958
- "description": "Payment reference (admin/test path)",
959
- "name": "payment-ref",
956
+ "password": {
957
+ "description": "Password",
958
+ "name": "password",
959
+ "required": true,
960
+ "hasDynamicHelp": false,
961
+ "multiple": false,
962
+ "type": "option"
963
+ },
964
+ "username": {
965
+ "description": "Username (lowercase, dashes, numbers)",
966
+ "name": "username",
967
+ "required": true,
968
+ "hasDynamicHelp": false,
969
+ "multiple": false,
970
+ "type": "option"
971
+ },
972
+ "invite-key": {
973
+ "description": "Invite key (if required)",
974
+ "name": "invite-key",
975
+ "hasDynamicHelp": false,
976
+ "multiple": false,
977
+ "type": "option"
978
+ },
979
+ "plan": {
980
+ "description": "Plan to subscribe to: \"free\" ($5 activation) or \"connect\" ($17/mo, no activation fee)",
981
+ "name": "plan",
982
+ "default": "free",
960
983
  "hasDynamicHelp": false,
961
984
  "multiple": false,
985
+ "options": [
986
+ "free",
987
+ "connect"
988
+ ],
962
989
  "type": "option"
963
990
  }
964
991
  },
965
992
  "hasDynamicHelp": false,
966
993
  "hiddenAliases": [],
967
- "id": "billing:topup",
994
+ "id": "auth:register",
968
995
  "pluginAlias": "faces-cli",
969
996
  "pluginName": "faces-cli",
970
997
  "pluginType": "core",
@@ -974,14 +1001,14 @@
974
1001
  "relativePath": [
975
1002
  "dist",
976
1003
  "commands",
977
- "billing",
978
- "topup.js"
1004
+ "auth",
1005
+ "register.js"
979
1006
  ]
980
1007
  },
981
- "billing:usage": {
1008
+ "auth:whoami": {
982
1009
  "aliases": [],
983
1010
  "args": {},
984
- "description": "Aggregated usage analytics",
1011
+ "description": "Print current user profile and auth diagnostic",
985
1012
  "flags": {
986
1013
  "json": {
987
1014
  "description": "Format output as json.",
@@ -1013,38 +1040,11 @@
1013
1040
  "hasDynamicHelp": false,
1014
1041
  "multiple": false,
1015
1042
  "type": "option"
1016
- },
1017
- "group-by": {
1018
- "description": "Group results",
1019
- "name": "group-by",
1020
- "hasDynamicHelp": false,
1021
- "multiple": false,
1022
- "options": [
1023
- "api_key",
1024
- "model",
1025
- "llm",
1026
- "date"
1027
- ],
1028
- "type": "option"
1029
- },
1030
- "from": {
1031
- "description": "Start date (YYYY-MM-DD)",
1032
- "name": "from",
1033
- "hasDynamicHelp": false,
1034
- "multiple": false,
1035
- "type": "option"
1036
- },
1037
- "to": {
1038
- "description": "End date (YYYY-MM-DD)",
1039
- "name": "to",
1040
- "hasDynamicHelp": false,
1041
- "multiple": false,
1042
- "type": "option"
1043
1043
  }
1044
1044
  },
1045
1045
  "hasDynamicHelp": false,
1046
1046
  "hiddenAliases": [],
1047
- "id": "billing:usage",
1047
+ "id": "auth:whoami",
1048
1048
  "pluginAlias": "faces-cli",
1049
1049
  "pluginName": "faces-cli",
1050
1050
  "pluginType": "core",
@@ -1054,8 +1054,8 @@
1054
1054
  "relativePath": [
1055
1055
  "dist",
1056
1056
  "commands",
1057
- "billing",
1058
- "usage.js"
1057
+ "auth",
1058
+ "whoami.js"
1059
1059
  ]
1060
1060
  },
1061
1061
  "catalog:backup": {
@@ -1676,6 +1676,152 @@
1676
1676
  "responses.js"
1677
1677
  ]
1678
1678
  },
1679
+ "chat:thread": {
1680
+ "aliases": [],
1681
+ "args": {
1682
+ "face_username": {
1683
+ "description": "Face alias (or alias@model) — required when starting a new thread",
1684
+ "name": "face_username",
1685
+ "required": false
1686
+ }
1687
+ },
1688
+ "description": "Multi-turn chat thread. Conversation history is stored under ~/.faces/threads/<id>.json — resume any thread later with --id.",
1689
+ "examples": [
1690
+ "<%= config.bin %> <%= command.id %> socrates -m \"What is justice?\"",
1691
+ "<%= config.bin %> <%= command.id %> --id t_abc123 -m \"Say more about that\"",
1692
+ "<%= config.bin %> <%= command.id %> --list",
1693
+ "<%= config.bin %> <%= command.id %> --id t_abc123 --show",
1694
+ "<%= config.bin %> <%= command.id %> --id t_abc123 --delete"
1695
+ ],
1696
+ "flags": {
1697
+ "json": {
1698
+ "description": "Format output as json.",
1699
+ "helpGroup": "GLOBAL",
1700
+ "name": "json",
1701
+ "allowNo": false,
1702
+ "type": "boolean"
1703
+ },
1704
+ "base-url": {
1705
+ "description": "API base URL",
1706
+ "env": "FACES_BASE_URL",
1707
+ "name": "base-url",
1708
+ "hasDynamicHelp": false,
1709
+ "multiple": false,
1710
+ "type": "option"
1711
+ },
1712
+ "token": {
1713
+ "description": "JWT bearer token",
1714
+ "env": "FACES_TOKEN",
1715
+ "name": "token",
1716
+ "hasDynamicHelp": false,
1717
+ "multiple": false,
1718
+ "type": "option"
1719
+ },
1720
+ "api-key": {
1721
+ "description": "API key",
1722
+ "env": "FACES_API_KEY",
1723
+ "name": "api-key",
1724
+ "hasDynamicHelp": false,
1725
+ "multiple": false,
1726
+ "type": "option"
1727
+ },
1728
+ "id": {
1729
+ "description": "Resume an existing thread by id",
1730
+ "name": "id",
1731
+ "hasDynamicHelp": false,
1732
+ "multiple": false,
1733
+ "type": "option"
1734
+ },
1735
+ "message": {
1736
+ "char": "m",
1737
+ "description": "User message",
1738
+ "name": "message",
1739
+ "hasDynamicHelp": false,
1740
+ "multiple": false,
1741
+ "type": "option"
1742
+ },
1743
+ "file": {
1744
+ "description": "Read message from file",
1745
+ "name": "file",
1746
+ "hasDynamicHelp": false,
1747
+ "multiple": false,
1748
+ "type": "option"
1749
+ },
1750
+ "llm": {
1751
+ "description": "LLM override (only honored when starting a new thread)",
1752
+ "name": "llm",
1753
+ "hasDynamicHelp": false,
1754
+ "multiple": false,
1755
+ "type": "option"
1756
+ },
1757
+ "system": {
1758
+ "description": "System prompt (only honored when starting a new thread)",
1759
+ "name": "system",
1760
+ "hasDynamicHelp": false,
1761
+ "multiple": false,
1762
+ "type": "option"
1763
+ },
1764
+ "max-tokens": {
1765
+ "description": "Max tokens",
1766
+ "name": "max-tokens",
1767
+ "hasDynamicHelp": false,
1768
+ "multiple": false,
1769
+ "type": "option"
1770
+ },
1771
+ "temperature": {
1772
+ "description": "Temperature (0.0-2.0, OpenAI/Chat Completions only)",
1773
+ "name": "temperature",
1774
+ "hasDynamicHelp": false,
1775
+ "multiple": false,
1776
+ "type": "option"
1777
+ },
1778
+ "stream": {
1779
+ "description": "Stream the response",
1780
+ "name": "stream",
1781
+ "allowNo": false,
1782
+ "type": "boolean"
1783
+ },
1784
+ "oauth-only": {
1785
+ "description": "Prevent fallback to paid system key",
1786
+ "name": "oauth-only",
1787
+ "allowNo": false,
1788
+ "type": "boolean"
1789
+ },
1790
+ "list": {
1791
+ "description": "List saved threads",
1792
+ "name": "list",
1793
+ "allowNo": false,
1794
+ "type": "boolean"
1795
+ },
1796
+ "show": {
1797
+ "description": "Show the thread transcript (requires --id)",
1798
+ "name": "show",
1799
+ "allowNo": false,
1800
+ "type": "boolean"
1801
+ },
1802
+ "delete": {
1803
+ "description": "Delete the thread (requires --id)",
1804
+ "name": "delete",
1805
+ "allowNo": false,
1806
+ "type": "boolean"
1807
+ }
1808
+ },
1809
+ "hasDynamicHelp": false,
1810
+ "hiddenAliases": [],
1811
+ "id": "chat:thread",
1812
+ "pluginAlias": "faces-cli",
1813
+ "pluginName": "faces-cli",
1814
+ "pluginType": "core",
1815
+ "strict": true,
1816
+ "enableJsonFlag": true,
1817
+ "isESM": true,
1818
+ "relativePath": [
1819
+ "dist",
1820
+ "commands",
1821
+ "chat",
1822
+ "thread.js"
1823
+ ]
1824
+ },
1679
1825
  "compile:all": {
1680
1826
  "aliases": [],
1681
1827
  "args": {},
@@ -2174,10 +2320,10 @@
2174
2320
  "show.js"
2175
2321
  ]
2176
2322
  },
2177
- "face:attributes": {
2323
+ "keys:create": {
2178
2324
  "aliases": [],
2179
2325
  "args": {},
2180
- "description": "List all supported attribute keys",
2326
+ "description": "Create a new API key (JWT required). The new key is saved to ~/.faces/config.json as api_key by default; pass --no-save to skip.",
2181
2327
  "flags": {
2182
2328
  "json": {
2183
2329
  "description": "Format output as json.",
@@ -2209,11 +2355,53 @@
2209
2355
  "hasDynamicHelp": false,
2210
2356
  "multiple": false,
2211
2357
  "type": "option"
2358
+ },
2359
+ "name": {
2360
+ "description": "Key name/label",
2361
+ "name": "name",
2362
+ "required": true,
2363
+ "hasDynamicHelp": false,
2364
+ "multiple": false,
2365
+ "type": "option"
2366
+ },
2367
+ "expires-days": {
2368
+ "description": "Expiry in days (omit for no expiry)",
2369
+ "name": "expires-days",
2370
+ "hasDynamicHelp": false,
2371
+ "multiple": false,
2372
+ "type": "option"
2373
+ },
2374
+ "budget": {
2375
+ "description": "Spend budget in USD",
2376
+ "name": "budget",
2377
+ "hasDynamicHelp": false,
2378
+ "multiple": false,
2379
+ "type": "option"
2380
+ },
2381
+ "face": {
2382
+ "description": "Allowed face alias (repeatable)",
2383
+ "name": "face",
2384
+ "hasDynamicHelp": false,
2385
+ "multiple": true,
2386
+ "type": "option"
2387
+ },
2388
+ "model": {
2389
+ "description": "Allowed model name (repeatable)",
2390
+ "name": "model",
2391
+ "hasDynamicHelp": false,
2392
+ "multiple": true,
2393
+ "type": "option"
2394
+ },
2395
+ "save": {
2396
+ "description": "Save the new key to ~/.faces/config.json as api_key (default: true; use --no-save to skip)",
2397
+ "name": "save",
2398
+ "allowNo": true,
2399
+ "type": "boolean"
2212
2400
  }
2213
2401
  },
2214
2402
  "hasDynamicHelp": false,
2215
2403
  "hiddenAliases": [],
2216
- "id": "face:attributes",
2404
+ "id": "keys:create",
2217
2405
  "pluginAlias": "faces-cli",
2218
2406
  "pluginName": "faces-cli",
2219
2407
  "pluginType": "core",
@@ -2223,14 +2411,14 @@
2223
2411
  "relativePath": [
2224
2412
  "dist",
2225
2413
  "commands",
2226
- "face",
2227
- "attributes.js"
2414
+ "keys",
2415
+ "create.js"
2228
2416
  ]
2229
2417
  },
2230
- "face:create": {
2418
+ "keys:list": {
2231
2419
  "aliases": [],
2232
2420
  "args": {},
2233
- "description": "Create a new face",
2421
+ "description": "List all API keys (JWT required)",
2234
2422
  "flags": {
2235
2423
  "json": {
2236
2424
  "description": "Format output as json.",
@@ -2262,69 +2450,76 @@
2262
2450
  "hasDynamicHelp": false,
2263
2451
  "multiple": false,
2264
2452
  "type": "option"
2453
+ }
2454
+ },
2455
+ "hasDynamicHelp": false,
2456
+ "hiddenAliases": [],
2457
+ "id": "keys:list",
2458
+ "pluginAlias": "faces-cli",
2459
+ "pluginName": "faces-cli",
2460
+ "pluginType": "core",
2461
+ "strict": true,
2462
+ "enableJsonFlag": true,
2463
+ "isESM": true,
2464
+ "relativePath": [
2465
+ "dist",
2466
+ "commands",
2467
+ "keys",
2468
+ "list.js"
2469
+ ]
2470
+ },
2471
+ "keys:revoke": {
2472
+ "aliases": [],
2473
+ "args": {
2474
+ "key_id": {
2475
+ "description": "Key ID",
2476
+ "name": "key_id",
2477
+ "required": true
2478
+ }
2479
+ },
2480
+ "description": "Revoke an API key (JWT required)",
2481
+ "flags": {
2482
+ "json": {
2483
+ "description": "Format output as json.",
2484
+ "helpGroup": "GLOBAL",
2485
+ "name": "json",
2486
+ "allowNo": false,
2487
+ "type": "boolean"
2265
2488
  },
2266
- "name": {
2267
- "description": "Display name",
2268
- "name": "name",
2269
- "required": true,
2270
- "hasDynamicHelp": false,
2271
- "multiple": false,
2272
- "type": "option"
2273
- },
2274
- "alias": {
2275
- "description": "Unique alias slug",
2276
- "name": "alias",
2277
- "required": true,
2278
- "hasDynamicHelp": false,
2279
- "multiple": false,
2280
- "type": "option"
2281
- },
2282
- "description": {
2283
- "description": "Plain-text description / bio (max 1500 chars)",
2284
- "name": "description",
2489
+ "base-url": {
2490
+ "description": "API base URL",
2491
+ "env": "FACES_BASE_URL",
2492
+ "name": "base-url",
2285
2493
  "hasDynamicHelp": false,
2286
2494
  "multiple": false,
2287
2495
  "type": "option"
2288
2496
  },
2289
- "tag": {
2290
- "description": "Tag label (repeatable, lowercase)",
2291
- "name": "tag",
2292
- "hasDynamicHelp": false,
2293
- "multiple": true,
2294
- "type": "option"
2295
- },
2296
- "default-model": {
2297
- "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
2298
- "name": "default-model",
2497
+ "token": {
2498
+ "description": "JWT bearer token",
2499
+ "env": "FACES_TOKEN",
2500
+ "name": "token",
2299
2501
  "hasDynamicHelp": false,
2300
2502
  "multiple": false,
2301
2503
  "type": "option"
2302
2504
  },
2303
- "formula": {
2304
- "description": "Boolean formula over owned concrete face aliases (e.g. \"a | b\", \"(a | b) - c\"). Creates a composite face.",
2305
- "name": "formula",
2505
+ "api-key": {
2506
+ "description": "API key",
2507
+ "env": "FACES_API_KEY",
2508
+ "name": "api-key",
2306
2509
  "hasDynamicHelp": false,
2307
2510
  "multiple": false,
2308
2511
  "type": "option"
2309
2512
  },
2310
- "attr": {
2311
- "description": "Attribute KEY=VALUE (repeatable)",
2312
- "name": "attr",
2313
- "hasDynamicHelp": false,
2314
- "multiple": true,
2315
- "type": "option"
2316
- },
2317
- "tool": {
2318
- "description": "Tool name to enable (repeatable)",
2319
- "name": "tool",
2320
- "hasDynamicHelp": false,
2321
- "multiple": true,
2322
- "type": "option"
2513
+ "yes": {
2514
+ "description": "Skip confirmation",
2515
+ "name": "yes",
2516
+ "allowNo": false,
2517
+ "type": "boolean"
2323
2518
  }
2324
2519
  },
2325
2520
  "hasDynamicHelp": false,
2326
2521
  "hiddenAliases": [],
2327
- "id": "face:create",
2522
+ "id": "keys:revoke",
2328
2523
  "pluginAlias": "faces-cli",
2329
2524
  "pluginName": "faces-cli",
2330
2525
  "pluginType": "core",
@@ -2334,20 +2529,20 @@
2334
2529
  "relativePath": [
2335
2530
  "dist",
2336
2531
  "commands",
2337
- "face",
2338
- "create.js"
2532
+ "keys",
2533
+ "revoke.js"
2339
2534
  ]
2340
2535
  },
2341
- "face:delete": {
2536
+ "keys:update": {
2342
2537
  "aliases": [],
2343
2538
  "args": {
2344
- "face_id": {
2345
- "description": "Face alias",
2346
- "name": "face_id",
2539
+ "key_id": {
2540
+ "description": "Key ID",
2541
+ "name": "key_id",
2347
2542
  "required": true
2348
2543
  }
2349
2544
  },
2350
- "description": "Delete a face permanently",
2545
+ "description": "Update API key metadata (JWT required)",
2351
2546
  "flags": {
2352
2547
  "json": {
2353
2548
  "description": "Format output as json.",
@@ -2380,16 +2575,30 @@
2380
2575
  "multiple": false,
2381
2576
  "type": "option"
2382
2577
  },
2383
- "yes": {
2384
- "description": "Skip confirmation",
2385
- "name": "yes",
2578
+ "name": {
2579
+ "description": "New key name",
2580
+ "name": "name",
2581
+ "hasDynamicHelp": false,
2582
+ "multiple": false,
2583
+ "type": "option"
2584
+ },
2585
+ "budget": {
2586
+ "description": "New spend budget in USD",
2587
+ "name": "budget",
2588
+ "hasDynamicHelp": false,
2589
+ "multiple": false,
2590
+ "type": "option"
2591
+ },
2592
+ "reset-spent": {
2593
+ "description": "Reset spent amount to zero",
2594
+ "name": "reset-spent",
2386
2595
  "allowNo": false,
2387
2596
  "type": "boolean"
2388
2597
  }
2389
2598
  },
2390
2599
  "hasDynamicHelp": false,
2391
2600
  "hiddenAliases": [],
2392
- "id": "face:delete",
2601
+ "id": "keys:update",
2393
2602
  "pluginAlias": "faces-cli",
2394
2603
  "pluginName": "faces-cli",
2395
2604
  "pluginType": "core",
@@ -2399,14 +2608,14 @@
2399
2608
  "relativePath": [
2400
2609
  "dist",
2401
2610
  "commands",
2402
- "face",
2403
- "delete.js"
2611
+ "keys",
2612
+ "update.js"
2404
2613
  ]
2405
2614
  },
2406
- "face:diff": {
2615
+ "face:attributes": {
2407
2616
  "aliases": [],
2408
2617
  "args": {},
2409
- "description": "Compare owned faces pairwise across all centroid components",
2618
+ "description": "List all supported attribute keys",
2410
2619
  "flags": {
2411
2620
  "json": {
2412
2621
  "description": "Format output as json.",
@@ -2438,19 +2647,11 @@
2438
2647
  "hasDynamicHelp": false,
2439
2648
  "multiple": false,
2440
2649
  "type": "option"
2441
- },
2442
- "face": {
2443
- "description": "Face alias to include (repeatable, min 2)",
2444
- "name": "face",
2445
- "required": true,
2446
- "hasDynamicHelp": false,
2447
- "multiple": true,
2448
- "type": "option"
2449
2650
  }
2450
2651
  },
2451
2652
  "hasDynamicHelp": false,
2452
2653
  "hiddenAliases": [],
2453
- "id": "face:diff",
2654
+ "id": "face:attributes",
2454
2655
  "pluginAlias": "faces-cli",
2455
2656
  "pluginName": "faces-cli",
2456
2657
  "pluginType": "core",
@@ -2461,19 +2662,13 @@
2461
2662
  "dist",
2462
2663
  "commands",
2463
2664
  "face",
2464
- "diff.js"
2665
+ "attributes.js"
2465
2666
  ]
2466
2667
  },
2467
- "face:edit": {
2668
+ "face:create": {
2468
2669
  "aliases": [],
2469
- "args": {
2470
- "face_id": {
2471
- "description": "Face alias",
2472
- "name": "face_id",
2473
- "required": true
2474
- }
2475
- },
2476
- "description": "Edit a face's metadata",
2670
+ "args": {},
2671
+ "description": "Create a new face",
2477
2672
  "flags": {
2478
2673
  "json": {
2479
2674
  "description": "Format output as json.",
@@ -2507,8 +2702,17 @@
2507
2702
  "type": "option"
2508
2703
  },
2509
2704
  "name": {
2510
- "description": "New display name",
2705
+ "description": "Display name",
2511
2706
  "name": "name",
2707
+ "required": true,
2708
+ "hasDynamicHelp": false,
2709
+ "multiple": false,
2710
+ "type": "option"
2711
+ },
2712
+ "alias": {
2713
+ "description": "Unique alias slug",
2714
+ "name": "alias",
2715
+ "required": true,
2512
2716
  "hasDynamicHelp": false,
2513
2717
  "multiple": false,
2514
2718
  "type": "option"
@@ -2521,7 +2725,7 @@
2521
2725
  "type": "option"
2522
2726
  },
2523
2727
  "tag": {
2524
- "description": "Replace all tags (repeatable, lowercase)",
2728
+ "description": "Tag label (repeatable, lowercase)",
2525
2729
  "name": "tag",
2526
2730
  "hasDynamicHelp": false,
2527
2731
  "multiple": true,
@@ -2535,21 +2739,21 @@
2535
2739
  "type": "option"
2536
2740
  },
2537
2741
  "formula": {
2538
- "description": "New boolean formula (synthetic faces only)",
2742
+ "description": "Boolean formula over owned concrete face aliases (e.g. \"a | b\", \"(a | b) - c\"). Creates a composite face.",
2539
2743
  "name": "formula",
2540
2744
  "hasDynamicHelp": false,
2541
2745
  "multiple": false,
2542
2746
  "type": "option"
2543
2747
  },
2544
2748
  "attr": {
2545
- "description": "Update attribute KEY=VALUE (repeatable)",
2749
+ "description": "Attribute KEY=VALUE (repeatable)",
2546
2750
  "name": "attr",
2547
2751
  "hasDynamicHelp": false,
2548
2752
  "multiple": true,
2549
2753
  "type": "option"
2550
2754
  },
2551
2755
  "tool": {
2552
- "description": "Tool names to set (replaces list, repeatable)",
2756
+ "description": "Tool name to enable (repeatable)",
2553
2757
  "name": "tool",
2554
2758
  "hasDynamicHelp": false,
2555
2759
  "multiple": true,
@@ -2558,7 +2762,7 @@
2558
2762
  },
2559
2763
  "hasDynamicHelp": false,
2560
2764
  "hiddenAliases": [],
2561
- "id": "face:edit",
2765
+ "id": "face:create",
2562
2766
  "pluginAlias": "faces-cli",
2563
2767
  "pluginName": "faces-cli",
2564
2768
  "pluginType": "core",
@@ -2569,10 +2773,10 @@
2569
2773
  "dist",
2570
2774
  "commands",
2571
2775
  "face",
2572
- "edit.js"
2776
+ "create.js"
2573
2777
  ]
2574
2778
  },
2575
- "face:get": {
2779
+ "face:delete": {
2576
2780
  "aliases": [],
2577
2781
  "args": {
2578
2782
  "face_id": {
@@ -2581,7 +2785,7 @@
2581
2785
  "required": true
2582
2786
  }
2583
2787
  },
2584
- "description": "Get details for a face by alias",
2788
+ "description": "Delete a face permanently",
2585
2789
  "flags": {
2586
2790
  "json": {
2587
2791
  "description": "Format output as json.",
@@ -2614,17 +2818,16 @@
2614
2818
  "multiple": false,
2615
2819
  "type": "option"
2616
2820
  },
2617
- "include": {
2618
- "description": "Include extra fields: tags, teams (comma-separated)",
2619
- "name": "include",
2620
- "hasDynamicHelp": false,
2621
- "multiple": false,
2622
- "type": "option"
2821
+ "yes": {
2822
+ "description": "Skip confirmation",
2823
+ "name": "yes",
2824
+ "allowNo": false,
2825
+ "type": "boolean"
2623
2826
  }
2624
2827
  },
2625
2828
  "hasDynamicHelp": false,
2626
2829
  "hiddenAliases": [],
2627
- "id": "face:get",
2830
+ "id": "face:delete",
2628
2831
  "pluginAlias": "faces-cli",
2629
2832
  "pluginName": "faces-cli",
2630
2833
  "pluginType": "core",
@@ -2635,13 +2838,13 @@
2635
2838
  "dist",
2636
2839
  "commands",
2637
2840
  "face",
2638
- "get.js"
2841
+ "delete.js"
2639
2842
  ]
2640
2843
  },
2641
- "face:list": {
2844
+ "face:diff": {
2642
2845
  "aliases": [],
2643
2846
  "args": {},
2644
- "description": "List all owned faces",
2847
+ "description": "Compare owned faces pairwise across all centroid components",
2645
2848
  "flags": {
2646
2849
  "json": {
2647
2850
  "description": "Format output as json.",
@@ -2674,31 +2877,18 @@
2674
2877
  "multiple": false,
2675
2878
  "type": "option"
2676
2879
  },
2677
- "tag": {
2678
- "description": "Filter by tag (repeatable, AND logic)",
2679
- "name": "tag",
2680
- "hasDynamicHelp": false,
2681
- "multiple": true,
2682
- "type": "option"
2683
- },
2684
- "team": {
2685
- "description": "Filter by team ID (repeatable, OR logic)",
2686
- "name": "team",
2880
+ "face": {
2881
+ "description": "Face alias to include (repeatable, min 2)",
2882
+ "name": "face",
2883
+ "required": true,
2687
2884
  "hasDynamicHelp": false,
2688
2885
  "multiple": true,
2689
2886
  "type": "option"
2690
- },
2691
- "include": {
2692
- "description": "Include extra fields: tags, teams (comma-separated)",
2693
- "name": "include",
2694
- "hasDynamicHelp": false,
2695
- "multiple": false,
2696
- "type": "option"
2697
2887
  }
2698
2888
  },
2699
2889
  "hasDynamicHelp": false,
2700
2890
  "hiddenAliases": [],
2701
- "id": "face:list",
2891
+ "id": "face:diff",
2702
2892
  "pluginAlias": "faces-cli",
2703
2893
  "pluginName": "faces-cli",
2704
2894
  "pluginType": "core",
@@ -2709,10 +2899,10 @@
2709
2899
  "dist",
2710
2900
  "commands",
2711
2901
  "face",
2712
- "list.js"
2902
+ "diff.js"
2713
2903
  ]
2714
2904
  },
2715
- "face:neighbors": {
2905
+ "face:edit": {
2716
2906
  "aliases": [],
2717
2907
  "args": {
2718
2908
  "face_id": {
@@ -2721,7 +2911,7 @@
2721
2911
  "required": true
2722
2912
  }
2723
2913
  },
2724
- "description": "Find the most similar or dissimilar owned faces to a given face",
2914
+ "description": "Edit a face's metadata",
2725
2915
  "flags": {
2726
2916
  "json": {
2727
2917
  "description": "Format output as json.",
@@ -2754,97 +2944,59 @@
2754
2944
  "multiple": false,
2755
2945
  "type": "option"
2756
2946
  },
2757
- "k": {
2758
- "description": "Number of results (1–20)",
2759
- "name": "k",
2760
- "default": 5,
2947
+ "name": {
2948
+ "description": "New display name",
2949
+ "name": "name",
2761
2950
  "hasDynamicHelp": false,
2762
2951
  "multiple": false,
2763
2952
  "type": "option"
2764
2953
  },
2765
- "component": {
2766
- "description": "Centroid component to rank on (beta, delta, epsilon are the principal components of a face; face is their composite)",
2767
- "name": "component",
2768
- "default": "face",
2954
+ "description": {
2955
+ "description": "Plain-text description / bio (max 1500 chars)",
2956
+ "name": "description",
2769
2957
  "hasDynamicHelp": false,
2770
2958
  "multiple": false,
2771
- "options": [
2772
- "face",
2773
- "beta",
2774
- "delta",
2775
- "epsilon"
2776
- ],
2777
2959
  "type": "option"
2778
2960
  },
2779
- "direction": {
2780
- "description": "nearest (most similar) or furthest (most dissimilar)",
2781
- "name": "direction",
2782
- "default": "nearest",
2961
+ "tag": {
2962
+ "description": "Replace all tags (repeatable, lowercase)",
2963
+ "name": "tag",
2783
2964
  "hasDynamicHelp": false,
2784
- "multiple": false,
2785
- "options": [
2786
- "nearest",
2787
- "furthest"
2788
- ],
2965
+ "multiple": true,
2789
2966
  "type": "option"
2790
- }
2791
- },
2792
- "hasDynamicHelp": false,
2793
- "hiddenAliases": [],
2794
- "id": "face:neighbors",
2795
- "pluginAlias": "faces-cli",
2796
- "pluginName": "faces-cli",
2797
- "pluginType": "core",
2798
- "strict": true,
2799
- "enableJsonFlag": true,
2800
- "isESM": true,
2801
- "relativePath": [
2802
- "dist",
2803
- "commands",
2804
- "face",
2805
- "neighbors.js"
2806
- ]
2807
- },
2808
- "face:stats": {
2809
- "aliases": [],
2810
- "args": {},
2811
- "description": "Compile and chat stats for all owned faces",
2812
- "flags": {
2813
- "json": {
2814
- "description": "Format output as json.",
2815
- "helpGroup": "GLOBAL",
2816
- "name": "json",
2817
- "allowNo": false,
2818
- "type": "boolean"
2819
2967
  },
2820
- "base-url": {
2821
- "description": "API base URL",
2822
- "env": "FACES_BASE_URL",
2823
- "name": "base-url",
2968
+ "default-model": {
2969
+ "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
2970
+ "name": "default-model",
2824
2971
  "hasDynamicHelp": false,
2825
2972
  "multiple": false,
2826
2973
  "type": "option"
2827
2974
  },
2828
- "token": {
2829
- "description": "JWT bearer token",
2830
- "env": "FACES_TOKEN",
2831
- "name": "token",
2975
+ "formula": {
2976
+ "description": "New boolean formula (synthetic faces only)",
2977
+ "name": "formula",
2832
2978
  "hasDynamicHelp": false,
2833
2979
  "multiple": false,
2834
2980
  "type": "option"
2835
2981
  },
2836
- "api-key": {
2837
- "description": "API key",
2838
- "env": "FACES_API_KEY",
2839
- "name": "api-key",
2982
+ "attr": {
2983
+ "description": "Update attribute KEY=VALUE (repeatable)",
2984
+ "name": "attr",
2840
2985
  "hasDynamicHelp": false,
2841
- "multiple": false,
2986
+ "multiple": true,
2987
+ "type": "option"
2988
+ },
2989
+ "tool": {
2990
+ "description": "Tool names to set (replaces list, repeatable)",
2991
+ "name": "tool",
2992
+ "hasDynamicHelp": false,
2993
+ "multiple": true,
2842
2994
  "type": "option"
2843
2995
  }
2844
2996
  },
2845
2997
  "hasDynamicHelp": false,
2846
2998
  "hiddenAliases": [],
2847
- "id": "face:stats",
2999
+ "id": "face:edit",
2848
3000
  "pluginAlias": "faces-cli",
2849
3001
  "pluginName": "faces-cli",
2850
3002
  "pluginType": "core",
@@ -2855,19 +3007,19 @@
2855
3007
  "dist",
2856
3008
  "commands",
2857
3009
  "face",
2858
- "stats.js"
3010
+ "edit.js"
2859
3011
  ]
2860
3012
  },
2861
- "face:teams": {
3013
+ "face:get": {
2862
3014
  "aliases": [],
2863
3015
  "args": {
2864
- "alias": {
3016
+ "face_id": {
2865
3017
  "description": "Face alias",
2866
- "name": "alias",
3018
+ "name": "face_id",
2867
3019
  "required": true
2868
3020
  }
2869
3021
  },
2870
- "description": "Set a face's team memberships (replaces all)",
3022
+ "description": "Get details for a face by alias",
2871
3023
  "flags": {
2872
3024
  "json": {
2873
3025
  "description": "Format output as json.",
@@ -2900,18 +3052,17 @@
2900
3052
  "multiple": false,
2901
3053
  "type": "option"
2902
3054
  },
2903
- "team": {
2904
- "description": "Team ID (repeatable, replaces all memberships)",
2905
- "name": "team",
2906
- "required": true,
3055
+ "include": {
3056
+ "description": "Include extra fields: tags, teams (comma-separated)",
3057
+ "name": "include",
2907
3058
  "hasDynamicHelp": false,
2908
- "multiple": true,
3059
+ "multiple": false,
2909
3060
  "type": "option"
2910
3061
  }
2911
3062
  },
2912
3063
  "hasDynamicHelp": false,
2913
3064
  "hiddenAliases": [],
2914
- "id": "face:teams",
3065
+ "id": "face:get",
2915
3066
  "pluginAlias": "faces-cli",
2916
3067
  "pluginName": "faces-cli",
2917
3068
  "pluginType": "core",
@@ -2922,19 +3073,13 @@
2922
3073
  "dist",
2923
3074
  "commands",
2924
3075
  "face",
2925
- "teams.js"
3076
+ "get.js"
2926
3077
  ]
2927
3078
  },
2928
- "face:upload": {
3079
+ "face:list": {
2929
3080
  "aliases": [],
2930
- "args": {
2931
- "face_id": {
2932
- "description": "Face alias",
2933
- "name": "face_id",
2934
- "required": true
2935
- }
2936
- },
2937
- "description": "Upload a file (text/PDF/audio/video) to a face",
3081
+ "args": {},
3082
+ "description": "List all owned faces",
2938
3083
  "flags": {
2939
3084
  "json": {
2940
3085
  "description": "Format output as json.",
@@ -2967,41 +3112,23 @@
2967
3112
  "multiple": false,
2968
3113
  "type": "option"
2969
3114
  },
2970
- "file": {
2971
- "description": "File to upload",
2972
- "name": "file",
2973
- "required": true,
2974
- "hasDynamicHelp": false,
2975
- "multiple": false,
2976
- "type": "option"
2977
- },
2978
- "kind": {
2979
- "description": "Upload kind: document or thread",
2980
- "name": "kind",
2981
- "default": "document",
3115
+ "tag": {
3116
+ "description": "Filter by tag (repeatable, AND logic)",
3117
+ "name": "tag",
2982
3118
  "hasDynamicHelp": false,
2983
- "multiple": false,
2984
- "options": [
2985
- "document",
2986
- "thread"
2987
- ],
3119
+ "multiple": true,
2988
3120
  "type": "option"
2989
3121
  },
2990
- "perspective": {
2991
- "description": "Perspective (document only)",
2992
- "name": "perspective",
2993
- "default": "third-person",
3122
+ "team": {
3123
+ "description": "Filter by team ID (repeatable, OR logic)",
3124
+ "name": "team",
2994
3125
  "hasDynamicHelp": false,
2995
- "multiple": false,
2996
- "options": [
2997
- "first-person",
2998
- "third-person"
2999
- ],
3126
+ "multiple": true,
3000
3127
  "type": "option"
3001
3128
  },
3002
- "face-speaker": {
3003
- "description": "Speaker name to map to the face (thread only). If omitted, first speaker is used.",
3004
- "name": "face-speaker",
3129
+ "include": {
3130
+ "description": "Include extra fields: tags, teams (comma-separated)",
3131
+ "name": "include",
3005
3132
  "hasDynamicHelp": false,
3006
3133
  "multiple": false,
3007
3134
  "type": "option"
@@ -3009,7 +3136,7 @@
3009
3136
  },
3010
3137
  "hasDynamicHelp": false,
3011
3138
  "hiddenAliases": [],
3012
- "id": "face:upload",
3139
+ "id": "face:list",
3013
3140
  "pluginAlias": "faces-cli",
3014
3141
  "pluginName": "faces-cli",
3015
3142
  "pluginType": "core",
@@ -3020,13 +3147,19 @@
3020
3147
  "dist",
3021
3148
  "commands",
3022
3149
  "face",
3023
- "upload.js"
3150
+ "list.js"
3024
3151
  ]
3025
3152
  },
3026
- "keys:create": {
3153
+ "face:neighbors": {
3027
3154
  "aliases": [],
3028
- "args": {},
3029
- "description": "Create a new API key (JWT required)",
3155
+ "args": {
3156
+ "face_id": {
3157
+ "description": "Face alias",
3158
+ "name": "face_id",
3159
+ "required": true
3160
+ }
3161
+ },
3162
+ "description": "Find the most similar or dissimilar owned faces to a given face",
3030
3163
  "flags": {
3031
3164
  "json": {
3032
3165
  "description": "Format output as json.",
@@ -3059,46 +3192,44 @@
3059
3192
  "multiple": false,
3060
3193
  "type": "option"
3061
3194
  },
3062
- "name": {
3063
- "description": "Key name/label",
3064
- "name": "name",
3065
- "required": true,
3195
+ "k": {
3196
+ "description": "Number of results (1–20)",
3197
+ "name": "k",
3198
+ "default": 5,
3066
3199
  "hasDynamicHelp": false,
3067
3200
  "multiple": false,
3068
3201
  "type": "option"
3069
3202
  },
3070
- "expires-days": {
3071
- "description": "Expiry in days (omit for no expiry)",
3072
- "name": "expires-days",
3203
+ "component": {
3204
+ "description": "Centroid component to rank on (beta, delta, epsilon are the principal components of a face; face is their composite)",
3205
+ "name": "component",
3206
+ "default": "face",
3073
3207
  "hasDynamicHelp": false,
3074
3208
  "multiple": false,
3209
+ "options": [
3210
+ "face",
3211
+ "beta",
3212
+ "delta",
3213
+ "epsilon"
3214
+ ],
3075
3215
  "type": "option"
3076
3216
  },
3077
- "budget": {
3078
- "description": "Spend budget in USD",
3079
- "name": "budget",
3217
+ "direction": {
3218
+ "description": "nearest (most similar) or furthest (most dissimilar)",
3219
+ "name": "direction",
3220
+ "default": "nearest",
3080
3221
  "hasDynamicHelp": false,
3081
3222
  "multiple": false,
3082
- "type": "option"
3083
- },
3084
- "face": {
3085
- "description": "Allowed face alias (repeatable)",
3086
- "name": "face",
3087
- "hasDynamicHelp": false,
3088
- "multiple": true,
3089
- "type": "option"
3090
- },
3091
- "model": {
3092
- "description": "Allowed model name (repeatable)",
3093
- "name": "model",
3094
- "hasDynamicHelp": false,
3095
- "multiple": true,
3223
+ "options": [
3224
+ "nearest",
3225
+ "furthest"
3226
+ ],
3096
3227
  "type": "option"
3097
3228
  }
3098
3229
  },
3099
3230
  "hasDynamicHelp": false,
3100
3231
  "hiddenAliases": [],
3101
- "id": "keys:create",
3232
+ "id": "face:neighbors",
3102
3233
  "pluginAlias": "faces-cli",
3103
3234
  "pluginName": "faces-cli",
3104
3235
  "pluginType": "core",
@@ -3108,14 +3239,14 @@
3108
3239
  "relativePath": [
3109
3240
  "dist",
3110
3241
  "commands",
3111
- "keys",
3112
- "create.js"
3242
+ "face",
3243
+ "neighbors.js"
3113
3244
  ]
3114
3245
  },
3115
- "keys:list": {
3246
+ "face:stats": {
3116
3247
  "aliases": [],
3117
3248
  "args": {},
3118
- "description": "List all API keys (JWT required)",
3249
+ "description": "Compile and chat stats for all owned faces",
3119
3250
  "flags": {
3120
3251
  "json": {
3121
3252
  "description": "Format output as json.",
@@ -3151,7 +3282,7 @@
3151
3282
  },
3152
3283
  "hasDynamicHelp": false,
3153
3284
  "hiddenAliases": [],
3154
- "id": "keys:list",
3285
+ "id": "face:stats",
3155
3286
  "pluginAlias": "faces-cli",
3156
3287
  "pluginName": "faces-cli",
3157
3288
  "pluginType": "core",
@@ -3161,20 +3292,20 @@
3161
3292
  "relativePath": [
3162
3293
  "dist",
3163
3294
  "commands",
3164
- "keys",
3165
- "list.js"
3295
+ "face",
3296
+ "stats.js"
3166
3297
  ]
3167
3298
  },
3168
- "keys:revoke": {
3299
+ "face:teams": {
3169
3300
  "aliases": [],
3170
3301
  "args": {
3171
- "key_id": {
3172
- "description": "Key ID",
3173
- "name": "key_id",
3302
+ "alias": {
3303
+ "description": "Face alias",
3304
+ "name": "alias",
3174
3305
  "required": true
3175
3306
  }
3176
3307
  },
3177
- "description": "Revoke an API key (JWT required)",
3308
+ "description": "Set a face's team memberships (replaces all)",
3178
3309
  "flags": {
3179
3310
  "json": {
3180
3311
  "description": "Format output as json.",
@@ -3207,16 +3338,18 @@
3207
3338
  "multiple": false,
3208
3339
  "type": "option"
3209
3340
  },
3210
- "yes": {
3211
- "description": "Skip confirmation",
3212
- "name": "yes",
3213
- "allowNo": false,
3214
- "type": "boolean"
3341
+ "team": {
3342
+ "description": "Team ID (repeatable, replaces all memberships)",
3343
+ "name": "team",
3344
+ "required": true,
3345
+ "hasDynamicHelp": false,
3346
+ "multiple": true,
3347
+ "type": "option"
3215
3348
  }
3216
3349
  },
3217
3350
  "hasDynamicHelp": false,
3218
3351
  "hiddenAliases": [],
3219
- "id": "keys:revoke",
3352
+ "id": "face:teams",
3220
3353
  "pluginAlias": "faces-cli",
3221
3354
  "pluginName": "faces-cli",
3222
3355
  "pluginType": "core",
@@ -3226,20 +3359,20 @@
3226
3359
  "relativePath": [
3227
3360
  "dist",
3228
3361
  "commands",
3229
- "keys",
3230
- "revoke.js"
3362
+ "face",
3363
+ "teams.js"
3231
3364
  ]
3232
3365
  },
3233
- "keys:update": {
3366
+ "face:upload": {
3234
3367
  "aliases": [],
3235
3368
  "args": {
3236
- "key_id": {
3237
- "description": "Key ID",
3238
- "name": "key_id",
3369
+ "face_id": {
3370
+ "description": "Face alias",
3371
+ "name": "face_id",
3239
3372
  "required": true
3240
3373
  }
3241
3374
  },
3242
- "description": "Update API key metadata (JWT required)",
3375
+ "description": "Upload a file (text/PDF/audio/video) to a face",
3243
3376
  "flags": {
3244
3377
  "json": {
3245
3378
  "description": "Format output as json.",
@@ -3272,30 +3405,49 @@
3272
3405
  "multiple": false,
3273
3406
  "type": "option"
3274
3407
  },
3275
- "name": {
3276
- "description": "New key name",
3277
- "name": "name",
3408
+ "file": {
3409
+ "description": "File to upload",
3410
+ "name": "file",
3411
+ "required": true,
3278
3412
  "hasDynamicHelp": false,
3279
3413
  "multiple": false,
3280
3414
  "type": "option"
3281
3415
  },
3282
- "budget": {
3283
- "description": "New spend budget in USD",
3284
- "name": "budget",
3416
+ "kind": {
3417
+ "description": "Upload kind: document or thread",
3418
+ "name": "kind",
3419
+ "default": "document",
3285
3420
  "hasDynamicHelp": false,
3286
3421
  "multiple": false,
3422
+ "options": [
3423
+ "document",
3424
+ "thread"
3425
+ ],
3287
3426
  "type": "option"
3288
3427
  },
3289
- "reset-spent": {
3290
- "description": "Reset spent amount to zero",
3291
- "name": "reset-spent",
3292
- "allowNo": false,
3293
- "type": "boolean"
3428
+ "perspective": {
3429
+ "description": "Perspective (document only)",
3430
+ "name": "perspective",
3431
+ "default": "third-person",
3432
+ "hasDynamicHelp": false,
3433
+ "multiple": false,
3434
+ "options": [
3435
+ "first-person",
3436
+ "third-person"
3437
+ ],
3438
+ "type": "option"
3439
+ },
3440
+ "face-speaker": {
3441
+ "description": "Speaker name to map to the face (thread only). If omitted, first speaker is used.",
3442
+ "name": "face-speaker",
3443
+ "hasDynamicHelp": false,
3444
+ "multiple": false,
3445
+ "type": "option"
3294
3446
  }
3295
3447
  },
3296
3448
  "hasDynamicHelp": false,
3297
3449
  "hiddenAliases": [],
3298
- "id": "keys:update",
3450
+ "id": "face:upload",
3299
3451
  "pluginAlias": "faces-cli",
3300
3452
  "pluginName": "faces-cli",
3301
3453
  "pluginType": "core",
@@ -3305,8 +3457,8 @@
3305
3457
  "relativePath": [
3306
3458
  "dist",
3307
3459
  "commands",
3308
- "keys",
3309
- "update.js"
3460
+ "face",
3461
+ "upload.js"
3310
3462
  ]
3311
3463
  },
3312
3464
  "team:add": {
@@ -5894,5 +6046,5 @@
5894
6046
  ]
5895
6047
  }
5896
6048
  },
5897
- "version": "1.6.15"
6049
+ "version": "1.6.17"
5898
6050
  }