faces-cli 1.7.10 → 1.7.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/catalog.d.ts +2 -12
  2. package/dist/catalog.js +2 -3
  3. package/dist/commands/chat/chat.d.ts +1 -0
  4. package/dist/commands/chat/chat.js +36 -3
  5. package/dist/commands/chat/messages.d.ts +1 -0
  6. package/dist/commands/chat/messages.js +5 -1
  7. package/dist/commands/chat/responses.d.ts +1 -0
  8. package/dist/commands/chat/responses.js +5 -1
  9. package/dist/commands/chat/thread.d.ts +1 -0
  10. package/dist/commands/chat/thread.js +31 -3
  11. package/dist/commands/compile/doc/create.d.ts +1 -0
  12. package/dist/commands/compile/doc/create.js +4 -0
  13. package/dist/commands/compile/doc/edit.d.ts +1 -0
  14. package/dist/commands/compile/doc/edit.js +4 -0
  15. package/dist/commands/compile/doc/index.d.ts +1 -0
  16. package/dist/commands/compile/doc/index.js +5 -1
  17. package/dist/commands/compile/doc/list.d.ts +1 -0
  18. package/dist/commands/compile/doc/list.js +19 -4
  19. package/dist/commands/compile/doc/make.js +1 -1
  20. package/dist/commands/compile/thread/make.js +1 -1
  21. package/dist/commands/compile/upload.d.ts +1 -0
  22. package/dist/commands/compile/upload.js +9 -0
  23. package/dist/commands/face/diff.js +8 -6
  24. package/dist/commands/face/list.d.ts +1 -0
  25. package/dist/commands/face/list.js +16 -3
  26. package/dist/commands/face/neighbors.js +20 -4
  27. package/dist/commands/face/publish.d.ts +15 -0
  28. package/dist/commands/face/publish.js +41 -0
  29. package/dist/commands/face/share.d.ts +21 -0
  30. package/dist/commands/face/share.js +106 -0
  31. package/dist/commands/face/sources.d.ts +20 -0
  32. package/dist/commands/face/sources.js +150 -0
  33. package/dist/commands/face/unpublish.d.ts +13 -0
  34. package/dist/commands/face/unpublish.js +30 -0
  35. package/dist/commands/face/unshare.d.ts +17 -0
  36. package/dist/commands/face/unshare.js +67 -0
  37. package/dist/poll.d.ts +1 -6
  38. package/dist/utils.d.ts +34 -0
  39. package/dist/utils.js +57 -0
  40. package/oclif.manifest.json +750 -289
  41. package/package.json +1 -1
@@ -120,10 +120,23 @@
120
120
  "state.js"
121
121
  ]
122
122
  },
