faces-cli 1.8.7 → 1.8.8

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,10 +120,23 @@
120
120
  "state.js"
121
121
  ]
122
122
  },
123
- "catalog:backup": {
123
+ "auth:connect": {
124
124
  "aliases": [],
125
- "args": {},
126
- "description": "Snapshot all faces, teams, and source material for migration",
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": "catalog:backup",
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
- "catalog",
173
- "backup.js"
185
+ "auth",
186
+ "connect.js"
174
187
  ]
175
188
  },
176
- "catalog:doctor": {
189
+ "auth:connections": {
177
190
  "aliases": [],
178
191
  "args": {},
179
- "description": "Diagnose and repair the local face and team catalog",
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.",
@@ -208,23 +225,11 @@
208
225
  "hasDynamicHelp": false,
209
226
  "multiple": false,
210
227
  "type": "option"
211
- },
212
- "fix": {
213
- "description": "Rebuild missing or stale catalog entries from API",
214
- "name": "fix",
215
- "allowNo": false,
216
- "type": "boolean"
217
- },
218
- "generate": {
219
- "description": "Fix + generate missing descriptions via LLM",
220
- "name": "generate",
221
- "allowNo": false,
222
- "type": "boolean"
223
228
  }
224
229
  },
225
230
  "hasDynamicHelp": false,
226
231
  "hiddenAliases": [],
227
- "id": "catalog:doctor",
232
+ "id": "auth:connections",
228
233
  "pluginAlias": "faces-cli",
229
234
  "pluginName": "faces-cli",
230
235
  "pluginType": "core",
@@ -234,14 +239,26 @@
234
239
  "relativePath": [
235
240
  "dist",
236
241
  "commands",
237
- "catalog",
238
- "doctor.js"
242
+ "auth",
243
+ "connections.js"
239
244
  ]
240
245
  },
