faces-cli 1.5.14 → 1.6.0

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.
@@ -1,9 +1,23 @@
1
1
  {
2
2
  "commands": {
3
- "account:state": {
3
+ "account:preferences": {
4
4
  "aliases": [],
5
- "args": {},
6
- "description": "Full account routing state (plan, balance, onboarding)",
5
+ "args": {
6
+ "key": {
7
+ "description": "Preference key to update (api_fallback, default_model)",
8
+ "name": "key"
9
+ },
10
+ "value": {
11
+ "description": "New value",
12
+ "name": "value"
13
+ }
14
+ },
15
+ "description": "View or update account preferences (api_fallback, default_model)",
16
+ "examples": [
17
+ "faces account:preferences",
18
+ "faces account:preferences default_model gpt-5.4",
19
+ "faces account:preferences api_fallback true"
20
+ ],
7
21
  "flags": {
8
22
  "json": {
9
23
  "description": "Format output as json.",
@@ -39,7 +53,7 @@
39
53
  },
40
54
  "hasDynamicHelp": false,
41
55
  "hiddenAliases": [],
42
- "id": "account:state",
56
+ "id": "account:preferences",
43
57
  "pluginAlias": "faces-cli",
44
58
  "pluginName": "faces-cli",
45
59
  "pluginType": "core",
@@ -50,13 +64,13 @@
50
64
  "dist",
51
65
  "commands",
52
66
  "account",
53
- "state.js"
67
+ "preferences.js"
54
68
  ]
55
69
  },
56
- "billing:balance": {
70
+ "account:state": {
57
71
  "aliases": [],
58
72
  "args": {},
59
- "description": "Show credit balance and payment method status",
73
+ "description": "Full account routing state (plan, balance, onboarding)",
60
74
  "flags": {
61
75
  "json": {
62
76
  "description": "Format output as json.",
@@ -92,7 +106,7 @@
92
106
  },
93
107
  "hasDynamicHelp": false,
94
108
  "hiddenAliases": [],
95
- "id": "billing:balance",
109
+ "id": "account:state",
96
110
  "pluginAlias": "faces-cli",
97
111
  "pluginName": "faces-cli",
98
112
  "pluginType": "core",
@@ -102,14 +116,27 @@
102
116
  "relativePath": [
103
117
  "dist",
104
118
  "commands",
105
- "billing",
106
- "balance.js"
119
+ "account",
120
+ "state.js"
107
121
  ]
108
122
  },
109
- "billing:card-setup": {
123
+ "auth:connect": {
110
124
  "aliases": [],
111
- "args": {},
112
- "description": "Get a Stripe card setup URL to save a payment method",
125
+ "args": {
126
+ "provider": {
127
+ "description": "OAuth provider to connect",
128
+ "name": "provider",
129
+ "options": [
130
+ "openai"
131
+ ],
132
+ "required": true
133
+ }
134
+ },
135
+ "description": "Connect an OAuth provider account to Faces (e.g. ChatGPT Plus/Pro)",
136
+ "examples": [
137
+ "<%= config.bin %> auth connect openai",
138
+ "<%= config.bin %> auth connect openai --manual"
139
+ ],
113
140
  "flags": {
114
141
  "json": {
115
142
  "description": "Format output as json.",
@@ -141,11 +168,17 @@
141
168
  "hasDynamicHelp": false,
142
169
  "multiple": false,
143
170
  "type": "option"
171
+ },
172
+ "manual": {
173
+ "description": "Manual mode for headless environments: prints the authorize URL and prompts you to paste the callback URL after approving in any browser.",
174
+ "name": "manual",
175
+ "allowNo": false,
176
+ "type": "boolean"
144
177
  }
145
178
  },
146
179
  "hasDynamicHelp": false,
147
180
  "hiddenAliases": [],
148
- "id": "billing:card-setup",
181
+ "id": "auth:connect",
149
182
  "pluginAlias": "faces-cli",
150
183
  "pluginName": "faces-cli",
151
184
  "pluginType": "core",
@@ -155,14 +188,18 @@
155
188
  "relativePath": [
156
189
  "dist",
157
190
  "commands",
158
- "billing",
159
- "card-setup.js"
191
+ "auth",
192
+ "connect.js"
160
193
  ]
161
194
  },
162
- "billing:checkout": {
195
+ "auth:connections": {
163
196
  "aliases": [],
164
197
  "args": {},
165
- "description": "Get a Stripe checkout URL to upgrade your subscription plan",
198
+ "description": "List connected OAuth provider accounts",
199
+ "examples": [
200
+ "<%= config.bin %> auth connections",
201
+ "<%= config.bin %> auth connections --json"
202
+ ],
166
203
  "flags": {
167
204
  "json": {
168
205
  "description": "Format output as json.",
@@ -194,22 +231,11 @@
194
231
  "hasDynamicHelp": false,
195
232
  "multiple": false,
196
233
  "type": "option"
197
- },
198
- "plan": {
199
- "description": "Plan to subscribe to",
200
- "name": "plan",
201
- "default": "connect",
202
- "hasDynamicHelp": false,
203
- "multiple": false,
204
- "options": [
205
- "connect"
206
- ],
207
- "type": "option"
208
234
  }
209
235
  },
210
236
  "hasDynamicHelp": false,
211
237
  "hiddenAliases": [],
212
- "id": "billing:checkout",
238
+ "id": "auth:connections",
213
239
  "pluginAlias": "faces-cli",
214
240
  "pluginName": "faces-cli",
215
241
  "pluginType": "core",
@@ -219,14 +245,26 @@
219
245
  "relativePath": [
220
246
  "dist",
221
247
  "commands",
222
- "billing",
223
- "checkout.js"
248
+ "auth",
249
+ "connections.js"
224
250
  ]
225
251
  },
226
- "billing:llm-costs": {
252
+ "auth:disconnect": {
227
253
  "aliases": [],
228
- "args": {},
229
- "description": "List available LLMs and their per-token costs",
254
+ "args": {
255
+ "provider": {
256
+ "description": "OAuth provider to disconnect",
257
+ "name": "provider",
258
+ "options": [
259
+ "openai"
260
+ ],
261
+ "required": true
262
+ }
263
+ },
264
+ "description": "Disconnect a linked OAuth provider account",
265
+ "examples": [
266
+ "<%= config.bin %> auth disconnect openai"
267
+ ],
230
268
  "flags": {
231
269
  "json": {
232
270
  "description": "Format output as json.",
@@ -258,18 +296,11 @@
258
296
  "hasDynamicHelp": false,
259
297
  "multiple": false,
260
298
  "type": "option"
261
- },
262
- "provider": {
263
- "description": "Filter by provider (e.g. openai, anthropic)",
264
- "name": "provider",
265
- "hasDynamicHelp": false,
266
- "multiple": false,
267
- "type": "option"
268
299
  }
269
300
  },
270
301
  "hasDynamicHelp": false,
271
302
  "hiddenAliases": [],
272
- "id": "billing:llm-costs",
303
+ "id": "auth:disconnect",
273
304
  "pluginAlias": "faces-cli",
274
305
  "pluginName": "faces-cli",
275
306
  "pluginType": "core",
@@ -279,14 +310,14 @@
279
310
  "relativePath": [
280
311
  "dist",
281
312
  "commands",
282
- "billing",
283
- "llm-costs.js"
313
+ "auth",
314
+ "disconnect.js"
284
315
  ]
285
316
  },
286
- "billing:quota": {
317
+ "auth:login": {
287
318
  "aliases": [],
288
319
  "args": {},
289
- "description": "Show compile token quota and per-face stats",
320
+ "description": "Login and save JWT credentials",
290
321
  "flags": {
291
322
  "json": {
292
323
  "description": "Format output as json.",
@@ -318,11 +349,27 @@
318
349
  "hasDynamicHelp": false,
319
350
  "multiple": false,
320
351
  "type": "option"
352
+ },
353
+ "email": {
354
+ "description": "Account email",
355
+ "name": "email",
356
+ "required": true,
357
+ "hasDynamicHelp": false,
358
+ "multiple": false,
359
+ "type": "option"
360
+ },
361
+ "password": {
362
+ "description": "Account password",
363
+ "name": "password",
364
+ "required": true,
365
+ "hasDynamicHelp": false,
366
+ "multiple": false,
367
+ "type": "option"
321
368
  }
322
369
  },
323
370
  "hasDynamicHelp": false,
324
371
  "hiddenAliases": [],
325
- "id": "billing:quota",
372
+ "id": "auth:login",
326
373
  "pluginAlias": "faces-cli",
327
374
  "pluginName": "faces-cli",
328
375
  "pluginType": "core",
@@ -332,14 +379,14 @@
332
379
  "relativePath": [
333
380
  "dist",
334
381
  "commands",
335
- "billing",
336
- "quota.js"
382
+ "auth",
383
+ "login.js"
337
384
  ]
338
385
  },
339
- "billing:subscription": {
386
+ "auth:logout": {
340
387
  "aliases": [],
341
388
  "args": {},
342
- "description": "Show current plan, face count, and renewal date",
389
+ "description": "Clear saved credentials",
343
390
  "flags": {
344
391
  "json": {
345
392
  "description": "Format output as json.",
@@ -375,7 +422,7 @@
375
422
  },
376
423
  "hasDynamicHelp": false,
377
424
  "hiddenAliases": [],
378
- "id": "billing:subscription",
425
+ "id": "auth:logout",
379
426
  "pluginAlias": "faces-cli",
380
427
  "pluginName": "faces-cli",
381
428
  "pluginType": "core",
@@ -385,14 +432,14 @@
385
432
  "relativePath": [
386
433
  "dist",
387
434
  "commands",
388
- "billing",
389
- "subscription.js"
435
+ "auth",
436
+ "logout.js"
390
437
  ]
391
438
  },
392
- "billing:topup": {
439
+ "auth:refresh": {
393
440
  "aliases": [],
394
441
  "args": {},
395
- "description": "Top up credit balance using saved payment method",
442
+ "description": "Exchange current JWT for a fresh one",
396
443
  "flags": {
397
444
  "json": {
398
445
  "description": "Format output as json.",
@@ -424,26 +471,11 @@
424
471
  "hasDynamicHelp": false,
425
472
  "multiple": false,
426
473
  "type": "option"
427
- },
428
- "amount": {
429
- "description": "Top-up amount in USD (min $1)",
430
- "name": "amount",
431
- "required": true,
432
- "hasDynamicHelp": false,
433
- "multiple": false,
434
- "type": "option"
435
- },
436
- "payment-ref": {
437
- "description": "Payment reference (admin/test path)",
438
- "name": "payment-ref",
439
- "hasDynamicHelp": false,
440
- "multiple": false,
441
- "type": "option"
442
474
  }
443
475
  },
444
476
  "hasDynamicHelp": false,
445
477
  "hiddenAliases": [],
446
- "id": "billing:topup",
478
+ "id": "auth:refresh",
447
479
  "pluginAlias": "faces-cli",
448
480
  "pluginName": "faces-cli",
449
481
  "pluginType": "core",
@@ -453,14 +485,14 @@
453
485
  "relativePath": [
454
486
  "dist",
455
487
  "commands",
456
- "billing",
457
- "topup.js"
488
+ "auth",
489
+ "refresh.js"
458
490
  ]
459
491
  },
460
- "billing:usage": {
492
+ "auth:register": {
461
493
  "aliases": [],
462
494
  "args": {},
463
- "description": "Aggregated usage analytics",
495
+ "description": "Create a new Faces account",
464
496
  "flags": {
465
497
  "json": {
466
498
  "description": "Format output as json.",
@@ -493,37 +525,60 @@
493
525
  "multiple": false,
494
526
  "type": "option"
495
527
  },
496
- "group-by": {
497
- "description": "Group results",
498
- "name": "group-by",
528
+ "email": {
529
+ "description": "Email address",
530
+ "name": "email",
531
+ "required": true,
499
532
  "hasDynamicHelp": false,
500
533
  "multiple": false,
501
- "options": [
502
- "api_key",
503
- "model",
504
- "llm",
505
- "date"
506
- ],
507
534
  "type": "option"
508
535
  },
509
- "from": {
510
- "description": "Start date (YYYY-MM-DD)",
511
- "name": "from",
536
+ "password": {
537
+ "description": "Password",
538
+ "name": "password",
539
+ "required": true,
512
540
  "hasDynamicHelp": false,
513
541
  "multiple": false,
514
542
  "type": "option"
515
543
  },
516
- "to": {
517
- "description": "End date (YYYY-MM-DD)",
518
- "name": "to",
544
+ "name": {
545
+ "description": "Display name (defaults to username)",
546
+ "name": "name",
547
+ "hasDynamicHelp": false,
548
+ "multiple": false,
549
+ "type": "option"
550
+ },
551
+ "username": {
552
+ "description": "Username (lowercase, dashes, numbers)",
553
+ "name": "username",
554
+ "required": true,
555
+ "hasDynamicHelp": false,
556
+ "multiple": false,
557
+ "type": "option"
558
+ },
559
+ "invite-key": {
560
+ "description": "Invite key (if required)",
561
+ "name": "invite-key",
562
+ "hasDynamicHelp": false,
563
+ "multiple": false,
564
+ "type": "option"
565
+ },
566
+ "plan": {
567
+ "description": "Plan to subscribe to: \"free\" ($5 activation) or \"connect\" ($17/mo, no activation fee)",
568
+ "name": "plan",
569
+ "default": "free",
519
570
  "hasDynamicHelp": false,
520
571
  "multiple": false,
572
+ "options": [
573
+ "free",
574
+ "connect"
575
+ ],
521
576
  "type": "option"
522
577
  }
523
578
  },
524
579
  "hasDynamicHelp": false,
525
580
  "hiddenAliases": [],
526
- "id": "billing:usage",
581
+ "id": "auth:register",
527
582
  "pluginAlias": "faces-cli",
528
583
  "pluginName": "faces-cli",
529
584
  "pluginType": "core",
@@ -533,14 +588,14 @@
533
588
  "relativePath": [
534
589
  "dist",
535
590
  "commands",
536
- "billing",
537
- "usage.js"
591
+ "auth",
592
+ "register.js"
538
593
  ]
539
594
  },
540
- "catalog:doctor": {
595
+ "auth:whoami": {
541
596
  "aliases": [],
542
597
  "args": {},
543
- "description": "Diagnose and repair the local face catalog",
598
+ "description": "Print current user profile and auth diagnostic",
544
599
  "flags": {
545
600
  "json": {
546
601
  "description": "Format output as json.",
@@ -572,23 +627,11 @@
572
627
  "hasDynamicHelp": false,
573
628
  "multiple": false,
574
629
  "type": "option"
575
- },
576
- "fix": {
577
- "description": "Rebuild missing or stale catalog entries from API",
578
- "name": "fix",
579
- "allowNo": false,
580
- "type": "boolean"
581
- },
582
- "generate": {
583
- "description": "Fix + generate missing descriptions via LLM",
584
- "name": "generate",
585
- "allowNo": false,
586
- "type": "boolean"
587
630
  }
588
631
  },
589
632
  "hasDynamicHelp": false,
590
633
  "hiddenAliases": [],
591
- "id": "catalog:doctor",
634
+ "id": "auth:whoami",
592
635
  "pluginAlias": "faces-cli",
593
636
  "pluginName": "faces-cli",
594
637
  "pluginType": "core",
@@ -598,14 +641,14 @@
598
641
  "relativePath": [
599
642
  "dist",
600
643
  "commands",
601
- "catalog",
602
- "doctor.js"
644
+ "auth",
645
+ "whoami.js"
603
646
  ]
604
647
  },
605
- "catalog:list": {
648
+ "billing:balance": {
606
649
  "aliases": [],
607
650
  "args": {},
608
- "description": "List all faces in the local catalog",
651
+ "description": "Show credit balance and payment method status",
609
652
  "flags": {
610
653
  "json": {
611
654
  "description": "Format output as json.",
@@ -641,7 +684,7 @@
641
684
  },
642
685
  "hasDynamicHelp": false,
643
686
  "hiddenAliases": [],
644
- "id": "catalog:list",
687
+ "id": "billing:balance",
645
688
  "pluginAlias": "faces-cli",
646
689
  "pluginName": "faces-cli",
647
690
  "pluginType": "core",
@@ -651,14 +694,14 @@
651
694
  "relativePath": [
652
695
  "dist",
653
696
  "commands",
654
- "catalog",
655
- "list.js"
697
+ "billing",
698
+ "balance.js"
656
699
  ]
657
700
  },
658
- "catalog:manyfaced": {
701
+ "billing:card-setup": {
659
702
  "aliases": [],
660
703
  "args": {},
661
- "description": "Browse and install community manyfaced skills from github.com/facessh/manyfaced",
704
+ "description": "Get a Stripe card setup URL to save a payment method",
662
705
  "flags": {
663
706
  "json": {
664
707
  "description": "Format output as json.",
@@ -690,38 +733,75 @@
690
733
  "hasDynamicHelp": false,
691
734
  "multiple": false,
692
735
  "type": "option"
736
+ }
737
+ },
738
+ "hasDynamicHelp": false,
739
+ "hiddenAliases": [],
740
+ "id": "billing:card-setup",
741
+ "pluginAlias": "faces-cli",
742
+ "pluginName": "faces-cli",
743
+ "pluginType": "core",
744
+ "strict": true,
745
+ "enableJsonFlag": true,
746
+ "isESM": true,
747
+ "relativePath": [
748
+ "dist",
749
+ "commands",
750
+ "billing",
751
+ "card-setup.js"
752
+ ]
753
+ },
754
+ "billing:checkout": {
755
+ "aliases": [],
756
+ "args": {},
757
+ "description": "Get a Stripe checkout URL to upgrade your subscription plan",
758
+ "flags": {
759
+ "json": {
760
+ "description": "Format output as json.",
761
+ "helpGroup": "GLOBAL",
762
+ "name": "json",
763
+ "allowNo": false,
764
+ "type": "boolean"
693
765
  },
694
- "skill": {
695
- "description": "Show details for a specific skill",
696
- "name": "skill",
766
+ "base-url": {
767
+ "description": "API base URL",
768
+ "env": "FACES_BASE_URL",
769
+ "name": "base-url",
697
770
  "hasDynamicHelp": false,
698
771
  "multiple": false,
699
772
  "type": "option"
700
773
  },
701
- "install": {
702
- "description": "Install a skill by name",
703
- "name": "install",
774
+ "token": {
775
+ "description": "JWT bearer token",
776
+ "env": "FACES_TOKEN",
777
+ "name": "token",
704
778
  "hasDynamicHelp": false,
705
779
  "multiple": false,
706
780
  "type": "option"
707
781
  },
708
- "skills-dir": {
709
- "description": "Directory to install skills into (required for --install)",
710
- "name": "skills-dir",
782
+ "api-key": {
783
+ "description": "API key",
784
+ "env": "FACES_API_KEY",
785
+ "name": "api-key",
711
786
  "hasDynamicHelp": false,
712
787
  "multiple": false,
713
788
  "type": "option"
714
789
  },
715
- "refresh": {
716
- "description": "Force refresh the skill index (ignore cache)",
717
- "name": "refresh",
718
- "allowNo": false,
719
- "type": "boolean"
790
+ "plan": {
791
+ "description": "Plan to subscribe to",
792
+ "name": "plan",
793
+ "default": "connect",
794
+ "hasDynamicHelp": false,
795
+ "multiple": false,
796
+ "options": [
797
+ "connect"
798
+ ],
799
+ "type": "option"
720
800
  }
721
801
  },
722
802
  "hasDynamicHelp": false,
723
803
  "hiddenAliases": [],
724
- "id": "catalog:manyfaced",
804
+ "id": "billing:checkout",
725
805
  "pluginAlias": "faces-cli",
726
806
  "pluginName": "faces-cli",
727
807
  "pluginType": "core",
@@ -731,27 +811,14 @@
731
811
  "relativePath": [
732
812
  "dist",
733
813
  "commands",
734
- "catalog",
735
- "manyfaced.js"
814
+ "billing",
815
+ "checkout.js"
736
816
  ]
737
817
  },
738
- "auth:connect": {
818
+ "billing:llm-costs": {
739
819
  "aliases": [],
740
- "args": {
741
- "provider": {
742
- "description": "OAuth provider to connect",
743
- "name": "provider",
744
- "options": [
745
- "openai"
746
- ],
747
- "required": true
748
- }
749
- },
750
- "description": "Connect an OAuth provider account to Faces (e.g. ChatGPT Plus/Pro)",
751
- "examples": [
752
- "<%= config.bin %> auth connect openai",
753
- "<%= config.bin %> auth connect openai --manual"
754
- ],
820
+ "args": {},
821
+ "description": "List available LLMs and their per-token costs",
755
822
  "flags": {
756
823
  "json": {
757
824
  "description": "Format output as json.",
@@ -784,16 +851,17 @@
784
851
  "multiple": false,
785
852
  "type": "option"
786
853
  },
787
- "manual": {
788
- "description": "Manual mode for headless environments: prints the authorize URL and prompts you to paste the callback URL after approving in any browser.",
789
- "name": "manual",
790
- "allowNo": false,
791
- "type": "boolean"
854
+ "provider": {
855
+ "description": "Filter by provider (e.g. openai, anthropic)",
856
+ "name": "provider",
857
+ "hasDynamicHelp": false,
858
+ "multiple": false,
859
+ "type": "option"
792
860
  }
793
861
  },
794
862
  "hasDynamicHelp": false,
795
863
  "hiddenAliases": [],
796
- "id": "auth:connect",
864
+ "id": "billing:llm-costs",
797
865
  "pluginAlias": "faces-cli",
798
866
  "pluginName": "faces-cli",
799
867
  "pluginType": "core",
@@ -803,18 +871,14 @@
803
871
  "relativePath": [
804
872
  "dist",
805
873
  "commands",
806
- "auth",
807
- "connect.js"
874
+ "billing",
875
+ "llm-costs.js"
808
876
  ]
809
877
  },
810
- "auth:connections": {
878
+ "billing:quota": {
811
879
  "aliases": [],
812
880
  "args": {},
813
- "description": "List connected OAuth provider accounts",
814
- "examples": [
815
- "<%= config.bin %> auth connections",
816
- "<%= config.bin %> auth connections --json"
817
- ],
881
+ "description": "Show compile token quota and per-face stats",
818
882
  "flags": {
819
883
  "json": {
820
884
  "description": "Format output as json.",
@@ -850,7 +914,7 @@
850
914
  },
851
915
  "hasDynamicHelp": false,
852
916
  "hiddenAliases": [],
853
- "id": "auth:connections",
917
+ "id": "billing:quota",
854
918
  "pluginAlias": "faces-cli",
855
919
  "pluginName": "faces-cli",
856
920
  "pluginType": "core",
@@ -860,26 +924,14 @@
860
924
  "relativePath": [
861
925
  "dist",
862
926
  "commands",
863
- "auth",
864
- "connections.js"
927
+ "billing",
928
+ "quota.js"
865
929
  ]
866
930
  },
867
- "auth:disconnect": {
931
+ "billing:subscription": {
868
932
  "aliases": [],
869
- "args": {
870
- "provider": {
871
- "description": "OAuth provider to disconnect",
872
- "name": "provider",
873
- "options": [
874
- "openai"
875
- ],
876
- "required": true
877
- }
878
- },
879
- "description": "Disconnect a linked OAuth provider account",
880
- "examples": [
881
- "<%= config.bin %> auth disconnect openai"
882
- ],
933
+ "args": {},
934
+ "description": "Show current plan, face count, and renewal date",
883
935
  "flags": {
884
936
  "json": {
885
937
  "description": "Format output as json.",
@@ -915,7 +967,7 @@
915
967
  },
916
968
  "hasDynamicHelp": false,
917
969
  "hiddenAliases": [],
918
- "id": "auth:disconnect",
970
+ "id": "billing:subscription",
919
971
  "pluginAlias": "faces-cli",
920
972
  "pluginName": "faces-cli",
921
973
  "pluginType": "core",
@@ -925,14 +977,14 @@
925
977
  "relativePath": [
926
978
  "dist",
927
979
  "commands",
928
- "auth",
929
- "disconnect.js"
980
+ "billing",
981
+ "subscription.js"
930
982
  ]
931
983
  },
932
- "auth:login": {
984
+ "billing:topup": {
933
985
  "aliases": [],
934
986
  "args": {},
935
- "description": "Login and save JWT credentials",
987
+ "description": "Top up credit balance using saved payment method",
936
988
  "flags": {
937
989
  "json": {
938
990
  "description": "Format output as json.",
@@ -965,18 +1017,17 @@
965
1017
  "multiple": false,
966
1018
  "type": "option"
967
1019
  },
968
- "email": {
969
- "description": "Account email",
970
- "name": "email",
1020
+ "amount": {
1021
+ "description": "Top-up amount in USD (min $1)",
1022
+ "name": "amount",
971
1023
  "required": true,
972
1024
  "hasDynamicHelp": false,
973
1025
  "multiple": false,
974
1026
  "type": "option"
975
1027
  },
976
- "password": {
977
- "description": "Account password",
978
- "name": "password",
979
- "required": true,
1028
+ "payment-ref": {
1029
+ "description": "Payment reference (admin/test path)",
1030
+ "name": "payment-ref",
980
1031
  "hasDynamicHelp": false,
981
1032
  "multiple": false,
982
1033
  "type": "option"
@@ -984,7 +1035,7 @@
984
1035
  },
985
1036
  "hasDynamicHelp": false,
986
1037
  "hiddenAliases": [],
987
- "id": "auth:login",
1038
+ "id": "billing:topup",
988
1039
  "pluginAlias": "faces-cli",
989
1040
  "pluginName": "faces-cli",
990
1041
  "pluginType": "core",
@@ -994,14 +1045,14 @@
994
1045
  "relativePath": [
995
1046
  "dist",
996
1047
  "commands",
997
- "auth",
998
- "login.js"
1048
+ "billing",
1049
+ "topup.js"
999
1050
  ]
1000
1051
  },
1001
- "auth:logout": {
1052
+ "billing:usage": {
1002
1053
  "aliases": [],
1003
1054
  "args": {},
1004
- "description": "Clear saved credentials",
1055
+ "description": "Aggregated usage analytics",
1005
1056
  "flags": {
1006
1057
  "json": {
1007
1058
  "description": "Format output as json.",
@@ -1033,11 +1084,38 @@
1033
1084
  "hasDynamicHelp": false,
1034
1085
  "multiple": false,
1035
1086
  "type": "option"
1087
+ },
1088
+ "group-by": {
1089
+ "description": "Group results",
1090
+ "name": "group-by",
1091
+ "hasDynamicHelp": false,
1092
+ "multiple": false,
1093
+ "options": [
1094
+ "api_key",
1095
+ "model",
1096
+ "llm",
1097
+ "date"
1098
+ ],
1099
+ "type": "option"
1100
+ },
1101
+ "from": {
1102
+ "description": "Start date (YYYY-MM-DD)",
1103
+ "name": "from",
1104
+ "hasDynamicHelp": false,
1105
+ "multiple": false,
1106
+ "type": "option"
1107
+ },
1108
+ "to": {
1109
+ "description": "End date (YYYY-MM-DD)",
1110
+ "name": "to",
1111
+ "hasDynamicHelp": false,
1112
+ "multiple": false,
1113
+ "type": "option"
1036
1114
  }
1037
1115
  },
1038
1116
  "hasDynamicHelp": false,
1039
1117
  "hiddenAliases": [],
1040
- "id": "auth:logout",
1118
+ "id": "billing:usage",
1041
1119
  "pluginAlias": "faces-cli",
1042
1120
  "pluginName": "faces-cli",
1043
1121
  "pluginType": "core",
@@ -1047,14 +1125,14 @@
1047
1125
  "relativePath": [
1048
1126
  "dist",
1049
1127
  "commands",
1050
- "auth",
1051
- "logout.js"
1128
+ "billing",
1129
+ "usage.js"
1052
1130
  ]
1053
1131
  },
1054
- "auth:refresh": {
1132
+ "catalog:backup": {
1055
1133
  "aliases": [],
1056
1134
  "args": {},
1057
- "description": "Exchange current JWT for a fresh one",
1135
+ "description": "Snapshot all faces and source material for migration",
1058
1136
  "flags": {
1059
1137
  "json": {
1060
1138
  "description": "Format output as json.",
@@ -1090,7 +1168,7 @@
1090
1168
  },
1091
1169
  "hasDynamicHelp": false,
1092
1170
  "hiddenAliases": [],
1093
- "id": "auth:refresh",
1171
+ "id": "catalog:backup",
1094
1172
  "pluginAlias": "faces-cli",
1095
1173
  "pluginName": "faces-cli",
1096
1174
  "pluginType": "core",
@@ -1100,14 +1178,14 @@
1100
1178
  "relativePath": [
1101
1179
  "dist",
1102
1180
  "commands",
1103
- "auth",
1104
- "refresh.js"
1181
+ "catalog",
1182
+ "backup.js"
1105
1183
  ]
1106
1184
  },
1107
- "auth:register": {
1185
+ "catalog:doctor": {
1108
1186
  "aliases": [],
1109
1187
  "args": {},
1110
- "description": "Create a new Faces account",
1188
+ "description": "Diagnose and repair the local face catalog",
1111
1189
  "flags": {
1112
1190
  "json": {
1113
1191
  "description": "Format output as json.",
@@ -1140,60 +1218,75 @@
1140
1218
  "multiple": false,
1141
1219
  "type": "option"
1142
1220
  },
1143
- "email": {
1144
- "description": "Email address",
1145
- "name": "email",
1146
- "required": true,
1147
- "hasDynamicHelp": false,
1148
- "multiple": false,
1149
- "type": "option"
1150
- },
1151
- "password": {
1152
- "description": "Password",
1153
- "name": "password",
1154
- "required": true,
1155
- "hasDynamicHelp": false,
1156
- "multiple": false,
1157
- "type": "option"
1158
- },
1159
- "name": {
1160
- "description": "Display name (defaults to username)",
1161
- "name": "name",
1162
- "hasDynamicHelp": false,
1163
- "multiple": false,
1164
- "type": "option"
1221
+ "fix": {
1222
+ "description": "Rebuild missing or stale catalog entries from API",
1223
+ "name": "fix",
1224
+ "allowNo": false,
1225
+ "type": "boolean"
1165
1226
  },
1166
- "username": {
1167
- "description": "Username (lowercase, dashes, numbers)",
1168
- "name": "username",
1169
- "required": true,
1227
+ "generate": {
1228
+ "description": "Fix + generate missing descriptions via LLM",
1229
+ "name": "generate",
1230
+ "allowNo": false,
1231
+ "type": "boolean"
1232
+ }
1233
+ },
1234
+ "hasDynamicHelp": false,
1235
+ "hiddenAliases": [],
1236
+ "id": "catalog:doctor",
1237
+ "pluginAlias": "faces-cli",
1238
+ "pluginName": "faces-cli",
1239
+ "pluginType": "core",
1240
+ "strict": true,
1241
+ "enableJsonFlag": true,
1242
+ "isESM": true,
1243
+ "relativePath": [
1244
+ "dist",
1245
+ "commands",
1246
+ "catalog",
1247
+ "doctor.js"
1248
+ ]
1249
+ },
1250
+ "catalog:list": {
1251
+ "aliases": [],
1252
+ "args": {},
1253
+ "description": "List all faces in the local catalog",
1254
+ "flags": {
1255
+ "json": {
1256
+ "description": "Format output as json.",
1257
+ "helpGroup": "GLOBAL",
1258
+ "name": "json",
1259
+ "allowNo": false,
1260
+ "type": "boolean"
1261
+ },
1262
+ "base-url": {
1263
+ "description": "API base URL",
1264
+ "env": "FACES_BASE_URL",
1265
+ "name": "base-url",
1170
1266
  "hasDynamicHelp": false,
1171
1267
  "multiple": false,
1172
1268
  "type": "option"
1173
1269
  },
1174
- "invite-key": {
1175
- "description": "Invite key (if required)",
1176
- "name": "invite-key",
1270
+ "token": {
1271
+ "description": "JWT bearer token",
1272
+ "env": "FACES_TOKEN",
1273
+ "name": "token",
1177
1274
  "hasDynamicHelp": false,
1178
1275
  "multiple": false,
1179
1276
  "type": "option"
1180
1277
  },
1181
- "plan": {
1182
- "description": "Plan to subscribe to: \"free\" ($5 activation) or \"connect\" ($17/mo, no activation fee)",
1183
- "name": "plan",
1184
- "default": "free",
1278
+ "api-key": {
1279
+ "description": "API key",
1280
+ "env": "FACES_API_KEY",
1281
+ "name": "api-key",
1185
1282
  "hasDynamicHelp": false,
1186
1283
  "multiple": false,
1187
- "options": [
1188
- "free",
1189
- "connect"
1190
- ],
1191
1284
  "type": "option"
1192
1285
  }
1193
1286
  },
1194
1287
  "hasDynamicHelp": false,
1195
1288
  "hiddenAliases": [],
1196
- "id": "auth:register",
1289
+ "id": "catalog:list",
1197
1290
  "pluginAlias": "faces-cli",
1198
1291
  "pluginName": "faces-cli",
1199
1292
  "pluginType": "core",
@@ -1203,14 +1296,14 @@
1203
1296
  "relativePath": [
1204
1297
  "dist",
1205
1298
  "commands",
1206
- "auth",
1207
- "register.js"
1299
+ "catalog",
1300
+ "list.js"
1208
1301
  ]
1209
1302
  },
1210
- "auth:whoami": {
1303
+ "catalog:manyfaced": {
1211
1304
  "aliases": [],
1212
1305
  "args": {},
1213
- "description": "Print current user profile and auth diagnostic",
1306
+ "description": "Browse and install community manyfaced skills from github.com/facessh/manyfaced",
1214
1307
  "flags": {
1215
1308
  "json": {
1216
1309
  "description": "Format output as json.",
@@ -1242,11 +1335,38 @@
1242
1335
  "hasDynamicHelp": false,
1243
1336
  "multiple": false,
1244
1337
  "type": "option"
1338
+ },
1339
+ "skill": {
1340
+ "description": "Show details for a specific skill",
1341
+ "name": "skill",
1342
+ "hasDynamicHelp": false,
1343
+ "multiple": false,
1344
+ "type": "option"
1345
+ },
1346
+ "install": {
1347
+ "description": "Install a skill by name",
1348
+ "name": "install",
1349
+ "hasDynamicHelp": false,
1350
+ "multiple": false,
1351
+ "type": "option"
1352
+ },
1353
+ "skills-dir": {
1354
+ "description": "Directory to install skills into (required for --install)",
1355
+ "name": "skills-dir",
1356
+ "hasDynamicHelp": false,
1357
+ "multiple": false,
1358
+ "type": "option"
1359
+ },
1360
+ "refresh": {
1361
+ "description": "Force refresh the skill index (ignore cache)",
1362
+ "name": "refresh",
1363
+ "allowNo": false,
1364
+ "type": "boolean"
1245
1365
  }
1246
1366
  },
1247
1367
  "hasDynamicHelp": false,
1248
1368
  "hiddenAliases": [],
1249
- "id": "auth:whoami",
1369
+ "id": "catalog:manyfaced",
1250
1370
  "pluginAlias": "faces-cli",
1251
1371
  "pluginName": "faces-cli",
1252
1372
  "pluginType": "core",
@@ -1256,20 +1376,84 @@
1256
1376
  "relativePath": [
1257
1377
  "dist",
1258
1378
  "commands",
1259
- "auth",
1260
- "whoami.js"
1379
+ "catalog",
1380
+ "manyfaced.js"
1261
1381
  ]
1262
1382
  },
1263
- "compile:import": {
1383
+ "catalog:restore": {
1264
1384
  "aliases": [],
1265
1385
  "args": {
1266
- "face_id": {
1267
- "description": "Face alias",
1268
- "name": "face_id",
1386
+ "file": {
1387
+ "description": "Backup file path (default: most recent in ~/.faces/backups/)",
1388
+ "name": "file"
1389
+ }
1390
+ },
1391
+ "description": "Restore faces and source material from a backup snapshot",
1392
+ "flags": {
1393
+ "json": {
1394
+ "description": "Format output as json.",
1395
+ "helpGroup": "GLOBAL",
1396
+ "name": "json",
1397
+ "allowNo": false,
1398
+ "type": "boolean"
1399
+ },
1400
+ "base-url": {
1401
+ "description": "API base URL",
1402
+ "env": "FACES_BASE_URL",
1403
+ "name": "base-url",
1404
+ "hasDynamicHelp": false,
1405
+ "multiple": false,
1406
+ "type": "option"
1407
+ },
1408
+ "token": {
1409
+ "description": "JWT bearer token",
1410
+ "env": "FACES_TOKEN",
1411
+ "name": "token",
1412
+ "hasDynamicHelp": false,
1413
+ "multiple": false,
1414
+ "type": "option"
1415
+ },
1416
+ "api-key": {
1417
+ "description": "API key",
1418
+ "env": "FACES_API_KEY",
1419
+ "name": "api-key",
1420
+ "hasDynamicHelp": false,
1421
+ "multiple": false,
1422
+ "type": "option"
1423
+ },
1424
+ "compile": {
1425
+ "description": "Run compile:all after restoring",
1426
+ "name": "compile",
1427
+ "allowNo": false,
1428
+ "type": "boolean"
1429
+ }
1430
+ },
1431
+ "hasDynamicHelp": false,
1432
+ "hiddenAliases": [],
1433
+ "id": "catalog:restore",
1434
+ "pluginAlias": "faces-cli",
1435
+ "pluginName": "faces-cli",
1436
+ "pluginType": "core",
1437
+ "strict": true,
1438
+ "enableJsonFlag": true,
1439
+ "isESM": true,
1440
+ "relativePath": [
1441
+ "dist",
1442
+ "commands",
1443
+ "catalog",
1444
+ "restore.js"
1445
+ ]
1446
+ },
1447
+ "chat:chat": {
1448
+ "aliases": [],
1449
+ "args": {
1450
+ "face_username": {
1451
+ "description": "Face alias (or alias@model)",
1452
+ "name": "face_username",
1269
1453
  "required": true
1270
1454
  }
1271
1455
  },
1272
- "description": "Import a YouTube video into a face via server-side download and transcription",
1456
+ "description": "Chat via a face. Auto-routes to the correct API endpoint based on model provider.",
1273
1457
  "flags": {
1274
1458
  "json": {
1275
1459
  "description": "Format output as json.",
@@ -1302,55 +1486,72 @@
1302
1486
  "multiple": false,
1303
1487
  "type": "option"
1304
1488
  },
1305
- "url": {
1306
- "description": "YouTube URL (youtube.com/watch?v=... or youtu.be/...)",
1307
- "name": "url",
1308
- "required": true,
1489
+ "message": {
1490
+ "char": "m",
1491
+ "description": "User message (repeatable)",
1492
+ "name": "message",
1493
+ "required": false,
1494
+ "hasDynamicHelp": false,
1495
+ "multiple": true,
1496
+ "type": "option"
1497
+ },
1498
+ "llm": {
1499
+ "description": "LLM override (e.g. gpt-4o-mini, claude-sonnet-4-6)",
1500
+ "name": "llm",
1309
1501
  "hasDynamicHelp": false,
1310
1502
  "multiple": false,
1311
1503
  "type": "option"
1312
1504
  },
1313
- "type": {
1314
- "description": "\"document\" for solo talks, lectures, monologues; \"thread\" for interviews or multi-speaker conversations",
1315
- "name": "type",
1316
- "default": "document",
1505
+ "system": {
1506
+ "description": "System prompt / instructions",
1507
+ "name": "system",
1317
1508
  "hasDynamicHelp": false,
1318
1509
  "multiple": false,
1319
- "options": [
1320
- "document",
1321
- "thread"
1322
- ],
1323
1510
  "type": "option"
1324
1511
  },
1325
- "perspective": {
1326
- "description": "\"first-person\" if the face is the speaker; \"third-person\" if the video is about the face",
1327
- "name": "perspective",
1328
- "default": "third-person",
1512
+ "stream": {
1513
+ "description": "Stream the response",
1514
+ "name": "stream",
1515
+ "allowNo": false,
1516
+ "type": "boolean"
1517
+ },
1518
+ "max-tokens": {
1519
+ "description": "Max tokens",
1520
+ "name": "max-tokens",
1329
1521
  "hasDynamicHelp": false,
1330
1522
  "multiple": false,
1331
- "options": [
1332
- "first-person",
1333
- "third-person"
1334
- ],
1335
1523
  "type": "option"
1336
1524
  },
1337
- "face-speaker": {
1338
- "description": "For --type thread: AssemblyAI speaker label (e.g. \"A\") that corresponds to the face. Defaults to first detected speaker.",
1339
- "name": "face-speaker",
1525
+ "temperature": {
1526
+ "description": "Temperature (0.0-2.0)",
1527
+ "name": "temperature",
1340
1528
  "hasDynamicHelp": false,
1341
1529
  "multiple": false,
1342
1530
  "type": "option"
1343
1531
  },
1344
- "no-wait": {
1345
- "description": "Return immediately after import starts (do not poll for transcription). Prints the ID for manual polling.",
1346
- "name": "no-wait",
1532
+ "file": {
1533
+ "description": "Read message from file",
1534
+ "name": "file",
1535
+ "hasDynamicHelp": false,
1536
+ "multiple": false,
1537
+ "type": "option"
1538
+ },
1539
+ "responses": {
1540
+ "description": "Use OpenAI Responses API instead of Chat Completions",
1541
+ "name": "responses",
1542
+ "allowNo": false,
1543
+ "type": "boolean"
1544
+ },
1545
+ "oauth-only": {
1546
+ "description": "Prevent fallback to paid system key (use OAuth only)",
1547
+ "name": "oauth-only",
1347
1548
  "allowNo": false,
1348
1549
  "type": "boolean"
1349
1550
  }
1350
1551
  },
1351
1552
  "hasDynamicHelp": false,
1352
1553
  "hiddenAliases": [],
1353
- "id": "compile:import",
1554
+ "id": "chat:chat",
1354
1555
  "pluginAlias": "faces-cli",
1355
1556
  "pluginName": "faces-cli",
1356
1557
  "pluginType": "core",
@@ -1360,20 +1561,20 @@
1360
1561
  "relativePath": [
1361
1562
  "dist",
1362
1563
  "commands",
1363
- "compile",
1364
- "import.js"
1564
+ "chat",
1565
+ "chat.js"
1365
1566
  ]
1366
1567
  },
1367
- "compile:upload": {
1568
+ "chat:messages": {
1368
1569
  "aliases": [],
1369
1570
  "args": {
1370
- "alias": {
1371
- "description": "Face alias",
1372
- "name": "alias",
1571
+ "face_model": {
1572
+ "description": "Face model (e.g. myface or myface@claude-sonnet-4-6)",
1573
+ "name": "face_model",
1373
1574
  "required": true
1374
1575
  }
1375
1576
  },
1376
- "description": "Upload a file (text/PDF/audio/video) to compile into a face",
1577
+ "description": "Anthropic Messages API proxy via a face (alias: chat:chat auto-routes Anthropic models here)",
1377
1578
  "flags": {
1378
1579
  "json": {
1379
1580
  "description": "Format output as json.",
@@ -1406,55 +1607,46 @@
1406
1607
  "multiple": false,
1407
1608
  "type": "option"
1408
1609
  },
1409
- "file": {
1410
- "description": "File to upload",
1411
- "name": "file",
1610
+ "message": {
1611
+ "char": "m",
1612
+ "description": "User message (repeatable)",
1613
+ "name": "message",
1412
1614
  "required": true,
1413
1615
  "hasDynamicHelp": false,
1414
- "multiple": false,
1616
+ "multiple": true,
1415
1617
  "type": "option"
1416
1618
  },
1417
- "kind": {
1418
- "description": "Upload kind: document or thread",
1419
- "name": "kind",
1420
- "default": "document",
1619
+ "system": {
1620
+ "description": "System prompt",
1621
+ "name": "system",
1421
1622
  "hasDynamicHelp": false,
1422
1623
  "multiple": false,
1423
- "options": [
1424
- "document",
1425
- "thread"
1426
- ],
1427
1624
  "type": "option"
1428
1625
  },
1429
- "perspective": {
1430
- "description": "Perspective (document only)",
1431
- "name": "perspective",
1432
- "default": "third-person",
1433
- "hasDynamicHelp": false,
1434
- "multiple": false,
1435
- "options": [
1436
- "first-person",
1437
- "third-person"
1438
- ],
1439
- "type": "option"
1626
+ "stream": {
1627
+ "description": "Stream the response",
1628
+ "name": "stream",
1629
+ "allowNo": false,
1630
+ "type": "boolean"
1440
1631
  },
1441
- "face-speaker": {
1442
- "description": "Speaker name to map to the face (thread only). If omitted, auto-detected from face name.",
1443
- "name": "face-speaker",
1632
+ "max-tokens": {
1633
+ "description": "Max tokens",
1634
+ "name": "max-tokens",
1635
+ "default": 1024,
1444
1636
  "hasDynamicHelp": false,
1445
1637
  "multiple": false,
1446
1638
  "type": "option"
1447
1639
  },
1448
- "no-wait": {
1449
- "description": "Return immediately after upload (do not poll for transcription). Prints the ID for manual polling.",
1450
- "name": "no-wait",
1640
+ "oauth-only": {
1641
+ "description": "Prevent fallback to paid system key (use OAuth only)",
1642
+ "name": "oauth-only",
1451
1643
  "allowNo": false,
1452
1644
  "type": "boolean"
1453
1645
  }
1454
1646
  },
1455
1647
  "hasDynamicHelp": false,
1456
1648
  "hiddenAliases": [],
1457
- "id": "compile:upload",
1649
+ "id": "chat:messages",
1458
1650
  "pluginAlias": "faces-cli",
1459
1651
  "pluginName": "faces-cli",
1460
1652
  "pluginType": "core",
@@ -1464,20 +1656,20 @@
1464
1656
  "relativePath": [
1465
1657
  "dist",
1466
1658
  "commands",
1467
- "compile",
1468
- "upload.js"
1659
+ "chat",
1660
+ "messages.js"
1469
1661
  ]
1470
1662
  },
1471
- "chat:chat": {
1663
+ "chat:responses": {
1472
1664
  "aliases": [],
1473
1665
  "args": {
1474
- "face_username": {
1475
- "description": "Face alias (or alias@model)",
1476
- "name": "face_username",
1666
+ "face_model": {
1667
+ "description": "Face model (e.g. myface or myface@gpt-4o)",
1668
+ "name": "face_model",
1477
1669
  "required": true
1478
1670
  }
1479
1671
  },
1480
- "description": "Chat via a face. Auto-routes to the correct API endpoint based on model provider.",
1672
+ "description": "OpenAI Responses API proxy via a face (alias: chat:chat --responses)",
1481
1673
  "flags": {
1482
1674
  "json": {
1483
1675
  "description": "Format output as json.",
@@ -1512,23 +1704,16 @@
1512
1704
  },
1513
1705
  "message": {
1514
1706
  "char": "m",
1515
- "description": "User message (repeatable)",
1707
+ "description": "User input message",
1516
1708
  "name": "message",
1517
- "required": false,
1518
- "hasDynamicHelp": false,
1519
- "multiple": true,
1520
- "type": "option"
1521
- },
1522
- "llm": {
1523
- "description": "LLM override (e.g. gpt-4o-mini, claude-sonnet-4-6)",
1524
- "name": "llm",
1709
+ "required": true,
1525
1710
  "hasDynamicHelp": false,
1526
1711
  "multiple": false,
1527
1712
  "type": "option"
1528
1713
  },
1529
- "system": {
1530
- "description": "System prompt / instructions",
1531
- "name": "system",
1714
+ "instructions": {
1715
+ "description": "System instructions",
1716
+ "name": "instructions",
1532
1717
  "hasDynamicHelp": false,
1533
1718
  "multiple": false,
1534
1719
  "type": "option"
@@ -1539,37 +1724,77 @@
1539
1724
  "allowNo": false,
1540
1725
  "type": "boolean"
1541
1726
  },
1542
- "max-tokens": {
1543
- "description": "Max tokens",
1544
- "name": "max-tokens",
1727
+ "oauth-only": {
1728
+ "description": "Prevent fallback to paid system key (use OAuth only)",
1729
+ "name": "oauth-only",
1730
+ "allowNo": false,
1731
+ "type": "boolean"
1732
+ }
1733
+ },
1734
+ "hasDynamicHelp": false,
1735
+ "hiddenAliases": [],
1736
+ "id": "chat:responses",
1737
+ "pluginAlias": "faces-cli",
1738
+ "pluginName": "faces-cli",
1739
+ "pluginType": "core",
1740
+ "strict": true,
1741
+ "enableJsonFlag": true,
1742
+ "isESM": true,
1743
+ "relativePath": [
1744
+ "dist",
1745
+ "commands",
1746
+ "chat",
1747
+ "responses.js"
1748
+ ]
1749
+ },
1750
+ "compile:all": {
1751
+ "aliases": [],
1752
+ "args": {},
1753
+ "description": "Compile all uncompiled documents and threads across all faces",
1754
+ "flags": {
1755
+ "json": {
1756
+ "description": "Format output as json.",
1757
+ "helpGroup": "GLOBAL",
1758
+ "name": "json",
1759
+ "allowNo": false,
1760
+ "type": "boolean"
1761
+ },
1762
+ "base-url": {
1763
+ "description": "API base URL",
1764
+ "env": "FACES_BASE_URL",
1765
+ "name": "base-url",
1766
+ "hasDynamicHelp": false,
1767
+ "multiple": false,
1768
+ "type": "option"
1769
+ },
1770
+ "token": {
1771
+ "description": "JWT bearer token",
1772
+ "env": "FACES_TOKEN",
1773
+ "name": "token",
1545
1774
  "hasDynamicHelp": false,
1546
1775
  "multiple": false,
1547
1776
  "type": "option"
1548
1777
  },
1549
- "temperature": {
1550
- "description": "Temperature (0.0-2.0)",
1551
- "name": "temperature",
1778
+ "api-key": {
1779
+ "description": "API key",
1780
+ "env": "FACES_API_KEY",
1781
+ "name": "api-key",
1552
1782
  "hasDynamicHelp": false,
1553
1783
  "multiple": false,
1554
1784
  "type": "option"
1555
1785
  },
1556
- "file": {
1557
- "description": "Read message from file",
1558
- "name": "file",
1786
+ "timeout": {
1787
+ "description": "Per-item compile timeout in seconds (default: 600)",
1788
+ "name": "timeout",
1789
+ "default": 600,
1559
1790
  "hasDynamicHelp": false,
1560
1791
  "multiple": false,
1561
1792
  "type": "option"
1562
- },
1563
- "responses": {
1564
- "description": "Use OpenAI Responses API instead of Chat Completions",
1565
- "name": "responses",
1566
- "allowNo": false,
1567
- "type": "boolean"
1568
1793
  }
1569
1794
  },
1570
1795
  "hasDynamicHelp": false,
1571
1796
  "hiddenAliases": [],
1572
- "id": "chat:chat",
1797
+ "id": "compile:all",
1573
1798
  "pluginAlias": "faces-cli",
1574
1799
  "pluginName": "faces-cli",
1575
1800
  "pluginType": "core",
@@ -1579,20 +1804,20 @@
1579
1804
  "relativePath": [
1580
1805
  "dist",
1581
1806
  "commands",
1582
- "chat",
1583
- "chat.js"
1807
+ "compile",
1808
+ "all.js"
1584
1809
  ]
1585
1810
  },
1586
- "chat:messages": {
1811
+ "compile:import": {
1587
1812
  "aliases": [],
1588
1813
  "args": {
1589
- "face_model": {
1590
- "description": "Face model (e.g. myface or myface@claude-sonnet-4-6)",
1591
- "name": "face_model",
1814
+ "face_id": {
1815
+ "description": "Face alias",
1816
+ "name": "face_id",
1592
1817
  "required": true
1593
1818
  }
1594
1819
  },
1595
- "description": "Anthropic Messages API proxy via a face (alias: chat:chat auto-routes Anthropic models here)",
1820
+ "description": "Import a YouTube video into a face via server-side download and transcription",
1596
1821
  "flags": {
1597
1822
  "json": {
1598
1823
  "description": "Format output as json.",
@@ -1625,40 +1850,55 @@
1625
1850
  "multiple": false,
1626
1851
  "type": "option"
1627
1852
  },
1628
- "message": {
1629
- "char": "m",
1630
- "description": "User message (repeatable)",
1631
- "name": "message",
1853
+ "url": {
1854
+ "description": "YouTube URL (youtube.com/watch?v=... or youtu.be/...)",
1855
+ "name": "url",
1632
1856
  "required": true,
1633
1857
  "hasDynamicHelp": false,
1634
- "multiple": true,
1858
+ "multiple": false,
1635
1859
  "type": "option"
1636
1860
  },
1637
- "system": {
1638
- "description": "System prompt",
1639
- "name": "system",
1861
+ "type": {
1862
+ "description": "\"document\" for solo talks, lectures, monologues; \"thread\" for interviews or multi-speaker conversations",
1863
+ "name": "type",
1864
+ "default": "document",
1640
1865
  "hasDynamicHelp": false,
1641
1866
  "multiple": false,
1867
+ "options": [
1868
+ "document",
1869
+ "thread"
1870
+ ],
1642
1871
  "type": "option"
1643
1872
  },
1644
- "stream": {
1645
- "description": "Stream the response",
1646
- "name": "stream",
1647
- "allowNo": false,
1648
- "type": "boolean"
1873
+ "perspective": {
1874
+ "description": "\"first-person\" if the face is the speaker; \"third-person\" if the video is about the face",
1875
+ "name": "perspective",
1876
+ "default": "third-person",
1877
+ "hasDynamicHelp": false,
1878
+ "multiple": false,
1879
+ "options": [
1880
+ "first-person",
1881
+ "third-person"
1882
+ ],
1883
+ "type": "option"
1649
1884
  },
1650
- "max-tokens": {
1651
- "description": "Max tokens",
1652
- "name": "max-tokens",
1653
- "default": 1024,
1885
+ "face-speaker": {
1886
+ "description": "For --type thread: AssemblyAI speaker label (e.g. \"A\") that corresponds to the face. Defaults to first detected speaker.",
1887
+ "name": "face-speaker",
1654
1888
  "hasDynamicHelp": false,
1655
1889
  "multiple": false,
1656
1890
  "type": "option"
1891
+ },
1892
+ "no-wait": {
1893
+ "description": "Return immediately after import starts (do not poll for transcription). Prints the ID for manual polling.",
1894
+ "name": "no-wait",
1895
+ "allowNo": false,
1896
+ "type": "boolean"
1657
1897
  }
1658
1898
  },
1659
1899
  "hasDynamicHelp": false,
1660
1900
  "hiddenAliases": [],
1661
- "id": "chat:messages",
1901
+ "id": "compile:import",
1662
1902
  "pluginAlias": "faces-cli",
1663
1903
  "pluginName": "faces-cli",
1664
1904
  "pluginType": "core",
@@ -1668,20 +1908,20 @@
1668
1908
  "relativePath": [
1669
1909
  "dist",
1670
1910
  "commands",
1671
- "chat",
1672
- "messages.js"
1911
+ "compile",
1912
+ "import.js"
1673
1913
  ]
1674
1914
  },
1675
- "chat:responses": {
1915
+ "compile:upload": {
1676
1916
  "aliases": [],
1677
1917
  "args": {
1678
- "face_model": {
1679
- "description": "Face model (e.g. myface or myface@gpt-4o)",
1680
- "name": "face_model",
1918
+ "alias": {
1919
+ "description": "Face alias",
1920
+ "name": "alias",
1681
1921
  "required": true
1682
1922
  }
1683
1923
  },
1684
- "description": "OpenAI Responses API proxy via a face (alias: chat:chat --responses)",
1924
+ "description": "Upload a file (text/PDF/audio/video) to compile into a face",
1685
1925
  "flags": {
1686
1926
  "json": {
1687
1927
  "description": "Format output as json.",
@@ -1714,32 +1954,55 @@
1714
1954
  "multiple": false,
1715
1955
  "type": "option"
1716
1956
  },
1717
- "message": {
1718
- "char": "m",
1719
- "description": "User input message",
1720
- "name": "message",
1957
+ "file": {
1958
+ "description": "File to upload",
1959
+ "name": "file",
1721
1960
  "required": true,
1722
1961
  "hasDynamicHelp": false,
1723
1962
  "multiple": false,
1724
1963
  "type": "option"
1725
1964
  },
1726
- "instructions": {
1727
- "description": "System instructions",
1728
- "name": "instructions",
1965
+ "kind": {
1966
+ "description": "Upload kind: document or thread",
1967
+ "name": "kind",
1968
+ "default": "document",
1729
1969
  "hasDynamicHelp": false,
1730
1970
  "multiple": false,
1971
+ "options": [
1972
+ "document",
1973
+ "thread"
1974
+ ],
1731
1975
  "type": "option"
1732
1976
  },
1733
- "stream": {
1734
- "description": "Stream the response",
1735
- "name": "stream",
1977
+ "perspective": {
1978
+ "description": "Perspective (document only)",
1979
+ "name": "perspective",
1980
+ "default": "third-person",
1981
+ "hasDynamicHelp": false,
1982
+ "multiple": false,
1983
+ "options": [
1984
+ "first-person",
1985
+ "third-person"
1986
+ ],
1987
+ "type": "option"
1988
+ },
1989
+ "face-speaker": {
1990
+ "description": "Speaker name to map to the face (thread only). If omitted, auto-detected from face name.",
1991
+ "name": "face-speaker",
1992
+ "hasDynamicHelp": false,
1993
+ "multiple": false,
1994
+ "type": "option"
1995
+ },
1996
+ "no-wait": {
1997
+ "description": "Return immediately after upload (do not poll for transcription). Prints the ID for manual polling.",
1998
+ "name": "no-wait",
1736
1999
  "allowNo": false,
1737
2000
  "type": "boolean"
1738
2001
  }
1739
2002
  },
1740
2003
  "hasDynamicHelp": false,
1741
2004
  "hiddenAliases": [],
1742
- "id": "chat:responses",
2005
+ "id": "compile:upload",
1743
2006
  "pluginAlias": "faces-cli",
1744
2007
  "pluginName": "faces-cli",
1745
2008
  "pluginType": "core",
@@ -1749,8 +2012,8 @@
1749
2012
  "relativePath": [
1750
2013
  "dist",
1751
2014
  "commands",
1752
- "chat",
1753
- "responses.js"
2015
+ "compile",
2016
+ "upload.js"
1754
2017
  ]
1755
2018
  },
1756
2019
  "config:clear": {
@@ -2955,7 +3218,7 @@
2955
3218
  "upload.js"
2956
3219
  ]
2957
3220
  },
2958
- "compile:thread:create": {
3221
+ "compile:doc:create": {
2959
3222
  "aliases": [],
2960
3223
  "args": {
2961
3224
  "face_id": {
@@ -2964,7 +3227,7 @@
2964
3227
  "required": true
2965
3228
  }
2966
3229
  },
2967
- "description": "Start a new thread for a face",
3230
+ "description": "Submit a document to a face",
2968
3231
  "flags": {
2969
3232
  "json": {
2970
3233
  "description": "Format output as json.",
@@ -2998,82 +3261,42 @@
2998
3261
  "type": "option"
2999
3262
  },
3000
3263
  "label": {
3001
- "description": "Thread label",
3264
+ "description": "Document label/title",
3002
3265
  "name": "label",
3003
3266
  "hasDynamicHelp": false,
3004
3267
  "multiple": false,
3005
3268
  "type": "option"
3006
- }
3007
- },
3008
- "hasDynamicHelp": false,
3009
- "hiddenAliases": [],
3010
- "id": "compile:thread:create",
3011
- "pluginAlias": "faces-cli",
3012
- "pluginName": "faces-cli",
3013
- "pluginType": "core",
3014
- "strict": true,
3015
- "enableJsonFlag": true,
3016
- "isESM": true,
3017
- "relativePath": [
3018
- "dist",
3019
- "commands",
3020
- "compile",
3021
- "thread",
3022
- "create.js"
3023
- ]
3024
- },
3025
- "compile:thread:delete": {
3026
- "aliases": [],
3027
- "args": {
3028
- "thread_id": {
3029
- "description": "Thread ID",
3030
- "name": "thread_id",
3031
- "required": true
3032
- }
3033
- },
3034
- "description": "Delete a thread",
3035
- "flags": {
3036
- "json": {
3037
- "description": "Format output as json.",
3038
- "helpGroup": "GLOBAL",
3039
- "name": "json",
3040
- "allowNo": false,
3041
- "type": "boolean"
3042
3269
  },
3043
- "base-url": {
3044
- "description": "API base URL",
3045
- "env": "FACES_BASE_URL",
3046
- "name": "base-url",
3270
+ "content": {
3271
+ "description": "Inline text content",
3272
+ "name": "content",
3047
3273
  "hasDynamicHelp": false,
3048
3274
  "multiple": false,
3049
3275
  "type": "option"
3050
3276
  },
3051
- "token": {
3052
- "description": "JWT bearer token",
3053
- "env": "FACES_TOKEN",
3054
- "name": "token",
3277
+ "file": {
3278
+ "description": "Read content from file",
3279
+ "name": "file",
3055
3280
  "hasDynamicHelp": false,
3056
3281
  "multiple": false,
3057
3282
  "type": "option"
3058
3283
  },
3059
- "api-key": {
3060
- "description": "API key",
3061
- "env": "FACES_API_KEY",
3062
- "name": "api-key",
3284
+ "perspective": {
3285
+ "description": "Perspective (first-person or third-person)",
3286
+ "name": "perspective",
3287
+ "default": "first-person",
3063
3288
  "hasDynamicHelp": false,
3064
3289
  "multiple": false,
3290
+ "options": [
3291
+ "first-person",
3292
+ "third-person"
3293
+ ],
3065
3294
  "type": "option"
3066
- },
3067
- "yes": {
3068
- "description": "Skip confirmation",
3069
- "name": "yes",
3070
- "allowNo": false,
3071
- "type": "boolean"
3072
3295
  }
3073
3296
  },
3074
3297
  "hasDynamicHelp": false,
3075
3298
  "hiddenAliases": [],
3076
- "id": "compile:thread:delete",
3299
+ "id": "compile:doc:create",
3077
3300
  "pluginAlias": "faces-cli",
3078
3301
  "pluginName": "faces-cli",
3079
3302
  "pluginType": "core",
@@ -3084,20 +3307,20 @@
3084
3307
  "dist",
3085
3308
  "commands",
3086
3309
  "compile",
3087
- "thread",
3088
- "delete.js"
3310
+ "doc",
3311
+ "create.js"
3089
3312
  ]
3090
3313
  },
3091
- "compile:thread:edit": {
3314
+ "compile:doc:delete": {
3092
3315
  "aliases": [],
3093
3316
  "args": {
3094
- "thread_id": {
3095
- "description": "Thread ID",
3096
- "name": "thread_id",
3317
+ "doc_id": {
3318
+ "description": "Document ID",
3319
+ "name": "doc_id",
3097
3320
  "required": true
3098
3321
  }
3099
3322
  },
3100
- "description": "Edit a thread (label and/or reassign face speaker)",
3323
+ "description": "Delete a document",
3101
3324
  "flags": {
3102
3325
  "json": {
3103
3326
  "description": "Format output as json.",
@@ -3129,25 +3352,11 @@
3129
3352
  "hasDynamicHelp": false,
3130
3353
  "multiple": false,
3131
3354
  "type": "option"
3132
- },
3133
- "label": {
3134
- "description": "New thread label",
3135
- "name": "label",
3136
- "hasDynamicHelp": false,
3137
- "multiple": false,
3138
- "type": "option"
3139
- },
3140
- "face-speaker": {
3141
- "description": "Reassign face speaker: set this speaker to role=user, all others to role=assistant",
3142
- "name": "face-speaker",
3143
- "hasDynamicHelp": false,
3144
- "multiple": false,
3145
- "type": "option"
3146
3355
  }
3147
3356
  },
3148
3357
  "hasDynamicHelp": false,
3149
3358
  "hiddenAliases": [],
3150
- "id": "compile:thread:edit",
3359
+ "id": "compile:doc:delete",
3151
3360
  "pluginAlias": "faces-cli",
3152
3361
  "pluginName": "faces-cli",
3153
3362
  "pluginType": "core",
@@ -3158,20 +3367,20 @@
3158
3367
  "dist",
3159
3368
  "commands",
3160
3369
  "compile",
3161
- "thread",
3162
- "edit.js"
3370
+ "doc",
3371
+ "delete.js"
3163
3372
  ]
3164
3373
  },
3165
- "compile:thread:get": {
3374
+ "compile:doc:edit": {
3166
3375
  "aliases": [],
3167
3376
  "args": {
3168
- "thread_id": {
3169
- "description": "Thread ID",
3170
- "name": "thread_id",
3377
+ "doc_id": {
3378
+ "description": "Document ID",
3379
+ "name": "doc_id",
3171
3380
  "required": true
3172
3381
  }
3173
3382
  },
3174
- "description": "Get a thread by ID",
3383
+ "description": "Edit a document (label, content, or perspective)",
3175
3384
  "flags": {
3176
3385
  "json": {
3177
3386
  "description": "Format output as json.",
@@ -3203,11 +3412,43 @@
3203
3412
  "hasDynamicHelp": false,
3204
3413
  "multiple": false,
3205
3414
  "type": "option"
3415
+ },
3416
+ "label": {
3417
+ "description": "New label/title",
3418
+ "name": "label",
3419
+ "hasDynamicHelp": false,
3420
+ "multiple": false,
3421
+ "type": "option"
3422
+ },
3423
+ "content": {
3424
+ "description": "New inline text content",
3425
+ "name": "content",
3426
+ "hasDynamicHelp": false,
3427
+ "multiple": false,
3428
+ "type": "option"
3429
+ },
3430
+ "file": {
3431
+ "description": "Read new content from file",
3432
+ "name": "file",
3433
+ "hasDynamicHelp": false,
3434
+ "multiple": false,
3435
+ "type": "option"
3436
+ },
3437
+ "perspective": {
3438
+ "description": "Perspective (first-person or third-person)",
3439
+ "name": "perspective",
3440
+ "hasDynamicHelp": false,
3441
+ "multiple": false,
3442
+ "options": [
3443
+ "first-person",
3444
+ "third-person"
3445
+ ],
3446
+ "type": "option"
3206
3447
  }
3207
3448
  },
3208
3449
  "hasDynamicHelp": false,
3209
3450
  "hiddenAliases": [],
3210
- "id": "compile:thread:get",
3451
+ "id": "compile:doc:edit",
3211
3452
  "pluginAlias": "faces-cli",
3212
3453
  "pluginName": "faces-cli",
3213
3454
  "pluginType": "core",
@@ -3218,20 +3459,20 @@
3218
3459
  "dist",
3219
3460
  "commands",
3220
3461
  "compile",
3221
- "thread",
3222
- "get.js"
3462
+ "doc",
3463
+ "edit.js"
3223
3464
  ]
3224
3465
  },
3225
- "compile:thread:list": {
3466
+ "compile:doc:get": {
3226
3467
  "aliases": [],
3227
3468
  "args": {
3228
- "face_id": {
3229
- "description": "Face alias",
3230
- "name": "face_id",
3469
+ "doc_id": {
3470
+ "description": "Document ID",
3471
+ "name": "doc_id",
3231
3472
  "required": true
3232
3473
  }
3233
3474
  },
3234
- "description": "List threads for a face",
3475
+ "description": "Get a document by ID",
3235
3476
  "flags": {
3236
3477
  "json": {
3237
3478
  "description": "Format output as json.",
@@ -3267,7 +3508,7 @@
3267
3508
  },
3268
3509
  "hasDynamicHelp": false,
3269
3510
  "hiddenAliases": [],
3270
- "id": "compile:thread:list",
3511
+ "id": "compile:doc:get",
3271
3512
  "pluginAlias": "faces-cli",
3272
3513
  "pluginName": "faces-cli",
3273
3514
  "pluginType": "core",
@@ -3278,20 +3519,20 @@
3278
3519
  "dist",
3279
3520
  "commands",
3280
3521
  "compile",
3281
- "thread",
3282
- "list.js"
3522
+ "doc",
3523
+ "get.js"
3283
3524
  ]
3284
3525
  },
3285
- "compile:thread:make": {
3526
+ "compile:doc": {
3286
3527
  "aliases": [],
3287
3528
  "args": {
3288
- "thread_id": {
3289
- "description": "Thread ID",
3290
- "name": "thread_id",
3529
+ "face_id": {
3530
+ "description": "Face alias",
3531
+ "name": "face_id",
3291
3532
  "required": true
3292
3533
  }
3293
3534
  },
3294
- "description": "Compile an existing thread (prepare + sync in one step)",
3535
+ "description": "Compile a document into a face (create make in one step)",
3295
3536
  "flags": {
3296
3537
  "json": {
3297
3538
  "description": "Format output as json.",
@@ -3324,6 +3565,39 @@
3324
3565
  "multiple": false,
3325
3566
  "type": "option"
3326
3567
  },
3568
+ "label": {
3569
+ "description": "Document label/title",
3570
+ "name": "label",
3571
+ "hasDynamicHelp": false,
3572
+ "multiple": false,
3573
+ "type": "option"
3574
+ },
3575
+ "content": {
3576
+ "description": "Inline text content",
3577
+ "name": "content",
3578
+ "hasDynamicHelp": false,
3579
+ "multiple": false,
3580
+ "type": "option"
3581
+ },
3582
+ "file": {
3583
+ "description": "Read content from file",
3584
+ "name": "file",
3585
+ "hasDynamicHelp": false,
3586
+ "multiple": false,
3587
+ "type": "option"
3588
+ },
3589
+ "perspective": {
3590
+ "description": "Perspective",
3591
+ "name": "perspective",
3592
+ "default": "first-person",
3593
+ "hasDynamicHelp": false,
3594
+ "multiple": false,
3595
+ "options": [
3596
+ "first-person",
3597
+ "third-person"
3598
+ ],
3599
+ "type": "option"
3600
+ },
3327
3601
  "timeout": {
3328
3602
  "description": "Compile timeout in seconds (default: 600)",
3329
3603
  "name": "timeout",
@@ -3333,7 +3607,7 @@
3333
3607
  "type": "option"
3334
3608
  },
3335
3609
  "no-wait": {
3336
- "description": "Return immediately after triggering compilation. Prints the thread ID for manual polling.",
3610
+ "description": "Create and trigger compilation, then return immediately without polling.",
3337
3611
  "name": "no-wait",
3338
3612
  "allowNo": false,
3339
3613
  "type": "boolean"
@@ -3341,7 +3615,7 @@
3341
3615
  },
3342
3616
  "hasDynamicHelp": false,
3343
3617
  "hiddenAliases": [],
3344
- "id": "compile:thread:make",
3618
+ "id": "compile:doc",
3345
3619
  "pluginAlias": "faces-cli",
3346
3620
  "pluginName": "faces-cli",
3347
3621
  "pluginType": "core",
@@ -3352,20 +3626,20 @@
3352
3626
  "dist",
3353
3627
  "commands",
3354
3628
  "compile",
3355
- "thread",
3356
- "make.js"
3629
+ "doc",
3630
+ "index.js"
3357
3631
  ]
3358
3632
  },
3359
- "compile:thread:message": {
3633
+ "compile:doc:list": {
3360
3634
  "aliases": [],
3361
3635
  "args": {
3362
- "thread_id": {
3363
- "description": "Thread ID",
3364
- "name": "thread_id",
3636
+ "face_id": {
3637
+ "description": "Face alias",
3638
+ "name": "face_id",
3365
3639
  "required": true
3366
3640
  }
3367
3641
  },
3368
- "description": "Send a user message to a thread",
3642
+ "description": "List documents for a face",
3369
3643
  "flags": {
3370
3644
  "json": {
3371
3645
  "description": "Format output as json.",
@@ -3397,20 +3671,11 @@
3397
3671
  "hasDynamicHelp": false,
3398
3672
  "multiple": false,
3399
3673
  "type": "option"
3400
- },
3401
- "message": {
3402
- "char": "m",
3403
- "description": "User message to append",
3404
- "name": "message",
3405
- "required": true,
3406
- "hasDynamicHelp": false,
3407
- "multiple": false,
3408
- "type": "option"
3409
3674
  }
3410
3675
  },
3411
3676
  "hasDynamicHelp": false,
3412
3677
  "hiddenAliases": [],
3413
- "id": "compile:thread:message",
3678
+ "id": "compile:doc:list",
3414
3679
  "pluginAlias": "faces-cli",
3415
3680
  "pluginName": "faces-cli",
3416
3681
  "pluginType": "core",
@@ -3421,20 +3686,20 @@
3421
3686
  "dist",
3422
3687
  "commands",
3423
3688
  "compile",
3424
- "thread",
3425
- "message.js"
3689
+ "doc",
3690
+ "list.js"
3426
3691
  ]
3427
3692
  },
3428
- "compile:thread:pause": {
3693
+ "compile:doc:make": {
3429
3694
  "aliases": [],
3430
3695
  "args": {
3431
- "thread_id": {
3432
- "description": "Thread ID",
3433
- "name": "thread_id",
3696
+ "doc_id": {
3697
+ "description": "Document ID",
3698
+ "name": "doc_id",
3434
3699
  "required": true
3435
3700
  }
3436
3701
  },
3437
- "description": "Pause a running thread compilation (preserves progress, resume with make)",
3702
+ "description": "Compile an existing document (prepare + sync in one step)",
3438
3703
  "flags": {
3439
3704
  "json": {
3440
3705
  "description": "Format output as json.",
@@ -3466,11 +3731,25 @@
3466
3731
  "hasDynamicHelp": false,
3467
3732
  "multiple": false,
3468
3733
  "type": "option"
3734
+ },
3735
+ "timeout": {
3736
+ "description": "Compile timeout in seconds (default: 600)",
3737
+ "name": "timeout",
3738
+ "default": 600,
3739
+ "hasDynamicHelp": false,
3740
+ "multiple": false,
3741
+ "type": "option"
3742
+ },
3743
+ "no-wait": {
3744
+ "description": "Return immediately after triggering compilation. Prints the document ID for manual polling.",
3745
+ "name": "no-wait",
3746
+ "allowNo": false,
3747
+ "type": "boolean"
3469
3748
  }
3470
3749
  },
3471
3750
  "hasDynamicHelp": false,
3472
3751
  "hiddenAliases": [],
3473
- "id": "compile:thread:pause",
3752
+ "id": "compile:doc:make",
3474
3753
  "pluginAlias": "faces-cli",
3475
3754
  "pluginName": "faces-cli",
3476
3755
  "pluginType": "core",
@@ -3481,20 +3760,20 @@
3481
3760
  "dist",
3482
3761
  "commands",
3483
3762
  "compile",
3484
- "thread",
3485
- "pause.js"
3763
+ "doc",
3764
+ "make.js"
3486
3765
  ]
3487
3766
  },
3488
- "compile:thread:reset": {
3767
+ "compile:doc:pause": {
3489
3768
  "aliases": [],
3490
3769
  "args": {
3491
- "thread_id": {
3492
- "description": "Thread ID",
3493
- "name": "thread_id",
3770
+ "doc_id": {
3771
+ "description": "Document ID",
3772
+ "name": "doc_id",
3494
3773
  "required": true
3495
3774
  }
3496
3775
  },
3497
- "description": "Reset thread compilation progress (wipe extraction, keep source messages)",
3776
+ "description": "Pause a running document compilation (preserves progress, resume with make)",
3498
3777
  "flags": {
3499
3778
  "json": {
3500
3779
  "description": "Format output as json.",
@@ -3526,17 +3805,11 @@
3526
3805
  "hasDynamicHelp": false,
3527
3806
  "multiple": false,
3528
3807
  "type": "option"
3529
- },
3530
- "yes": {
3531
- "description": "Skip confirmation",
3532
- "name": "yes",
3533
- "allowNo": false,
3534
- "type": "boolean"
3535
3808
  }
3536
3809
  },
3537
3810
  "hasDynamicHelp": false,
3538
3811
  "hiddenAliases": [],
3539
- "id": "compile:thread:reset",
3812
+ "id": "compile:doc:pause",
3540
3813
  "pluginAlias": "faces-cli",
3541
3814
  "pluginName": "faces-cli",
3542
3815
  "pluginType": "core",
@@ -3547,20 +3820,20 @@
3547
3820
  "dist",
3548
3821
  "commands",
3549
3822
  "compile",
3550
- "thread",
3551
- "reset.js"
3823
+ "doc",
3824
+ "pause.js"
3552
3825
  ]
3553
3826
  },
3554
- "compile:thread:sync": {
3827
+ "compile:doc:reset": {
3555
3828
  "aliases": [],
3556
3829
  "args": {
3557
- "thread_id": {
3558
- "description": "Thread ID",
3559
- "name": "thread_id",
3830
+ "doc_id": {
3831
+ "description": "Document ID",
3832
+ "name": "doc_id",
3560
3833
  "required": true
3561
3834
  }
3562
3835
  },
3563
- "description": "Archive and sync a thread into a face",
3836
+ "description": "Reset document compilation progress (wipe extraction, keep content)",
3564
3837
  "flags": {
3565
3838
  "json": {
3566
3839
  "description": "Format output as json.",
@@ -3592,11 +3865,17 @@
3592
3865
  "hasDynamicHelp": false,
3593
3866
  "multiple": false,
3594
3867
  "type": "option"
3868
+ },
3869
+ "yes": {
3870
+ "description": "Skip confirmation",
3871
+ "name": "yes",
3872
+ "allowNo": false,
3873
+ "type": "boolean"
3595
3874
  }
3596
3875
  },
3597
3876
  "hasDynamicHelp": false,
3598
3877
  "hiddenAliases": [],
3599
- "id": "compile:thread:sync",
3878
+ "id": "compile:doc:reset",
3600
3879
  "pluginAlias": "faces-cli",
3601
3880
  "pluginName": "faces-cli",
3602
3881
  "pluginType": "core",
@@ -3607,11 +3886,11 @@
3607
3886
  "dist",
3608
3887
  "commands",
3609
3888
  "compile",
3610
- "thread",
3611
- "sync.js"
3889
+ "doc",
3890
+ "reset.js"
3612
3891
  ]
3613
3892
  },
3614
- "compile:doc:create": {
3893
+ "compile:thread:create": {
3615
3894
  "aliases": [],
3616
3895
  "args": {
3617
3896
  "face_id": {
@@ -3620,7 +3899,7 @@
3620
3899
  "required": true
3621
3900
  }
3622
3901
  },
3623
- "description": "Submit a document to a face",
3902
+ "description": "Start a new thread for a face",
3624
3903
  "flags": {
3625
3904
  "json": {
3626
3905
  "description": "Format output as json.",
@@ -3654,42 +3933,22 @@
3654
3933
  "type": "option"
3655
3934
  },
3656
3935
  "label": {
3657
- "description": "Document label/title",
3936
+ "description": "Thread label",
3658
3937
  "name": "label",
3659
3938
  "hasDynamicHelp": false,
3660
3939
  "multiple": false,
3661
3940
  "type": "option"
3662
3941
  },
3663
- "content": {
3664
- "description": "Inline text content",
3665
- "name": "content",
3666
- "hasDynamicHelp": false,
3667
- "multiple": false,
3668
- "type": "option"
3669
- },
3670
- "file": {
3671
- "description": "Read content from file",
3672
- "name": "file",
3673
- "hasDynamicHelp": false,
3674
- "multiple": false,
3675
- "type": "option"
3676
- },
3677
- "perspective": {
3678
- "description": "Perspective (first-person or third-person)",
3679
- "name": "perspective",
3680
- "default": "first-person",
3681
- "hasDynamicHelp": false,
3682
- "multiple": false,
3683
- "options": [
3684
- "first-person",
3685
- "third-person"
3686
- ],
3687
- "type": "option"
3942
+ "oauth-only": {
3943
+ "description": "Prevent fallback to paid system key (use OAuth only)",
3944
+ "name": "oauth-only",
3945
+ "allowNo": false,
3946
+ "type": "boolean"
3688
3947
  }
3689
3948
  },
3690
3949
  "hasDynamicHelp": false,
3691
3950
  "hiddenAliases": [],
3692
- "id": "compile:doc:create",
3951
+ "id": "compile:thread:create",
3693
3952
  "pluginAlias": "faces-cli",
3694
3953
  "pluginName": "faces-cli",
3695
3954
  "pluginType": "core",
@@ -3700,20 +3959,20 @@
3700
3959
  "dist",
3701
3960
  "commands",
3702
3961
  "compile",
3703
- "doc",
3962
+ "thread",
3704
3963
  "create.js"
3705
3964
  ]
3706
3965
  },
3707
- "compile:doc:delete": {
3966
+ "compile:thread:delete": {
3708
3967
  "aliases": [],
3709
3968
  "args": {
3710
- "doc_id": {
3711
- "description": "Document ID",
3712
- "name": "doc_id",
3969
+ "thread_id": {
3970
+ "description": "Thread ID",
3971
+ "name": "thread_id",
3713
3972
  "required": true
3714
3973
  }
3715
3974
  },
3716
- "description": "Delete a document",
3975
+ "description": "Delete a thread",
3717
3976
  "flags": {
3718
3977
  "json": {
3719
3978
  "description": "Format output as json.",
@@ -3745,11 +4004,17 @@
3745
4004
  "hasDynamicHelp": false,
3746
4005
  "multiple": false,
3747
4006
  "type": "option"
4007
+ },
4008
+ "yes": {
4009
+ "description": "Skip confirmation",
4010
+ "name": "yes",
4011
+ "allowNo": false,
4012
+ "type": "boolean"
3748
4013
  }
3749
4014
  },
3750
4015
  "hasDynamicHelp": false,
3751
4016
  "hiddenAliases": [],
3752
- "id": "compile:doc:delete",
4017
+ "id": "compile:thread:delete",
3753
4018
  "pluginAlias": "faces-cli",
3754
4019
  "pluginName": "faces-cli",
3755
4020
  "pluginType": "core",
@@ -3760,20 +4025,20 @@
3760
4025
  "dist",
3761
4026
  "commands",
3762
4027
  "compile",
3763
- "doc",
4028
+ "thread",
3764
4029
  "delete.js"
3765
4030
  ]
3766
4031
  },
3767
- "compile:doc:edit": {
4032
+ "compile:thread:edit": {
3768
4033
  "aliases": [],
3769
4034
  "args": {
3770
- "doc_id": {
3771
- "description": "Document ID",
3772
- "name": "doc_id",
4035
+ "thread_id": {
4036
+ "description": "Thread ID",
4037
+ "name": "thread_id",
3773
4038
  "required": true
3774
4039
  }
3775
4040
  },
3776
- "description": "Edit a document (label, content, or perspective)",
4041
+ "description": "Edit a thread (label and/or reassign face speaker)",
3777
4042
  "flags": {
3778
4043
  "json": {
3779
4044
  "description": "Format output as json.",
@@ -3807,41 +4072,23 @@
3807
4072
  "type": "option"
3808
4073
  },
3809
4074
  "label": {
3810
- "description": "New label/title",
4075
+ "description": "New thread label",
3811
4076
  "name": "label",
3812
4077
  "hasDynamicHelp": false,
3813
4078
  "multiple": false,
3814
4079
  "type": "option"
3815
4080
  },
3816
- "content": {
3817
- "description": "New inline text content",
3818
- "name": "content",
3819
- "hasDynamicHelp": false,
3820
- "multiple": false,
3821
- "type": "option"
3822
- },
3823
- "file": {
3824
- "description": "Read new content from file",
3825
- "name": "file",
3826
- "hasDynamicHelp": false,
3827
- "multiple": false,
3828
- "type": "option"
3829
- },
3830
- "perspective": {
3831
- "description": "Perspective (first-person or third-person)",
3832
- "name": "perspective",
4081
+ "face-speaker": {
4082
+ "description": "Reassign face speaker: set this speaker to role=user, all others to role=assistant",
4083
+ "name": "face-speaker",
3833
4084
  "hasDynamicHelp": false,
3834
4085
  "multiple": false,
3835
- "options": [
3836
- "first-person",
3837
- "third-person"
3838
- ],
3839
4086
  "type": "option"
3840
4087
  }
3841
4088
  },
3842
4089
  "hasDynamicHelp": false,
3843
4090
  "hiddenAliases": [],
3844
- "id": "compile:doc:edit",
4091
+ "id": "compile:thread:edit",
3845
4092
  "pluginAlias": "faces-cli",
3846
4093
  "pluginName": "faces-cli",
3847
4094
  "pluginType": "core",
@@ -3852,20 +4099,20 @@
3852
4099
  "dist",
3853
4100
  "commands",
3854
4101
  "compile",
3855
- "doc",
4102
+ "thread",
3856
4103
  "edit.js"
3857
4104
  ]
3858
4105
  },
3859
- "compile:doc:get": {
4106
+ "compile:thread:get": {
3860
4107
  "aliases": [],
3861
4108
  "args": {
3862
- "doc_id": {
3863
- "description": "Document ID",
3864
- "name": "doc_id",
4109
+ "thread_id": {
4110
+ "description": "Thread ID",
4111
+ "name": "thread_id",
3865
4112
  "required": true
3866
4113
  }
3867
4114
  },
3868
- "description": "Get a document by ID",
4115
+ "description": "Get a thread by ID",
3869
4116
  "flags": {
3870
4117
  "json": {
3871
4118
  "description": "Format output as json.",
@@ -3901,7 +4148,7 @@
3901
4148
  },
3902
4149
  "hasDynamicHelp": false,
3903
4150
  "hiddenAliases": [],
3904
- "id": "compile:doc:get",
4151
+ "id": "compile:thread:get",
3905
4152
  "pluginAlias": "faces-cli",
3906
4153
  "pluginName": "faces-cli",
3907
4154
  "pluginType": "core",
@@ -3912,11 +4159,11 @@
3912
4159
  "dist",
3913
4160
  "commands",
3914
4161
  "compile",
3915
- "doc",
4162
+ "thread",
3916
4163
  "get.js"
3917
4164
  ]
3918
4165
  },
3919
- "compile:doc": {
4166
+ "compile:thread:list": {
3920
4167
  "aliases": [],
3921
4168
  "args": {
3922
4169
  "face_id": {
@@ -3925,7 +4172,7 @@
3925
4172
  "required": true
3926
4173
  }
3927
4174
  },
3928
- "description": "Compile a document into a face (create → make in one step)",
4175
+ "description": "List threads for a face",
3929
4176
  "flags": {
3930
4177
  "json": {
3931
4178
  "description": "Format output as json.",
@@ -3957,38 +4204,65 @@
3957
4204
  "hasDynamicHelp": false,
3958
4205
  "multiple": false,
3959
4206
  "type": "option"
4207
+ }
4208
+ },
4209
+ "hasDynamicHelp": false,
4210
+ "hiddenAliases": [],
4211
+ "id": "compile:thread:list",
4212
+ "pluginAlias": "faces-cli",
4213
+ "pluginName": "faces-cli",
4214
+ "pluginType": "core",
4215
+ "strict": true,
4216
+ "enableJsonFlag": true,
4217
+ "isESM": true,
4218
+ "relativePath": [
4219
+ "dist",
4220
+ "commands",
4221
+ "compile",
4222
+ "thread",
4223
+ "list.js"
4224
+ ]
4225
+ },
4226
+ "compile:thread:make": {
4227
+ "aliases": [],
4228
+ "args": {
4229
+ "thread_id": {
4230
+ "description": "Thread ID",
4231
+ "name": "thread_id",
4232
+ "required": true
4233
+ }
4234
+ },
4235
+ "description": "Compile an existing thread (prepare + sync in one step)",
4236
+ "flags": {
4237
+ "json": {
4238
+ "description": "Format output as json.",
4239
+ "helpGroup": "GLOBAL",
4240
+ "name": "json",
4241
+ "allowNo": false,
4242
+ "type": "boolean"
3960
4243
  },
3961
- "label": {
3962
- "description": "Document label/title",
3963
- "name": "label",
3964
- "hasDynamicHelp": false,
3965
- "multiple": false,
3966
- "type": "option"
3967
- },
3968
- "content": {
3969
- "description": "Inline text content",
3970
- "name": "content",
4244
+ "base-url": {
4245
+ "description": "API base URL",
4246
+ "env": "FACES_BASE_URL",
4247
+ "name": "base-url",
3971
4248
  "hasDynamicHelp": false,
3972
4249
  "multiple": false,
3973
4250
  "type": "option"
3974
4251
  },
3975
- "file": {
3976
- "description": "Read content from file",
3977
- "name": "file",
4252
+ "token": {
4253
+ "description": "JWT bearer token",
4254
+ "env": "FACES_TOKEN",
4255
+ "name": "token",
3978
4256
  "hasDynamicHelp": false,
3979
4257
  "multiple": false,
3980
4258
  "type": "option"
3981
4259
  },
3982
- "perspective": {
3983
- "description": "Perspective",
3984
- "name": "perspective",
3985
- "default": "first-person",
4260
+ "api-key": {
4261
+ "description": "API key",
4262
+ "env": "FACES_API_KEY",
4263
+ "name": "api-key",
3986
4264
  "hasDynamicHelp": false,
3987
4265
  "multiple": false,
3988
- "options": [
3989
- "first-person",
3990
- "third-person"
3991
- ],
3992
4266
  "type": "option"
3993
4267
  },
3994
4268
  "timeout": {
@@ -4000,7 +4274,7 @@
4000
4274
  "type": "option"
4001
4275
  },
4002
4276
  "no-wait": {
4003
- "description": "Create and trigger compilation, then return immediately without polling.",
4277
+ "description": "Return immediately after triggering compilation. Prints the thread ID for manual polling.",
4004
4278
  "name": "no-wait",
4005
4279
  "allowNo": false,
4006
4280
  "type": "boolean"
@@ -4008,7 +4282,7 @@
4008
4282
  },
4009
4283
  "hasDynamicHelp": false,
4010
4284
  "hiddenAliases": [],
4011
- "id": "compile:doc",
4285
+ "id": "compile:thread:make",
4012
4286
  "pluginAlias": "faces-cli",
4013
4287
  "pluginName": "faces-cli",
4014
4288
  "pluginType": "core",
@@ -4019,20 +4293,20 @@
4019
4293
  "dist",
4020
4294
  "commands",
4021
4295
  "compile",
4022
- "doc",
4023
- "index.js"
4296
+ "thread",
4297
+ "make.js"
4024
4298
  ]
4025
4299
  },
4026
- "compile:doc:list": {
4300
+ "compile:thread:message": {
4027
4301
  "aliases": [],
4028
4302
  "args": {
4029
- "face_id": {
4030
- "description": "Face alias",
4031
- "name": "face_id",
4303
+ "thread_id": {
4304
+ "description": "Thread ID",
4305
+ "name": "thread_id",
4032
4306
  "required": true
4033
4307
  }
4034
4308
  },
4035
- "description": "List documents for a face",
4309
+ "description": "Send a user message to a thread",
4036
4310
  "flags": {
4037
4311
  "json": {
4038
4312
  "description": "Format output as json.",
@@ -4064,11 +4338,26 @@
4064
4338
  "hasDynamicHelp": false,
4065
4339
  "multiple": false,
4066
4340
  "type": "option"
4341
+ },
4342
+ "message": {
4343
+ "char": "m",
4344
+ "description": "User message to append",
4345
+ "name": "message",
4346
+ "required": true,
4347
+ "hasDynamicHelp": false,
4348
+ "multiple": false,
4349
+ "type": "option"
4350
+ },
4351
+ "oauth-only": {
4352
+ "description": "Prevent fallback to paid system key (use OAuth only)",
4353
+ "name": "oauth-only",
4354
+ "allowNo": false,
4355
+ "type": "boolean"
4067
4356
  }
4068
4357
  },
4069
4358
  "hasDynamicHelp": false,
4070
4359
  "hiddenAliases": [],
4071
- "id": "compile:doc:list",
4360
+ "id": "compile:thread:message",
4072
4361
  "pluginAlias": "faces-cli",
4073
4362
  "pluginName": "faces-cli",
4074
4363
  "pluginType": "core",
@@ -4079,20 +4368,20 @@
4079
4368
  "dist",
4080
4369
  "commands",
4081
4370
  "compile",
4082
- "doc",
4083
- "list.js"
4371
+ "thread",
4372
+ "message.js"
4084
4373
  ]
4085
4374
  },
4086
- "compile:doc:make": {
4375
+ "compile:thread:pause": {
4087
4376
  "aliases": [],
4088
4377
  "args": {
4089
- "doc_id": {
4090
- "description": "Document ID",
4091
- "name": "doc_id",
4378
+ "thread_id": {
4379
+ "description": "Thread ID",
4380
+ "name": "thread_id",
4092
4381
  "required": true
4093
4382
  }
4094
4383
  },
4095
- "description": "Compile an existing document (prepare + sync in one step)",
4384
+ "description": "Pause a running thread compilation (preserves progress, resume with make)",
4096
4385
  "flags": {
4097
4386
  "json": {
4098
4387
  "description": "Format output as json.",
@@ -4124,25 +4413,11 @@
4124
4413
  "hasDynamicHelp": false,
4125
4414
  "multiple": false,
4126
4415
  "type": "option"
4127
- },
4128
- "timeout": {
4129
- "description": "Compile timeout in seconds (default: 600)",
4130
- "name": "timeout",
4131
- "default": 600,
4132
- "hasDynamicHelp": false,
4133
- "multiple": false,
4134
- "type": "option"
4135
- },
4136
- "no-wait": {
4137
- "description": "Return immediately after triggering compilation. Prints the document ID for manual polling.",
4138
- "name": "no-wait",
4139
- "allowNo": false,
4140
- "type": "boolean"
4141
4416
  }
4142
4417
  },
4143
4418
  "hasDynamicHelp": false,
4144
4419
  "hiddenAliases": [],
4145
- "id": "compile:doc:make",
4420
+ "id": "compile:thread:pause",
4146
4421
  "pluginAlias": "faces-cli",
4147
4422
  "pluginName": "faces-cli",
4148
4423
  "pluginType": "core",
@@ -4153,20 +4428,20 @@
4153
4428
  "dist",
4154
4429
  "commands",
4155
4430
  "compile",
4156
- "doc",
4157
- "make.js"
4431
+ "thread",
4432
+ "pause.js"
4158
4433
  ]
4159
4434
  },
4160
- "compile:doc:pause": {
4435
+ "compile:thread:reset": {
4161
4436
  "aliases": [],
4162
4437
  "args": {
4163
- "doc_id": {
4164
- "description": "Document ID",
4165
- "name": "doc_id",
4438
+ "thread_id": {
4439
+ "description": "Thread ID",
4440
+ "name": "thread_id",
4166
4441
  "required": true
4167
4442
  }
4168
4443
  },
4169
- "description": "Pause a running document compilation (preserves progress, resume with make)",
4444
+ "description": "Reset thread compilation progress (wipe extraction, keep source messages)",
4170
4445
  "flags": {
4171
4446
  "json": {
4172
4447
  "description": "Format output as json.",
@@ -4198,11 +4473,17 @@
4198
4473
  "hasDynamicHelp": false,
4199
4474
  "multiple": false,
4200
4475
  "type": "option"
4476
+ },
4477
+ "yes": {
4478
+ "description": "Skip confirmation",
4479
+ "name": "yes",
4480
+ "allowNo": false,
4481
+ "type": "boolean"
4201
4482
  }
4202
4483
  },
4203
4484
  "hasDynamicHelp": false,
4204
4485
  "hiddenAliases": [],
4205
- "id": "compile:doc:pause",
4486
+ "id": "compile:thread:reset",
4206
4487
  "pluginAlias": "faces-cli",
4207
4488
  "pluginName": "faces-cli",
4208
4489
  "pluginType": "core",
@@ -4213,20 +4494,20 @@
4213
4494
  "dist",
4214
4495
  "commands",
4215
4496
  "compile",
4216
- "doc",
4217
- "pause.js"
4497
+ "thread",
4498
+ "reset.js"
4218
4499
  ]
4219
4500
  },
4220
- "compile:doc:reset": {
4501
+ "compile:thread:sync": {
4221
4502
  "aliases": [],
4222
4503
  "args": {
4223
- "doc_id": {
4224
- "description": "Document ID",
4225
- "name": "doc_id",
4504
+ "thread_id": {
4505
+ "description": "Thread ID",
4506
+ "name": "thread_id",
4226
4507
  "required": true
4227
4508
  }
4228
4509
  },
4229
- "description": "Reset document compilation progress (wipe extraction, keep content)",
4510
+ "description": "Archive and sync a thread into a face",
4230
4511
  "flags": {
4231
4512
  "json": {
4232
4513
  "description": "Format output as json.",
@@ -4258,17 +4539,11 @@
4258
4539
  "hasDynamicHelp": false,
4259
4540
  "multiple": false,
4260
4541
  "type": "option"
4261
- },
4262
- "yes": {
4263
- "description": "Skip confirmation",
4264
- "name": "yes",
4265
- "allowNo": false,
4266
- "type": "boolean"
4267
4542
  }
4268
4543
  },
4269
4544
  "hasDynamicHelp": false,
4270
4545
  "hiddenAliases": [],
4271
- "id": "compile:doc:reset",
4546
+ "id": "compile:thread:sync",
4272
4547
  "pluginAlias": "faces-cli",
4273
4548
  "pluginName": "faces-cli",
4274
4549
  "pluginType": "core",
@@ -4279,10 +4554,10 @@
4279
4554
  "dist",
4280
4555
  "commands",
4281
4556
  "compile",
4282
- "doc",
4283
- "reset.js"
4557
+ "thread",
4558
+ "sync.js"
4284
4559
  ]
4285
4560
  }
4286
4561
  },
4287
- "version": "1.5.14"
4562
+ "version": "1.6.0"
4288
4563
  }