123
- "billing:balance": {
123
+ "auth:connect": {
124
124
  "aliases": [],
125
- "args": {},
126
- "description": "Show credit balance and payment method status",
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 your ChatGPT account to Faces via device-code authorization (Subscription Connect plan)",
136
+ "examples": [
137
+ "<%= config.bin %> auth connect openai",
138
+ "<%= config.bin %> auth connect openai --json"
139
+ ],
127
140
  "flags": {
128
141
  "json": {
129
142
  "description": "Format output as json.",
@@ -159,7 +172,7 @@
159
172
  },
160
173
  "hasDynamicHelp": false,
161
174
  "hiddenAliases": [],
162
- "id": "billing:balance",
175
+ "id": "auth:connect",
163
176
  "pluginAlias": "faces-cli",
164
177
  "pluginName": "faces-cli",
165
178
  "pluginType": "core",
@@ -169,14 +182,18 @@
169
182
  "relativePath": [
170
183
  "dist",
171
184
  "commands",
172
- "billing",
173
- "balance.js"
185
+ "auth",
186
+ "connect.js"
174
187
  ]
175
188
  },
176
- "billing:card-setup": {
189
+ "auth:connections": {
177
190
  "aliases": [],
178
191
  "args": {},
179
- "description": "Get a Stripe card setup URL to save a payment method",
192
+ "description": "List connected OAuth provider accounts",
193
+ "examples": [
194
+ "<%= config.bin %> auth connections",
195
+ "<%= config.bin %> auth connections --json"
196
+ ],
180
197
  "flags": {
181
198
  "json": {
182
199
  "description": "Format output as json.",
@@ -212,7 +229,7 @@
212
229
  },
213
230
  "hasDynamicHelp": false,
214
231
  "hiddenAliases": [],
215
- "id": "billing:card-setup",
232
+ "id": "auth:connections",
216
233
  "pluginAlias": "faces-cli",
217
234
  "pluginName": "faces-cli",
218
235
  "pluginType": "core",
@@ -222,14 +239,26 @@
222
239
  "relativePath": [
223
240
  "dist",
224
241
  "commands",
225
- "billing",
226
- "card-setup.js"
242
+ "auth",
243
+ "connections.js"
227
244
  ]
228
245
  },
229
- "billing:llm-costs": {
246
+ "auth:disconnect": {
230
247
  "aliases": [],
231
- "args": {},
232
- "description": "List available LLMs and their per-token costs",
248
+ "args": {
249
+ "provider": {
250
+ "description": "OAuth provider to disconnect",
251
+ "name": "provider",
252
+ "options": [
253
+ "openai"
254
+ ],
255
+ "required": true
256
+ }
257
+ },
258
+ "description": "Disconnect a linked OAuth provider account",
259
+ "examples": [
260
+ "<%= config.bin %> auth disconnect openai"
261
+ ],
233
262
  "flags": {
234
263
  "json": {
235
264
  "description": "Format output as json.",
@@ -261,18 +290,11 @@
261
290
  "hasDynamicHelp": false,
262
291
  "multiple": false,
263
292
  "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"
271
293
  }
272
294
  },
273
295
  "hasDynamicHelp": false,
274
296
  "hiddenAliases": [],
275
- "id": "billing:llm-costs",
297
+ "id": "auth:disconnect",
276
298
  "pluginAlias": "faces-cli",
277
299
  "pluginName": "faces-cli",
278
300
  "pluginType": "core",
@@ -282,14 +304,14 @@
282
304
  "relativePath": [
283
305
  "dist",
284
306
  "commands",
285
- "billing",
286
- "llm-costs.js"
307
+ "auth",
308
+ "disconnect.js"
287
309
  ]
288
310
  },
289
- "billing:topup": {
311
+ "auth:login": {
290
312
  "aliases": [],
291
313
  "args": {},
292
- "description": "Top up credit balance using saved payment method",
314
+ "description": "Login and save JWT credentials",
293
315
  "flags": {
294
316
  "json": {
295
317
  "description": "Format output as json.",
@@ -322,17 +344,18 @@
322
344
  "multiple": false,
323
345
  "type": "option"
324
346
  },
325
- "amount": {
326
- "description": "Top-up amount in USD (min $1)",
327
- "name": "amount",
347
+ "email": {
348
+ "description": "Account email",
349
+ "name": "email",
328
350
  "required": true,
329
351
  "hasDynamicHelp": false,
330
352
  "multiple": false,
331
353
  "type": "option"
332
354
  },
333
- "payment-ref": {
334
- "description": "Payment reference (admin/test path)",
335
- "name": "payment-ref",
355
+ "password": {
356
+ "description": "Account password",
357
+ "name": "password",
358
+ "required": true,
336
359
  "hasDynamicHelp": false,
337
360
  "multiple": false,
338
361
  "type": "option"
@@ -340,7 +363,7 @@
340
363
  },
341
364
  "hasDynamicHelp": false,
342
365
  "hiddenAliases": [],
343
- "id": "billing:topup",
366
+ "id": "auth:login",
344
367
  "pluginAlias": "faces-cli",
345
368
  "pluginName": "faces-cli",
346
369
  "pluginType": "core",
@@ -350,14 +373,14 @@
350
373
  "relativePath": [
351
374
  "dist",
352
375
  "commands",
353
- "billing",
354
- "topup.js"
376
+ "auth",
377
+ "login.js"
355
378
  ]
356
379
  },
357
- "billing:usage": {
380
+ "auth:logout": {
358
381
  "aliases": [],
359
382
  "args": {},
360
- "description": "Aggregated usage analytics",
383
+ "description": "Clear saved credentials",
361
384
  "flags": {
362
385
  "json": {
363
386
  "description": "Format output as json.",
@@ -389,38 +412,11 @@
389
412
  "hasDynamicHelp": false,
390
413
  "multiple": false,
391
414
  "type": "option"
392
- },
393
- "group-by": {
394
- "description": "Group results",
395
- "name": "group-by",
396
- "hasDynamicHelp": false,
397
- "multiple": false,
398
- "options": [
399
- "api_key",
400
- "model",
401
- "llm",
402
- "date"
403
- ],
404
- "type": "option"
405
- },
406
- "from": {
407
- "description": "Start date (YYYY-MM-DD)",
408
- "name": "from",
409
- "hasDynamicHelp": false,
410
- "multiple": false,
411
- "type": "option"
412
- },
413
- "to": {
414
- "description": "End date (YYYY-MM-DD)",
415
- "name": "to",
416
- "hasDynamicHelp": false,
417
- "multiple": false,
418
- "type": "option"
419
415
  }
420
416
  },
421
417
  "hasDynamicHelp": false,
422
418
  "hiddenAliases": [],
423
- "id": "billing:usage",
419
+ "id": "auth:logout",
424
420
  "pluginAlias": "faces-cli",
425
421
  "pluginName": "faces-cli",
426
422
  "pluginType": "core",
@@ -430,27 +426,14 @@
430
426
  "relativePath": [
431
427
  "dist",
432
428
  "commands",
433
- "billing",
434
- "usage.js"
429
+ "auth",
430
+ "logout.js"
435
431
  ]
436
432
  },
437
- "auth:connect": {
433
+ "auth:refresh": {
438
434
  "aliases": [],
439
- "args": {
440
- "provider": {
441
- "description": "OAuth provider to connect",
442
- "name": "provider",
443
- "options": [
444
- "openai"
445
- ],
446
- "required": true
447
- }
448
- },
449
- "description": "Connect your ChatGPT account to Faces via device-code authorization (Subscription Connect plan)",
450
- "examples": [
451
- "<%= config.bin %> auth connect openai",
452
- "<%= config.bin %> auth connect openai --json"
453
- ],
435
+ "args": {},
436
+ "description": "Exchange current JWT for a fresh one",
454
437
  "flags": {
455
438
  "json": {
456
439
  "description": "Format output as json.",
@@ -486,7 +469,7 @@
486
469
  },
487
470
  "hasDynamicHelp": false,
488
471
  "hiddenAliases": [],
489
- "id": "auth:connect",
472
+ "id": "auth:refresh",
490
473
  "pluginAlias": "faces-cli",
491
474
  "pluginName": "faces-cli",
492
475
  "pluginType": "core",
@@ -497,17 +480,13 @@
497
480
  "dist",
498
481
  "commands",
499
482
  "auth",
500
- "connect.js"
483
+ "refresh.js"
501
484
  ]
502
485
  },
503
- "auth:connections": {
486
+ "auth:register": {
504
487
  "aliases": [],
505
488
  "args": {},
506
- "description": "List connected OAuth provider accounts",
507
- "examples": [
508
- "<%= config.bin %> auth connections",
509
- "<%= config.bin %> auth connections --json"
510
- ],
489
+ "description": "Create a new Faces account",
511
490
  "flags": {
512
491
  "json": {
513
492
  "description": "Format output as json.",
@@ -539,11 +518,54 @@
539
518
  "hasDynamicHelp": false,
540
519
  "multiple": false,
541
520
  "type": "option"
521
+ },
522
+ "email": {
523
+ "description": "Email address",
524
+ "name": "email",
525
+ "required": true,
526
+ "hasDynamicHelp": false,
527
+ "multiple": false,
528
+ "type": "option"
529
+ },
530
+ "password": {
531
+ "description": "Password",
532
+ "name": "password",
533
+ "required": true,
534
+ "hasDynamicHelp": false,
535
+ "multiple": false,
536
+ "type": "option"
537
+ },
538
+ "username": {
539
+ "description": "Username (lowercase, dashes, numbers)",
540
+ "name": "username",
541
+ "required": true,
542
+ "hasDynamicHelp": false,
543
+ "multiple": false,
544
+ "type": "option"
545
+ },
546
+ "invite-key": {
547
+ "description": "Invite key (if required)",
548
+ "name": "invite-key",
549
+ "hasDynamicHelp": false,
550
+ "multiple": false,
551
+ "type": "option"
552
+ },
553
+ "plan": {
554
+ "description": "Plan to subscribe to: \"free\" ($5 activation) or \"connect\" ($17/mo, no activation fee)",
555
+ "name": "plan",
556
+ "default": "free",
557
+ "hasDynamicHelp": false,
558
+ "multiple": false,
559
+ "options": [
560
+ "free",
561
+ "connect"
562
+ ],
563
+ "type": "option"
542
564
  }
543
565
  },
544
566
  "hasDynamicHelp": false,
545
567
  "hiddenAliases": [],
546
- "id": "auth:connections",
568
+ "id": "auth:register",
547
569
  "pluginAlias": "faces-cli",
548
570
  "pluginName": "faces-cli",
549
571
  "pluginType": "core",
@@ -554,25 +576,13 @@
554
576
  "dist",
555
577
  "commands",
556
578
  "auth",
557
- "connections.js"
579
+ "register.js"
558
580
  ]
559
581
  },
560
- "auth:disconnect": {
582
+ "auth:whoami": {
561
583
  "aliases": [],
562
- "args": {
563
- "provider": {
564
- "description": "OAuth provider to disconnect",
565
- "name": "provider",
566
- "options": [
567
- "openai"
568
- ],
569
- "required": true
570
- }
571
- },
572
- "description": "Disconnect a linked OAuth provider account",
573
- "examples": [
574
- "<%= config.bin %> auth disconnect openai"
575
- ],
584
+ "args": {},
585
+ "description": "Print current user profile and auth diagnostic",
576
586
  "flags": {
577
587
  "json": {
578
588
  "description": "Format output as json.",
@@ -608,7 +618,7 @@
608
618
  },
609
619
  "hasDynamicHelp": false,
610
620
  "hiddenAliases": [],
611
- "id": "auth:disconnect",
621
+ "id": "auth:whoami",
612
622
  "pluginAlias": "faces-cli",
613
623
  "pluginName": "faces-cli",
614
624
  "pluginType": "core",
@@ -619,13 +629,13 @@
619
629
  "dist",
620
630
  "commands",
621
631
  "auth",
622
- "disconnect.js"
632
+ "whoami.js"
623
633
  ]
624
634
  },
625
- "auth:login": {
635
+ "billing:balance": {
626
636
  "aliases": [],
627
637
  "args": {},
628
- "description": "Login and save JWT credentials",
638
+ "description": "Show credit balance and payment method status",
629
639
  "flags": {
630
640
  "json": {
631
641
  "description": "Format output as json.",
@@ -657,27 +667,11 @@
657
667
  "hasDynamicHelp": false,
658
668
  "multiple": false,
659
669
  "type": "option"
660
- },
661
- "email": {
662
- "description": "Account email",
663
- "name": "email",
664
- "required": true,
665
- "hasDynamicHelp": false,
666
- "multiple": false,
667
- "type": "option"
668
- },
669
- "password": {
670
- "description": "Account password",
671
- "name": "password",
672
- "required": true,
673
- "hasDynamicHelp": false,
674
- "multiple": false,
675
- "type": "option"
676
670
  }
677
671
  },
678
672
  "hasDynamicHelp": false,
679
673
  "hiddenAliases": [],
680
- "id": "auth:login",
674
+ "id": "billing:balance",
681
675
  "pluginAlias": "faces-cli",
682
676
  "pluginName": "faces-cli",
683
677
  "pluginType": "core",
@@ -687,14 +681,14 @@
687
681
  "relativePath": [
688
682
  "dist",
689
683
  "commands",
690
- "auth",
691
- "login.js"
684
+ "billing",
685
+ "balance.js"
692
686
  ]
693
687
  },
694
- "auth:logout": {
688
+ "billing:card-setup": {
695
689
  "aliases": [],
696
690
  "args": {},
697
- "description": "Clear saved credentials",
691
+ "description": "Get a Stripe card setup URL to save a payment method",
698
692
  "flags": {
699
693
  "json": {
700
694
  "description": "Format output as json.",
@@ -730,7 +724,7 @@
730
724
  },
731
725
  "hasDynamicHelp": false,
732
726
  "hiddenAliases": [],
733
- "id": "auth:logout",
727
+ "id": "billing:card-setup",
734
728
  "pluginAlias": "faces-cli",
735
729
  "pluginName": "faces-cli",
736
730
  "pluginType": "core",
@@ -740,14 +734,14 @@
740
734
  "relativePath": [
741
735
  "dist",
742
736
  "commands",
743
- "auth",
744
- "logout.js"
737
+ "billing",
738
+ "card-setup.js"
745
739
  ]
746
740
  },
747
- "auth:refresh": {
741
+ "billing:llm-costs": {
748
742
  "aliases": [],
749
743
  "args": {},
750
- "description": "Exchange current JWT for a fresh one",
744
+ "description": "List available LLMs and their per-token costs",
751
745
  "flags": {
752
746
  "json": {
753
747
  "description": "Format output as json.",
@@ -779,11 +773,18 @@
779
773
  "hasDynamicHelp": false,
780
774
  "multiple": false,
781
775
  "type": "option"
776
+ },
777
+ "provider": {
778
+ "description": "Filter by provider (e.g. openai, anthropic)",
779
+ "name": "provider",
780
+ "hasDynamicHelp": false,
781
+ "multiple": false,
782
+ "type": "option"
782
783
  }
783
784
  },
784
785
  "hasDynamicHelp": false,
785
786
  "hiddenAliases": [],
786
- "id": "auth:refresh",
787
+ "id": "billing:llm-costs",
787
788
  "pluginAlias": "faces-cli",
788
789
  "pluginName": "faces-cli",
789
790
  "pluginType": "core",
@@ -793,14 +794,14 @@
793
794
  "relativePath": [
794
795
  "dist",
795
796
  "commands",
796
- "auth",
797
- "refresh.js"
797
+ "billing",
798
+ "llm-costs.js"
798
799
  ]
799
800
  },
800
- "auth:register": {
801
+ "billing:topup": {
801
802
  "aliases": [],
802
803
  "args": {},
803
- "description": "Create a new Faces account",
804
+ "description": "Top up credit balance using saved payment method",
804
805
  "flags": {
805
806
  "json": {
806
807
  "description": "Format output as json.",
@@ -833,53 +834,25 @@
833
834
  "multiple": false,
834
835
  "type": "option"
835
836
  },
836
- "email": {
837
- "description": "Email address",
838
- "name": "email",
839
- "required": true,
840
- "hasDynamicHelp": false,
841
- "multiple": false,
842
- "type": "option"
843
- },
844
- "password": {
845
- "description": "Password",
846
- "name": "password",
847
- "required": true,
848
- "hasDynamicHelp": false,
849
- "multiple": false,
850
- "type": "option"
851
- },
852
- "username": {
853
- "description": "Username (lowercase, dashes, numbers)",
854
- "name": "username",
837
+ "amount": {
838
+ "description": "Top-up amount in USD (min $1)",
839
+ "name": "amount",
855
840
  "required": true,
856
841
  "hasDynamicHelp": false,
857
842
  "multiple": false,
858
843
  "type": "option"
859
844
  },
860
- "invite-key": {
861
- "description": "Invite key (if required)",
862
- "name": "invite-key",
845
+ "payment-ref": {
846
+ "description": "Payment reference (admin/test path)",
847
+ "name": "payment-ref",
863
848
  "hasDynamicHelp": false,
864
849
  "multiple": false,
865
850
  "type": "option"
866
- },
867
- "plan": {
868
- "description": "Plan to subscribe to: \"free\" ($5 activation) or \"connect\" ($17/mo, no activation fee)",
869
- "name": "plan",
870
- "default": "free",
871
- "hasDynamicHelp": false,
872
- "multiple": false,
873
- "options": [
874
- "free",
875
- "connect"
876
- ],
877
- "type": "option"
878
851
  }
879
852
  },
880
853
  "hasDynamicHelp": false,
881
854
  "hiddenAliases": [],
882
- "id": "auth:register",
855
+ "id": "billing:topup",
883
856
  "pluginAlias": "faces-cli",
884
857
  "pluginName": "faces-cli",
885
858
  "pluginType": "core",
@@ -889,14 +862,14 @@
889
862
  "relativePath": [
890
863
  "dist",
891
864
  "commands",
892
- "auth",
893
- "register.js"
865
+ "billing",
866
+ "topup.js"
894
867
  ]
895
868
  },
896
- "auth:whoami": {
869
+ "billing:usage": {
897
870
  "aliases": [],
898
871
  "args": {},
899
- "description": "Print current user profile and auth diagnostic",
872
+ "description": "Aggregated usage analytics",
900
873
  "flags": {
901
874
  "json": {
902
875
  "description": "Format output as json.",
@@ -928,11 +901,38 @@
928
901
  "hasDynamicHelp": false,
929
902
  "multiple": false,
930
903
  "type": "option"
904
+ },
905
+ "group-by": {
906
+ "description": "Group results",
907
+ "name": "group-by",
908
+ "hasDynamicHelp": false,
909
+ "multiple": false,
910
+ "options": [
911
+ "api_key",
912
+ "model",
913
+ "llm",
914
+ "date"
915
+ ],
916
+ "type": "option"
917
+ },
918
+ "from": {
919
+ "description": "Start date (YYYY-MM-DD)",
920
+ "name": "from",
921
+ "hasDynamicHelp": false,
922
+ "multiple": false,
923
+ "type": "option"
924
+ },
925
+ "to": {
926
+ "description": "End date (YYYY-MM-DD)",
927
+ "name": "to",
928
+ "hasDynamicHelp": false,
929
+ "multiple": false,
930
+ "type": "option"
931
931
  }
932
932
  },
933
933
  "hasDynamicHelp": false,
934
934
  "hiddenAliases": [],
935
- "id": "auth:whoami",
935
+ "id": "billing:usage",
936
936
  "pluginAlias": "faces-cli",
937
937
  "pluginName": "faces-cli",
938
938
  "pluginType": "core",
@@ -942,8 +942,8 @@
942
942
  "relativePath": [
943
943
  "dist",
944
944
  "commands",
945
- "auth",
946
- "whoami.js"
945
+ "billing",
946
+ "usage.js"
947
947
  ]
948
948
  },
949
949
  "catalog:backup": {
@@ -1371,6 +1371,13 @@
1371
1371
  "allowNo": false,
1372
1372
  "type": "boolean"
1373
1373
  },
1374
+ "medium": {
1375
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
1376
+ "name": "medium",
1377
+ "hasDynamicHelp": false,
1378
+ "multiple": false,
1379
+ "type": "option"
1380
+ },
1374
1381
  "oauth-only": {
1375
1382
  "description": "Prevent fallback to paid system key (use OAuth only)",
1376
1383
  "name": "oauth-only",
@@ -1398,7 +1405,7 @@
1398
1405
  "aliases": [],
1399
1406
  "args": {
1400
1407
  "face_model": {
1401
- "description": "Face model (e.g. myface, myface@claude-sonnet-4-6, or head:judge@claude-sonnet-4-6)",
1408
+ "description": "Face model (e.g. myface, myface@claude-sonnet-4-6, or head:socrates@claude-sonnet-4-6)",
1402
1409
  "name": "face_model",
1403
1410
  "required": true
1404
1411
  }
@@ -1466,6 +1473,13 @@
1466
1473
  "multiple": false,
1467
1474
  "type": "option"
1468
1475
  },
1476
+ "medium": {
1477
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
1478
+ "name": "medium",
1479
+ "hasDynamicHelp": false,
1480
+ "multiple": false,
1481
+ "type": "option"
1482
+ },
1469
1483
  "oauth-only": {
1470
1484
  "description": "Prevent fallback to paid system key (use OAuth only)",
1471
1485
  "name": "oauth-only",
@@ -1493,7 +1507,7 @@
1493
1507
  "aliases": [],
1494
1508
  "args": {
1495
1509
  "face_model": {
1496
- "description": "Face model (e.g. myface, myface@gpt-4o, or head:logician@gpt-5.4)",
1510
+ "description": "Face model (e.g. myface, myface@gpt-4o, or head:socrates@gpt-5.4)",
1497
1511
  "name": "face_model",
1498
1512
  "required": true
1499
1513
  }
@@ -1553,6 +1567,13 @@
1553
1567
  "allowNo": false,
1554
1568
  "type": "boolean"
1555
1569
  },
1570
+ "medium": {
1571
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
1572
+ "name": "medium",
1573
+ "hasDynamicHelp": false,
1574
+ "multiple": false,
1575
+ "type": "option"
1576
+ },
1556
1577
  "oauth-only": {
1557
1578
  "description": "Prevent fallback to paid system key (use OAuth only)",
1558
1579
  "name": "oauth-only",
@@ -1681,6 +1702,13 @@
1681
1702
  "allowNo": false,
1682
1703
  "type": "boolean"
1683
1704
  },
1705
+ "medium": {
1706
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
1707
+ "name": "medium",
1708
+ "hasDynamicHelp": false,
1709
+ "multiple": false,
1710
+ "type": "option"
1711
+ },
1684
1712
  "oauth-only": {
1685
1713
  "description": "Prevent fallback to paid system key",
1686
1714
  "name": "oauth-only",
@@ -2014,6 +2042,13 @@
2014
2042
  ],
2015
2043
  "type": "option"
2016
2044
  },
2045
+ "medium": {
2046
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not. Only valid with --kind document.",
2047
+ "name": "medium",
2048
+ "hasDynamicHelp": false,
2049
+ "multiple": false,
2050
+ "type": "option"
2051
+ },
2017
2052
  "face-speaker": {
2018
2053
  "description": "Speaker name to map to the face (thread only). If omitted, auto-detected from face name.",
2019
2054
  "name": "face-speaker",
@@ -2220,6 +2255,298 @@
2220
2255
  "show.js"
2221
2256
  ]
2222
2257
  },
2258
+ "keys:create": {
2259
+ "aliases": [],
2260
+ "args": {},
2261
+ "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.",
2262
+ "flags": {
2263
+ "json": {
2264
+ "description": "Format output as json.",
2265
+ "helpGroup": "GLOBAL",
2266
+ "name": "json",
2267
+ "allowNo": false,
2268
+ "type": "boolean"
2269
+ },
2270
+ "base-url": {
2271
+ "description": "API base URL",
2272
+ "env": "FACES_BASE_URL",
2273
+ "name": "base-url",
2274
+ "hasDynamicHelp": false,
2275
+ "multiple": false,
2276
+ "type": "option"
2277
+ },
2278
+ "token": {
2279
+ "description": "JWT bearer token",
2280
+ "env": "FACES_TOKEN",
2281
+ "name": "token",
2282
+ "hasDynamicHelp": false,
2283
+ "multiple": false,
2284
+ "type": "option"
2285
+ },
2286
+ "api-key": {
2287
+ "description": "API key",
2288
+ "env": "FACES_API_KEY",
2289
+ "name": "api-key",
2290
+ "hasDynamicHelp": false,
2291
+ "multiple": false,
2292
+ "type": "option"
2293
+ },
2294
+ "name": {
2295
+ "description": "Key name/label",
2296
+ "name": "name",
2297
+ "required": true,
2298
+ "hasDynamicHelp": false,
2299
+ "multiple": false,
2300
+ "type": "option"
2301
+ },
2302
+ "expires-days": {
2303
+ "description": "Expiry in days (omit for no expiry)",
2304
+ "name": "expires-days",
2305
+ "hasDynamicHelp": false,
2306
+ "multiple": false,
2307
+ "type": "option"
2308
+ },
2309
+ "budget": {
2310
+ "description": "Spend budget in USD",
2311
+ "name": "budget",
2312
+ "hasDynamicHelp": false,
2313
+ "multiple": false,
2314
+ "type": "option"
2315
+ },
2316
+ "face": {
2317
+ "description": "Allowed face alias (repeatable)",
2318
+ "name": "face",
2319
+ "hasDynamicHelp": false,
2320
+ "multiple": true,
2321
+ "type": "option"
2322
+ },
2323
+ "model": {
2324
+ "description": "Allowed model name (repeatable)",
2325
+ "name": "model",
2326
+ "hasDynamicHelp": false,
2327
+ "multiple": true,
2328
+ "type": "option"
2329
+ },
2330
+ "save": {
2331
+ "description": "Save the new key to ~/.faces/config.json as api_key (default: true; use --no-save to skip)",
2332
+ "name": "save",
2333
+ "allowNo": true,
2334
+ "type": "boolean"
2335
+ }
2336
+ },
2337
+ "hasDynamicHelp": false,
2338
+ "hiddenAliases": [],
2339
+ "id": "keys:create",
2340
+ "pluginAlias": "faces-cli",
2341
+ "pluginName": "faces-cli",
2342
+ "pluginType": "core",
2343
+ "strict": true,
2344
+ "enableJsonFlag": true,
2345
+ "isESM": true,
2346
+ "relativePath": [
2347
+ "dist",
2348
+ "commands",
2349
+ "keys",
2350
+ "create.js"
2351
+ ]
2352
+ },
2353
+ "keys:list": {
2354
+ "aliases": [],
2355
+ "args": {},
2356
+ "description": "List all API keys (JWT required)",
2357
+ "flags": {
2358
+ "json": {
2359
+ "description": "Format output as json.",
2360
+ "helpGroup": "GLOBAL",
2361
+ "name": "json",
2362
+ "allowNo": false,
2363
+ "type": "boolean"
2364
+ },
2365
+ "base-url": {
2366
+ "description": "API base URL",
2367
+ "env": "FACES_BASE_URL",
2368
+ "name": "base-url",
2369
+ "hasDynamicHelp": false,
2370
+ "multiple": false,
2371
+ "type": "option"
2372
+ },
2373
+ "token": {
2374
+ "description": "JWT bearer token",
2375
+ "env": "FACES_TOKEN",
2376
+ "name": "token",
2377
+ "hasDynamicHelp": false,
2378
+ "multiple": false,
2379
+ "type": "option"
2380
+ },
2381
+ "api-key": {
2382
+ "description": "API key",
2383
+ "env": "FACES_API_KEY",
2384
+ "name": "api-key",
2385
+ "hasDynamicHelp": false,
2386
+ "multiple": false,
2387
+ "type": "option"
2388
+ }
2389
+ },
2390
+ "hasDynamicHelp": false,
2391
+ "hiddenAliases": [],
2392
+ "id": "keys:list",
2393
+ "pluginAlias": "faces-cli",
2394
+ "pluginName": "faces-cli",
2395
+ "pluginType": "core",
2396
+ "strict": true,
2397
+ "enableJsonFlag": true,
2398
+ "isESM": true,
2399
+ "relativePath": [
2400
+ "dist",
2401
+ "commands",
2402
+ "keys",
2403
+ "list.js"
2404
+ ]
2405
+ },
2406
+ "keys:revoke": {
2407
+ "aliases": [],
2408
+ "args": {
2409
+ "key_id": {
2410
+ "description": "Key ID",
2411
+ "name": "key_id",
2412
+ "required": true
2413
+ }
2414
+ },
2415
+ "description": "Revoke an API key (JWT required)",
2416
+ "flags": {
2417
+ "json": {
2418
+ "description": "Format output as json.",
2419
+ "helpGroup": "GLOBAL",
2420
+ "name": "json",
2421
+ "allowNo": false,
2422
+ "type": "boolean"
2423
+ },
2424
+ "base-url": {
2425
+ "description": "API base URL",
2426
+ "env": "FACES_BASE_URL",
2427
+ "name": "base-url",
2428
+ "hasDynamicHelp": false,
2429
+ "multiple": false,
2430
+ "type": "option"
2431
+ },
2432
+ "token": {
2433
+ "description": "JWT bearer token",
2434
+ "env": "FACES_TOKEN",
2435
+ "name": "token",
2436
+ "hasDynamicHelp": false,
2437
+ "multiple": false,
2438
+ "type": "option"
2439
+ },
2440
+ "api-key": {
2441
+ "description": "API key",
2442
+ "env": "FACES_API_KEY",
2443
+ "name": "api-key",
2444
+ "hasDynamicHelp": false,
2445
+ "multiple": false,
2446
+ "type": "option"
2447
+ },
2448
+ "yes": {
2449
+ "description": "Skip confirmation",
2450
+ "name": "yes",
2451
+ "allowNo": false,
2452
+ "type": "boolean"
2453
+ }
2454
+ },
2455
+ "hasDynamicHelp": false,
2456
+ "hiddenAliases": [],
2457
+ "id": "keys:revoke",
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
+ "revoke.js"
2469
+ ]
2470
+ },
2471
+ "keys:update": {
2472
+ "aliases": [],
2473
+ "args": {
2474
+ "key_id": {
2475
+ "description": "Key ID",
2476
+ "name": "key_id",
2477
+ "required": true
2478
+ }
2479
+ },
2480
+ "description": "Update API key metadata (JWT required)",
2481
+ "flags": {
2482
+ "json": {
2483
+ "description": "Format output as json.",
2484
+ "helpGroup": "GLOBAL",
2485
+ "name": "json",
2486
+ "allowNo": false,
2487
+ "type": "boolean"
2488
+ },
2489
+ "base-url": {
2490
+ "description": "API base URL",
2491
+ "env": "FACES_BASE_URL",
2492
+ "name": "base-url",
2493
+ "hasDynamicHelp": false,
2494
+ "multiple": false,
2495
+ "type": "option"
2496
+ },
2497
+ "token": {
2498
+ "description": "JWT bearer token",
2499
+ "env": "FACES_TOKEN",
2500
+ "name": "token",
2501
+ "hasDynamicHelp": false,
2502
+ "multiple": false,
2503
+ "type": "option"
2504
+ },
2505
+ "api-key": {
2506
+ "description": "API key",
2507
+ "env": "FACES_API_KEY",
2508
+ "name": "api-key",
2509
+ "hasDynamicHelp": false,
2510
+ "multiple": false,
2511
+ "type": "option"
2512
+ },
2513
+ "name": {
2514
+ "description": "New key name",
2515
+ "name": "name",
2516
+ "hasDynamicHelp": false,
2517
+ "multiple": false,
2518
+ "type": "option"
2519
+ },
2520
+ "budget": {
2521
+ "description": "New spend budget in USD",
2522
+ "name": "budget",
2523
+ "hasDynamicHelp": false,
2524
+ "multiple": false,
2525
+ "type": "option"
2526
+ },
2527
+ "reset-spent": {
2528
+ "description": "Reset spent amount to zero",
2529
+ "name": "reset-spent",
2530
+ "allowNo": false,
2531
+ "type": "boolean"
2532
+ }
2533
+ },
2534
+ "hasDynamicHelp": false,
2535
+ "hiddenAliases": [],
2536
+ "id": "keys:update",
2537
+ "pluginAlias": "faces-cli",
2538
+ "pluginName": "faces-cli",
2539
+ "pluginType": "core",
2540
+ "strict": true,
2541
+ "enableJsonFlag": true,
2542
+ "isESM": true,
2543
+ "relativePath": [
2544
+ "dist",
2545
+ "commands",
2546
+ "keys",
2547
+ "update.js"
2548
+ ]
2549
+ },
2223
2550
  "face:attributes": {
2224
2551
  "aliases": [],
2225
2552
  "args": {},
@@ -2792,11 +3119,17 @@
2792
3119
  "type": "option"
2793
3120
  },
2794
3121
  "public": {
2795
- "description": "Include published faces from other accounts",
3122
+ "description": "Include published faces from other accounts (open to everybody)",
2796
3123
  "name": "public",
2797
3124
  "allowNo": false,
2798
3125
  "type": "boolean"
2799
3126
  },
3127
+ "shared": {
3128
+ "description": "Include faces other accounts have shared with YOU in particular",
3129
+ "name": "shared",
3130
+ "allowNo": false,
3131
+ "type": "boolean"
3132
+ },
2800
3133
  "system": {
2801
3134
  "description": "Show only the curated system faces (published faces owned by 'head')",
2802
3135
  "name": "system",
@@ -2947,17 +3280,11 @@
2947
3280
  "type": "option"
2948
3281
  },
2949
3282
  "component": {
2950
- "description": "Centroid component to rank on (beta, delta, epsilon are the principal components of a face; face is their composite)",
3283
+ "description": "What to rank on: `face` for overall similarity, or a component position such as 1. Which positions are comparable varies; the API names them if you pick a wrong one.",
2951
3284
  "name": "component",
2952
3285
  "default": "face",
2953
3286
  "hasDynamicHelp": false,
2954
3287
  "multiple": false,
2955
- "options": [
2956
- "face",
2957
- "beta",
2958
- "delta",
2959
- "epsilon"
2960
- ],
2961
3288
  "type": "option"
2962
3289
  },
2963
3290
  "direction": {
@@ -2989,10 +3316,19 @@
2989
3316
  "neighbors.js"
2990
3317
  ]
2991
3318
  },
2992
- "face:stats": {
3319
+ "face:publish": {
2993
3320
  "aliases": [],
2994
- "args": {},
2995
- "description": "Compile and chat stats for all owned faces",
3321
+ "args": {
3322
+ "alias": {
3323
+ "description": "Face alias",
3324
+ "name": "alias",
3325
+ "required": true
3326
+ }
3327
+ },
3328
+ "description": "Publish a face so EVERY account can chat with it. This is a global override: while it is on, everyone can reach the face regardless of who it is shared with. You still pay only to compile it; whoever chats pays for their own inference.",
3329
+ "examples": [
3330
+ "<%= config.bin %> <%= command.id %> alice --yes"
3331
+ ],
2996
3332
  "flags": {
2997
3333
  "json": {
2998
3334
  "description": "Format output as json.",
@@ -3024,11 +3360,17 @@
3024
3360
  "hasDynamicHelp": false,
3025
3361
  "multiple": false,
3026
3362
  "type": "option"
3363
+ },
3364
+ "yes": {
3365
+ "description": "Skip confirmation",
3366
+ "name": "yes",
3367
+ "allowNo": false,
3368
+ "type": "boolean"
3027
3369
  }
3028
3370
  },
3029
3371
  "hasDynamicHelp": false,
3030
3372
  "hiddenAliases": [],
3031
- "id": "face:stats",
3373
+ "id": "face:publish",
3032
3374
  "pluginAlias": "faces-cli",
3033
3375
  "pluginName": "faces-cli",
3034
3376
  "pluginType": "core",
@@ -3039,10 +3381,10 @@
3039
3381
  "dist",
3040
3382
  "commands",
3041
3383
  "face",
3042
- "stats.js"
3384
+ "publish.js"
3043
3385
  ]
3044
3386
  },
3045
- "face:teams": {
3387
+ "face:share": {
3046
3388
  "aliases": [],
3047
3389
  "args": {
3048
3390
  "alias": {
@@ -3051,7 +3393,13 @@
3051
3393
  "required": true
3052
3394
  }
3053
3395
  },
3054
- "description": "Set a face's team memberships (replaces all)",
3396
+ "description": "Share a face so named accounts can chat with it. Sharing grants chat and nothing else: no reading its documents, no compiling, no re-sharing, and never its profile addendum. --add keeps the current list; --with replaces it.",
3397
+ "examples": [
3398
+ "<%= config.bin %> <%= command.id %> alice --list",
3399
+ "<%= config.bin %> <%= command.id %> alice --add dana",
3400
+ "<%= config.bin %> <%= command.id %> alice --with dana --with sam@example.com",
3401
+ "<%= config.bin %> <%= command.id %> alice --none --yes"
3402
+ ],
3055
3403
  "flags": {
3056
3404
  "json": {
3057
3405
  "description": "Format output as json.",
@@ -3084,18 +3432,54 @@
3084
3432
  "multiple": false,
3085
3433
  "type": "option"
3086
3434
  },
3087
- "team": {
3088
- "description": "Team ID (repeatable, replaces all memberships)",
3089
- "name": "team",
3090
- "required": true,
3435
+ "list": {
3436
+ "description": "Show who the face is shared with, and change nothing",
3437
+ "name": "list",
3438
+ "allowNo": false,
3439
+ "type": "boolean"
3440
+ },
3441
+ "add": {
3442
+ "description": "Add an account, keeping everyone already on the list — username or email (repeatable)",
3443
+ "exclusive": [
3444
+ "with",
3445
+ "none"
3446
+ ],
3447
+ "name": "add",
3091
3448
  "hasDynamicHelp": false,
3092
3449
  "multiple": true,
3093
3450
  "type": "option"
3451
+ },
3452
+ "with": {
3453
+ "description": "Set the list to exactly these accounts, dropping anyone else (repeatable)",
3454
+ "exclusive": [
3455
+ "add",
3456
+ "none"
3457
+ ],
3458
+ "name": "with",
3459
+ "hasDynamicHelp": false,
3460
+ "multiple": true,
3461
+ "type": "option"
3462
+ },
3463
+ "none": {
3464
+ "description": "Revoke everyone",
3465
+ "exclusive": [
3466
+ "add",
3467
+ "with"
3468
+ ],
3469
+ "name": "none",
3470
+ "allowNo": false,
3471
+ "type": "boolean"
3472
+ },
3473
+ "yes": {
3474
+ "description": "Skip the confirmation shown when someone would lose access",
3475
+ "name": "yes",
3476
+ "allowNo": false,
3477
+ "type": "boolean"
3094
3478
  }
3095
3479
  },
3096
3480
  "hasDynamicHelp": false,
3097
3481
  "hiddenAliases": [],
3098
- "id": "face:teams",
3482
+ "id": "face:share",
3099
3483
  "pluginAlias": "faces-cli",
3100
3484
  "pluginName": "faces-cli",
3101
3485
  "pluginType": "core",
@@ -3106,21 +3490,23 @@
3106
3490
  "dist",
3107
3491
  "commands",
3108
3492
  "face",
3109
- "teams.js"
3493
+ "share.js"
3110
3494
  ]
3111
3495
  },
3112
- "face:unlock": {
3496
+ "face:sources": {
3113
3497
  "aliases": [],
3114
3498
  "args": {
3115
- "face_id": {
3499
+ "alias": {
3116
3500
  "description": "Face alias",
3117
- "name": "face_id",
3501
+ "name": "alias",
3118
3502
  "required": true
3119
3503
  }
3120
3504
  },
3121
- "description": "Unlock a face (make it writable again). Thaws the face and everything it owns (documents, threads, voiceprint).",
3505
+ "description": "List every source compiled into a face: documents and threads together, one row each. Exits 4 if the face does not exist, which is a different answer from a face that has no sources. Content is never printed; read a single source with compile:doc:get or compile:thread:get.",
3122
3506
  "examples": [
3123
- "<%= config.bin %> <%= command.id %> socrates"
3507
+ "<%= config.bin %> <%= command.id %> alice",
3508
+ "<%= config.bin %> <%= command.id %> alice --type thread",
3509
+ "<%= config.bin %> <%= command.id %> alice --json"
3124
3510
  ],
3125
3511
  "flags": {
3126
3512
  "json": {
@@ -3153,11 +3539,22 @@
3153
3539
  "hasDynamicHelp": false,
3154
3540
  "multiple": false,
3155
3541
  "type": "option"
3542
+ },
3543
+ "type": {
3544
+ "description": "Show only one kind of source",
3545
+ "name": "type",
3546
+ "hasDynamicHelp": false,
3547
+ "multiple": false,
3548
+ "options": [
3549
+ "doc",
3550
+ "thread"
3551
+ ],
3552
+ "type": "option"
3156
3553
  }
3157
3554
  },
3158
3555
  "hasDynamicHelp": false,
3159
3556
  "hiddenAliases": [],
3160
- "id": "face:unlock",
3557
+ "id": "face:sources",
3161
3558
  "pluginAlias": "faces-cli",
3162
3559
  "pluginName": "faces-cli",
3163
3560
  "pluginType": "core",
@@ -3168,13 +3565,13 @@
3168
3565
  "dist",
3169
3566
  "commands",
3170
3567
  "face",
3171
- "unlock.js"
3568
+ "sources.js"
3172
3569
  ]
3173
3570
  },
3174
- "keys:create": {
3571
+ "face:stats": {
3175
3572
  "aliases": [],
3176
3573
  "args": {},
3177
- "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.",
3574
+ "description": "Compile and chat stats for all owned faces",
3178
3575
  "flags": {
3179
3576
  "json": {
3180
3577
  "description": "Format output as json.",
@@ -3206,53 +3603,78 @@
3206
3603
  "hasDynamicHelp": false,
3207
3604
  "multiple": false,
3208
3605
  "type": "option"
3606
+ }
3607
+ },
3608
+ "hasDynamicHelp": false,
3609
+ "hiddenAliases": [],
3610
+ "id": "face:stats",
3611
+ "pluginAlias": "faces-cli",
3612
+ "pluginName": "faces-cli",
3613
+ "pluginType": "core",
3614
+ "strict": true,
3615
+ "enableJsonFlag": true,
3616
+ "isESM": true,
3617
+ "relativePath": [
3618
+ "dist",
3619
+ "commands",
3620
+ "face",
3621
+ "stats.js"
3622
+ ]
3623
+ },
3624
+ "face:teams": {
3625
+ "aliases": [],
3626
+ "args": {
3627
+ "alias": {
3628
+ "description": "Face alias",
3629
+ "name": "alias",
3630
+ "required": true
3631
+ }
3632
+ },
3633
+ "description": "Set a face's team memberships (replaces all)",
3634
+ "flags": {
3635
+ "json": {
3636
+ "description": "Format output as json.",
3637
+ "helpGroup": "GLOBAL",
3638
+ "name": "json",
3639
+ "allowNo": false,
3640
+ "type": "boolean"
3209
3641
  },
3210
- "name": {
3211
- "description": "Key name/label",
3212
- "name": "name",
3213
- "required": true,
3642
+ "base-url": {
3643
+ "description": "API base URL",
3644
+ "env": "FACES_BASE_URL",
3645
+ "name": "base-url",
3214
3646
  "hasDynamicHelp": false,
3215
3647
  "multiple": false,
3216
3648
  "type": "option"
3217
3649
  },
3218
- "expires-days": {
3219
- "description": "Expiry in days (omit for no expiry)",
3220
- "name": "expires-days",
3650
+ "token": {
3651
+ "description": "JWT bearer token",
3652
+ "env": "FACES_TOKEN",
3653
+ "name": "token",
3221
3654
  "hasDynamicHelp": false,
3222
3655
  "multiple": false,
3223
3656
  "type": "option"
3224
3657
  },
3225
- "budget": {
3226
- "description": "Spend budget in USD",
3227
- "name": "budget",
3658
+ "api-key": {
3659
+ "description": "API key",
3660
+ "env": "FACES_API_KEY",
3661
+ "name": "api-key",
3228
3662
  "hasDynamicHelp": false,
3229
3663
  "multiple": false,
3230
3664
  "type": "option"
3231
3665
  },
3232
- "face": {
3233
- "description": "Allowed face alias (repeatable)",
3234
- "name": "face",
3235
- "hasDynamicHelp": false,
3236
- "multiple": true,
3237
- "type": "option"
3238
- },
3239
- "model": {
3240
- "description": "Allowed model name (repeatable)",
3241
- "name": "model",
3666
+ "team": {
3667
+ "description": "Team ID (repeatable, replaces all memberships)",
3668
+ "name": "team",
3669
+ "required": true,
3242
3670
  "hasDynamicHelp": false,
3243
3671
  "multiple": true,
3244
3672
  "type": "option"
3245
- },
3246
- "save": {
3247
- "description": "Save the new key to ~/.faces/config.json as api_key (default: true; use --no-save to skip)",
3248
- "name": "save",
3249
- "allowNo": true,
3250
- "type": "boolean"
3251
3673
  }
3252
3674
  },
3253
3675
  "hasDynamicHelp": false,
3254
3676
  "hiddenAliases": [],
3255
- "id": "keys:create",
3677
+ "id": "face:teams",
3256
3678
  "pluginAlias": "faces-cli",
3257
3679
  "pluginName": "faces-cli",
3258
3680
  "pluginType": "core",
@@ -3262,14 +3684,23 @@
3262
3684
  "relativePath": [
3263
3685
  "dist",
3264
3686
  "commands",
3265
- "keys",
3266
- "create.js"
3687
+ "face",
3688
+ "teams.js"
3267
3689
  ]
3268
3690
  },
3269
- "keys:list": {
3691
+ "face:unlock": {
3270
3692
  "aliases": [],
3271
- "args": {},
3272
- "description": "List all API keys (JWT required)",
3693
+ "args": {
3694
+ "face_id": {
3695
+ "description": "Face alias",
3696
+ "name": "face_id",
3697
+ "required": true
3698
+ }
3699
+ },
3700
+ "description": "Unlock a face (make it writable again). Thaws the face and everything it owns (documents, threads, voiceprint).",
3701
+ "examples": [
3702
+ "<%= config.bin %> <%= command.id %> socrates"
3703
+ ],
3273
3704
  "flags": {
3274
3705
  "json": {
3275
3706
  "description": "Format output as json.",
@@ -3305,7 +3736,7 @@
3305
3736
  },
3306
3737
  "hasDynamicHelp": false,
3307
3738
  "hiddenAliases": [],
3308
- "id": "keys:list",
3739
+ "id": "face:unlock",
3309
3740
  "pluginAlias": "faces-cli",
3310
3741
  "pluginName": "faces-cli",
3311
3742
  "pluginType": "core",
@@ -3315,20 +3746,20 @@
3315
3746
  "relativePath": [
3316
3747
  "dist",
3317
3748
  "commands",
3318
- "keys",
3319
- "list.js"
3749
+ "face",
3750
+ "unlock.js"
3320
3751
  ]
3321
3752
  },
3322
- "keys:revoke": {
3753
+ "face:unpublish": {
3323
3754
  "aliases": [],
3324
3755
  "args": {
3325
- "key_id": {
3326
- "description": "Key ID",
3327
- "name": "key_id",
3756
+ "alias": {
3757
+ "description": "Face alias",
3758
+ "name": "alias",
3328
3759
  "required": true
3329
3760
  }
3330
3761
  },
3331
- "description": "Revoke an API key (JWT required)",
3762
+ "description": "Stop publishing a face. Anyone it is individually shared with keeps their access — publishing is an override on top of sharing, not a replacement for it.",
3332
3763
  "flags": {
3333
3764
  "json": {
3334
3765
  "description": "Format output as json.",
@@ -3360,17 +3791,11 @@
3360
3791
  "hasDynamicHelp": false,
3361
3792
  "multiple": false,
3362
3793
  "type": "option"
3363
- },
3364
- "yes": {
3365
- "description": "Skip confirmation",
3366
- "name": "yes",
3367
- "allowNo": false,
3368
- "type": "boolean"
3369
3794
  }
3370
3795
  },
3371
3796
  "hasDynamicHelp": false,
3372
3797
  "hiddenAliases": [],
3373
- "id": "keys:revoke",
3798
+ "id": "face:unpublish",
3374
3799
  "pluginAlias": "faces-cli",
3375
3800
  "pluginName": "faces-cli",
3376
3801
  "pluginType": "core",
@@ -3380,20 +3805,24 @@
3380
3805
  "relativePath": [
3381
3806
  "dist",
3382
3807
  "commands",
3383
- "keys",
3384
- "revoke.js"
3808
+ "face",
3809
+ "unpublish.js"
3385
3810
  ]
3386
3811
  },
3387
- "keys:update": {
3812
+ "face:unshare": {
3388
3813
  "aliases": [],
3389
3814
  "args": {
3390
- "key_id": {
3391
- "description": "Key ID",
3392
- "name": "key_id",
3815
+ "alias": {
3816
+ "description": "Face alias",
3817
+ "name": "alias",
3393
3818
  "required": true
3394
3819
  }
3395
3820
  },
3396
- "description": "Update API key metadata (JWT required)",
3821
+ "description": "Revoke access to a shared face. Takes effect immediately — there is no grace period.",
3822
+ "examples": [
3823
+ "<%= config.bin %> <%= command.id %> alice --from dana --yes",
3824
+ "<%= config.bin %> <%= command.id %> alice --all --yes"
3825
+ ],
3397
3826
  "flags": {
3398
3827
  "json": {
3399
3828
  "description": "Format output as json.",
@@ -3426,30 +3855,35 @@
3426
3855
  "multiple": false,
3427
3856
  "type": "option"
3428
3857
  },
3429
- "name": {
3430
- "description": "New key name",
3431
- "name": "name",
3858
+ "from": {
3859
+ "description": "Account to revoke (repeatable)",
3860
+ "exclusive": [
3861
+ "all"
3862
+ ],
3863
+ "name": "from",
3432
3864
  "hasDynamicHelp": false,
3433
- "multiple": false,
3865
+ "multiple": true,
3434
3866
  "type": "option"
3435
3867
  },
3436
- "budget": {
3437
- "description": "New spend budget in USD",
3438
- "name": "budget",
3439
- "hasDynamicHelp": false,
3440
- "multiple": false,
3441
- "type": "option"
3868
+ "all": {
3869
+ "description": "Revoke everyone",
3870
+ "exclusive": [
3871
+ "from"
3872
+ ],
3873
+ "name": "all",
3874
+ "allowNo": false,
3875
+ "type": "boolean"
3442
3876
  },
3443
- "reset-spent": {
3444
- "description": "Reset spent amount to zero",
3445
- "name": "reset-spent",
3877
+ "yes": {
3878
+ "description": "Skip confirmation",
3879
+ "name": "yes",
3446
3880
  "allowNo": false,
3447
3881
  "type": "boolean"
3448
3882
  }
3449
3883
  },
3450
3884
  "hasDynamicHelp": false,
3451
3885
  "hiddenAliases": [],
3452
- "id": "keys:update",
3886
+ "id": "face:unshare",
3453
3887
  "pluginAlias": "faces-cli",
3454
3888
  "pluginName": "faces-cli",
3455
3889
  "pluginType": "core",
@@ -3459,8 +3893,8 @@
3459
3893
  "relativePath": [
3460
3894
  "dist",
3461
3895
  "commands",
3462
- "keys",
3463
- "update.js"
3896
+ "face",
3897
+ "unshare.js"
3464
3898
  ]
3465
3899
  },
3466
3900
  "team:add": {
@@ -4248,6 +4682,13 @@
4248
4682
  "multiple": false,
4249
4683
  "type": "option"
4250
4684
  },
4685
+ "medium": {
4686
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
4687
+ "name": "medium",
4688
+ "hasDynamicHelp": false,
4689
+ "multiple": false,
4690
+ "type": "option"
4691
+ },
4251
4692
  "perspective": {
4252
4693
  "description": "Perspective (first-person or third-person)",
4253
4694
  "name": "perspective",
@@ -4401,6 +4842,13 @@
4401
4842
  "multiple": false,
4402
4843
  "type": "option"
4403
4844
  },
4845
+ "medium": {
4846
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
4847
+ "name": "medium",
4848
+ "hasDynamicHelp": false,
4849
+ "multiple": false,
4850
+ "type": "option"
4851
+ },
4404
4852
  "perspective": {
4405
4853
  "description": "Perspective (first-person or third-person)",
4406
4854
  "name": "perspective",
@@ -4560,6 +5008,13 @@
4560
5008
  "multiple": true,
4561
5009
  "type": "option"
4562
5010
  },
5011
+ "medium": {
5012
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
5013
+ "name": "medium",
5014
+ "hasDynamicHelp": false,
5015
+ "multiple": false,
5016
+ "type": "option"
5017
+ },
4563
5018
  "perspective": {
4564
5019
  "description": "Perspective",
4565
5020
  "name": "perspective",
@@ -4613,7 +5068,7 @@
4613
5068
  "required": true
4614
5069
  }
4615
5070
  },
4616
- "description": "List documents for a face",
5071
+ "description": "List documents for a face. Each document's full text is omitted unless --verbose, so a face with a real corpus stays readable. For a table of every source, documents and threads together, use face:sources.",
4617
5072
  "flags": {
4618
5073
  "json": {
4619
5074
  "description": "Format output as json.",
@@ -4645,6 +5100,12 @@
4645
5100
  "hasDynamicHelp": false,
4646
5101
  "multiple": false,
4647
5102
  "type": "option"
5103
+ },
5104
+ "verbose": {
5105
+ "description": "Include each document's full text",
5106
+ "name": "verbose",
5107
+ "allowNo": false,
5108
+ "type": "boolean"
4648
5109
  }
4649
5110
  },
4650
5111
  "hasDynamicHelp": false,
@@ -6137,5 +6598,5 @@
6137
6598
  ]
6138
6599
  }
6139
6600
  },
6140
- "version": "1.7.10"
6601
+ "version": "1.7.16"
6141
6602
  }