241
- "catalog:list": {
246
+ "auth:disconnect": {
242
247
  "aliases": [],
243
- "args": {},
244
- "description": "List all faces in the local catalog",
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
+ ],
245
262
  "flags": {
246
263
  "json": {
247
264
  "description": "Format output as json.",
@@ -277,7 +294,7 @@
277
294
  },
278
295
  "hasDynamicHelp": false,
279
296
  "hiddenAliases": [],
280
- "id": "catalog:list",
297
+ "id": "auth:disconnect",
281
298
  "pluginAlias": "faces-cli",
282
299
  "pluginName": "faces-cli",
283
300
  "pluginType": "core",
@@ -287,14 +304,14 @@
287
304
  "relativePath": [
288
305
  "dist",
289
306
  "commands",
290
- "catalog",
291
- "list.js"
307
+ "auth",
308
+ "disconnect.js"
292
309
  ]
293
310
  },
294
- "catalog:manyfaced": {
311
+ "auth:login": {
295
312
  "aliases": [],
296
313
  "args": {},
297
- "description": "Browse and install community manyfaced skills from github.com/facessh/manyfaced",
314
+ "description": "Login and save JWT credentials",
298
315
  "flags": {
299
316
  "json": {
300
317
  "description": "Format output as json.",
@@ -327,37 +344,26 @@
327
344
  "multiple": false,
328
345
  "type": "option"
329
346
  },
330
- "skill": {
331
- "description": "Show details for a specific skill",
332
- "name": "skill",
333
- "hasDynamicHelp": false,
334
- "multiple": false,
335
- "type": "option"
336
- },
337
- "install": {
338
- "description": "Install a skill by name",
339
- "name": "install",
347
+ "email": {
348
+ "description": "Account email",
349
+ "name": "email",
350
+ "required": true,
340
351
  "hasDynamicHelp": false,
341
352
  "multiple": false,
342
353
  "type": "option"
343
354
  },
344
- "skills-dir": {
345
- "description": "Directory to install skills into (required for --install)",
346
- "name": "skills-dir",
355
+ "password": {
356
+ "description": "Account password",
357
+ "name": "password",
358
+ "required": true,
347
359
  "hasDynamicHelp": false,
348
360
  "multiple": false,
349
361
  "type": "option"
350
- },
351
- "refresh": {
352
- "description": "Force refresh the skill index (ignore cache)",
353
- "name": "refresh",
354
- "allowNo": false,
355
- "type": "boolean"
356
362
  }
357
363
  },
358
364
  "hasDynamicHelp": false,
359
365
  "hiddenAliases": [],
360
- "id": "catalog:manyfaced",
366
+ "id": "auth:login",
361
367
  "pluginAlias": "faces-cli",
362
368
  "pluginName": "faces-cli",
363
369
  "pluginType": "core",
@@ -367,19 +373,14 @@
367
373
  "relativePath": [
368
374
  "dist",
369
375
  "commands",
370
- "catalog",
371
- "manyfaced.js"
376
+ "auth",
377
+ "login.js"
372
378
  ]
373
379
  },
374
- "catalog:restore": {
380
+ "auth:logout": {
375
381
  "aliases": [],
376
- "args": {
377
- "file": {
378
- "description": "Backup file path (default: most recent in ~/.faces/backups/)",
379
- "name": "file"
380
- }
381
- },
382
- "description": "Restore faces, teams, and source material from a backup snapshot",
382
+ "args": {},
383
+ "description": "Clear saved credentials",
383
384
  "flags": {
384
385
  "json": {
385
386
  "description": "Format output as json.",
@@ -411,17 +412,11 @@
411
412
  "hasDynamicHelp": false,
412
413
  "multiple": false,
413
414
  "type": "option"
414
- },
415
- "compile": {
416
- "description": "Run compile:all after restoring",
417
- "name": "compile",
418
- "allowNo": false,
419
- "type": "boolean"
420
415
  }
421
416
  },
422
417
  "hasDynamicHelp": false,
423
418
  "hiddenAliases": [],
424
- "id": "catalog:restore",
419
+ "id": "auth:logout",
425
420
  "pluginAlias": "faces-cli",
426
421
  "pluginName": "faces-cli",
427
422
  "pluginType": "core",
@@ -431,14 +426,14 @@
431
426
  "relativePath": [
432
427
  "dist",
433
428
  "commands",
434
- "catalog",
435
- "restore.js"
429
+ "auth",
430
+ "logout.js"
436
431
  ]
437
432
  },
438
- "billing:balance": {
433
+ "auth:refresh": {
439
434
  "aliases": [],
440
435
  "args": {},
441
- "description": "Show credit balance and payment method status",
436
+ "description": "Exchange current JWT for a fresh one",
442
437
  "flags": {
443
438
  "json": {
444
439
  "description": "Format output as json.",
@@ -474,7 +469,7 @@
474
469
  },
475
470
  "hasDynamicHelp": false,
476
471
  "hiddenAliases": [],
477
- "id": "billing:balance",
472
+ "id": "auth:refresh",
478
473
  "pluginAlias": "faces-cli",
479
474
  "pluginName": "faces-cli",
480
475
  "pluginType": "core",
@@ -484,14 +479,14 @@
484
479
  "relativePath": [
485
480
  "dist",
486
481
  "commands",
487
- "billing",
488
- "balance.js"
482
+ "auth",
483
+ "refresh.js"
489
484
  ]
490
485
  },
491
- "billing:card-setup": {
486
+ "auth:register": {
492
487
  "aliases": [],
493
488
  "args": {},
494
- "description": "Get a Stripe card setup URL to save a payment method",
489
+ "description": "Create a new Faces account",
495
490
  "flags": {
496
491
  "json": {
497
492
  "description": "Format output as json.",
@@ -523,11 +518,54 @@
523
518
  "hasDynamicHelp": false,
524
519
  "multiple": false,
525
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"
526
564
  }
527
565
  },
528
566
  "hasDynamicHelp": false,
529
567
  "hiddenAliases": [],
530
- "id": "billing:card-setup",
568
+ "id": "auth:register",
531
569
  "pluginAlias": "faces-cli",
532
570
  "pluginName": "faces-cli",
533
571
  "pluginType": "core",
@@ -537,14 +575,14 @@
537
575
  "relativePath": [
538
576
  "dist",
539
577
  "commands",
540
- "billing",
541
- "card-setup.js"
578
+ "auth",
579
+ "register.js"
542
580
  ]
543
581
  },
544
- "billing:llm-costs": {
582
+ "auth:whoami": {
545
583
  "aliases": [],
546
584
  "args": {},
547
- "description": "List available LLMs and their per-token costs",
585
+ "description": "Print current user profile and auth diagnostic",
548
586
  "flags": {
549
587
  "json": {
550
588
  "description": "Format output as json.",
@@ -576,18 +614,11 @@
576
614
  "hasDynamicHelp": false,
577
615
  "multiple": false,
578
616
  "type": "option"
579
- },
580
- "provider": {
581
- "description": "Filter by provider (e.g. openai, anthropic)",
582
- "name": "provider",
583
- "hasDynamicHelp": false,
584
- "multiple": false,
585
- "type": "option"
586
617
  }
587
618
  },
588
619
  "hasDynamicHelp": false,
589
620
  "hiddenAliases": [],
590
- "id": "billing:llm-costs",
621
+ "id": "auth:whoami",
591
622
  "pluginAlias": "faces-cli",
592
623
  "pluginName": "faces-cli",
593
624
  "pluginType": "core",
@@ -597,14 +628,14 @@
597
628
  "relativePath": [
598
629
  "dist",
599
630
  "commands",
600
- "billing",
601
- "llm-costs.js"
631
+ "auth",
632
+ "whoami.js"
602
633
  ]
603
634
  },
604
- "billing:topup": {
635
+ "billing:balance": {
605
636
  "aliases": [],
606
637
  "args": {},
607
- "description": "Top up credit balance using saved payment method",
638
+ "description": "Show credit balance and payment method status",
608
639
  "flags": {
609
640
  "json": {
610
641
  "description": "Format output as json.",
@@ -636,26 +667,11 @@
636
667
  "hasDynamicHelp": false,
637
668
  "multiple": false,
638
669
  "type": "option"
639
- },
640
- "amount": {
641
- "description": "Top-up amount in USD (min $1)",
642
- "name": "amount",
643
- "required": true,
644
- "hasDynamicHelp": false,
645
- "multiple": false,
646
- "type": "option"
647
- },
648
- "payment-ref": {
649
- "description": "Payment reference (admin/test path)",
650
- "name": "payment-ref",
651
- "hasDynamicHelp": false,
652
- "multiple": false,
653
- "type": "option"
654
670
  }
655
671
  },
656
672
  "hasDynamicHelp": false,
657
673
  "hiddenAliases": [],
658
- "id": "billing:topup",
674
+ "id": "billing:balance",
659
675
  "pluginAlias": "faces-cli",
660
676
  "pluginName": "faces-cli",
661
677
  "pluginType": "core",
@@ -666,13 +682,13 @@
666
682
  "dist",
667
683
  "commands",
668
684
  "billing",
669
- "topup.js"
685
+ "balance.js"
670
686
  ]
671
687
  },
672
- "billing:usage": {
688
+ "billing:card-setup": {
673
689
  "aliases": [],
674
690
  "args": {},
675
- "description": "Aggregated usage analytics",
691
+ "description": "Get a Stripe card setup URL to save a payment method",
676
692
  "flags": {
677
693
  "json": {
678
694
  "description": "Format output as json.",
@@ -704,38 +720,11 @@
704
720
  "hasDynamicHelp": false,
705
721
  "multiple": false,
706
722
  "type": "option"
707
- },
708
- "group-by": {
709
- "description": "Group results",
710
- "name": "group-by",
711
- "hasDynamicHelp": false,
712
- "multiple": false,
713
- "options": [
714
- "api_key",
715
- "model",
716
- "llm",
717
- "date"
718
- ],
719
- "type": "option"
720
- },
721
- "from": {
722
- "description": "Start date (YYYY-MM-DD)",
723
- "name": "from",
724
- "hasDynamicHelp": false,
725
- "multiple": false,
726
- "type": "option"
727
- },
728
- "to": {
729
- "description": "End date (YYYY-MM-DD)",
730
- "name": "to",
731
- "hasDynamicHelp": false,
732
- "multiple": false,
733
- "type": "option"
734
723
  }
735
724
  },
736
725
  "hasDynamicHelp": false,
737
726
  "hiddenAliases": [],
738
- "id": "billing:usage",
727
+ "id": "billing:card-setup",
739
728
  "pluginAlias": "faces-cli",
740
729
  "pluginName": "faces-cli",
741
730
  "pluginType": "core",
@@ -746,26 +735,13 @@
746
735
  "dist",
747
736
  "commands",
748
737
  "billing",
749
- "usage.js"
738
+ "card-setup.js"
750
739
  ]
751
740
  },
752
- "auth:connect": {
741
+ "billing:llm-costs": {
753
742
  "aliases": [],
754
- "args": {
755
- "provider": {
756
- "description": "OAuth provider to connect",
757
- "name": "provider",
758
- "options": [
759
- "openai"
760
- ],
761
- "required": true
762
- }
763
- },
764
- "description": "Connect your ChatGPT account to Faces via device-code authorization (Subscription Connect plan)",
765
- "examples": [
766
- "<%= config.bin %> auth connect openai",
767
- "<%= config.bin %> auth connect openai --json"
768
- ],
743
+ "args": {},
744
+ "description": "List available LLMs and their per-token costs",
769
745
  "flags": {
770
746
  "json": {
771
747
  "description": "Format output as json.",
@@ -797,11 +773,18 @@
797
773
  "hasDynamicHelp": false,
798
774
  "multiple": false,
799
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"
800
783
  }
801
784
  },
802
785
  "hasDynamicHelp": false,
803
786
  "hiddenAliases": [],
804
- "id": "auth:connect",
787
+ "id": "billing:llm-costs",
805
788
  "pluginAlias": "faces-cli",
806
789
  "pluginName": "faces-cli",
807
790
  "pluginType": "core",
@@ -811,18 +794,14 @@
811
794
  "relativePath": [
812
795
  "dist",
813
796
  "commands",
814
- "auth",
815
- "connect.js"
797
+ "billing",
798
+ "llm-costs.js"
816
799
  ]
817
800
  },
818
- "auth:connections": {
801
+ "billing:topup": {
819
802
  "aliases": [],
820
803
  "args": {},
821
- "description": "List connected OAuth provider accounts",
822
- "examples": [
823
- "<%= config.bin %> auth connections",
824
- "<%= config.bin %> auth connections --json"
825
- ],
804
+ "description": "Top up credit balance using saved payment method",
826
805
  "flags": {
827
806
  "json": {
828
807
  "description": "Format output as json.",
@@ -854,11 +833,26 @@
854
833
  "hasDynamicHelp": false,
855
834
  "multiple": false,
856
835
  "type": "option"
836
+ },
837
+ "amount": {
838
+ "description": "Top-up amount in USD (min $1)",
839
+ "name": "amount",
840
+ "required": true,
841
+ "hasDynamicHelp": false,
842
+ "multiple": false,
843
+ "type": "option"
844
+ },
845
+ "payment-ref": {
846
+ "description": "Payment reference (admin/test path)",
847
+ "name": "payment-ref",
848
+ "hasDynamicHelp": false,
849
+ "multiple": false,
850
+ "type": "option"
857
851
  }
858
852
  },
859
853
  "hasDynamicHelp": false,
860
854
  "hiddenAliases": [],
861
- "id": "auth:connections",
855
+ "id": "billing:topup",
862
856
  "pluginAlias": "faces-cli",
863
857
  "pluginName": "faces-cli",
864
858
  "pluginType": "core",
@@ -868,26 +862,14 @@
868
862
  "relativePath": [
869
863
  "dist",
870
864
  "commands",
871
- "auth",
872
- "connections.js"
865
+ "billing",
866
+ "topup.js"
873
867
  ]
874
868
  },
875
- "auth:disconnect": {
869
+ "billing:usage": {
876
870
  "aliases": [],
877
- "args": {
878
- "provider": {
879
- "description": "OAuth provider to disconnect",
880
- "name": "provider",
881
- "options": [
882
- "openai"
883
- ],
884
- "required": true
885
- }
886
- },
887
- "description": "Disconnect a linked OAuth provider account",
888
- "examples": [
889
- "<%= config.bin %> auth disconnect openai"
890
- ],
871
+ "args": {},
872
+ "description": "Aggregated usage analytics",
891
873
  "flags": {
892
874
  "json": {
893
875
  "description": "Format output as json.",
@@ -919,11 +901,38 @@
919
901
  "hasDynamicHelp": false,
920
902
  "multiple": false,
921
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"
922
931
  }
923
932
  },
924
933
  "hasDynamicHelp": false,
925
934
  "hiddenAliases": [],
926
- "id": "auth:disconnect",
935
+ "id": "billing:usage",
927
936
  "pluginAlias": "faces-cli",
928
937
  "pluginName": "faces-cli",
929
938
  "pluginType": "core",
@@ -933,14 +942,14 @@
933
942
  "relativePath": [
934
943
  "dist",
935
944
  "commands",
936
- "auth",
937
- "disconnect.js"
945
+ "billing",
946
+ "usage.js"
938
947
  ]
939
948
  },
940
- "auth:login": {
949
+ "catalog:backup": {
941
950
  "aliases": [],
942
951
  "args": {},
943
- "description": "Login and save JWT credentials",
952
+ "description": "Snapshot all faces, teams, and source material for migration",
944
953
  "flags": {
945
954
  "json": {
946
955
  "description": "Format output as json.",
@@ -972,27 +981,11 @@
972
981
  "hasDynamicHelp": false,
973
982
  "multiple": false,
974
983
  "type": "option"
975
- },
976
- "email": {
977
- "description": "Account email",
978
- "name": "email",
979
- "required": true,
980
- "hasDynamicHelp": false,
981
- "multiple": false,
982
- "type": "option"
983
- },
984
- "password": {
985
- "description": "Account password",
986
- "name": "password",
987
- "required": true,
988
- "hasDynamicHelp": false,
989
- "multiple": false,
990
- "type": "option"
991
984
  }
992
985
  },
993
986
  "hasDynamicHelp": false,
994
987
  "hiddenAliases": [],
995
- "id": "auth:login",
988
+ "id": "catalog:backup",
996
989
  "pluginAlias": "faces-cli",
997
990
  "pluginName": "faces-cli",
998
991
  "pluginType": "core",
@@ -1002,14 +995,14 @@
1002
995
  "relativePath": [
1003
996
  "dist",
1004
997
  "commands",
1005
- "auth",
1006
- "login.js"
998
+ "catalog",
999
+ "backup.js"
1007
1000
  ]
1008
1001
  },
1009
- "auth:logout": {
1002
+ "catalog:doctor": {
1010
1003
  "aliases": [],
1011
1004
  "args": {},
1012
- "description": "Clear saved credentials",
1005
+ "description": "Diagnose and repair the local face and team catalog",
1013
1006
  "flags": {
1014
1007
  "json": {
1015
1008
  "description": "Format output as json.",
@@ -1041,11 +1034,23 @@
1041
1034
  "hasDynamicHelp": false,
1042
1035
  "multiple": false,
1043
1036
  "type": "option"
1037
+ },
1038
+ "fix": {
1039
+ "description": "Rebuild missing or stale catalog entries from API",
1040
+ "name": "fix",
1041
+ "allowNo": false,
1042
+ "type": "boolean"
1043
+ },
1044
+ "generate": {
1045
+ "description": "Fix + generate missing descriptions via LLM",
1046
+ "name": "generate",
1047
+ "allowNo": false,
1048
+ "type": "boolean"
1044
1049
  }
1045
1050
  },
1046
1051
  "hasDynamicHelp": false,
1047
1052
  "hiddenAliases": [],
1048
- "id": "auth:logout",
1053
+ "id": "catalog:doctor",
1049
1054
  "pluginAlias": "faces-cli",
1050
1055
  "pluginName": "faces-cli",
1051
1056
  "pluginType": "core",
@@ -1055,14 +1060,14 @@
1055
1060
  "relativePath": [
1056
1061
  "dist",
1057
1062
  "commands",
1058
- "auth",
1059
- "logout.js"
1063
+ "catalog",
1064
+ "doctor.js"
1060
1065
  ]
1061
1066
  },
1062
- "auth:refresh": {
1067
+ "catalog:list": {
1063
1068
  "aliases": [],
1064
1069
  "args": {},
1065
- "description": "Exchange current JWT for a fresh one",
1070
+ "description": "List all faces in the local catalog",
1066
1071
  "flags": {
1067
1072
  "json": {
1068
1073
  "description": "Format output as json.",
@@ -1098,7 +1103,7 @@
1098
1103
  },
1099
1104
  "hasDynamicHelp": false,
1100
1105
  "hiddenAliases": [],
1101
- "id": "auth:refresh",
1106
+ "id": "catalog:list",
1102
1107
  "pluginAlias": "faces-cli",
1103
1108
  "pluginName": "faces-cli",
1104
1109
  "pluginType": "core",
@@ -1108,14 +1113,14 @@
1108
1113
  "relativePath": [
1109
1114
  "dist",
1110
1115
  "commands",
1111
- "auth",
1112
- "refresh.js"
1116
+ "catalog",
1117
+ "list.js"
1113
1118
  ]
1114
1119
  },
1115
- "auth:register": {
1120
+ "catalog:manyfaced": {
1116
1121
  "aliases": [],
1117
1122
  "args": {},
1118
- "description": "Create a new Faces account",
1123
+ "description": "Browse and install community manyfaced skills from github.com/facessh/manyfaced",
1119
1124
  "flags": {
1120
1125
  "json": {
1121
1126
  "description": "Format output as json.",
@@ -1148,53 +1153,37 @@
1148
1153
  "multiple": false,
1149
1154
  "type": "option"
1150
1155
  },
1151
- "email": {
1152
- "description": "Email address",
1153
- "name": "email",
1154
- "required": true,
1155
- "hasDynamicHelp": false,
1156
- "multiple": false,
1157
- "type": "option"
1158
- },
1159
- "password": {
1160
- "description": "Password",
1161
- "name": "password",
1162
- "required": true,
1156
+ "skill": {
1157
+ "description": "Show details for a specific skill",
1158
+ "name": "skill",
1163
1159
  "hasDynamicHelp": false,
1164
1160
  "multiple": false,
1165
1161
  "type": "option"
1166
1162
  },
1167
- "username": {
1168
- "description": "Username (lowercase, dashes, numbers)",
1169
- "name": "username",
1170
- "required": true,
1163
+ "install": {
1164
+ "description": "Install a skill by name",
1165
+ "name": "install",
1171
1166
  "hasDynamicHelp": false,
1172
1167
  "multiple": false,
1173
1168
  "type": "option"
1174
1169
  },
1175
- "invite-key": {
1176
- "description": "Invite key (if required)",
1177
- "name": "invite-key",
1170
+ "skills-dir": {
1171
+ "description": "Directory to install skills into (required for --install)",
1172
+ "name": "skills-dir",
1178
1173
  "hasDynamicHelp": false,
1179
1174
  "multiple": false,
1180
1175
  "type": "option"
1181
1176
  },
1182
- "plan": {
1183
- "description": "Plan to subscribe to: \"free\" ($5 activation) or \"connect\" ($17/mo, no activation fee)",
1184
- "name": "plan",
1185
- "default": "free",
1186
- "hasDynamicHelp": false,
1187
- "multiple": false,
1188
- "options": [
1189
- "free",
1190
- "connect"
1191
- ],
1192
- "type": "option"
1177
+ "refresh": {
1178
+ "description": "Force refresh the skill index (ignore cache)",
1179
+ "name": "refresh",
1180
+ "allowNo": false,
1181
+ "type": "boolean"
1193
1182
  }
1194
1183
  },
1195
1184
  "hasDynamicHelp": false,
1196
1185
  "hiddenAliases": [],
1197
- "id": "auth:register",
1186
+ "id": "catalog:manyfaced",
1198
1187
  "pluginAlias": "faces-cli",
1199
1188
  "pluginName": "faces-cli",
1200
1189
  "pluginType": "core",
@@ -1204,14 +1193,19 @@
1204
1193
  "relativePath": [
1205
1194
  "dist",
1206
1195
  "commands",
1207
- "auth",
1208
- "register.js"
1196
+ "catalog",
1197
+ "manyfaced.js"
1209
1198
  ]
1210
1199
  },
1211
- "auth:whoami": {
1200
+ "catalog:restore": {
1212
1201
  "aliases": [],
1213
- "args": {},
1214
- "description": "Print current user profile and auth diagnostic",
1202
+ "args": {
1203
+ "file": {
1204
+ "description": "Backup file path (default: most recent in ~/.faces/backups/)",
1205
+ "name": "file"
1206
+ }
1207
+ },
1208
+ "description": "Restore faces, teams, and source material from a backup snapshot",
1215
1209
  "flags": {
1216
1210
  "json": {
1217
1211
  "description": "Format output as json.",
@@ -1243,11 +1237,17 @@
1243
1237
  "hasDynamicHelp": false,
1244
1238
  "multiple": false,
1245
1239
  "type": "option"
1246
- }
1247
- },
1248
- "hasDynamicHelp": false,
1249
- "hiddenAliases": [],
1250
- "id": "auth:whoami",
1240
+ },
1241
+ "compile": {
1242
+ "description": "Run compile:all after restoring",
1243
+ "name": "compile",
1244
+ "allowNo": false,
1245
+ "type": "boolean"
1246
+ }
1247
+ },
1248
+ "hasDynamicHelp": false,
1249
+ "hiddenAliases": [],
1250
+ "id": "catalog:restore",
1251
1251
  "pluginAlias": "faces-cli",
1252
1252
  "pluginName": "faces-cli",
1253
1253
  "pluginType": "core",
@@ -1257,22 +1257,23 @@
1257
1257
  "relativePath": [
1258
1258
  "dist",
1259
1259
  "commands",
1260
- "auth",
1261
- "whoami.js"
1260
+ "catalog",
1261
+ "restore.js"
1262
1262
  ]
1263
1263
  },
1264
1264
  "chat:chat": {
1265
1265
  "aliases": [],
1266
1266
  "args": {
1267
1267
  "face_username": {
1268
- "description": "Face alias (alias@model, owner:alias@model for a published face, or a composite formula like \"(a | b)@model\"). Omit when using --formula.",
1268
+ "description": "Face alias (alias@model, owner:alias@model for a published face, or a composite formula like \"(a | b)@model\"). Prefix with + to use the face's captured style. Omit when using --formula.",
1269
1269
  "name": "face_username",
1270
1270
  "required": false
1271
1271
  }
1272
1272
  },
1273
- "description": "Chat via a face. Auto-routes to the correct API endpoint based on the model catalog.",
1273
+ "description": "Chat via a face. Auto-routes to the correct API endpoint based on the model catalog. Prefix the alias with + to answer in the style the face captured, e.g. +alice; without it the face uses its ordinary voice.",
1274
1274
  "examples": [
1275
1275
  "<%= config.bin %> <%= command.id %> socrates -m \"What is virtue?\"",
1276
+ "<%= config.bin %> <%= command.id %> +alice -m \"Reply to the note below.\" --medium email",
1276
1277
  "<%= config.bin %> <%= command.id %> \"(socrates | nietzsche)@claude-sonnet-4-6\" -m \"What is virtue?\"",
1277
1278
  "<%= config.bin %> <%= command.id %> --formula \"socrates | nietzsche\" --llm claude-sonnet-4-6 -m \"What is virtue?\""
1278
1279
  ],
@@ -1378,6 +1379,13 @@
1378
1379
  "multiple": false,
1379
1380
  "type": "option"
1380
1381
  },
1382
+ "best-of": {
1383
+ "description": "Write N replies and serve the one closest to the captured style (1-5, default 1). Only meaningful with a + alias, and it multiplies the cost of the request by N. Cannot be streamed.",
1384
+ "name": "best-of",
1385
+ "hasDynamicHelp": false,
1386
+ "multiple": false,
1387
+ "type": "option"
1388
+ },
1381
1389
  "oauth-only": {
1382
1390
  "description": "Prevent fallback to paid system key (use OAuth only)",
1383
1391
  "name": "oauth-only",
@@ -1750,6 +1758,182 @@
1750
1758
  "thread.js"
1751
1759
  ]
1752
1760
  },
1761
+ "config:clear": {
1762
+ "aliases": [],
1763
+ "args": {},
1764
+ "description": "Delete all saved credentials and config",
1765
+ "flags": {
1766
+ "json": {
1767
+ "description": "Format output as json.",
1768
+ "helpGroup": "GLOBAL",
1769
+ "name": "json",
1770
+ "allowNo": false,
1771
+ "type": "boolean"
1772
+ },
1773
+ "base-url": {
1774
+ "description": "API base URL",
1775
+ "env": "FACES_BASE_URL",
1776
+ "name": "base-url",
1777
+ "hasDynamicHelp": false,
1778
+ "multiple": false,
1779
+ "type": "option"
1780
+ },
1781
+ "token": {
1782
+ "description": "JWT bearer token",
1783
+ "env": "FACES_TOKEN",
1784
+ "name": "token",
1785
+ "hasDynamicHelp": false,
1786
+ "multiple": false,
1787
+ "type": "option"
1788
+ },
1789
+ "api-key": {
1790
+ "description": "API key",
1791
+ "env": "FACES_API_KEY",
1792
+ "name": "api-key",
1793
+ "hasDynamicHelp": false,
1794
+ "multiple": false,
1795
+ "type": "option"
1796
+ },
1797
+ "yes": {
1798
+ "description": "Skip confirmation",
1799
+ "name": "yes",
1800
+ "allowNo": false,
1801
+ "type": "boolean"
1802
+ }
1803
+ },
1804
+ "hasDynamicHelp": false,
1805
+ "hiddenAliases": [],
1806
+ "id": "config:clear",
1807
+ "pluginAlias": "faces-cli",
1808
+ "pluginName": "faces-cli",
1809
+ "pluginType": "core",
1810
+ "strict": true,
1811
+ "enableJsonFlag": true,
1812
+ "isESM": true,
1813
+ "relativePath": [
1814
+ "dist",
1815
+ "commands",
1816
+ "config",
1817
+ "clear.js"
1818
+ ]
1819
+ },
1820
+ "config:set": {
1821
+ "aliases": [],
1822
+ "args": {
1823
+ "key": {
1824
+ "description": "Config key",
1825
+ "name": "key",
1826
+ "required": true
1827
+ },
1828
+ "value": {
1829
+ "description": "Config value",
1830
+ "name": "value",
1831
+ "required": true
1832
+ }
1833
+ },
1834
+ "description": "Set a config value (e.g. base_url, api_key, token)",
1835
+ "flags": {
1836
+ "json": {
1837
+ "description": "Format output as json.",
1838
+ "helpGroup": "GLOBAL",
1839
+ "name": "json",
1840
+ "allowNo": false,
1841
+ "type": "boolean"
1842
+ },
1843
+ "base-url": {
1844
+ "description": "API base URL",
1845
+ "env": "FACES_BASE_URL",
1846
+ "name": "base-url",
1847
+ "hasDynamicHelp": false,
1848
+ "multiple": false,
1849
+ "type": "option"
1850
+ },
1851
+ "token": {
1852
+ "description": "JWT bearer token",
1853
+ "env": "FACES_TOKEN",
1854
+ "name": "token",
1855
+ "hasDynamicHelp": false,
1856
+ "multiple": false,
1857
+ "type": "option"
1858
+ },
1859
+ "api-key": {
1860
+ "description": "API key",
1861
+ "env": "FACES_API_KEY",
1862
+ "name": "api-key",
1863
+ "hasDynamicHelp": false,
1864
+ "multiple": false,
1865
+ "type": "option"
1866
+ }
1867
+ },
1868
+ "hasDynamicHelp": false,
1869
+ "hiddenAliases": [],
1870
+ "id": "config:set",
1871
+ "pluginAlias": "faces-cli",
1872
+ "pluginName": "faces-cli",
1873
+ "pluginType": "core",
1874
+ "strict": true,
1875
+ "enableJsonFlag": true,
1876
+ "isESM": true,
1877
+ "relativePath": [
1878
+ "dist",
1879
+ "commands",
1880
+ "config",
1881
+ "set.js"
1882
+ ]
1883
+ },
1884
+ "config:show": {
1885
+ "aliases": [],
1886
+ "args": {},
1887
+ "description": "Print current config (credentials are masked)",
1888
+ "flags": {
1889
+ "json": {
1890
+ "description": "Format output as json.",
1891
+ "helpGroup": "GLOBAL",
1892
+ "name": "json",
1893
+ "allowNo": false,
1894
+ "type": "boolean"
1895
+ },
1896
+ "base-url": {
1897
+ "description": "API base URL",
1898
+ "env": "FACES_BASE_URL",
1899
+ "name": "base-url",
1900
+ "hasDynamicHelp": false,
1901
+ "multiple": false,
1902
+ "type": "option"
1903
+ },
1904
+ "token": {
1905
+ "description": "JWT bearer token",
1906
+ "env": "FACES_TOKEN",
1907
+ "name": "token",
1908
+ "hasDynamicHelp": false,
1909
+ "multiple": false,
1910
+ "type": "option"
1911
+ },
1912
+ "api-key": {
1913
+ "description": "API key",
1914
+ "env": "FACES_API_KEY",
1915
+ "name": "api-key",
1916
+ "hasDynamicHelp": false,
1917
+ "multiple": false,
1918
+ "type": "option"
1919
+ }
1920
+ },
1921
+ "hasDynamicHelp": false,
1922
+ "hiddenAliases": [],
1923
+ "id": "config:show",
1924
+ "pluginAlias": "faces-cli",
1925
+ "pluginName": "faces-cli",
1926
+ "pluginType": "core",
1927
+ "strict": true,
1928
+ "enableJsonFlag": true,
1929
+ "isESM": true,
1930
+ "relativePath": [
1931
+ "dist",
1932
+ "commands",
1933
+ "config",
1934
+ "show.js"
1935
+ ]
1936
+ },
1753
1937
  "compile:all": {
1754
1938
  "aliases": [],
1755
1939
  "args": {},
@@ -2079,10 +2263,10 @@
2079
2263
  "upload.js"
2080
2264
  ]
2081
2265
  },
2082
- "config:clear": {
2266
+ "keys:create": {
2083
2267
  "aliases": [],
2084
2268
  "args": {},
2085
- "description": "Delete all saved credentials and config",
2269
+ "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.",
2086
2270
  "flags": {
2087
2271
  "json": {
2088
2272
  "description": "Format output as json.",
@@ -2115,16 +2299,52 @@
2115
2299
  "multiple": false,
2116
2300
  "type": "option"
2117
2301
  },
2118
- "yes": {
2119
- "description": "Skip confirmation",
2120
- "name": "yes",
2121
- "allowNo": false,
2302
+ "name": {
2303
+ "description": "Key name/label",
2304
+ "name": "name",
2305
+ "required": true,
2306
+ "hasDynamicHelp": false,
2307
+ "multiple": false,
2308
+ "type": "option"
2309
+ },
2310
+ "expires-days": {
2311
+ "description": "Expiry in days (omit for no expiry)",
2312
+ "name": "expires-days",
2313
+ "hasDynamicHelp": false,
2314
+ "multiple": false,
2315
+ "type": "option"
2316
+ },
2317
+ "budget": {
2318
+ "description": "Spend budget in USD",
2319
+ "name": "budget",
2320
+ "hasDynamicHelp": false,
2321
+ "multiple": false,
2322
+ "type": "option"
2323
+ },
2324
+ "face": {
2325
+ "description": "Allowed face alias (repeatable)",
2326
+ "name": "face",
2327
+ "hasDynamicHelp": false,
2328
+ "multiple": true,
2329
+ "type": "option"
2330
+ },
2331
+ "model": {
2332
+ "description": "Allowed model name (repeatable)",
2333
+ "name": "model",
2334
+ "hasDynamicHelp": false,
2335
+ "multiple": true,
2336
+ "type": "option"
2337
+ },
2338
+ "save": {
2339
+ "description": "Save the new key to ~/.faces/config.json as api_key (default: true; use --no-save to skip)",
2340
+ "name": "save",
2341
+ "allowNo": true,
2122
2342
  "type": "boolean"
2123
2343
  }
2124
2344
  },
2125
2345
  "hasDynamicHelp": false,
2126
2346
  "hiddenAliases": [],
2127
- "id": "config:clear",
2347
+ "id": "keys:create",
2128
2348
  "pluginAlias": "faces-cli",
2129
2349
  "pluginName": "faces-cli",
2130
2350
  "pluginType": "core",
@@ -2134,25 +2354,73 @@
2134
2354
  "relativePath": [
2135
2355
  "dist",
2136
2356
  "commands",
2137
- "config",
2138
- "clear.js"
2357
+ "keys",
2358
+ "create.js"
2139
2359
  ]
2140
2360
  },
2141
- "config:set": {
2361
+ "keys:list": {
2142
2362
  "aliases": [],
2143
- "args": {
2144
- "key": {
2145
- "description": "Config key",
2146
- "name": "key",
2147
- "required": true
2363
+ "args": {},
2364
+ "description": "List all API keys (JWT required)",
2365
+ "flags": {
2366
+ "json": {
2367
+ "description": "Format output as json.",
2368
+ "helpGroup": "GLOBAL",
2369
+ "name": "json",
2370
+ "allowNo": false,
2371
+ "type": "boolean"
2148
2372
  },
2149
- "value": {
2150
- "description": "Config value",
2151
- "name": "value",
2373
+ "base-url": {
2374
+ "description": "API base URL",
2375
+ "env": "FACES_BASE_URL",
2376
+ "name": "base-url",
2377
+ "hasDynamicHelp": false,
2378
+ "multiple": false,
2379
+ "type": "option"
2380
+ },
2381
+ "token": {
2382
+ "description": "JWT bearer token",
2383
+ "env": "FACES_TOKEN",
2384
+ "name": "token",
2385
+ "hasDynamicHelp": false,
2386
+ "multiple": false,
2387
+ "type": "option"
2388
+ },
2389
+ "api-key": {
2390
+ "description": "API key",
2391
+ "env": "FACES_API_KEY",
2392
+ "name": "api-key",
2393
+ "hasDynamicHelp": false,
2394
+ "multiple": false,
2395
+ "type": "option"
2396
+ }
2397
+ },
2398
+ "hasDynamicHelp": false,
2399
+ "hiddenAliases": [],
2400
+ "id": "keys:list",
2401
+ "pluginAlias": "faces-cli",
2402
+ "pluginName": "faces-cli",
2403
+ "pluginType": "core",
2404
+ "strict": true,
2405
+ "enableJsonFlag": true,
2406
+ "isESM": true,
2407
+ "relativePath": [
2408
+ "dist",
2409
+ "commands",
2410
+ "keys",
2411
+ "list.js"
2412
+ ]
2413
+ },
2414
+ "keys:revoke": {
2415
+ "aliases": [],
2416
+ "args": {
2417
+ "key_id": {
2418
+ "description": "Key ID",
2419
+ "name": "key_id",
2152
2420
  "required": true
2153
2421
  }
2154
2422
  },
2155
- "description": "Set a config value (e.g. base_url, api_key, token)",
2423
+ "description": "Revoke an API key (JWT required)",
2156
2424
  "flags": {
2157
2425
  "json": {
2158
2426
  "description": "Format output as json.",
@@ -2184,11 +2452,17 @@
2184
2452
  "hasDynamicHelp": false,
2185
2453
  "multiple": false,
2186
2454
  "type": "option"
2455
+ },
2456
+ "yes": {
2457
+ "description": "Skip confirmation",
2458
+ "name": "yes",
2459
+ "allowNo": false,
2460
+ "type": "boolean"
2187
2461
  }
2188
2462
  },
2189
2463
  "hasDynamicHelp": false,
2190
2464
  "hiddenAliases": [],
2191
- "id": "config:set",
2465
+ "id": "keys:revoke",
2192
2466
  "pluginAlias": "faces-cli",
2193
2467
  "pluginName": "faces-cli",
2194
2468
  "pluginType": "core",
@@ -2198,14 +2472,20 @@
2198
2472
  "relativePath": [
2199
2473
  "dist",
2200
2474
  "commands",
2201
- "config",
2202
- "set.js"
2475
+ "keys",
2476
+ "revoke.js"
2203
2477
  ]
2204
2478
  },
2205
- "config:show": {
2479
+ "keys:update": {
2206
2480
  "aliases": [],
2207
- "args": {},
2208
- "description": "Print current config (credentials are masked)",
2481
+ "args": {
2482
+ "key_id": {
2483
+ "description": "Key ID",
2484
+ "name": "key_id",
2485
+ "required": true
2486
+ }
2487
+ },
2488
+ "description": "Update API key metadata (JWT required)",
2209
2489
  "flags": {
2210
2490
  "json": {
2211
2491
  "description": "Format output as json.",
@@ -2237,11 +2517,31 @@
2237
2517
  "hasDynamicHelp": false,
2238
2518
  "multiple": false,
2239
2519
  "type": "option"
2520
+ },
2521
+ "name": {
2522
+ "description": "New key name",
2523
+ "name": "name",
2524
+ "hasDynamicHelp": false,
2525
+ "multiple": false,
2526
+ "type": "option"
2527
+ },
2528
+ "budget": {
2529
+ "description": "New spend budget in USD",
2530
+ "name": "budget",
2531
+ "hasDynamicHelp": false,
2532
+ "multiple": false,
2533
+ "type": "option"
2534
+ },
2535
+ "reset-spent": {
2536
+ "description": "Reset spent amount to zero",
2537
+ "name": "reset-spent",
2538
+ "allowNo": false,
2539
+ "type": "boolean"
2240
2540
  }
2241
2541
  },
2242
2542
  "hasDynamicHelp": false,
2243
2543
  "hiddenAliases": [],
2244
- "id": "config:show",
2544
+ "id": "keys:update",
2245
2545
  "pluginAlias": "faces-cli",
2246
2546
  "pluginName": "faces-cli",
2247
2547
  "pluginType": "core",
@@ -2251,8 +2551,8 @@
2251
2551
  "relativePath": [
2252
2552
  "dist",
2253
2553
  "commands",
2254
- "config",
2255
- "show.js"
2554
+ "keys",
2555
+ "update.js"
2256
2556
  ]
2257
2557
  },
2258
2558
  "face:attributes": {
@@ -2890,7 +3190,7 @@
2890
3190
  "required": true
2891
3191
  }
2892
3192
  },
2893
- "description": "Lock a face (read-only). A locked face still reads and chats normally, but it, and everything it owns (documents, threads, voiceprint), cannot be changed until unlocked.",
3193
+ "description": "Lock a face (read-only). A locked face still reads and chats normally, but it, and everything it owns (documents, threads, captured style), cannot be changed until unlocked.",
2894
3194
  "examples": [
2895
3195
  "<%= config.bin %> <%= command.id %> socrates"
2896
3196
  ],
@@ -3411,7 +3711,7 @@
3411
3711
  "required": true
3412
3712
  }
3413
3713
  },
3414
- "description": "Unlock a face (make it writable again). Thaws the face and everything it owns (documents, threads, voiceprint).",
3714
+ "description": "Unlock a face (make it writable again). Thaws the face and everything it owns (documents, threads, captured style).",
3415
3715
  "examples": [
3416
3716
  "<%= config.bin %> <%= command.id %> socrates"
3417
3717
  ],
@@ -4683,10 +4983,10 @@
4683
4983
  "remove.js"
4684
4984
  ]
4685
4985
  },
4686
- "keys:create": {
4986
+ "billing:subscription:activate": {
4687
4987
  "aliases": [],
4688
4988
  "args": {},
4689
- "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.",
4989
+ "description": "Activate or reactivate a subscription plan",
4690
4990
  "flags": {
4691
4991
  "json": {
4692
4992
  "description": "Format output as json.",
@@ -4719,52 +5019,21 @@
4719
5019
  "multiple": false,
4720
5020
  "type": "option"
4721
5021
  },
4722
- "name": {
4723
- "description": "Key name/label",
4724
- "name": "name",
4725
- "required": true,
4726
- "hasDynamicHelp": false,
4727
- "multiple": false,
4728
- "type": "option"
4729
- },
4730
- "expires-days": {
4731
- "description": "Expiry in days (omit for no expiry)",
4732
- "name": "expires-days",
4733
- "hasDynamicHelp": false,
4734
- "multiple": false,
4735
- "type": "option"
4736
- },
4737
- "budget": {
4738
- "description": "Spend budget in USD",
4739
- "name": "budget",
5022
+ "plan": {
5023
+ "description": "Plan to activate",
5024
+ "name": "plan",
5025
+ "default": "connect",
4740
5026
  "hasDynamicHelp": false,
4741
5027
  "multiple": false,
5028
+ "options": [
5029
+ "connect"
5030
+ ],
4742
5031
  "type": "option"
4743
- },
4744
- "face": {
4745
- "description": "Allowed face alias (repeatable)",
4746
- "name": "face",
4747
- "hasDynamicHelp": false,
4748
- "multiple": true,
4749
- "type": "option"
4750
- },
4751
- "model": {
4752
- "description": "Allowed model name (repeatable)",
4753
- "name": "model",
4754
- "hasDynamicHelp": false,
4755
- "multiple": true,
4756
- "type": "option"
4757
- },
4758
- "save": {
4759
- "description": "Save the new key to ~/.faces/config.json as api_key (default: true; use --no-save to skip)",
4760
- "name": "save",
4761
- "allowNo": true,
4762
- "type": "boolean"
4763
5032
  }
4764
5033
  },
4765
5034
  "hasDynamicHelp": false,
4766
5035
  "hiddenAliases": [],
4767
- "id": "keys:create",
5036
+ "id": "billing:subscription:activate",
4768
5037
  "pluginAlias": "faces-cli",
4769
5038
  "pluginName": "faces-cli",
4770
5039
  "pluginType": "core",
@@ -4774,14 +5043,15 @@
4774
5043
  "relativePath": [
4775
5044
  "dist",
4776
5045
  "commands",
4777
- "keys",
4778
- "create.js"
5046
+ "billing",
5047
+ "subscription",
5048
+ "activate.js"
4779
5049
  ]
4780
5050
  },
4781
- "keys:list": {
5051
+ "billing:subscription:cancel": {
4782
5052
  "aliases": [],
4783
5053
  "args": {},
4784
- "description": "List all API keys (JWT required)",
5054
+ "description": "Cancel your subscription (keeps access until period end)",
4785
5055
  "flags": {
4786
5056
  "json": {
4787
5057
  "description": "Format output as json.",
@@ -4813,11 +5083,17 @@
4813
5083
  "hasDynamicHelp": false,
4814
5084
  "multiple": false,
4815
5085
  "type": "option"
5086
+ },
5087
+ "yes": {
5088
+ "description": "Skip confirmation",
5089
+ "name": "yes",
5090
+ "allowNo": false,
5091
+ "type": "boolean"
4816
5092
  }
4817
5093
  },
4818
5094
  "hasDynamicHelp": false,
4819
5095
  "hiddenAliases": [],
4820
- "id": "keys:list",
5096
+ "id": "billing:subscription:cancel",
4821
5097
  "pluginAlias": "faces-cli",
4822
5098
  "pluginName": "faces-cli",
4823
5099
  "pluginType": "core",
@@ -4827,20 +5103,15 @@
4827
5103
  "relativePath": [
4828
5104
  "dist",
4829
5105
  "commands",
4830
- "keys",
4831
- "list.js"
5106
+ "billing",
5107
+ "subscription",
5108
+ "cancel.js"
4832
5109
  ]
4833
5110
  },
4834
- "keys:revoke": {
5111
+ "billing:subscription": {
4835
5112
  "aliases": [],
4836
- "args": {
4837
- "key_id": {
4838
- "description": "Key ID",
4839
- "name": "key_id",
4840
- "required": true
4841
- }
4842
- },
4843
- "description": "Revoke an API key (JWT required)",
5113
+ "args": {},
5114
+ "description": "Show current plan, face count, and renewal date",
4844
5115
  "flags": {
4845
5116
  "json": {
4846
5117
  "description": "Format output as json.",
@@ -4872,17 +5143,11 @@
4872
5143
  "hasDynamicHelp": false,
4873
5144
  "multiple": false,
4874
5145
  "type": "option"
4875
- },
4876
- "yes": {
4877
- "description": "Skip confirmation",
4878
- "name": "yes",
4879
- "allowNo": false,
4880
- "type": "boolean"
4881
5146
  }
4882
5147
  },
4883
5148
  "hasDynamicHelp": false,
4884
5149
  "hiddenAliases": [],
4885
- "id": "keys:revoke",
5150
+ "id": "billing:subscription",
4886
5151
  "pluginAlias": "faces-cli",
4887
5152
  "pluginName": "faces-cli",
4888
5153
  "pluginType": "core",
@@ -4892,20 +5157,21 @@
4892
5157
  "relativePath": [
4893
5158
  "dist",
4894
5159
  "commands",
4895
- "keys",
4896
- "revoke.js"
5160
+ "billing",
5161
+ "subscription",
5162
+ "index.js"
4897
5163
  ]
4898
5164
  },
4899
- "keys:update": {
5165
+ "compile:thread:create": {
4900
5166
  "aliases": [],
4901
5167
  "args": {
4902
- "key_id": {
4903
- "description": "Key ID",
4904
- "name": "key_id",
5168
+ "face_id": {
5169
+ "description": "Face alias",
5170
+ "name": "face_id",
4905
5171
  "required": true
4906
5172
  }
4907
5173
  },
4908
- "description": "Update API key metadata (JWT required)",
5174
+ "description": "Start a new thread for a face",
4909
5175
  "flags": {
4910
5176
  "json": {
4911
5177
  "description": "Format output as json.",
@@ -4938,30 +5204,23 @@
4938
5204
  "multiple": false,
4939
5205
  "type": "option"
4940
5206
  },
4941
- "name": {
4942
- "description": "New key name",
4943
- "name": "name",
4944
- "hasDynamicHelp": false,
4945
- "multiple": false,
4946
- "type": "option"
4947
- },
4948
- "budget": {
4949
- "description": "New spend budget in USD",
4950
- "name": "budget",
5207
+ "label": {
5208
+ "description": "Thread label",
5209
+ "name": "label",
4951
5210
  "hasDynamicHelp": false,
4952
5211
  "multiple": false,
4953
5212
  "type": "option"
4954
5213
  },
4955
- "reset-spent": {
4956
- "description": "Reset spent amount to zero",
4957
- "name": "reset-spent",
5214
+ "oauth-only": {
5215
+ "description": "Prevent fallback to paid system key (use OAuth only)",
5216
+ "name": "oauth-only",
4958
5217
  "allowNo": false,
4959
5218
  "type": "boolean"
4960
5219
  }
4961
5220
  },
4962
5221
  "hasDynamicHelp": false,
4963
5222
  "hiddenAliases": [],
4964
- "id": "keys:update",
5223
+ "id": "compile:thread:create",
4965
5224
  "pluginAlias": "faces-cli",
4966
5225
  "pluginName": "faces-cli",
4967
5226
  "pluginType": "core",
@@ -4971,79 +5230,21 @@
4971
5230
  "relativePath": [
4972
5231
  "dist",
4973
5232
  "commands",
4974
- "keys",
4975
- "update.js"
5233
+ "compile",
5234
+ "thread",
5235
+ "create.js"
4976
5236
  ]
4977
5237
  },
4978
- "billing:subscription:activate": {
5238
+ "compile:thread:delete": {
4979
5239
  "aliases": [],
4980
- "args": {},
4981
- "description": "Activate or reactivate a subscription plan",
4982
- "flags": {
4983
- "json": {
4984
- "description": "Format output as json.",
4985
- "helpGroup": "GLOBAL",
4986
- "name": "json",
4987
- "allowNo": false,
4988
- "type": "boolean"
4989
- },
4990
- "base-url": {
4991
- "description": "API base URL",
4992
- "env": "FACES_BASE_URL",
4993
- "name": "base-url",
4994
- "hasDynamicHelp": false,
4995
- "multiple": false,
4996
- "type": "option"
4997
- },
4998
- "token": {
4999
- "description": "JWT bearer token",
5000
- "env": "FACES_TOKEN",
5001
- "name": "token",
5002
- "hasDynamicHelp": false,
5003
- "multiple": false,
5004
- "type": "option"
5005
- },
5006
- "api-key": {
5007
- "description": "API key",
5008
- "env": "FACES_API_KEY",
5009
- "name": "api-key",
5010
- "hasDynamicHelp": false,
5011
- "multiple": false,
5012
- "type": "option"
5013
- },
5014
- "plan": {
5015
- "description": "Plan to activate",
5016
- "name": "plan",
5017
- "default": "connect",
5018
- "hasDynamicHelp": false,
5019
- "multiple": false,
5020
- "options": [
5021
- "connect"
5022
- ],
5023
- "type": "option"
5240
+ "args": {
5241
+ "thread_id": {
5242
+ "description": "Thread ID",
5243
+ "name": "thread_id",
5244
+ "required": true
5024
5245
  }
5025
5246
  },
5026
- "hasDynamicHelp": false,
5027
- "hiddenAliases": [],
5028
- "id": "billing:subscription:activate",
5029
- "pluginAlias": "faces-cli",
5030
- "pluginName": "faces-cli",
5031
- "pluginType": "core",
5032
- "strict": true,
5033
- "enableJsonFlag": true,
5034
- "isESM": true,
5035
- "relativePath": [
5036
- "dist",
5037
- "commands",
5038
- "billing",
5039
- "subscription",
5040
- "activate.js"
5041
- ]
5042
- },
5043
- "billing:subscription:cancel": {
5044
- "aliases": [],
5045
- "args": {},
5046
- "description": "Cancel your subscription (keeps access until period end)",
5247
+ "description": "Delete a thread",
5047
5248
  "flags": {
5048
5249
  "json": {
5049
5250
  "description": "Format output as json.",
@@ -5085,221 +5286,7 @@
5085
5286
  },
5086
5287
  "hasDynamicHelp": false,
5087
5288
  "hiddenAliases": [],
5088
- "id": "billing:subscription:cancel",
5089
- "pluginAlias": "faces-cli",
5090
- "pluginName": "faces-cli",
5091
- "pluginType": "core",
5092
- "strict": true,
5093
- "enableJsonFlag": true,
5094
- "isESM": true,
5095
- "relativePath": [
5096
- "dist",
5097
- "commands",
5098
- "billing",
5099
- "subscription",
5100
- "cancel.js"
5101
- ]
5102
- },
5103
- "billing:subscription": {
5104
- "aliases": [],
5105
- "args": {},
5106
- "description": "Show current plan, face count, and renewal date",
5107
- "flags": {
5108
- "json": {
5109
- "description": "Format output as json.",
5110
- "helpGroup": "GLOBAL",
5111
- "name": "json",
5112
- "allowNo": false,
5113
- "type": "boolean"
5114
- },
5115
- "base-url": {
5116
- "description": "API base URL",
5117
- "env": "FACES_BASE_URL",
5118
- "name": "base-url",
5119
- "hasDynamicHelp": false,
5120
- "multiple": false,
5121
- "type": "option"
5122
- },
5123
- "token": {
5124
- "description": "JWT bearer token",
5125
- "env": "FACES_TOKEN",
5126
- "name": "token",
5127
- "hasDynamicHelp": false,
5128
- "multiple": false,
5129
- "type": "option"
5130
- },
5131
- "api-key": {
5132
- "description": "API key",
5133
- "env": "FACES_API_KEY",
5134
- "name": "api-key",
5135
- "hasDynamicHelp": false,
5136
- "multiple": false,
5137
- "type": "option"
5138
- }
5139
- },
5140
- "hasDynamicHelp": false,
5141
- "hiddenAliases": [],
5142
- "id": "billing:subscription",
5143
- "pluginAlias": "faces-cli",
5144
- "pluginName": "faces-cli",
5145
- "pluginType": "core",
5146
- "strict": true,
5147
- "enableJsonFlag": true,
5148
- "isESM": true,
5149
- "relativePath": [
5150
- "dist",
5151
- "commands",
5152
- "billing",
5153
- "subscription",
5154
- "index.js"
5155
- ]
5156
- },
5157
- "compile:doc:create": {
5158
- "aliases": [],
5159
- "args": {
5160
- "face_id": {
5161
- "description": "Face alias",
5162
- "name": "face_id",
5163
- "required": true
5164
- }
5165
- },
5166
- "description": "Submit a document to a face",
5167
- "flags": {
5168
- "json": {
5169
- "description": "Format output as json.",
5170
- "helpGroup": "GLOBAL",
5171
- "name": "json",
5172
- "allowNo": false,
5173
- "type": "boolean"
5174
- },
5175
- "base-url": {
5176
- "description": "API base URL",
5177
- "env": "FACES_BASE_URL",
5178
- "name": "base-url",
5179
- "hasDynamicHelp": false,
5180
- "multiple": false,
5181
- "type": "option"
5182
- },
5183
- "token": {
5184
- "description": "JWT bearer token",
5185
- "env": "FACES_TOKEN",
5186
- "name": "token",
5187
- "hasDynamicHelp": false,
5188
- "multiple": false,
5189
- "type": "option"
5190
- },
5191
- "api-key": {
5192
- "description": "API key",
5193
- "env": "FACES_API_KEY",
5194
- "name": "api-key",
5195
- "hasDynamicHelp": false,
5196
- "multiple": false,
5197
- "type": "option"
5198
- },
5199
- "label": {
5200
- "description": "Document label/title",
5201
- "name": "label",
5202
- "hasDynamicHelp": false,
5203
- "multiple": false,
5204
- "type": "option"
5205
- },
5206
- "content": {
5207
- "description": "Inline text content",
5208
- "name": "content",
5209
- "hasDynamicHelp": false,
5210
- "multiple": false,
5211
- "type": "option"
5212
- },
5213
- "file": {
5214
- "description": "Read content from file",
5215
- "name": "file",
5216
- "hasDynamicHelp": false,
5217
- "multiple": false,
5218
- "type": "option"
5219
- },
5220
- "medium": {
5221
- "description": "What sort of writing this is, e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (dialogue: transcripts, interviews, calls), lecture (sustained speech nobody interrupts: talks, sermons, keynotes). 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.",
5222
- "name": "medium",
5223
- "hasDynamicHelp": false,
5224
- "multiple": false,
5225
- "type": "option"
5226
- },
5227
- "perspective": {
5228
- "description": "Perspective (first-person or third-person)",
5229
- "name": "perspective",
5230
- "default": "first-person",
5231
- "hasDynamicHelp": false,
5232
- "multiple": false,
5233
- "options": [
5234
- "first-person",
5235
- "third-person"
5236
- ],
5237
- "type": "option"
5238
- }
5239
- },
5240
- "hasDynamicHelp": false,
5241
- "hiddenAliases": [],
5242
- "id": "compile:doc:create",
5243
- "pluginAlias": "faces-cli",
5244
- "pluginName": "faces-cli",
5245
- "pluginType": "core",
5246
- "strict": true,
5247
- "enableJsonFlag": true,
5248
- "isESM": true,
5249
- "relativePath": [
5250
- "dist",
5251
- "commands",
5252
- "compile",
5253
- "doc",
5254
- "create.js"
5255
- ]
5256
- },
5257
- "compile:doc:delete": {
5258
- "aliases": [],
5259
- "args": {
5260
- "doc_id": {
5261
- "description": "Document ID",
5262
- "name": "doc_id",
5263
- "required": true
5264
- }
5265
- },
5266
- "description": "Delete a document",
5267
- "flags": {
5268
- "json": {
5269
- "description": "Format output as json.",
5270
- "helpGroup": "GLOBAL",
5271
- "name": "json",
5272
- "allowNo": false,
5273
- "type": "boolean"
5274
- },
5275
- "base-url": {
5276
- "description": "API base URL",
5277
- "env": "FACES_BASE_URL",
5278
- "name": "base-url",
5279
- "hasDynamicHelp": false,
5280
- "multiple": false,
5281
- "type": "option"
5282
- },
5283
- "token": {
5284
- "description": "JWT bearer token",
5285
- "env": "FACES_TOKEN",
5286
- "name": "token",
5287
- "hasDynamicHelp": false,
5288
- "multiple": false,
5289
- "type": "option"
5290
- },
5291
- "api-key": {
5292
- "description": "API key",
5293
- "env": "FACES_API_KEY",
5294
- "name": "api-key",
5295
- "hasDynamicHelp": false,
5296
- "multiple": false,
5297
- "type": "option"
5298
- }
5299
- },
5300
- "hasDynamicHelp": false,
5301
- "hiddenAliases": [],
5302
- "id": "compile:doc:delete",
5289
+ "id": "compile:thread:delete",
5303
5290
  "pluginAlias": "faces-cli",
5304
5291
  "pluginName": "faces-cli",
5305
5292
  "pluginType": "core",
@@ -5310,20 +5297,25 @@
5310
5297
  "dist",
5311
5298
  "commands",
5312
5299
  "compile",
5313
- "doc",
5300
+ "thread",
5314
5301
  "delete.js"
5315
5302
  ]
5316
5303
  },
5317
- "compile:doc:edit": {
5304
+ "compile:thread:edit": {
5318
5305
  "aliases": [],
5319
5306
  "args": {
5320
- "doc_id": {
5321
- "description": "Document ID",
5322
- "name": "doc_id",
5307
+ "thread_id": {
5308
+ "description": "Thread ID",
5309
+ "name": "thread_id",
5323
5310
  "required": true
5324
5311
  }
5325
5312
  },
5326
- "description": "Edit a document (label, content, or perspective)",
5313
+ "description": "Edit a thread: its label, what medium it is read as, and/or which speaker is the face.",
5314
+ "examples": [
5315
+ "<%= config.bin %> <%= command.id %> THREAD_ID --label \"Interview\"",
5316
+ "<%= config.bin %> <%= command.id %> THREAD_ID --medium lecture",
5317
+ "<%= config.bin %> <%= command.id %> THREAD_ID --clear-medium"
5318
+ ],
5327
5319
  "flags": {
5328
5320
  "json": {
5329
5321
  "description": "Format output as json.",
@@ -5357,108 +5349,42 @@
5357
5349
  "type": "option"
5358
5350
  },
5359
5351
  "label": {
5360
- "description": "New label/title",
5352
+ "description": "New thread label",
5361
5353
  "name": "label",
5362
5354
  "hasDynamicHelp": false,
5363
5355
  "multiple": false,
5364
5356
  "type": "option"
5365
5357
  },
5366
- "content": {
5367
- "description": "New inline text content",
5368
- "name": "content",
5369
- "hasDynamicHelp": false,
5370
- "multiple": false,
5371
- "type": "option"
5372
- },
5373
- "file": {
5374
- "description": "Read new content from file",
5375
- "name": "file",
5358
+ "face-speaker": {
5359
+ "description": "Reassign face speaker: set this speaker to role=user, all others to role=assistant",
5360
+ "name": "face-speaker",
5376
5361
  "hasDynamicHelp": false,
5377
5362
  "multiple": false,
5378
5363
  "type": "option"
5379
5364
  },
5380
5365
  "medium": {
5381
- "description": "What sort of writing this is, e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (dialogue: transcripts, interviews, calls), lecture (sustained speech nobody interrupts: talks, sermons, keynotes). 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.",
5366
+ "description": "What this thread should be read as. What sort of writing this is, e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (dialogue: transcripts, interviews, calls), lecture (sustained speech nobody interrupts: talks, sermons, keynotes). 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. This is a correction that sticks: it overrides what an imported corpus arrived as, without changing the record of what that was.",
5367
+ "exclusive": [
5368
+ "clear-medium"
5369
+ ],
5382
5370
  "name": "medium",
5383
5371
  "hasDynamicHelp": false,
5384
5372
  "multiple": false,
5385
5373
  "type": "option"
5386
5374
  },
5387
- "perspective": {
5388
- "description": "Perspective (first-person or third-person)",
5389
- "name": "perspective",
5390
- "hasDynamicHelp": false,
5391
- "multiple": false,
5392
- "options": [
5393
- "first-person",
5394
- "third-person"
5375
+ "clear-medium": {
5376
+ "description": "Remove a medium correction, so the thread is read as whatever it arrived as.",
5377
+ "exclusive": [
5378
+ "medium"
5395
5379
  ],
5396
- "type": "option"
5397
- }
5398
- },
5399
- "hasDynamicHelp": false,
5400
- "hiddenAliases": [],
5401
- "id": "compile:doc:edit",
5402
- "pluginAlias": "faces-cli",
5403
- "pluginName": "faces-cli",
5404
- "pluginType": "core",
5405
- "strict": true,
5406
- "enableJsonFlag": true,
5407
- "isESM": true,
5408
- "relativePath": [
5409
- "dist",
5410
- "commands",
5411
- "compile",
5412
- "doc",
5413
- "edit.js"
5414
- ]
5415
- },
5416
- "compile:doc:get": {
5417
- "aliases": [],
5418
- "args": {
5419
- "doc_id": {
5420
- "description": "Document ID",
5421
- "name": "doc_id",
5422
- "required": true
5423
- }
5424
- },
5425
- "description": "Get a document by ID",
5426
- "flags": {
5427
- "json": {
5428
- "description": "Format output as json.",
5429
- "helpGroup": "GLOBAL",
5430
- "name": "json",
5380
+ "name": "clear-medium",
5431
5381
  "allowNo": false,
5432
5382
  "type": "boolean"
5433
- },
5434
- "base-url": {
5435
- "description": "API base URL",
5436
- "env": "FACES_BASE_URL",
5437
- "name": "base-url",
5438
- "hasDynamicHelp": false,
5439
- "multiple": false,
5440
- "type": "option"
5441
- },
5442
- "token": {
5443
- "description": "JWT bearer token",
5444
- "env": "FACES_TOKEN",
5445
- "name": "token",
5446
- "hasDynamicHelp": false,
5447
- "multiple": false,
5448
- "type": "option"
5449
- },
5450
- "api-key": {
5451
- "description": "API key",
5452
- "env": "FACES_API_KEY",
5453
- "name": "api-key",
5454
- "hasDynamicHelp": false,
5455
- "multiple": false,
5456
- "type": "option"
5457
5383
  }
5458
5384
  },
5459
5385
  "hasDynamicHelp": false,
5460
5386
  "hiddenAliases": [],
5461
- "id": "compile:doc:get",
5387
+ "id": "compile:thread:edit",
5462
5388
  "pluginAlias": "faces-cli",
5463
5389
  "pluginName": "faces-cli",
5464
5390
  "pluginType": "core",
@@ -5469,24 +5395,20 @@
5469
5395
  "dist",
5470
5396
  "commands",
5471
5397
  "compile",
5472
- "doc",
5473
- "get.js"
5398
+ "thread",
5399
+ "edit.js"
5474
5400
  ]
5475
5401
  },
5476
- "compile:doc": {
5402
+ "compile:thread:get": {
5477
5403
  "aliases": [],
5478
5404
  "args": {
5479
- "face_id": {
5480
- "description": "Face alias",
5481
- "name": "face_id",
5405
+ "thread_id": {
5406
+ "description": "Thread ID",
5407
+ "name": "thread_id",
5482
5408
  "required": true
5483
5409
  }
5484
5410
  },
5485
- "description": "Compile one or more documents into a face (create → make in one step). Repeat --file to submit several documents in a single command; each file becomes its own document rather than being concatenated.",
5486
- "examples": [
5487
- "<%= config.bin %> <%= command.id %> alice --file notes.txt",
5488
- "<%= config.bin %> <%= command.id %> alice --file a.txt --file b.txt --file c.txt --no-wait --json"
5489
- ],
5411
+ "description": "Get a thread by ID",
5490
5412
  "flags": {
5491
5413
  "json": {
5492
5414
  "description": "Format output as json.",
@@ -5518,68 +5440,11 @@
5518
5440
  "hasDynamicHelp": false,
5519
5441
  "multiple": false,
5520
5442
  "type": "option"
5521
- },
5522
- "label": {
5523
- "description": "Document label/title (single document only; with several files each is labelled by its filename)",
5524
- "name": "label",
5525
- "hasDynamicHelp": false,
5526
- "multiple": false,
5527
- "type": "option"
5528
- },
5529
- "content": {
5530
- "description": "Inline text content",
5531
- "exclusive": [
5532
- "file"
5533
- ],
5534
- "name": "content",
5535
- "hasDynamicHelp": false,
5536
- "multiple": false,
5537
- "type": "option"
5538
- },
5539
- "file": {
5540
- "description": "Read content from file (repeatable; each file becomes its own document)",
5541
- "name": "file",
5542
- "hasDynamicHelp": false,
5543
- "multiple": true,
5544
- "type": "option"
5545
- },
5546
- "medium": {
5547
- "description": "What sort of writing this is, e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (dialogue: transcripts, interviews, calls), lecture (sustained speech nobody interrupts: talks, sermons, keynotes). 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.",
5548
- "name": "medium",
5549
- "hasDynamicHelp": false,
5550
- "multiple": false,
5551
- "type": "option"
5552
- },
5553
- "perspective": {
5554
- "description": "Perspective",
5555
- "name": "perspective",
5556
- "default": "first-person",
5557
- "hasDynamicHelp": false,
5558
- "multiple": false,
5559
- "options": [
5560
- "first-person",
5561
- "third-person"
5562
- ],
5563
- "type": "option"
5564
- },
5565
- "timeout": {
5566
- "description": "Compile timeout in seconds, per document (default: 600)",
5567
- "name": "timeout",
5568
- "default": 600,
5569
- "hasDynamicHelp": false,
5570
- "multiple": false,
5571
- "type": "option"
5572
- },
5573
- "no-wait": {
5574
- "description": "Create and trigger compilation, then return immediately without polling.",
5575
- "name": "no-wait",
5576
- "allowNo": false,
5577
- "type": "boolean"
5578
5443
  }
5579
5444
  },
5580
5445
  "hasDynamicHelp": false,
5581
5446
  "hiddenAliases": [],
5582
- "id": "compile:doc",
5447
+ "id": "compile:thread:get",
5583
5448
  "pluginAlias": "faces-cli",
5584
5449
  "pluginName": "faces-cli",
5585
5450
  "pluginType": "core",
@@ -5590,11 +5455,11 @@
5590
5455
  "dist",
5591
5456
  "commands",
5592
5457
  "compile",
5593
- "doc",
5594
- "index.js"
5458
+ "thread",
5459
+ "get.js"
5595
5460
  ]
5596
5461
  },
5597
- "compile:doc:list": {
5462
+ "compile:thread:list": {
5598
5463
  "aliases": [],
5599
5464
  "args": {
5600
5465
  "face_id": {
@@ -5603,7 +5468,7 @@
5603
5468
  "required": true
5604
5469
  }
5605
5470
  },
5606
- "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.",
5471
+ "description": "List threads for a face",
5607
5472
  "flags": {
5608
5473
  "json": {
5609
5474
  "description": "Format output as json.",
@@ -5635,17 +5500,11 @@
5635
5500
  "hasDynamicHelp": false,
5636
5501
  "multiple": false,
5637
5502
  "type": "option"
5638
- },
5639
- "verbose": {
5640
- "description": "Include each document's full text",
5641
- "name": "verbose",
5642
- "allowNo": false,
5643
- "type": "boolean"
5644
5503
  }
5645
5504
  },
5646
5505
  "hasDynamicHelp": false,
5647
5506
  "hiddenAliases": [],
5648
- "id": "compile:doc:list",
5507
+ "id": "compile:thread:list",
5649
5508
  "pluginAlias": "faces-cli",
5650
5509
  "pluginName": "faces-cli",
5651
5510
  "pluginType": "core",
@@ -5656,20 +5515,20 @@
5656
5515
  "dist",
5657
5516
  "commands",
5658
5517
  "compile",
5659
- "doc",
5518
+ "thread",
5660
5519
  "list.js"
5661
5520
  ]
5662
5521
  },
5663
- "compile:doc:make": {
5522
+ "compile:thread:make": {
5664
5523
  "aliases": [],
5665
5524
  "args": {
5666
- "doc_id": {
5667
- "description": "Document ID",
5668
- "name": "doc_id",
5525
+ "thread_id": {
5526
+ "description": "Thread ID",
5527
+ "name": "thread_id",
5669
5528
  "required": true
5670
5529
  }
5671
5530
  },
5672
- "description": "Compile an existing document (prepare + sync in one step)",
5531
+ "description": "Compile an existing thread (prepare + sync in one step)",
5673
5532
  "flags": {
5674
5533
  "json": {
5675
5534
  "description": "Format output as json.",
@@ -5711,7 +5570,7 @@
5711
5570
  "type": "option"
5712
5571
  },
5713
5572
  "no-wait": {
5714
- "description": "Return immediately after triggering compilation. Prints the document ID for manual polling.",
5573
+ "description": "Return immediately after triggering compilation. Prints the thread ID for manual polling.",
5715
5574
  "name": "no-wait",
5716
5575
  "allowNo": false,
5717
5576
  "type": "boolean"
@@ -5719,7 +5578,7 @@
5719
5578
  },
5720
5579
  "hasDynamicHelp": false,
5721
5580
  "hiddenAliases": [],
5722
- "id": "compile:doc:make",
5581
+ "id": "compile:thread:make",
5723
5582
  "pluginAlias": "faces-cli",
5724
5583
  "pluginName": "faces-cli",
5725
5584
  "pluginType": "core",
@@ -5730,20 +5589,20 @@
5730
5589
  "dist",
5731
5590
  "commands",
5732
5591
  "compile",
5733
- "doc",
5592
+ "thread",
5734
5593
  "make.js"
5735
5594
  ]
5736
5595
  },
5737
- "compile:doc:pause": {
5596
+ "compile:thread:message": {
5738
5597
  "aliases": [],
5739
5598
  "args": {
5740
- "doc_id": {
5741
- "description": "Document ID",
5742
- "name": "doc_id",
5599
+ "thread_id": {
5600
+ "description": "Thread ID",
5601
+ "name": "thread_id",
5743
5602
  "required": true
5744
5603
  }
5745
5604
  },
5746
- "description": "Ask a running document compilation to stop (preserves progress, resume with make). The compile stops at the next chunk boundary; this waits for it unless --no-wait.",
5605
+ "description": "Send a user message to a thread",
5747
5606
  "flags": {
5748
5607
  "json": {
5749
5608
  "description": "Format output as json.",
@@ -5776,24 +5635,25 @@
5776
5635
  "multiple": false,
5777
5636
  "type": "option"
5778
5637
  },
5779
- "no-wait": {
5780
- "description": "Return as soon as the pause is accepted, without waiting for the compile to stop.",
5781
- "name": "no-wait",
5782
- "allowNo": false,
5783
- "type": "boolean"
5784
- },
5785
- "timeout": {
5786
- "description": "Seconds to wait for the compile to stop (default: 60)",
5787
- "name": "timeout",
5788
- "default": 60,
5638
+ "message": {
5639
+ "char": "m",
5640
+ "description": "User message to append",
5641
+ "name": "message",
5642
+ "required": true,
5789
5643
  "hasDynamicHelp": false,
5790
5644
  "multiple": false,
5791
5645
  "type": "option"
5646
+ },
5647
+ "oauth-only": {
5648
+ "description": "Prevent fallback to paid system key (use OAuth only)",
5649
+ "name": "oauth-only",
5650
+ "allowNo": false,
5651
+ "type": "boolean"
5792
5652
  }
5793
5653
  },
5794
5654
  "hasDynamicHelp": false,
5795
5655
  "hiddenAliases": [],
5796
- "id": "compile:doc:pause",
5656
+ "id": "compile:thread:message",
5797
5657
  "pluginAlias": "faces-cli",
5798
5658
  "pluginName": "faces-cli",
5799
5659
  "pluginType": "core",
@@ -5804,20 +5664,20 @@
5804
5664
  "dist",
5805
5665
  "commands",
5806
5666
  "compile",
5807
- "doc",
5808
- "pause.js"
5667
+ "thread",
5668
+ "message.js"
5809
5669
  ]
5810
5670
  },
5811
- "compile:doc:reset": {
5671
+ "compile:thread:pause": {
5812
5672
  "aliases": [],
5813
5673
  "args": {
5814
- "doc_id": {
5815
- "description": "Document ID",
5816
- "name": "doc_id",
5674
+ "thread_id": {
5675
+ "description": "Thread ID",
5676
+ "name": "thread_id",
5817
5677
  "required": true
5818
5678
  }
5819
5679
  },
5820
- "description": "Reset document compilation progress (wipe extraction, keep content)",
5680
+ "description": "Ask a running thread compilation to stop (preserves progress, resume with make). The compile stops at the next chunk boundary; this waits for it unless --no-wait.",
5821
5681
  "flags": {
5822
5682
  "json": {
5823
5683
  "description": "Format output as json.",
@@ -5850,16 +5710,24 @@
5850
5710
  "multiple": false,
5851
5711
  "type": "option"
5852
5712
  },
5853
- "yes": {
5854
- "description": "Skip confirmation",
5855
- "name": "yes",
5713
+ "no-wait": {
5714
+ "description": "Return as soon as the pause is accepted, without waiting for the compile to stop.",
5715
+ "name": "no-wait",
5856
5716
  "allowNo": false,
5857
5717
  "type": "boolean"
5718
+ },
5719
+ "timeout": {
5720
+ "description": "Seconds to wait for the compile to stop (default: 60)",
5721
+ "name": "timeout",
5722
+ "default": 60,
5723
+ "hasDynamicHelp": false,
5724
+ "multiple": false,
5725
+ "type": "option"
5858
5726
  }
5859
5727
  },
5860
5728
  "hasDynamicHelp": false,
5861
5729
  "hiddenAliases": [],
5862
- "id": "compile:doc:reset",
5730
+ "id": "compile:thread:pause",
5863
5731
  "pluginAlias": "faces-cli",
5864
5732
  "pluginName": "faces-cli",
5865
5733
  "pluginType": "core",
@@ -5870,20 +5738,20 @@
5870
5738
  "dist",
5871
5739
  "commands",
5872
5740
  "compile",
5873
- "doc",
5874
- "reset.js"
5741
+ "thread",
5742
+ "pause.js"
5875
5743
  ]
5876
5744
  },
5877
- "compile:thread:create": {
5745
+ "compile:thread:reset": {
5878
5746
  "aliases": [],
5879
5747
  "args": {
5880
- "face_id": {
5881
- "description": "Face alias",
5882
- "name": "face_id",
5748
+ "thread_id": {
5749
+ "description": "Thread ID",
5750
+ "name": "thread_id",
5883
5751
  "required": true
5884
5752
  }
5885
5753
  },
5886
- "description": "Start a new thread for a face",
5754
+ "description": "Reset thread compilation progress (wipe extraction, keep source messages)",
5887
5755
  "flags": {
5888
5756
  "json": {
5889
5757
  "description": "Format output as json.",
@@ -5916,23 +5784,16 @@
5916
5784
  "multiple": false,
5917
5785
  "type": "option"
5918
5786
  },
5919
- "label": {
5920
- "description": "Thread label",
5921
- "name": "label",
5922
- "hasDynamicHelp": false,
5923
- "multiple": false,
5924
- "type": "option"
5925
- },
5926
- "oauth-only": {
5927
- "description": "Prevent fallback to paid system key (use OAuth only)",
5928
- "name": "oauth-only",
5787
+ "yes": {
5788
+ "description": "Skip confirmation",
5789
+ "name": "yes",
5929
5790
  "allowNo": false,
5930
5791
  "type": "boolean"
5931
5792
  }
5932
5793
  },
5933
5794
  "hasDynamicHelp": false,
5934
5795
  "hiddenAliases": [],
5935
- "id": "compile:thread:create",
5796
+ "id": "compile:thread:reset",
5936
5797
  "pluginAlias": "faces-cli",
5937
5798
  "pluginName": "faces-cli",
5938
5799
  "pluginType": "core",
@@ -5944,10 +5805,10 @@
5944
5805
  "commands",
5945
5806
  "compile",
5946
5807
  "thread",
5947
- "create.js"
5808
+ "reset.js"
5948
5809
  ]
5949
5810
  },
5950
- "compile:thread:delete": {
5811
+ "compile:thread:sync": {
5951
5812
  "aliases": [],
5952
5813
  "args": {
5953
5814
  "thread_id": {
@@ -5956,7 +5817,7 @@
5956
5817
  "required": true
5957
5818
  }
5958
5819
  },
5959
- "description": "Delete a thread",
5820
+ "description": "Archive and sync a thread into a face",
5960
5821
  "flags": {
5961
5822
  "json": {
5962
5823
  "description": "Format output as json.",
@@ -5988,17 +5849,11 @@
5988
5849
  "hasDynamicHelp": false,
5989
5850
  "multiple": false,
5990
5851
  "type": "option"
5991
- },
5992
- "yes": {
5993
- "description": "Skip confirmation",
5994
- "name": "yes",
5995
- "allowNo": false,
5996
- "type": "boolean"
5997
5852
  }
5998
5853
  },
5999
5854
  "hasDynamicHelp": false,
6000
5855
  "hiddenAliases": [],
6001
- "id": "compile:thread:delete",
5856
+ "id": "compile:thread:sync",
6002
5857
  "pluginAlias": "faces-cli",
6003
5858
  "pluginName": "faces-cli",
6004
5859
  "pluginType": "core",
@@ -6010,24 +5865,19 @@
6010
5865
  "commands",
6011
5866
  "compile",
6012
5867
  "thread",
6013
- "delete.js"
5868
+ "sync.js"
6014
5869
  ]
6015
5870
  },
6016
- "compile:thread:edit": {
5871
+ "compile:doc:create": {
6017
5872
  "aliases": [],
6018
5873
  "args": {
6019
- "thread_id": {
6020
- "description": "Thread ID",
6021
- "name": "thread_id",
5874
+ "face_id": {
5875
+ "description": "Face alias",
5876
+ "name": "face_id",
6022
5877
  "required": true
6023
5878
  }
6024
5879
  },
6025
- "description": "Edit a thread: its label, what medium it is read as, and/or which speaker is the face.",
6026
- "examples": [
6027
- "<%= config.bin %> <%= command.id %> THREAD_ID --label \"Interview\"",
6028
- "<%= config.bin %> <%= command.id %> THREAD_ID --medium lecture",
6029
- "<%= config.bin %> <%= command.id %> THREAD_ID --clear-medium"
6030
- ],
5880
+ "description": "Submit a document to a face",
6031
5881
  "flags": {
6032
5882
  "json": {
6033
5883
  "description": "Format output as json.",
@@ -6061,42 +5911,109 @@
6061
5911
  "type": "option"
6062
5912
  },
6063
5913
  "label": {
6064
- "description": "New thread label",
5914
+ "description": "Document label/title",
6065
5915
  "name": "label",
6066
5916
  "hasDynamicHelp": false,
6067
5917
  "multiple": false,
6068
5918
  "type": "option"
6069
5919
  },
6070
- "face-speaker": {
6071
- "description": "Reassign face speaker: set this speaker to role=user, all others to role=assistant",
6072
- "name": "face-speaker",
5920
+ "content": {
5921
+ "description": "Inline text content",
5922
+ "name": "content",
5923
+ "hasDynamicHelp": false,
5924
+ "multiple": false,
5925
+ "type": "option"
5926
+ },
5927
+ "file": {
5928
+ "description": "Read content from file",
5929
+ "name": "file",
6073
5930
  "hasDynamicHelp": false,
6074
5931
  "multiple": false,
6075
5932
  "type": "option"
6076
5933
  },
6077
5934
  "medium": {
6078
- "description": "What this thread should be read as. What sort of writing this is, e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (dialogue: transcripts, interviews, calls), lecture (sustained speech nobody interrupts: talks, sermons, keynotes). 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. This is a correction that sticks: it overrides what an imported corpus arrived as, without changing the record of what that was.",
6079
- "exclusive": [
6080
- "clear-medium"
6081
- ],
5935
+ "description": "What sort of writing this is, e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (dialogue: transcripts, interviews, calls), lecture (sustained speech nobody interrupts: talks, sermons, keynotes). 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.",
6082
5936
  "name": "medium",
6083
5937
  "hasDynamicHelp": false,
6084
5938
  "multiple": false,
6085
5939
  "type": "option"
6086
5940
  },
6087
- "clear-medium": {
6088
- "description": "Remove a medium correction, so the thread is read as whatever it arrived as.",
6089
- "exclusive": [
6090
- "medium"
5941
+ "perspective": {
5942
+ "description": "Perspective (first-person or third-person)",
5943
+ "name": "perspective",
5944
+ "default": "first-person",
5945
+ "hasDynamicHelp": false,
5946
+ "multiple": false,
5947
+ "options": [
5948
+ "first-person",
5949
+ "third-person"
6091
5950
  ],
6092
- "name": "clear-medium",
5951
+ "type": "option"
5952
+ }
5953
+ },
5954
+ "hasDynamicHelp": false,
5955
+ "hiddenAliases": [],
5956
+ "id": "compile:doc:create",
5957
+ "pluginAlias": "faces-cli",
5958
+ "pluginName": "faces-cli",
5959
+ "pluginType": "core",
5960
+ "strict": true,
5961
+ "enableJsonFlag": true,
5962
+ "isESM": true,
5963
+ "relativePath": [
5964
+ "dist",
5965
+ "commands",
5966
+ "compile",
5967
+ "doc",
5968
+ "create.js"
5969
+ ]
5970
+ },
5971
+ "compile:doc:delete": {
5972
+ "aliases": [],
5973
+ "args": {
5974
+ "doc_id": {
5975
+ "description": "Document ID",
5976
+ "name": "doc_id",
5977
+ "required": true
5978
+ }
5979
+ },
5980
+ "description": "Delete a document",
5981
+ "flags": {
5982
+ "json": {
5983
+ "description": "Format output as json.",
5984
+ "helpGroup": "GLOBAL",
5985
+ "name": "json",
6093
5986
  "allowNo": false,
6094
5987
  "type": "boolean"
5988
+ },
5989
+ "base-url": {
5990
+ "description": "API base URL",
5991
+ "env": "FACES_BASE_URL",
5992
+ "name": "base-url",
5993
+ "hasDynamicHelp": false,
5994
+ "multiple": false,
5995
+ "type": "option"
5996
+ },
5997
+ "token": {
5998
+ "description": "JWT bearer token",
5999
+ "env": "FACES_TOKEN",
6000
+ "name": "token",
6001
+ "hasDynamicHelp": false,
6002
+ "multiple": false,
6003
+ "type": "option"
6004
+ },
6005
+ "api-key": {
6006
+ "description": "API key",
6007
+ "env": "FACES_API_KEY",
6008
+ "name": "api-key",
6009
+ "hasDynamicHelp": false,
6010
+ "multiple": false,
6011
+ "type": "option"
6095
6012
  }
6096
6013
  },
6097
6014
  "hasDynamicHelp": false,
6098
6015
  "hiddenAliases": [],
6099
- "id": "compile:thread:edit",
6016
+ "id": "compile:doc:delete",
6100
6017
  "pluginAlias": "faces-cli",
6101
6018
  "pluginName": "faces-cli",
6102
6019
  "pluginType": "core",
@@ -6106,21 +6023,21 @@
6106
6023
  "relativePath": [
6107
6024
  "dist",
6108
6025
  "commands",
6109
- "compile",
6110
- "thread",
6111
- "edit.js"
6026
+ "compile",
6027
+ "doc",
6028
+ "delete.js"
6112
6029
  ]
6113
6030
  },
6114
- "compile:thread:get": {
6031
+ "compile:doc:edit": {
6115
6032
  "aliases": [],
6116
6033
  "args": {
6117
- "thread_id": {
6118
- "description": "Thread ID",
6119
- "name": "thread_id",
6034
+ "doc_id": {
6035
+ "description": "Document ID",
6036
+ "name": "doc_id",
6120
6037
  "required": true
6121
6038
  }
6122
6039
  },
6123
- "description": "Get a thread by ID",
6040
+ "description": "Edit a document (label, content, or perspective)",
6124
6041
  "flags": {
6125
6042
  "json": {
6126
6043
  "description": "Format output as json.",
@@ -6152,11 +6069,50 @@
6152
6069
  "hasDynamicHelp": false,
6153
6070
  "multiple": false,
6154
6071
  "type": "option"
6072
+ },
6073
+ "label": {
6074
+ "description": "New label/title",
6075
+ "name": "label",
6076
+ "hasDynamicHelp": false,
6077
+ "multiple": false,
6078
+ "type": "option"
6079
+ },
6080
+ "content": {
6081
+ "description": "New inline text content",
6082
+ "name": "content",
6083
+ "hasDynamicHelp": false,
6084
+ "multiple": false,
6085
+ "type": "option"
6086
+ },
6087
+ "file": {
6088
+ "description": "Read new content from file",
6089
+ "name": "file",
6090
+ "hasDynamicHelp": false,
6091
+ "multiple": false,
6092
+ "type": "option"
6093
+ },
6094
+ "medium": {
6095
+ "description": "What sort of writing this is, e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (dialogue: transcripts, interviews, calls), lecture (sustained speech nobody interrupts: talks, sermons, keynotes). 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.",
6096
+ "name": "medium",
6097
+ "hasDynamicHelp": false,
6098
+ "multiple": false,
6099
+ "type": "option"
6100
+ },
6101
+ "perspective": {
6102
+ "description": "Perspective (first-person or third-person)",
6103
+ "name": "perspective",
6104
+ "hasDynamicHelp": false,
6105
+ "multiple": false,
6106
+ "options": [
6107
+ "first-person",
6108
+ "third-person"
6109
+ ],
6110
+ "type": "option"
6155
6111
  }
6156
6112
  },
6157
6113
  "hasDynamicHelp": false,
6158
6114
  "hiddenAliases": [],
6159
- "id": "compile:thread:get",
6115
+ "id": "compile:doc:edit",
6160
6116
  "pluginAlias": "faces-cli",
6161
6117
  "pluginName": "faces-cli",
6162
6118
  "pluginType": "core",
@@ -6167,20 +6123,20 @@
6167
6123
  "dist",
6168
6124
  "commands",
6169
6125
  "compile",
6170
- "thread",
6171
- "get.js"
6126
+ "doc",
6127
+ "edit.js"
6172
6128
  ]
6173
6129
  },
6174
- "compile:thread:list": {
6130
+ "compile:doc:get": {
6175
6131
  "aliases": [],
6176
6132
  "args": {
6177
- "face_id": {
6178
- "description": "Face alias",
6179
- "name": "face_id",
6133
+ "doc_id": {
6134
+ "description": "Document ID",
6135
+ "name": "doc_id",
6180
6136
  "required": true
6181
6137
  }
6182
6138
  },
6183
- "description": "List threads for a face",
6139
+ "description": "Get a document by ID",
6184
6140
  "flags": {
6185
6141
  "json": {
6186
6142
  "description": "Format output as json.",
@@ -6216,7 +6172,7 @@
6216
6172
  },
6217
6173
  "hasDynamicHelp": false,
6218
6174
  "hiddenAliases": [],
6219
- "id": "compile:thread:list",
6175
+ "id": "compile:doc:get",
6220
6176
  "pluginAlias": "faces-cli",
6221
6177
  "pluginName": "faces-cli",
6222
6178
  "pluginType": "core",
@@ -6227,20 +6183,24 @@
6227
6183
  "dist",
6228
6184
  "commands",
6229
6185
  "compile",
6230
- "thread",
6231
- "list.js"
6186
+ "doc",
6187
+ "get.js"
6232
6188
  ]
6233
6189
  },
6234
- "compile:thread:make": {
6190
+ "compile:doc": {
6235
6191
  "aliases": [],
6236
6192
  "args": {
6237
- "thread_id": {
6238
- "description": "Thread ID",
6239
- "name": "thread_id",
6193
+ "face_id": {
6194
+ "description": "Face alias",
6195
+ "name": "face_id",
6240
6196
  "required": true
6241
6197
  }
6242
6198
  },
6243
- "description": "Compile an existing thread (prepare + sync in one step)",
6199
+ "description": "Compile one or more documents into a face (create make in one step). Repeat --file to submit several documents in a single command; each file becomes its own document rather than being concatenated.",
6200
+ "examples": [
6201
+ "<%= config.bin %> <%= command.id %> alice --file notes.txt",
6202
+ "<%= config.bin %> <%= command.id %> alice --file a.txt --file b.txt --file c.txt --no-wait --json"
6203
+ ],
6244
6204
  "flags": {
6245
6205
  "json": {
6246
6206
  "description": "Format output as json.",
@@ -6273,8 +6233,51 @@
6273
6233
  "multiple": false,
6274
6234
  "type": "option"
6275
6235
  },
6236
+ "label": {
6237
+ "description": "Document label/title (single document only; with several files each is labelled by its filename)",
6238
+ "name": "label",
6239
+ "hasDynamicHelp": false,
6240
+ "multiple": false,
6241
+ "type": "option"
6242
+ },
6243
+ "content": {
6244
+ "description": "Inline text content",
6245
+ "exclusive": [
6246
+ "file"
6247
+ ],
6248
+ "name": "content",
6249
+ "hasDynamicHelp": false,
6250
+ "multiple": false,
6251
+ "type": "option"
6252
+ },
6253
+ "file": {
6254
+ "description": "Read content from file (repeatable; each file becomes its own document)",
6255
+ "name": "file",
6256
+ "hasDynamicHelp": false,
6257
+ "multiple": true,
6258
+ "type": "option"
6259
+ },
6260
+ "medium": {
6261
+ "description": "What sort of writing this is, e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (dialogue: transcripts, interviews, calls), lecture (sustained speech nobody interrupts: talks, sermons, keynotes). 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.",
6262
+ "name": "medium",
6263
+ "hasDynamicHelp": false,
6264
+ "multiple": false,
6265
+ "type": "option"
6266
+ },
6267
+ "perspective": {
6268
+ "description": "Perspective",
6269
+ "name": "perspective",
6270
+ "default": "first-person",
6271
+ "hasDynamicHelp": false,
6272
+ "multiple": false,
6273
+ "options": [
6274
+ "first-person",
6275
+ "third-person"
6276
+ ],
6277
+ "type": "option"
6278
+ },
6276
6279
  "timeout": {
6277
- "description": "Compile timeout in seconds (default: 600)",
6280
+ "description": "Compile timeout in seconds, per document (default: 600)",
6278
6281
  "name": "timeout",
6279
6282
  "default": 600,
6280
6283
  "hasDynamicHelp": false,
@@ -6282,7 +6285,7 @@
6282
6285
  "type": "option"
6283
6286
  },
6284
6287
  "no-wait": {
6285
- "description": "Return immediately after triggering compilation. Prints the thread ID for manual polling.",
6288
+ "description": "Create and trigger compilation, then return immediately without polling.",
6286
6289
  "name": "no-wait",
6287
6290
  "allowNo": false,
6288
6291
  "type": "boolean"
@@ -6290,7 +6293,7 @@
6290
6293
  },
6291
6294
  "hasDynamicHelp": false,
6292
6295
  "hiddenAliases": [],
6293
- "id": "compile:thread:make",
6296
+ "id": "compile:doc",
6294
6297
  "pluginAlias": "faces-cli",
6295
6298
  "pluginName": "faces-cli",
6296
6299
  "pluginType": "core",
@@ -6301,20 +6304,20 @@
6301
6304
  "dist",
6302
6305
  "commands",
6303
6306
  "compile",
6304
- "thread",
6305
- "make.js"
6307
+ "doc",
6308
+ "index.js"
6306
6309
  ]
6307
6310
  },
6308
- "compile:thread:message": {
6311
+ "compile:doc:list": {
6309
6312
  "aliases": [],
6310
6313
  "args": {
6311
- "thread_id": {
6312
- "description": "Thread ID",
6313
- "name": "thread_id",
6314
+ "face_id": {
6315
+ "description": "Face alias",
6316
+ "name": "face_id",
6314
6317
  "required": true
6315
6318
  }
6316
6319
  },
6317
- "description": "Send a user message to a thread",
6320
+ "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.",
6318
6321
  "flags": {
6319
6322
  "json": {
6320
6323
  "description": "Format output as json.",
@@ -6347,25 +6350,16 @@
6347
6350
  "multiple": false,
6348
6351
  "type": "option"
6349
6352
  },
6350
- "message": {
6351
- "char": "m",
6352
- "description": "User message to append",
6353
- "name": "message",
6354
- "required": true,
6355
- "hasDynamicHelp": false,
6356
- "multiple": false,
6357
- "type": "option"
6358
- },
6359
- "oauth-only": {
6360
- "description": "Prevent fallback to paid system key (use OAuth only)",
6361
- "name": "oauth-only",
6353
+ "verbose": {
6354
+ "description": "Include each document's full text",
6355
+ "name": "verbose",
6362
6356
  "allowNo": false,
6363
6357
  "type": "boolean"
6364
6358
  }
6365
6359
  },
6366
6360
  "hasDynamicHelp": false,
6367
6361
  "hiddenAliases": [],
6368
- "id": "compile:thread:message",
6362
+ "id": "compile:doc:list",
6369
6363
  "pluginAlias": "faces-cli",
6370
6364
  "pluginName": "faces-cli",
6371
6365
  "pluginType": "core",
@@ -6376,20 +6370,20 @@
6376
6370
  "dist",
6377
6371
  "commands",
6378
6372
  "compile",
6379
- "thread",
6380
- "message.js"
6373
+ "doc",
6374
+ "list.js"
6381
6375
  ]
6382
6376
  },
6383
- "compile:thread:pause": {
6377
+ "compile:doc:make": {
6384
6378
  "aliases": [],
6385
6379
  "args": {
6386
- "thread_id": {
6387
- "description": "Thread ID",
6388
- "name": "thread_id",
6380
+ "doc_id": {
6381
+ "description": "Document ID",
6382
+ "name": "doc_id",
6389
6383
  "required": true
6390
6384
  }
6391
6385
  },
6392
- "description": "Ask a running thread compilation to stop (preserves progress, resume with make). The compile stops at the next chunk boundary; this waits for it unless --no-wait.",
6386
+ "description": "Compile an existing document (prepare + sync in one step)",
6393
6387
  "flags": {
6394
6388
  "json": {
6395
6389
  "description": "Format output as json.",
@@ -6422,24 +6416,24 @@
6422
6416
  "multiple": false,
6423
6417
  "type": "option"
6424
6418
  },
6425
- "no-wait": {
6426
- "description": "Return as soon as the pause is accepted, without waiting for the compile to stop.",
6427
- "name": "no-wait",
6428
- "allowNo": false,
6429
- "type": "boolean"
6430
- },
6431
6419
  "timeout": {
6432
- "description": "Seconds to wait for the compile to stop (default: 60)",
6420
+ "description": "Compile timeout in seconds (default: 600)",
6433
6421
  "name": "timeout",
6434
- "default": 60,
6422
+ "default": 600,
6435
6423
  "hasDynamicHelp": false,
6436
6424
  "multiple": false,
6437
6425
  "type": "option"
6426
+ },
6427
+ "no-wait": {
6428
+ "description": "Return immediately after triggering compilation. Prints the document ID for manual polling.",
6429
+ "name": "no-wait",
6430
+ "allowNo": false,
6431
+ "type": "boolean"
6438
6432
  }
6439
6433
  },
6440
6434
  "hasDynamicHelp": false,
6441
6435
  "hiddenAliases": [],
6442
- "id": "compile:thread:pause",
6436
+ "id": "compile:doc:make",
6443
6437
  "pluginAlias": "faces-cli",
6444
6438
  "pluginName": "faces-cli",
6445
6439
  "pluginType": "core",
@@ -6450,20 +6444,20 @@
6450
6444
  "dist",
6451
6445
  "commands",
6452
6446
  "compile",
6453
- "thread",
6454
- "pause.js"
6447
+ "doc",
6448
+ "make.js"
6455
6449
  ]
6456
6450
  },
6457
- "compile:thread:reset": {
6451
+ "compile:doc:pause": {
6458
6452
  "aliases": [],
6459
6453
  "args": {
6460
- "thread_id": {
6461
- "description": "Thread ID",
6462
- "name": "thread_id",
6454
+ "doc_id": {
6455
+ "description": "Document ID",
6456
+ "name": "doc_id",
6463
6457
  "required": true
6464
6458
  }
6465
6459
  },
6466
- "description": "Reset thread compilation progress (wipe extraction, keep source messages)",
6460
+ "description": "Ask a running document compilation to stop (preserves progress, resume with make). The compile stops at the next chunk boundary; this waits for it unless --no-wait.",
6467
6461
  "flags": {
6468
6462
  "json": {
6469
6463
  "description": "Format output as json.",
@@ -6496,16 +6490,24 @@
6496
6490
  "multiple": false,
6497
6491
  "type": "option"
6498
6492
  },
6499
- "yes": {
6500
- "description": "Skip confirmation",
6501
- "name": "yes",
6493
+ "no-wait": {
6494
+ "description": "Return as soon as the pause is accepted, without waiting for the compile to stop.",
6495
+ "name": "no-wait",
6502
6496
  "allowNo": false,
6503
6497
  "type": "boolean"
6498
+ },
6499
+ "timeout": {
6500
+ "description": "Seconds to wait for the compile to stop (default: 60)",
6501
+ "name": "timeout",
6502
+ "default": 60,
6503
+ "hasDynamicHelp": false,
6504
+ "multiple": false,
6505
+ "type": "option"
6504
6506
  }
6505
6507
  },
6506
6508
  "hasDynamicHelp": false,
6507
6509
  "hiddenAliases": [],
6508
- "id": "compile:thread:reset",
6510
+ "id": "compile:doc:pause",
6509
6511
  "pluginAlias": "faces-cli",
6510
6512
  "pluginName": "faces-cli",
6511
6513
  "pluginType": "core",
@@ -6516,20 +6518,20 @@
6516
6518
  "dist",
6517
6519
  "commands",
6518
6520
  "compile",
6519
- "thread",
6520
- "reset.js"
6521
+ "doc",
6522
+ "pause.js"
6521
6523
  ]
6522
6524
  },
6523
- "compile:thread:sync": {
6525
+ "compile:doc:reset": {
6524
6526
  "aliases": [],
6525
6527
  "args": {
6526
- "thread_id": {
6527
- "description": "Thread ID",
6528
- "name": "thread_id",
6528
+ "doc_id": {
6529
+ "description": "Document ID",
6530
+ "name": "doc_id",
6529
6531
  "required": true
6530
6532
  }
6531
6533
  },
6532
- "description": "Archive and sync a thread into a face",
6534
+ "description": "Reset document compilation progress (wipe extraction, keep content)",
6533
6535
  "flags": {
6534
6536
  "json": {
6535
6537
  "description": "Format output as json.",
@@ -6561,11 +6563,17 @@
6561
6563
  "hasDynamicHelp": false,
6562
6564
  "multiple": false,
6563
6565
  "type": "option"
6566
+ },
6567
+ "yes": {
6568
+ "description": "Skip confirmation",
6569
+ "name": "yes",
6570
+ "allowNo": false,
6571
+ "type": "boolean"
6564
6572
  }
6565
6573
  },
6566
6574
  "hasDynamicHelp": false,
6567
6575
  "hiddenAliases": [],
6568
- "id": "compile:thread:sync",
6576
+ "id": "compile:doc:reset",
6569
6577
  "pluginAlias": "faces-cli",
6570
6578
  "pluginName": "faces-cli",
6571
6579
  "pluginType": "core",
@@ -6576,8 +6584,8 @@
6576
6584
  "dist",
6577
6585
  "commands",
6578
6586
  "compile",
6579
- "thread",
6580
- "sync.js"
6587
+ "doc",
6588
+ "reset.js"
6581
6589
  ]
6582
6590
  },
6583
6591
  "face:tag:add": {
@@ -7157,5 +7165,5 @@
7157
7165
  ]
7158
7166
  }
7159
7167
  },
7160
- "version": "1.8.7"
7168
+ "version": "1.8.8"
7161
7169
  }