faces-cli 1.7.14 → 1.7.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -632,10 +632,10 @@
632
632
  "whoami.js"
633
633
  ]
634
634
  },
635
- "catalog:backup": {
635
+ "billing:balance": {
636
636
  "aliases": [],
637
637
  "args": {},
638
- "description": "Snapshot all faces, teams, and source material for migration",
638
+ "description": "Show credit balance and payment method status",
639
639
  "flags": {
640
640
  "json": {
641
641
  "description": "Format output as json.",
@@ -671,7 +671,7 @@
671
671
  },
672
672
  "hasDynamicHelp": false,
673
673
  "hiddenAliases": [],
674
- "id": "catalog:backup",
674
+ "id": "billing:balance",
675
675
  "pluginAlias": "faces-cli",
676
676
  "pluginName": "faces-cli",
677
677
  "pluginType": "core",
@@ -681,14 +681,14 @@
681
681
  "relativePath": [
682
682
  "dist",
683
683
  "commands",
684
- "catalog",
685
- "backup.js"
684
+ "billing",
685
+ "balance.js"
686
686
  ]
687
687
  },
688
- "catalog:doctor": {
688
+ "billing:card-setup": {
689
689
  "aliases": [],
690
690
  "args": {},
691
- "description": "Diagnose and repair the local face and team catalog",
691
+ "description": "Get a Stripe card setup URL to save a payment method",
692
692
  "flags": {
693
693
  "json": {
694
694
  "description": "Format output as json.",
@@ -720,23 +720,11 @@
720
720
  "hasDynamicHelp": false,
721
721
  "multiple": false,
722
722
  "type": "option"
723
- },
724
- "fix": {
725
- "description": "Rebuild missing or stale catalog entries from API",
726
- "name": "fix",
727
- "allowNo": false,
728
- "type": "boolean"
729
- },
730
- "generate": {
731
- "description": "Fix + generate missing descriptions via LLM",
732
- "name": "generate",
733
- "allowNo": false,
734
- "type": "boolean"
735
723
  }
736
724
  },
737
725
  "hasDynamicHelp": false,
738
726
  "hiddenAliases": [],
739
- "id": "catalog:doctor",
727
+ "id": "billing:card-setup",
740
728
  "pluginAlias": "faces-cli",
741
729
  "pluginName": "faces-cli",
742
730
  "pluginType": "core",
@@ -746,14 +734,14 @@
746
734
  "relativePath": [
747
735
  "dist",
748
736
  "commands",
749
- "catalog",
750
- "doctor.js"
737
+ "billing",
738
+ "card-setup.js"
751
739
  ]
752
740
  },
753
- "catalog:list": {
741
+ "billing:llm-costs": {
754
742
  "aliases": [],
755
743
  "args": {},
756
- "description": "List all faces in the local catalog",
744
+ "description": "List available LLMs and their per-token costs",
757
745
  "flags": {
758
746
  "json": {
759
747
  "description": "Format output as json.",
@@ -785,11 +773,18 @@
785
773
  "hasDynamicHelp": false,
786
774
  "multiple": false,
787
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"
788
783
  }
789
784
  },
790
785
  "hasDynamicHelp": false,
791
786
  "hiddenAliases": [],
792
- "id": "catalog:list",
787
+ "id": "billing:llm-costs",
793
788
  "pluginAlias": "faces-cli",
794
789
  "pluginName": "faces-cli",
795
790
  "pluginType": "core",
@@ -799,14 +794,14 @@
799
794
  "relativePath": [
800
795
  "dist",
801
796
  "commands",
802
- "catalog",
803
- "list.js"
797
+ "billing",
798
+ "llm-costs.js"
804
799
  ]
805
800
  },
806
- "catalog:manyfaced": {
801
+ "billing:topup": {
807
802
  "aliases": [],
808
803
  "args": {},
809
- "description": "Browse and install community manyfaced skills from github.com/facessh/manyfaced",
804
+ "description": "Top up credit balance using saved payment method",
810
805
  "flags": {
811
806
  "json": {
812
807
  "description": "Format output as json.",
@@ -839,37 +834,25 @@
839
834
  "multiple": false,
840
835
  "type": "option"
841
836
  },
842
- "skill": {
843
- "description": "Show details for a specific skill",
844
- "name": "skill",
845
- "hasDynamicHelp": false,
846
- "multiple": false,
847
- "type": "option"
848
- },
849
- "install": {
850
- "description": "Install a skill by name",
851
- "name": "install",
837
+ "amount": {
838
+ "description": "Top-up amount in USD (min $1)",
839
+ "name": "amount",
840
+ "required": true,
852
841
  "hasDynamicHelp": false,
853
842
  "multiple": false,
854
843
  "type": "option"
855
844
  },
856
- "skills-dir": {
857
- "description": "Directory to install skills into (required for --install)",
858
- "name": "skills-dir",
845
+ "payment-ref": {
846
+ "description": "Payment reference (admin/test path)",
847
+ "name": "payment-ref",
859
848
  "hasDynamicHelp": false,
860
849
  "multiple": false,
861
850
  "type": "option"
862
- },
863
- "refresh": {
864
- "description": "Force refresh the skill index (ignore cache)",
865
- "name": "refresh",
866
- "allowNo": false,
867
- "type": "boolean"
868
851
  }
869
852
  },
870
853
  "hasDynamicHelp": false,
871
854
  "hiddenAliases": [],
872
- "id": "catalog:manyfaced",
855
+ "id": "billing:topup",
873
856
  "pluginAlias": "faces-cli",
874
857
  "pluginName": "faces-cli",
875
858
  "pluginType": "core",
@@ -879,19 +862,14 @@
879
862
  "relativePath": [
880
863
  "dist",
881
864
  "commands",
882
- "catalog",
883
- "manyfaced.js"
865
+ "billing",
866
+ "topup.js"
884
867
  ]
885
868
  },
886
- "catalog:restore": {
869
+ "billing:usage": {
887
870
  "aliases": [],
888
- "args": {
889
- "file": {
890
- "description": "Backup file path (default: most recent in ~/.faces/backups/)",
891
- "name": "file"
892
- }
893
- },
894
- "description": "Restore faces, teams, and source material from a backup snapshot",
871
+ "args": {},
872
+ "description": "Aggregated usage analytics",
895
873
  "flags": {
896
874
  "json": {
897
875
  "description": "Format output as json.",
@@ -924,16 +902,37 @@
924
902
  "multiple": false,
925
903
  "type": "option"
926
904
  },
927
- "compile": {
928
- "description": "Run compile:all after restoring",
929
- "name": "compile",
930
- "allowNo": false,
931
- "type": "boolean"
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"
932
931
  }
933
932
  },
934
933
  "hasDynamicHelp": false,
935
934
  "hiddenAliases": [],
936
- "id": "catalog:restore",
935
+ "id": "billing:usage",
937
936
  "pluginAlias": "faces-cli",
938
937
  "pluginName": "faces-cli",
939
938
  "pluginType": "core",
@@ -943,14 +942,14 @@
943
942
  "relativePath": [
944
943
  "dist",
945
944
  "commands",
946
- "catalog",
947
- "restore.js"
945
+ "billing",
946
+ "usage.js"
948
947
  ]
949
948
  },
950
- "billing:balance": {
949
+ "catalog:backup": {
951
950
  "aliases": [],
952
951
  "args": {},
953
- "description": "Show credit balance and payment method status",
952
+ "description": "Snapshot all faces, teams, and source material for migration",
954
953
  "flags": {
955
954
  "json": {
956
955
  "description": "Format output as json.",
@@ -986,7 +985,7 @@
986
985
  },
987
986
  "hasDynamicHelp": false,
988
987
  "hiddenAliases": [],
989
- "id": "billing:balance",
988
+ "id": "catalog:backup",
990
989
  "pluginAlias": "faces-cli",
991
990
  "pluginName": "faces-cli",
992
991
  "pluginType": "core",
@@ -996,14 +995,14 @@
996
995
  "relativePath": [
997
996
  "dist",
998
997
  "commands",
999
- "billing",
1000
- "balance.js"
998
+ "catalog",
999
+ "backup.js"
1001
1000
  ]
1002
1001
  },
1003
- "billing:card-setup": {
1002
+ "catalog:doctor": {
1004
1003
  "aliases": [],
1005
1004
  "args": {},
1006
- "description": "Get a Stripe card setup URL to save a payment method",
1005
+ "description": "Diagnose and repair the local face and team catalog",
1007
1006
  "flags": {
1008
1007
  "json": {
1009
1008
  "description": "Format output as json.",
@@ -1035,11 +1034,23 @@
1035
1034
  "hasDynamicHelp": false,
1036
1035
  "multiple": false,
1037
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"
1038
1049
  }
1039
1050
  },
1040
1051
  "hasDynamicHelp": false,
1041
1052
  "hiddenAliases": [],
1042
- "id": "billing:card-setup",
1053
+ "id": "catalog:doctor",
1043
1054
  "pluginAlias": "faces-cli",
1044
1055
  "pluginName": "faces-cli",
1045
1056
  "pluginType": "core",
@@ -1049,14 +1060,14 @@
1049
1060
  "relativePath": [
1050
1061
  "dist",
1051
1062
  "commands",
1052
- "billing",
1053
- "card-setup.js"
1063
+ "catalog",
1064
+ "doctor.js"
1054
1065
  ]
1055
1066
  },
1056
- "billing:llm-costs": {
1067
+ "catalog:list": {
1057
1068
  "aliases": [],
1058
1069
  "args": {},
1059
- "description": "List available LLMs and their per-token costs",
1070
+ "description": "List all faces in the local catalog",
1060
1071
  "flags": {
1061
1072
  "json": {
1062
1073
  "description": "Format output as json.",
@@ -1088,18 +1099,11 @@
1088
1099
  "hasDynamicHelp": false,
1089
1100
  "multiple": false,
1090
1101
  "type": "option"
1091
- },
1092
- "provider": {
1093
- "description": "Filter by provider (e.g. openai, anthropic)",
1094
- "name": "provider",
1095
- "hasDynamicHelp": false,
1096
- "multiple": false,
1097
- "type": "option"
1098
1102
  }
1099
1103
  },
1100
1104
  "hasDynamicHelp": false,
1101
1105
  "hiddenAliases": [],
1102
- "id": "billing:llm-costs",
1106
+ "id": "catalog:list",
1103
1107
  "pluginAlias": "faces-cli",
1104
1108
  "pluginName": "faces-cli",
1105
1109
  "pluginType": "core",
@@ -1109,14 +1113,14 @@
1109
1113
  "relativePath": [
1110
1114
  "dist",
1111
1115
  "commands",
1112
- "billing",
1113
- "llm-costs.js"
1116
+ "catalog",
1117
+ "list.js"
1114
1118
  ]
1115
1119
  },
1116
- "billing:topup": {
1120
+ "catalog:manyfaced": {
1117
1121
  "aliases": [],
1118
1122
  "args": {},
1119
- "description": "Top up credit balance using saved payment method",
1123
+ "description": "Browse and install community manyfaced skills from github.com/facessh/manyfaced",
1120
1124
  "flags": {
1121
1125
  "json": {
1122
1126
  "description": "Format output as json.",
@@ -1149,25 +1153,37 @@
1149
1153
  "multiple": false,
1150
1154
  "type": "option"
1151
1155
  },
1152
- "amount": {
1153
- "description": "Top-up amount in USD (min $1)",
1154
- "name": "amount",
1155
- "required": true,
1156
+ "skill": {
1157
+ "description": "Show details for a specific skill",
1158
+ "name": "skill",
1156
1159
  "hasDynamicHelp": false,
1157
1160
  "multiple": false,
1158
1161
  "type": "option"
1159
1162
  },
1160
- "payment-ref": {
1161
- "description": "Payment reference (admin/test path)",
1162
- "name": "payment-ref",
1163
+ "install": {
1164
+ "description": "Install a skill by name",
1165
+ "name": "install",
1166
+ "hasDynamicHelp": false,
1167
+ "multiple": false,
1168
+ "type": "option"
1169
+ },
1170
+ "skills-dir": {
1171
+ "description": "Directory to install skills into (required for --install)",
1172
+ "name": "skills-dir",
1163
1173
  "hasDynamicHelp": false,
1164
1174
  "multiple": false,
1165
1175
  "type": "option"
1176
+ },
1177
+ "refresh": {
1178
+ "description": "Force refresh the skill index (ignore cache)",
1179
+ "name": "refresh",
1180
+ "allowNo": false,
1181
+ "type": "boolean"
1166
1182
  }
1167
1183
  },
1168
1184
  "hasDynamicHelp": false,
1169
1185
  "hiddenAliases": [],
1170
- "id": "billing:topup",
1186
+ "id": "catalog:manyfaced",
1171
1187
  "pluginAlias": "faces-cli",
1172
1188
  "pluginName": "faces-cli",
1173
1189
  "pluginType": "core",
@@ -1177,14 +1193,19 @@
1177
1193
  "relativePath": [
1178
1194
  "dist",
1179
1195
  "commands",
1180
- "billing",
1181
- "topup.js"
1196
+ "catalog",
1197
+ "manyfaced.js"
1182
1198
  ]
1183
1199
  },
1184
- "billing:usage": {
1200
+ "catalog:restore": {
1185
1201
  "aliases": [],
1186
- "args": {},
1187
- "description": "Aggregated usage analytics",
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",
1188
1209
  "flags": {
1189
1210
  "json": {
1190
1211
  "description": "Format output as json.",
@@ -1217,37 +1238,16 @@
1217
1238
  "multiple": false,
1218
1239
  "type": "option"
1219
1240
  },
1220
- "group-by": {
1221
- "description": "Group results",
1222
- "name": "group-by",
1223
- "hasDynamicHelp": false,
1224
- "multiple": false,
1225
- "options": [
1226
- "api_key",
1227
- "model",
1228
- "llm",
1229
- "date"
1230
- ],
1231
- "type": "option"
1232
- },
1233
- "from": {
1234
- "description": "Start date (YYYY-MM-DD)",
1235
- "name": "from",
1236
- "hasDynamicHelp": false,
1237
- "multiple": false,
1238
- "type": "option"
1239
- },
1240
- "to": {
1241
- "description": "End date (YYYY-MM-DD)",
1242
- "name": "to",
1243
- "hasDynamicHelp": false,
1244
- "multiple": false,
1245
- "type": "option"
1246
- }
1241
+ "compile": {
1242
+ "description": "Run compile:all after restoring",
1243
+ "name": "compile",
1244
+ "allowNo": false,
1245
+ "type": "boolean"
1246
+ }
1247
1247
  },
1248
1248
  "hasDynamicHelp": false,
1249
1249
  "hiddenAliases": [],
1250
- "id": "billing:usage",
1250
+ "id": "catalog:restore",
1251
1251
  "pluginAlias": "faces-cli",
1252
1252
  "pluginName": "faces-cli",
1253
1253
  "pluginType": "core",
@@ -1257,8 +1257,8 @@
1257
1257
  "relativePath": [
1258
1258
  "dist",
1259
1259
  "commands",
1260
- "billing",
1261
- "usage.js"
1260
+ "catalog",
1261
+ "restore.js"
1262
1262
  ]
1263
1263
  },
1264
1264
  "chat:chat": {
@@ -2255,10 +2255,10 @@
2255
2255
  "show.js"
2256
2256
  ]
2257
2257
  },
2258
- "face:attributes": {
2258
+ "keys:create": {
2259
2259
  "aliases": [],
2260
2260
  "args": {},
2261
- "description": "List all supported attribute keys",
2261
+ "description": "Create a new API key (JWT required). The new key is saved to ~/.faces/config.json as api_key by default; pass --no-save to skip.",
2262
2262
  "flags": {
2263
2263
  "json": {
2264
2264
  "description": "Format output as json.",
@@ -2290,11 +2290,53 @@
2290
2290
  "hasDynamicHelp": false,
2291
2291
  "multiple": false,
2292
2292
  "type": "option"
2293
+ },
2294
+ "name": {
2295
+ "description": "Key name/label",
2296
+ "name": "name",
2297
+ "required": true,
2298
+ "hasDynamicHelp": false,
2299
+ "multiple": false,
2300
+ "type": "option"
2301
+ },
2302
+ "expires-days": {
2303
+ "description": "Expiry in days (omit for no expiry)",
2304
+ "name": "expires-days",
2305
+ "hasDynamicHelp": false,
2306
+ "multiple": false,
2307
+ "type": "option"
2308
+ },
2309
+ "budget": {
2310
+ "description": "Spend budget in USD",
2311
+ "name": "budget",
2312
+ "hasDynamicHelp": false,
2313
+ "multiple": false,
2314
+ "type": "option"
2315
+ },
2316
+ "face": {
2317
+ "description": "Allowed face alias (repeatable)",
2318
+ "name": "face",
2319
+ "hasDynamicHelp": false,
2320
+ "multiple": true,
2321
+ "type": "option"
2322
+ },
2323
+ "model": {
2324
+ "description": "Allowed model name (repeatable)",
2325
+ "name": "model",
2326
+ "hasDynamicHelp": false,
2327
+ "multiple": true,
2328
+ "type": "option"
2329
+ },
2330
+ "save": {
2331
+ "description": "Save the new key to ~/.faces/config.json as api_key (default: true; use --no-save to skip)",
2332
+ "name": "save",
2333
+ "allowNo": true,
2334
+ "type": "boolean"
2293
2335
  }
2294
2336
  },
2295
2337
  "hasDynamicHelp": false,
2296
2338
  "hiddenAliases": [],
2297
- "id": "face:attributes",
2339
+ "id": "keys:create",
2298
2340
  "pluginAlias": "faces-cli",
2299
2341
  "pluginName": "faces-cli",
2300
2342
  "pluginType": "core",
@@ -2304,14 +2346,14 @@
2304
2346
  "relativePath": [
2305
2347
  "dist",
2306
2348
  "commands",
2307
- "face",
2308
- "attributes.js"
2349
+ "keys",
2350
+ "create.js"
2309
2351
  ]
2310
2352
  },
2311
- "face:create": {
2353
+ "keys:list": {
2312
2354
  "aliases": [],
2313
2355
  "args": {},
2314
- "description": "Create a new face",
2356
+ "description": "List all API keys (JWT required)",
2315
2357
  "flags": {
2316
2358
  "json": {
2317
2359
  "description": "Format output as json.",
@@ -2343,86 +2385,76 @@
2343
2385
  "hasDynamicHelp": false,
2344
2386
  "multiple": false,
2345
2387
  "type": "option"
2388
+ }
2389
+ },
2390
+ "hasDynamicHelp": false,
2391
+ "hiddenAliases": [],
2392
+ "id": "keys:list",
2393
+ "pluginAlias": "faces-cli",
2394
+ "pluginName": "faces-cli",
2395
+ "pluginType": "core",
2396
+ "strict": true,
2397
+ "enableJsonFlag": true,
2398
+ "isESM": true,
2399
+ "relativePath": [
2400
+ "dist",
2401
+ "commands",
2402
+ "keys",
2403
+ "list.js"
2404
+ ]
2405
+ },
2406
+ "keys:revoke": {
2407
+ "aliases": [],
2408
+ "args": {
2409
+ "key_id": {
2410
+ "description": "Key ID",
2411
+ "name": "key_id",
2412
+ "required": true
2413
+ }
2414
+ },
2415
+ "description": "Revoke an API key (JWT required)",
2416
+ "flags": {
2417
+ "json": {
2418
+ "description": "Format output as json.",
2419
+ "helpGroup": "GLOBAL",
2420
+ "name": "json",
2421
+ "allowNo": false,
2422
+ "type": "boolean"
2346
2423
  },
2347
- "name": {
2348
- "description": "Display name",
2349
- "name": "name",
2350
- "required": true,
2351
- "hasDynamicHelp": false,
2352
- "multiple": false,
2353
- "type": "option"
2354
- },
2355
- "alias": {
2356
- "description": "Unique alias slug",
2357
- "name": "alias",
2358
- "required": true,
2359
- "hasDynamicHelp": false,
2360
- "multiple": false,
2361
- "type": "option"
2362
- },
2363
- "description": {
2364
- "description": "Plain-text description / bio (max 1500 chars)",
2365
- "name": "description",
2366
- "hasDynamicHelp": false,
2367
- "multiple": false,
2368
- "type": "option"
2369
- },
2370
- "tag": {
2371
- "description": "Tag label (repeatable, lowercase)",
2372
- "name": "tag",
2373
- "hasDynamicHelp": false,
2374
- "multiple": true,
2375
- "type": "option"
2376
- },
2377
- "default-model": {
2378
- "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
2379
- "name": "default-model",
2424
+ "base-url": {
2425
+ "description": "API base URL",
2426
+ "env": "FACES_BASE_URL",
2427
+ "name": "base-url",
2380
2428
  "hasDynamicHelp": false,
2381
2429
  "multiple": false,
2382
2430
  "type": "option"
2383
2431
  },
2384
- "formula": {
2385
- "description": "Boolean formula over owned concrete face aliases (e.g. \"a | b\", \"(a | b) - c\"). Creates a composite face.",
2386
- "name": "formula",
2432
+ "token": {
2433
+ "description": "JWT bearer token",
2434
+ "env": "FACES_TOKEN",
2435
+ "name": "token",
2387
2436
  "hasDynamicHelp": false,
2388
2437
  "multiple": false,
2389
2438
  "type": "option"
2390
2439
  },
2391
- "attr": {
2392
- "description": "Attribute KEY=VALUE (repeatable)",
2393
- "name": "attr",
2394
- "hasDynamicHelp": false,
2395
- "multiple": true,
2396
- "type": "option"
2397
- },
2398
- "tool": {
2399
- "description": "Tool name to enable (repeatable)",
2400
- "name": "tool",
2401
- "hasDynamicHelp": false,
2402
- "multiple": true,
2403
- "type": "option"
2404
- },
2405
- "profile-addendum": {
2406
- "description": "Per-face system prompt, injected after the persona profile and before any per-request system prompt (max 100,000 chars).",
2407
- "name": "profile-addendum",
2440
+ "api-key": {
2441
+ "description": "API key",
2442
+ "env": "FACES_API_KEY",
2443
+ "name": "api-key",
2408
2444
  "hasDynamicHelp": false,
2409
2445
  "multiple": false,
2410
2446
  "type": "option"
2411
2447
  },
2412
- "profile-addendum-file": {
2413
- "description": "Read the per-face system prompt from a file (alternative to --profile-addendum).",
2414
- "exclusive": [
2415
- "profile-addendum"
2416
- ],
2417
- "name": "profile-addendum-file",
2418
- "hasDynamicHelp": false,
2419
- "multiple": false,
2420
- "type": "option"
2448
+ "yes": {
2449
+ "description": "Skip confirmation",
2450
+ "name": "yes",
2451
+ "allowNo": false,
2452
+ "type": "boolean"
2421
2453
  }
2422
2454
  },
2423
2455
  "hasDynamicHelp": false,
2424
2456
  "hiddenAliases": [],
2425
- "id": "face:create",
2457
+ "id": "keys:revoke",
2426
2458
  "pluginAlias": "faces-cli",
2427
2459
  "pluginName": "faces-cli",
2428
2460
  "pluginType": "core",
@@ -2432,20 +2464,20 @@
2432
2464
  "relativePath": [
2433
2465
  "dist",
2434
2466
  "commands",
2435
- "face",
2436
- "create.js"
2467
+ "keys",
2468
+ "revoke.js"
2437
2469
  ]
2438
2470
  },
2439
- "face:delete": {
2471
+ "keys:update": {
2440
2472
  "aliases": [],
2441
2473
  "args": {
2442
- "face_id": {
2443
- "description": "Face alias",
2444
- "name": "face_id",
2474
+ "key_id": {
2475
+ "description": "Key ID",
2476
+ "name": "key_id",
2445
2477
  "required": true
2446
2478
  }
2447
2479
  },
2448
- "description": "Delete a face permanently",
2480
+ "description": "Update API key metadata (JWT required)",
2449
2481
  "flags": {
2450
2482
  "json": {
2451
2483
  "description": "Format output as json.",
@@ -2478,16 +2510,30 @@
2478
2510
  "multiple": false,
2479
2511
  "type": "option"
2480
2512
  },
2481
- "yes": {
2482
- "description": "Skip confirmation",
2483
- "name": "yes",
2513
+ "name": {
2514
+ "description": "New key name",
2515
+ "name": "name",
2516
+ "hasDynamicHelp": false,
2517
+ "multiple": false,
2518
+ "type": "option"
2519
+ },
2520
+ "budget": {
2521
+ "description": "New spend budget in USD",
2522
+ "name": "budget",
2523
+ "hasDynamicHelp": false,
2524
+ "multiple": false,
2525
+ "type": "option"
2526
+ },
2527
+ "reset-spent": {
2528
+ "description": "Reset spent amount to zero",
2529
+ "name": "reset-spent",
2484
2530
  "allowNo": false,
2485
2531
  "type": "boolean"
2486
2532
  }
2487
2533
  },
2488
2534
  "hasDynamicHelp": false,
2489
2535
  "hiddenAliases": [],
2490
- "id": "face:delete",
2536
+ "id": "keys:update",
2491
2537
  "pluginAlias": "faces-cli",
2492
2538
  "pluginName": "faces-cli",
2493
2539
  "pluginType": "core",
@@ -2497,14 +2543,14 @@
2497
2543
  "relativePath": [
2498
2544
  "dist",
2499
2545
  "commands",
2500
- "face",
2501
- "delete.js"
2546
+ "keys",
2547
+ "update.js"
2502
2548
  ]
2503
2549
  },
2504
- "face:diff": {
2550
+ "face:attributes": {
2505
2551
  "aliases": [],
2506
2552
  "args": {},
2507
- "description": "Compare owned faces pairwise across all centroid components",
2553
+ "description": "List all supported attribute keys",
2508
2554
  "flags": {
2509
2555
  "json": {
2510
2556
  "description": "Format output as json.",
@@ -2536,19 +2582,11 @@
2536
2582
  "hasDynamicHelp": false,
2537
2583
  "multiple": false,
2538
2584
  "type": "option"
2539
- },
2540
- "face": {
2541
- "description": "Face alias to include (repeatable, min 2)",
2542
- "name": "face",
2543
- "required": true,
2544
- "hasDynamicHelp": false,
2545
- "multiple": true,
2546
- "type": "option"
2547
2585
  }
2548
2586
  },
2549
2587
  "hasDynamicHelp": false,
2550
2588
  "hiddenAliases": [],
2551
- "id": "face:diff",
2589
+ "id": "face:attributes",
2552
2590
  "pluginAlias": "faces-cli",
2553
2591
  "pluginName": "faces-cli",
2554
2592
  "pluginType": "core",
@@ -2559,19 +2597,13 @@
2559
2597
  "dist",
2560
2598
  "commands",
2561
2599
  "face",
2562
- "diff.js"
2600
+ "attributes.js"
2563
2601
  ]
2564
2602
  },
2565
- "face:edit": {
2603
+ "face:create": {
2566
2604
  "aliases": [],
2567
- "args": {
2568
- "face_id": {
2569
- "description": "Face alias",
2570
- "name": "face_id",
2571
- "required": true
2572
- }
2573
- },
2574
- "description": "Edit a face's metadata",
2605
+ "args": {},
2606
+ "description": "Create a new face",
2575
2607
  "flags": {
2576
2608
  "json": {
2577
2609
  "description": "Format output as json.",
@@ -2605,13 +2637,273 @@
2605
2637
  "type": "option"
2606
2638
  },
2607
2639
  "name": {
2608
- "description": "New display name",
2640
+ "description": "Display name",
2609
2641
  "name": "name",
2642
+ "required": true,
2610
2643
  "hasDynamicHelp": false,
2611
2644
  "multiple": false,
2612
2645
  "type": "option"
2613
2646
  },
2614
- "description": {
2647
+ "alias": {
2648
+ "description": "Unique alias slug",
2649
+ "name": "alias",
2650
+ "required": true,
2651
+ "hasDynamicHelp": false,
2652
+ "multiple": false,
2653
+ "type": "option"
2654
+ },
2655
+ "description": {
2656
+ "description": "Plain-text description / bio (max 1500 chars)",
2657
+ "name": "description",
2658
+ "hasDynamicHelp": false,
2659
+ "multiple": false,
2660
+ "type": "option"
2661
+ },
2662
+ "tag": {
2663
+ "description": "Tag label (repeatable, lowercase)",
2664
+ "name": "tag",
2665
+ "hasDynamicHelp": false,
2666
+ "multiple": true,
2667
+ "type": "option"
2668
+ },
2669
+ "default-model": {
2670
+ "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
2671
+ "name": "default-model",
2672
+ "hasDynamicHelp": false,
2673
+ "multiple": false,
2674
+ "type": "option"
2675
+ },
2676
+ "formula": {
2677
+ "description": "Boolean formula over owned concrete face aliases (e.g. \"a | b\", \"(a | b) - c\"). Creates a composite face.",
2678
+ "name": "formula",
2679
+ "hasDynamicHelp": false,
2680
+ "multiple": false,
2681
+ "type": "option"
2682
+ },
2683
+ "attr": {
2684
+ "description": "Attribute KEY=VALUE (repeatable)",
2685
+ "name": "attr",
2686
+ "hasDynamicHelp": false,
2687
+ "multiple": true,
2688
+ "type": "option"
2689
+ },
2690
+ "tool": {
2691
+ "description": "Tool name to enable (repeatable)",
2692
+ "name": "tool",
2693
+ "hasDynamicHelp": false,
2694
+ "multiple": true,
2695
+ "type": "option"
2696
+ },
2697
+ "profile-addendum": {
2698
+ "description": "Per-face system prompt, injected after the persona profile and before any per-request system prompt (max 100,000 chars).",
2699
+ "name": "profile-addendum",
2700
+ "hasDynamicHelp": false,
2701
+ "multiple": false,
2702
+ "type": "option"
2703
+ },
2704
+ "profile-addendum-file": {
2705
+ "description": "Read the per-face system prompt from a file (alternative to --profile-addendum).",
2706
+ "exclusive": [
2707
+ "profile-addendum"
2708
+ ],
2709
+ "name": "profile-addendum-file",
2710
+ "hasDynamicHelp": false,
2711
+ "multiple": false,
2712
+ "type": "option"
2713
+ }
2714
+ },
2715
+ "hasDynamicHelp": false,
2716
+ "hiddenAliases": [],
2717
+ "id": "face:create",
2718
+ "pluginAlias": "faces-cli",
2719
+ "pluginName": "faces-cli",
2720
+ "pluginType": "core",
2721
+ "strict": true,
2722
+ "enableJsonFlag": true,
2723
+ "isESM": true,
2724
+ "relativePath": [
2725
+ "dist",
2726
+ "commands",
2727
+ "face",
2728
+ "create.js"
2729
+ ]
2730
+ },
2731
+ "face:delete": {
2732
+ "aliases": [],
2733
+ "args": {
2734
+ "face_id": {
2735
+ "description": "Face alias",
2736
+ "name": "face_id",
2737
+ "required": true
2738
+ }
2739
+ },
2740
+ "description": "Delete a face permanently",
2741
+ "flags": {
2742
+ "json": {
2743
+ "description": "Format output as json.",
2744
+ "helpGroup": "GLOBAL",
2745
+ "name": "json",
2746
+ "allowNo": false,
2747
+ "type": "boolean"
2748
+ },
2749
+ "base-url": {
2750
+ "description": "API base URL",
2751
+ "env": "FACES_BASE_URL",
2752
+ "name": "base-url",
2753
+ "hasDynamicHelp": false,
2754
+ "multiple": false,
2755
+ "type": "option"
2756
+ },
2757
+ "token": {
2758
+ "description": "JWT bearer token",
2759
+ "env": "FACES_TOKEN",
2760
+ "name": "token",
2761
+ "hasDynamicHelp": false,
2762
+ "multiple": false,
2763
+ "type": "option"
2764
+ },
2765
+ "api-key": {
2766
+ "description": "API key",
2767
+ "env": "FACES_API_KEY",
2768
+ "name": "api-key",
2769
+ "hasDynamicHelp": false,
2770
+ "multiple": false,
2771
+ "type": "option"
2772
+ },
2773
+ "yes": {
2774
+ "description": "Skip confirmation",
2775
+ "name": "yes",
2776
+ "allowNo": false,
2777
+ "type": "boolean"
2778
+ }
2779
+ },
2780
+ "hasDynamicHelp": false,
2781
+ "hiddenAliases": [],
2782
+ "id": "face:delete",
2783
+ "pluginAlias": "faces-cli",
2784
+ "pluginName": "faces-cli",
2785
+ "pluginType": "core",
2786
+ "strict": true,
2787
+ "enableJsonFlag": true,
2788
+ "isESM": true,
2789
+ "relativePath": [
2790
+ "dist",
2791
+ "commands",
2792
+ "face",
2793
+ "delete.js"
2794
+ ]
2795
+ },
2796
+ "face:diff": {
2797
+ "aliases": [],
2798
+ "args": {},
2799
+ "description": "Compare owned faces pairwise across all centroid components",
2800
+ "flags": {
2801
+ "json": {
2802
+ "description": "Format output as json.",
2803
+ "helpGroup": "GLOBAL",
2804
+ "name": "json",
2805
+ "allowNo": false,
2806
+ "type": "boolean"
2807
+ },
2808
+ "base-url": {
2809
+ "description": "API base URL",
2810
+ "env": "FACES_BASE_URL",
2811
+ "name": "base-url",
2812
+ "hasDynamicHelp": false,
2813
+ "multiple": false,
2814
+ "type": "option"
2815
+ },
2816
+ "token": {
2817
+ "description": "JWT bearer token",
2818
+ "env": "FACES_TOKEN",
2819
+ "name": "token",
2820
+ "hasDynamicHelp": false,
2821
+ "multiple": false,
2822
+ "type": "option"
2823
+ },
2824
+ "api-key": {
2825
+ "description": "API key",
2826
+ "env": "FACES_API_KEY",
2827
+ "name": "api-key",
2828
+ "hasDynamicHelp": false,
2829
+ "multiple": false,
2830
+ "type": "option"
2831
+ },
2832
+ "face": {
2833
+ "description": "Face alias to include (repeatable, min 2)",
2834
+ "name": "face",
2835
+ "required": true,
2836
+ "hasDynamicHelp": false,
2837
+ "multiple": true,
2838
+ "type": "option"
2839
+ }
2840
+ },
2841
+ "hasDynamicHelp": false,
2842
+ "hiddenAliases": [],
2843
+ "id": "face:diff",
2844
+ "pluginAlias": "faces-cli",
2845
+ "pluginName": "faces-cli",
2846
+ "pluginType": "core",
2847
+ "strict": true,
2848
+ "enableJsonFlag": true,
2849
+ "isESM": true,
2850
+ "relativePath": [
2851
+ "dist",
2852
+ "commands",
2853
+ "face",
2854
+ "diff.js"
2855
+ ]
2856
+ },
2857
+ "face:edit": {
2858
+ "aliases": [],
2859
+ "args": {
2860
+ "face_id": {
2861
+ "description": "Face alias",
2862
+ "name": "face_id",
2863
+ "required": true
2864
+ }
2865
+ },
2866
+ "description": "Edit a face's metadata",
2867
+ "flags": {
2868
+ "json": {
2869
+ "description": "Format output as json.",
2870
+ "helpGroup": "GLOBAL",
2871
+ "name": "json",
2872
+ "allowNo": false,
2873
+ "type": "boolean"
2874
+ },
2875
+ "base-url": {
2876
+ "description": "API base URL",
2877
+ "env": "FACES_BASE_URL",
2878
+ "name": "base-url",
2879
+ "hasDynamicHelp": false,
2880
+ "multiple": false,
2881
+ "type": "option"
2882
+ },
2883
+ "token": {
2884
+ "description": "JWT bearer token",
2885
+ "env": "FACES_TOKEN",
2886
+ "name": "token",
2887
+ "hasDynamicHelp": false,
2888
+ "multiple": false,
2889
+ "type": "option"
2890
+ },
2891
+ "api-key": {
2892
+ "description": "API key",
2893
+ "env": "FACES_API_KEY",
2894
+ "name": "api-key",
2895
+ "hasDynamicHelp": false,
2896
+ "multiple": false,
2897
+ "type": "option"
2898
+ },
2899
+ "name": {
2900
+ "description": "New display name",
2901
+ "name": "name",
2902
+ "hasDynamicHelp": false,
2903
+ "multiple": false,
2904
+ "type": "option"
2905
+ },
2906
+ "description": {
2615
2907
  "description": "Plain-text description / bio (max 1500 chars)",
2616
2908
  "name": "description",
2617
2909
  "hasDynamicHelp": false,
@@ -3201,189 +3493,7 @@
3201
3493
  "share.js"
3202
3494
  ]
3203
3495
  },
3204
- "face:stats": {
3205
- "aliases": [],
3206
- "args": {},
3207
- "description": "Compile and chat stats for all owned faces",
3208
- "flags": {
3209
- "json": {
3210
- "description": "Format output as json.",
3211
- "helpGroup": "GLOBAL",
3212
- "name": "json",
3213
- "allowNo": false,
3214
- "type": "boolean"
3215
- },
3216
- "base-url": {
3217
- "description": "API base URL",
3218
- "env": "FACES_BASE_URL",
3219
- "name": "base-url",
3220
- "hasDynamicHelp": false,
3221
- "multiple": false,
3222
- "type": "option"
3223
- },
3224
- "token": {
3225
- "description": "JWT bearer token",
3226
- "env": "FACES_TOKEN",
3227
- "name": "token",
3228
- "hasDynamicHelp": false,
3229
- "multiple": false,
3230
- "type": "option"
3231
- },
3232
- "api-key": {
3233
- "description": "API key",
3234
- "env": "FACES_API_KEY",
3235
- "name": "api-key",
3236
- "hasDynamicHelp": false,
3237
- "multiple": false,
3238
- "type": "option"
3239
- }
3240
- },
3241
- "hasDynamicHelp": false,
3242
- "hiddenAliases": [],
3243
- "id": "face:stats",
3244
- "pluginAlias": "faces-cli",
3245
- "pluginName": "faces-cli",
3246
- "pluginType": "core",
3247
- "strict": true,
3248
- "enableJsonFlag": true,
3249
- "isESM": true,
3250
- "relativePath": [
3251
- "dist",
3252
- "commands",
3253
- "face",
3254
- "stats.js"
3255
- ]
3256
- },
3257
- "face:teams": {
3258
- "aliases": [],
3259
- "args": {
3260
- "alias": {
3261
- "description": "Face alias",
3262
- "name": "alias",
3263
- "required": true
3264
- }
3265
- },
3266
- "description": "Set a face's team memberships (replaces all)",
3267
- "flags": {
3268
- "json": {
3269
- "description": "Format output as json.",
3270
- "helpGroup": "GLOBAL",
3271
- "name": "json",
3272
- "allowNo": false,
3273
- "type": "boolean"
3274
- },
3275
- "base-url": {
3276
- "description": "API base URL",
3277
- "env": "FACES_BASE_URL",
3278
- "name": "base-url",
3279
- "hasDynamicHelp": false,
3280
- "multiple": false,
3281
- "type": "option"
3282
- },
3283
- "token": {
3284
- "description": "JWT bearer token",
3285
- "env": "FACES_TOKEN",
3286
- "name": "token",
3287
- "hasDynamicHelp": false,
3288
- "multiple": false,
3289
- "type": "option"
3290
- },
3291
- "api-key": {
3292
- "description": "API key",
3293
- "env": "FACES_API_KEY",
3294
- "name": "api-key",
3295
- "hasDynamicHelp": false,
3296
- "multiple": false,
3297
- "type": "option"
3298
- },
3299
- "team": {
3300
- "description": "Team ID (repeatable, replaces all memberships)",
3301
- "name": "team",
3302
- "required": true,
3303
- "hasDynamicHelp": false,
3304
- "multiple": true,
3305
- "type": "option"
3306
- }
3307
- },
3308
- "hasDynamicHelp": false,
3309
- "hiddenAliases": [],
3310
- "id": "face:teams",
3311
- "pluginAlias": "faces-cli",
3312
- "pluginName": "faces-cli",
3313
- "pluginType": "core",
3314
- "strict": true,
3315
- "enableJsonFlag": true,
3316
- "isESM": true,
3317
- "relativePath": [
3318
- "dist",
3319
- "commands",
3320
- "face",
3321
- "teams.js"
3322
- ]
3323
- },
3324
- "face:unlock": {
3325
- "aliases": [],
3326
- "args": {
3327
- "face_id": {
3328
- "description": "Face alias",
3329
- "name": "face_id",
3330
- "required": true
3331
- }
3332
- },
3333
- "description": "Unlock a face (make it writable again). Thaws the face and everything it owns (documents, threads, voiceprint).",
3334
- "examples": [
3335
- "<%= config.bin %> <%= command.id %> socrates"
3336
- ],
3337
- "flags": {
3338
- "json": {
3339
- "description": "Format output as json.",
3340
- "helpGroup": "GLOBAL",
3341
- "name": "json",
3342
- "allowNo": false,
3343
- "type": "boolean"
3344
- },
3345
- "base-url": {
3346
- "description": "API base URL",
3347
- "env": "FACES_BASE_URL",
3348
- "name": "base-url",
3349
- "hasDynamicHelp": false,
3350
- "multiple": false,
3351
- "type": "option"
3352
- },
3353
- "token": {
3354
- "description": "JWT bearer token",
3355
- "env": "FACES_TOKEN",
3356
- "name": "token",
3357
- "hasDynamicHelp": false,
3358
- "multiple": false,
3359
- "type": "option"
3360
- },
3361
- "api-key": {
3362
- "description": "API key",
3363
- "env": "FACES_API_KEY",
3364
- "name": "api-key",
3365
- "hasDynamicHelp": false,
3366
- "multiple": false,
3367
- "type": "option"
3368
- }
3369
- },
3370
- "hasDynamicHelp": false,
3371
- "hiddenAliases": [],
3372
- "id": "face:unlock",
3373
- "pluginAlias": "faces-cli",
3374
- "pluginName": "faces-cli",
3375
- "pluginType": "core",
3376
- "strict": true,
3377
- "enableJsonFlag": true,
3378
- "isESM": true,
3379
- "relativePath": [
3380
- "dist",
3381
- "commands",
3382
- "face",
3383
- "unlock.js"
3384
- ]
3385
- },
3386
- "face:unpublish": {
3496
+ "face:sources": {
3387
3497
  "aliases": [],
3388
3498
  "args": {
3389
3499
  "alias": {
@@ -3392,7 +3502,12 @@
3392
3502
  "required": true
3393
3503
  }
3394
3504
  },
3395
- "description": "Stop publishing a face. Anyone it is individually shared with keeps their access publishing is an override on top of sharing, not a replacement for it.",
3505
+ "description": "List every source compiled into a face: documents and threads together, one row each. Exits 4 if the face does not exist, which is a different answer from a face that has no sources. Content is never printed; read a single source with compile:doc:get or compile:thread:get.",
3506
+ "examples": [
3507
+ "<%= config.bin %> <%= command.id %> alice",
3508
+ "<%= config.bin %> <%= command.id %> alice --type thread",
3509
+ "<%= config.bin %> <%= command.id %> alice --json"
3510
+ ],
3396
3511
  "flags": {
3397
3512
  "json": {
3398
3513
  "description": "Format output as json.",
@@ -3424,11 +3539,22 @@
3424
3539
  "hasDynamicHelp": false,
3425
3540
  "multiple": false,
3426
3541
  "type": "option"
3542
+ },
3543
+ "type": {
3544
+ "description": "Show only one kind of source",
3545
+ "name": "type",
3546
+ "hasDynamicHelp": false,
3547
+ "multiple": false,
3548
+ "options": [
3549
+ "doc",
3550
+ "thread"
3551
+ ],
3552
+ "type": "option"
3427
3553
  }
3428
3554
  },
3429
3555
  "hasDynamicHelp": false,
3430
3556
  "hiddenAliases": [],
3431
- "id": "face:unpublish",
3557
+ "id": "face:sources",
3432
3558
  "pluginAlias": "faces-cli",
3433
3559
  "pluginName": "faces-cli",
3434
3560
  "pluginType": "core",
@@ -3439,23 +3565,13 @@
3439
3565
  "dist",
3440
3566
  "commands",
3441
3567
  "face",
3442
- "unpublish.js"
3568
+ "sources.js"
3443
3569
  ]
3444
3570
  },
3445
- "face:unshare": {
3571
+ "face:stats": {
3446
3572
  "aliases": [],
3447
- "args": {
3448
- "alias": {
3449
- "description": "Face alias",
3450
- "name": "alias",
3451
- "required": true
3452
- }
3453
- },
3454
- "description": "Revoke access to a shared face. Takes effect immediately — there is no grace period.",
3455
- "examples": [
3456
- "<%= config.bin %> <%= command.id %> alice --from dana --yes",
3457
- "<%= config.bin %> <%= command.id %> alice --all --yes"
3458
- ],
3573
+ "args": {},
3574
+ "description": "Compile and chat stats for all owned faces",
3459
3575
  "flags": {
3460
3576
  "json": {
3461
3577
  "description": "Format output as json.",
@@ -3487,36 +3603,11 @@
3487
3603
  "hasDynamicHelp": false,
3488
3604
  "multiple": false,
3489
3605
  "type": "option"
3490
- },
3491
- "from": {
3492
- "description": "Account to revoke (repeatable)",
3493
- "exclusive": [
3494
- "all"
3495
- ],
3496
- "name": "from",
3497
- "hasDynamicHelp": false,
3498
- "multiple": true,
3499
- "type": "option"
3500
- },
3501
- "all": {
3502
- "description": "Revoke everyone",
3503
- "exclusive": [
3504
- "from"
3505
- ],
3506
- "name": "all",
3507
- "allowNo": false,
3508
- "type": "boolean"
3509
- },
3510
- "yes": {
3511
- "description": "Skip confirmation",
3512
- "name": "yes",
3513
- "allowNo": false,
3514
- "type": "boolean"
3515
3606
  }
3516
3607
  },
3517
3608
  "hasDynamicHelp": false,
3518
3609
  "hiddenAliases": [],
3519
- "id": "face:unshare",
3610
+ "id": "face:stats",
3520
3611
  "pluginAlias": "faces-cli",
3521
3612
  "pluginName": "faces-cli",
3522
3613
  "pluginType": "core",
@@ -3527,13 +3618,19 @@
3527
3618
  "dist",
3528
3619
  "commands",
3529
3620
  "face",
3530
- "unshare.js"
3621
+ "stats.js"
3531
3622
  ]
3532
3623
  },
3533
- "keys:create": {
3624
+ "face:teams": {
3534
3625
  "aliases": [],
3535
- "args": {},
3536
- "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.",
3626
+ "args": {
3627
+ "alias": {
3628
+ "description": "Face alias",
3629
+ "name": "alias",
3630
+ "required": true
3631
+ }
3632
+ },
3633
+ "description": "Set a face's team memberships (replaces all)",
3537
3634
  "flags": {
3538
3635
  "json": {
3539
3636
  "description": "Format output as json.",
@@ -3566,52 +3663,18 @@
3566
3663
  "multiple": false,
3567
3664
  "type": "option"
3568
3665
  },
3569
- "name": {
3570
- "description": "Key name/label",
3571
- "name": "name",
3666
+ "team": {
3667
+ "description": "Team ID (repeatable, replaces all memberships)",
3668
+ "name": "team",
3572
3669
  "required": true,
3573
3670
  "hasDynamicHelp": false,
3574
- "multiple": false,
3575
- "type": "option"
3576
- },
3577
- "expires-days": {
3578
- "description": "Expiry in days (omit for no expiry)",
3579
- "name": "expires-days",
3580
- "hasDynamicHelp": false,
3581
- "multiple": false,
3582
- "type": "option"
3583
- },
3584
- "budget": {
3585
- "description": "Spend budget in USD",
3586
- "name": "budget",
3587
- "hasDynamicHelp": false,
3588
- "multiple": false,
3589
- "type": "option"
3590
- },
3591
- "face": {
3592
- "description": "Allowed face alias (repeatable)",
3593
- "name": "face",
3594
- "hasDynamicHelp": false,
3595
- "multiple": true,
3596
- "type": "option"
3597
- },
3598
- "model": {
3599
- "description": "Allowed model name (repeatable)",
3600
- "name": "model",
3601
- "hasDynamicHelp": false,
3602
3671
  "multiple": true,
3603
3672
  "type": "option"
3604
- },
3605
- "save": {
3606
- "description": "Save the new key to ~/.faces/config.json as api_key (default: true; use --no-save to skip)",
3607
- "name": "save",
3608
- "allowNo": true,
3609
- "type": "boolean"
3610
3673
  }
3611
3674
  },
3612
3675
  "hasDynamicHelp": false,
3613
3676
  "hiddenAliases": [],
3614
- "id": "keys:create",
3677
+ "id": "face:teams",
3615
3678
  "pluginAlias": "faces-cli",
3616
3679
  "pluginName": "faces-cli",
3617
3680
  "pluginType": "core",
@@ -3621,14 +3684,23 @@
3621
3684
  "relativePath": [
3622
3685
  "dist",
3623
3686
  "commands",
3624
- "keys",
3625
- "create.js"
3687
+ "face",
3688
+ "teams.js"
3626
3689
  ]
3627
3690
  },
3628
- "keys:list": {
3691
+ "face:unlock": {
3629
3692
  "aliases": [],
3630
- "args": {},
3631
- "description": "List all API keys (JWT required)",
3693
+ "args": {
3694
+ "face_id": {
3695
+ "description": "Face alias",
3696
+ "name": "face_id",
3697
+ "required": true
3698
+ }
3699
+ },
3700
+ "description": "Unlock a face (make it writable again). Thaws the face and everything it owns (documents, threads, voiceprint).",
3701
+ "examples": [
3702
+ "<%= config.bin %> <%= command.id %> socrates"
3703
+ ],
3632
3704
  "flags": {
3633
3705
  "json": {
3634
3706
  "description": "Format output as json.",
@@ -3664,7 +3736,7 @@
3664
3736
  },
3665
3737
  "hasDynamicHelp": false,
3666
3738
  "hiddenAliases": [],
3667
- "id": "keys:list",
3739
+ "id": "face:unlock",
3668
3740
  "pluginAlias": "faces-cli",
3669
3741
  "pluginName": "faces-cli",
3670
3742
  "pluginType": "core",
@@ -3674,20 +3746,20 @@
3674
3746
  "relativePath": [
3675
3747
  "dist",
3676
3748
  "commands",
3677
- "keys",
3678
- "list.js"
3749
+ "face",
3750
+ "unlock.js"
3679
3751
  ]
3680
3752
  },
3681
- "keys:revoke": {
3753
+ "face:unpublish": {
3682
3754
  "aliases": [],
3683
3755
  "args": {
3684
- "key_id": {
3685
- "description": "Key ID",
3686
- "name": "key_id",
3756
+ "alias": {
3757
+ "description": "Face alias",
3758
+ "name": "alias",
3687
3759
  "required": true
3688
3760
  }
3689
3761
  },
3690
- "description": "Revoke an API key (JWT required)",
3762
+ "description": "Stop publishing a face. Anyone it is individually shared with keeps their access — publishing is an override on top of sharing, not a replacement for it.",
3691
3763
  "flags": {
3692
3764
  "json": {
3693
3765
  "description": "Format output as json.",
@@ -3719,17 +3791,11 @@
3719
3791
  "hasDynamicHelp": false,
3720
3792
  "multiple": false,
3721
3793
  "type": "option"
3722
- },
3723
- "yes": {
3724
- "description": "Skip confirmation",
3725
- "name": "yes",
3726
- "allowNo": false,
3727
- "type": "boolean"
3728
3794
  }
3729
3795
  },
3730
3796
  "hasDynamicHelp": false,
3731
3797
  "hiddenAliases": [],
3732
- "id": "keys:revoke",
3798
+ "id": "face:unpublish",
3733
3799
  "pluginAlias": "faces-cli",
3734
3800
  "pluginName": "faces-cli",
3735
3801
  "pluginType": "core",
@@ -3739,20 +3805,24 @@
3739
3805
  "relativePath": [
3740
3806
  "dist",
3741
3807
  "commands",
3742
- "keys",
3743
- "revoke.js"
3808
+ "face",
3809
+ "unpublish.js"
3744
3810
  ]
3745
3811
  },
3746
- "keys:update": {
3812
+ "face:unshare": {
3747
3813
  "aliases": [],
3748
3814
  "args": {
3749
- "key_id": {
3750
- "description": "Key ID",
3751
- "name": "key_id",
3815
+ "alias": {
3816
+ "description": "Face alias",
3817
+ "name": "alias",
3752
3818
  "required": true
3753
3819
  }
3754
3820
  },
3755
- "description": "Update API key metadata (JWT required)",
3821
+ "description": "Revoke access to a shared face. Takes effect immediately — there is no grace period.",
3822
+ "examples": [
3823
+ "<%= config.bin %> <%= command.id %> alice --from dana --yes",
3824
+ "<%= config.bin %> <%= command.id %> alice --all --yes"
3825
+ ],
3756
3826
  "flags": {
3757
3827
  "json": {
3758
3828
  "description": "Format output as json.",
@@ -3785,30 +3855,35 @@
3785
3855
  "multiple": false,
3786
3856
  "type": "option"
3787
3857
  },
3788
- "name": {
3789
- "description": "New key name",
3790
- "name": "name",
3858
+ "from": {
3859
+ "description": "Account to revoke (repeatable)",
3860
+ "exclusive": [
3861
+ "all"
3862
+ ],
3863
+ "name": "from",
3791
3864
  "hasDynamicHelp": false,
3792
- "multiple": false,
3865
+ "multiple": true,
3793
3866
  "type": "option"
3794
3867
  },
3795
- "budget": {
3796
- "description": "New spend budget in USD",
3797
- "name": "budget",
3798
- "hasDynamicHelp": false,
3799
- "multiple": false,
3800
- "type": "option"
3868
+ "all": {
3869
+ "description": "Revoke everyone",
3870
+ "exclusive": [
3871
+ "from"
3872
+ ],
3873
+ "name": "all",
3874
+ "allowNo": false,
3875
+ "type": "boolean"
3801
3876
  },
3802
- "reset-spent": {
3803
- "description": "Reset spent amount to zero",
3804
- "name": "reset-spent",
3877
+ "yes": {
3878
+ "description": "Skip confirmation",
3879
+ "name": "yes",
3805
3880
  "allowNo": false,
3806
3881
  "type": "boolean"
3807
3882
  }
3808
3883
  },
3809
3884
  "hasDynamicHelp": false,
3810
3885
  "hiddenAliases": [],
3811
- "id": "keys:update",
3886
+ "id": "face:unshare",
3812
3887
  "pluginAlias": "faces-cli",
3813
3888
  "pluginName": "faces-cli",
3814
3889
  "pluginType": "core",
@@ -3818,8 +3893,8 @@
3818
3893
  "relativePath": [
3819
3894
  "dist",
3820
3895
  "commands",
3821
- "keys",
3822
- "update.js"
3896
+ "face",
3897
+ "unshare.js"
3823
3898
  ]
3824
3899
  },
3825
3900
  "team:add": {
@@ -4993,7 +5068,7 @@
4993
5068
  "required": true
4994
5069
  }
4995
5070
  },
4996
- "description": "List documents for a face",
5071
+ "description": "List documents for a face. Each document's full text is omitted unless --verbose, so a face with a real corpus stays readable. For a table of every source, documents and threads together, use face:sources.",
4997
5072
  "flags": {
4998
5073
  "json": {
4999
5074
  "description": "Format output as json.",
@@ -5025,6 +5100,12 @@
5025
5100
  "hasDynamicHelp": false,
5026
5101
  "multiple": false,
5027
5102
  "type": "option"
5103
+ },
5104
+ "verbose": {
5105
+ "description": "Include each document's full text",
5106
+ "name": "verbose",
5107
+ "allowNo": false,
5108
+ "type": "boolean"
5028
5109
  }
5029
5110
  },
5030
5111
  "hasDynamicHelp": false,
@@ -5258,16 +5339,16 @@
5258
5339
  "reset.js"
5259
5340
  ]
5260
5341
  },
5261
- "face:tag:add": {
5342
+ "compile:thread:create": {
5262
5343
  "aliases": [],
5263
5344
  "args": {
5264
- "alias": {
5345
+ "face_id": {
5265
5346
  "description": "Face alias",
5266
- "name": "alias",
5347
+ "name": "face_id",
5267
5348
  "required": true
5268
5349
  }
5269
5350
  },
5270
- "description": "Add tags to a face (appends, idempotent)",
5351
+ "description": "Start a new thread for a face",
5271
5352
  "flags": {
5272
5353
  "json": {
5273
5354
  "description": "Format output as json.",
@@ -5300,18 +5381,23 @@
5300
5381
  "multiple": false,
5301
5382
  "type": "option"
5302
5383
  },
5303
- "tag": {
5304
- "description": "Tag to add (repeatable)",
5305
- "name": "tag",
5306
- "required": true,
5384
+ "label": {
5385
+ "description": "Thread label",
5386
+ "name": "label",
5307
5387
  "hasDynamicHelp": false,
5308
- "multiple": true,
5388
+ "multiple": false,
5309
5389
  "type": "option"
5390
+ },
5391
+ "oauth-only": {
5392
+ "description": "Prevent fallback to paid system key (use OAuth only)",
5393
+ "name": "oauth-only",
5394
+ "allowNo": false,
5395
+ "type": "boolean"
5310
5396
  }
5311
5397
  },
5312
5398
  "hasDynamicHelp": false,
5313
5399
  "hiddenAliases": [],
5314
- "id": "face:tag:add",
5400
+ "id": "compile:thread:create",
5315
5401
  "pluginAlias": "faces-cli",
5316
5402
  "pluginName": "faces-cli",
5317
5403
  "pluginType": "core",
@@ -5321,15 +5407,21 @@
5321
5407
  "relativePath": [
5322
5408
  "dist",
5323
5409
  "commands",
5324
- "face",
5325
- "tag",
5326
- "add.js"
5410
+ "compile",
5411
+ "thread",
5412
+ "create.js"
5327
5413
  ]
5328
5414
  },
5329
- "face:tag:all": {
5415
+ "compile:thread:delete": {
5330
5416
  "aliases": [],
5331
- "args": {},
5332
- "description": "List all tags across all your faces",
5417
+ "args": {
5418
+ "thread_id": {
5419
+ "description": "Thread ID",
5420
+ "name": "thread_id",
5421
+ "required": true
5422
+ }
5423
+ },
5424
+ "description": "Delete a thread",
5333
5425
  "flags": {
5334
5426
  "json": {
5335
5427
  "description": "Format output as json.",
@@ -5361,11 +5453,17 @@
5361
5453
  "hasDynamicHelp": false,
5362
5454
  "multiple": false,
5363
5455
  "type": "option"
5456
+ },
5457
+ "yes": {
5458
+ "description": "Skip confirmation",
5459
+ "name": "yes",
5460
+ "allowNo": false,
5461
+ "type": "boolean"
5364
5462
  }
5365
5463
  },
5366
5464
  "hasDynamicHelp": false,
5367
5465
  "hiddenAliases": [],
5368
- "id": "face:tag:all",
5466
+ "id": "compile:thread:delete",
5369
5467
  "pluginAlias": "faces-cli",
5370
5468
  "pluginName": "faces-cli",
5371
5469
  "pluginType": "core",
@@ -5375,21 +5473,21 @@
5375
5473
  "relativePath": [
5376
5474
  "dist",
5377
5475
  "commands",
5378
- "face",
5379
- "tag",
5380
- "all.js"
5476
+ "compile",
5477
+ "thread",
5478
+ "delete.js"
5381
5479
  ]
5382
5480
  },
5383
- "face:tag:list": {
5481
+ "compile:thread:edit": {
5384
5482
  "aliases": [],
5385
5483
  "args": {
5386
- "alias": {
5387
- "description": "Face alias",
5388
- "name": "alias",
5484
+ "thread_id": {
5485
+ "description": "Thread ID",
5486
+ "name": "thread_id",
5389
5487
  "required": true
5390
5488
  }
5391
5489
  },
5392
- "description": "List tags on a face",
5490
+ "description": "Edit a thread (label and/or reassign face speaker)",
5393
5491
  "flags": {
5394
5492
  "json": {
5395
5493
  "description": "Format output as json.",
@@ -5421,11 +5519,25 @@
5421
5519
  "hasDynamicHelp": false,
5422
5520
  "multiple": false,
5423
5521
  "type": "option"
5522
+ },
5523
+ "label": {
5524
+ "description": "New thread label",
5525
+ "name": "label",
5526
+ "hasDynamicHelp": false,
5527
+ "multiple": false,
5528
+ "type": "option"
5529
+ },
5530
+ "face-speaker": {
5531
+ "description": "Reassign face speaker: set this speaker to role=user, all others to role=assistant",
5532
+ "name": "face-speaker",
5533
+ "hasDynamicHelp": false,
5534
+ "multiple": false,
5535
+ "type": "option"
5424
5536
  }
5425
5537
  },
5426
5538
  "hasDynamicHelp": false,
5427
5539
  "hiddenAliases": [],
5428
- "id": "face:tag:list",
5540
+ "id": "compile:thread:edit",
5429
5541
  "pluginAlias": "faces-cli",
5430
5542
  "pluginName": "faces-cli",
5431
5543
  "pluginType": "core",
@@ -5435,26 +5547,21 @@
5435
5547
  "relativePath": [
5436
5548
  "dist",
5437
5549
  "commands",
5438
- "face",
5439
- "tag",
5440
- "list.js"
5550
+ "compile",
5551
+ "thread",
5552
+ "edit.js"
5441
5553
  ]
5442
5554
  },
5443
- "face:tag:remove": {
5555
+ "compile:thread:get": {
5444
5556
  "aliases": [],
5445
5557
  "args": {
5446
- "alias": {
5447
- "description": "Face alias",
5448
- "name": "alias",
5449
- "required": true
5450
- },
5451
- "tag": {
5452
- "description": "Tag to remove",
5453
- "name": "tag",
5558
+ "thread_id": {
5559
+ "description": "Thread ID",
5560
+ "name": "thread_id",
5454
5561
  "required": true
5455
5562
  }
5456
5563
  },
5457
- "description": "Remove a tag from a face",
5564
+ "description": "Get a thread by ID",
5458
5565
  "flags": {
5459
5566
  "json": {
5460
5567
  "description": "Format output as json.",
@@ -5490,7 +5597,7 @@
5490
5597
  },
5491
5598
  "hasDynamicHelp": false,
5492
5599
  "hiddenAliases": [],
5493
- "id": "face:tag:remove",
5600
+ "id": "compile:thread:get",
5494
5601
  "pluginAlias": "faces-cli",
5495
5602
  "pluginName": "faces-cli",
5496
5603
  "pluginType": "core",
@@ -5500,21 +5607,21 @@
5500
5607
  "relativePath": [
5501
5608
  "dist",
5502
5609
  "commands",
5503
- "face",
5504
- "tag",
5505
- "remove.js"
5610
+ "compile",
5611
+ "thread",
5612
+ "get.js"
5506
5613
  ]
5507
5614
  },
5508
- "face:tag:set": {
5615
+ "compile:thread:list": {
5509
5616
  "aliases": [],
5510
5617
  "args": {
5511
- "alias": {
5618
+ "face_id": {
5512
5619
  "description": "Face alias",
5513
- "name": "alias",
5620
+ "name": "face_id",
5514
5621
  "required": true
5515
5622
  }
5516
5623
  },
5517
- "description": "Replace all tags on a face",
5624
+ "description": "List threads for a face",
5518
5625
  "flags": {
5519
5626
  "json": {
5520
5627
  "description": "Format output as json.",
@@ -5546,19 +5653,11 @@
5546
5653
  "hasDynamicHelp": false,
5547
5654
  "multiple": false,
5548
5655
  "type": "option"
5549
- },
5550
- "tag": {
5551
- "description": "Tag to set (repeatable, replaces all)",
5552
- "name": "tag",
5553
- "required": true,
5554
- "hasDynamicHelp": false,
5555
- "multiple": true,
5556
- "type": "option"
5557
5656
  }
5558
5657
  },
5559
5658
  "hasDynamicHelp": false,
5560
5659
  "hiddenAliases": [],
5561
- "id": "face:tag:set",
5660
+ "id": "compile:thread:list",
5562
5661
  "pluginAlias": "faces-cli",
5563
5662
  "pluginName": "faces-cli",
5564
5663
  "pluginType": "core",
@@ -5568,21 +5667,21 @@
5568
5667
  "relativePath": [
5569
5668
  "dist",
5570
5669
  "commands",
5571
- "face",
5572
- "tag",
5573
- "set.js"
5670
+ "compile",
5671
+ "thread",
5672
+ "list.js"
5574
5673
  ]
5575
5674
  },
5576
- "team:tag:add": {
5675
+ "compile:thread:make": {
5577
5676
  "aliases": [],
5578
5677
  "args": {
5579
- "team_id": {
5580
- "description": "Team ID",
5581
- "name": "team_id",
5678
+ "thread_id": {
5679
+ "description": "Thread ID",
5680
+ "name": "thread_id",
5582
5681
  "required": true
5583
5682
  }
5584
5683
  },
5585
- "description": "Add tags to a team (appends, idempotent)",
5684
+ "description": "Compile an existing thread (prepare + sync in one step)",
5586
5685
  "flags": {
5587
5686
  "json": {
5588
5687
  "description": "Format output as json.",
@@ -5615,18 +5714,24 @@
5615
5714
  "multiple": false,
5616
5715
  "type": "option"
5617
5716
  },
5618
- "tag": {
5619
- "description": "Tag to add (repeatable)",
5620
- "name": "tag",
5621
- "required": true,
5717
+ "timeout": {
5718
+ "description": "Compile timeout in seconds (default: 600)",
5719
+ "name": "timeout",
5720
+ "default": 600,
5622
5721
  "hasDynamicHelp": false,
5623
- "multiple": true,
5722
+ "multiple": false,
5624
5723
  "type": "option"
5724
+ },
5725
+ "no-wait": {
5726
+ "description": "Return immediately after triggering compilation. Prints the thread ID for manual polling.",
5727
+ "name": "no-wait",
5728
+ "allowNo": false,
5729
+ "type": "boolean"
5625
5730
  }
5626
5731
  },
5627
5732
  "hasDynamicHelp": false,
5628
5733
  "hiddenAliases": [],
5629
- "id": "team:tag:add",
5734
+ "id": "compile:thread:make",
5630
5735
  "pluginAlias": "faces-cli",
5631
5736
  "pluginName": "faces-cli",
5632
5737
  "pluginType": "core",
@@ -5636,21 +5741,21 @@
5636
5741
  "relativePath": [
5637
5742
  "dist",
5638
5743
  "commands",
5639
- "team",
5640
- "tag",
5641
- "add.js"
5744
+ "compile",
5745
+ "thread",
5746
+ "make.js"
5642
5747
  ]
5643
5748
  },
5644
- "team:tag:list": {
5749
+ "compile:thread:message": {
5645
5750
  "aliases": [],
5646
5751
  "args": {
5647
- "team_id": {
5648
- "description": "Team ID",
5649
- "name": "team_id",
5752
+ "thread_id": {
5753
+ "description": "Thread ID",
5754
+ "name": "thread_id",
5650
5755
  "required": true
5651
5756
  }
5652
5757
  },
5653
- "description": "List tags on a team",
5758
+ "description": "Send a user message to a thread",
5654
5759
  "flags": {
5655
5760
  "json": {
5656
5761
  "description": "Format output as json.",
@@ -5682,11 +5787,26 @@
5682
5787
  "hasDynamicHelp": false,
5683
5788
  "multiple": false,
5684
5789
  "type": "option"
5790
+ },
5791
+ "message": {
5792
+ "char": "m",
5793
+ "description": "User message to append",
5794
+ "name": "message",
5795
+ "required": true,
5796
+ "hasDynamicHelp": false,
5797
+ "multiple": false,
5798
+ "type": "option"
5799
+ },
5800
+ "oauth-only": {
5801
+ "description": "Prevent fallback to paid system key (use OAuth only)",
5802
+ "name": "oauth-only",
5803
+ "allowNo": false,
5804
+ "type": "boolean"
5685
5805
  }
5686
5806
  },
5687
5807
  "hasDynamicHelp": false,
5688
5808
  "hiddenAliases": [],
5689
- "id": "team:tag:list",
5809
+ "id": "compile:thread:message",
5690
5810
  "pluginAlias": "faces-cli",
5691
5811
  "pluginName": "faces-cli",
5692
5812
  "pluginType": "core",
@@ -5696,26 +5816,21 @@
5696
5816
  "relativePath": [
5697
5817
  "dist",
5698
5818
  "commands",
5699
- "team",
5700
- "tag",
5701
- "list.js"
5819
+ "compile",
5820
+ "thread",
5821
+ "message.js"
5702
5822
  ]
5703
5823
  },
5704
- "team:tag:remove": {
5824
+ "compile:thread:pause": {
5705
5825
  "aliases": [],
5706
5826
  "args": {
5707
- "team_id": {
5708
- "description": "Team ID",
5709
- "name": "team_id",
5710
- "required": true
5711
- },
5712
- "tag": {
5713
- "description": "Tag to remove",
5714
- "name": "tag",
5827
+ "thread_id": {
5828
+ "description": "Thread ID",
5829
+ "name": "thread_id",
5715
5830
  "required": true
5716
5831
  }
5717
5832
  },
5718
- "description": "Remove a tag from a team",
5833
+ "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.",
5719
5834
  "flags": {
5720
5835
  "json": {
5721
5836
  "description": "Format output as json.",
@@ -5747,11 +5862,25 @@
5747
5862
  "hasDynamicHelp": false,
5748
5863
  "multiple": false,
5749
5864
  "type": "option"
5865
+ },
5866
+ "no-wait": {
5867
+ "description": "Return as soon as the pause is accepted, without waiting for the compile to stop.",
5868
+ "name": "no-wait",
5869
+ "allowNo": false,
5870
+ "type": "boolean"
5871
+ },
5872
+ "timeout": {
5873
+ "description": "Seconds to wait for the compile to stop (default: 60)",
5874
+ "name": "timeout",
5875
+ "default": 60,
5876
+ "hasDynamicHelp": false,
5877
+ "multiple": false,
5878
+ "type": "option"
5750
5879
  }
5751
5880
  },
5752
5881
  "hasDynamicHelp": false,
5753
5882
  "hiddenAliases": [],
5754
- "id": "team:tag:remove",
5883
+ "id": "compile:thread:pause",
5755
5884
  "pluginAlias": "faces-cli",
5756
5885
  "pluginName": "faces-cli",
5757
5886
  "pluginType": "core",
@@ -5761,21 +5890,21 @@
5761
5890
  "relativePath": [
5762
5891
  "dist",
5763
5892
  "commands",
5764
- "team",
5765
- "tag",
5766
- "remove.js"
5893
+ "compile",
5894
+ "thread",
5895
+ "pause.js"
5767
5896
  ]
5768
5897
  },
5769
- "team:tag:set": {
5898
+ "compile:thread:reset": {
5770
5899
  "aliases": [],
5771
5900
  "args": {
5772
- "team_id": {
5773
- "description": "Team ID",
5774
- "name": "team_id",
5901
+ "thread_id": {
5902
+ "description": "Thread ID",
5903
+ "name": "thread_id",
5775
5904
  "required": true
5776
5905
  }
5777
5906
  },
5778
- "description": "Replace all tags on a team",
5907
+ "description": "Reset thread compilation progress (wipe extraction, keep source messages)",
5779
5908
  "flags": {
5780
5909
  "json": {
5781
5910
  "description": "Format output as json.",
@@ -5808,18 +5937,16 @@
5808
5937
  "multiple": false,
5809
5938
  "type": "option"
5810
5939
  },
5811
- "tag": {
5812
- "description": "Tag to set (repeatable, replaces all)",
5813
- "name": "tag",
5814
- "required": true,
5815
- "hasDynamicHelp": false,
5816
- "multiple": true,
5817
- "type": "option"
5940
+ "yes": {
5941
+ "description": "Skip confirmation",
5942
+ "name": "yes",
5943
+ "allowNo": false,
5944
+ "type": "boolean"
5818
5945
  }
5819
5946
  },
5820
5947
  "hasDynamicHelp": false,
5821
5948
  "hiddenAliases": [],
5822
- "id": "team:tag:set",
5949
+ "id": "compile:thread:reset",
5823
5950
  "pluginAlias": "faces-cli",
5824
5951
  "pluginName": "faces-cli",
5825
5952
  "pluginType": "core",
@@ -5829,21 +5956,21 @@
5829
5956
  "relativePath": [
5830
5957
  "dist",
5831
5958
  "commands",
5832
- "team",
5833
- "tag",
5834
- "set.js"
5959
+ "compile",
5960
+ "thread",
5961
+ "reset.js"
5835
5962
  ]
5836
5963
  },
5837
- "compile:thread:create": {
5964
+ "compile:thread:sync": {
5838
5965
  "aliases": [],
5839
5966
  "args": {
5840
- "face_id": {
5841
- "description": "Face alias",
5842
- "name": "face_id",
5967
+ "thread_id": {
5968
+ "description": "Thread ID",
5969
+ "name": "thread_id",
5843
5970
  "required": true
5844
5971
  }
5845
5972
  },
5846
- "description": "Start a new thread for a face",
5973
+ "description": "Archive and sync a thread into a face",
5847
5974
  "flags": {
5848
5975
  "json": {
5849
5976
  "description": "Format output as json.",
@@ -5875,24 +6002,11 @@
5875
6002
  "hasDynamicHelp": false,
5876
6003
  "multiple": false,
5877
6004
  "type": "option"
5878
- },
5879
- "label": {
5880
- "description": "Thread label",
5881
- "name": "label",
5882
- "hasDynamicHelp": false,
5883
- "multiple": false,
5884
- "type": "option"
5885
- },
5886
- "oauth-only": {
5887
- "description": "Prevent fallback to paid system key (use OAuth only)",
5888
- "name": "oauth-only",
5889
- "allowNo": false,
5890
- "type": "boolean"
5891
6005
  }
5892
6006
  },
5893
6007
  "hasDynamicHelp": false,
5894
6008
  "hiddenAliases": [],
5895
- "id": "compile:thread:create",
6009
+ "id": "compile:thread:sync",
5896
6010
  "pluginAlias": "faces-cli",
5897
6011
  "pluginName": "faces-cli",
5898
6012
  "pluginType": "core",
@@ -5904,19 +6018,19 @@
5904
6018
  "commands",
5905
6019
  "compile",
5906
6020
  "thread",
5907
- "create.js"
6021
+ "sync.js"
5908
6022
  ]
5909
6023
  },
5910
- "compile:thread:delete": {
6024
+ "face:tag:add": {
5911
6025
  "aliases": [],
5912
6026
  "args": {
5913
- "thread_id": {
5914
- "description": "Thread ID",
5915
- "name": "thread_id",
6027
+ "alias": {
6028
+ "description": "Face alias",
6029
+ "name": "alias",
5916
6030
  "required": true
5917
6031
  }
5918
6032
  },
5919
- "description": "Delete a thread",
6033
+ "description": "Add tags to a face (appends, idempotent)",
5920
6034
  "flags": {
5921
6035
  "json": {
5922
6036
  "description": "Format output as json.",
@@ -5949,16 +6063,18 @@
5949
6063
  "multiple": false,
5950
6064
  "type": "option"
5951
6065
  },
5952
- "yes": {
5953
- "description": "Skip confirmation",
5954
- "name": "yes",
5955
- "allowNo": false,
5956
- "type": "boolean"
6066
+ "tag": {
6067
+ "description": "Tag to add (repeatable)",
6068
+ "name": "tag",
6069
+ "required": true,
6070
+ "hasDynamicHelp": false,
6071
+ "multiple": true,
6072
+ "type": "option"
5957
6073
  }
5958
6074
  },
5959
6075
  "hasDynamicHelp": false,
5960
6076
  "hiddenAliases": [],
5961
- "id": "compile:thread:delete",
6077
+ "id": "face:tag:add",
5962
6078
  "pluginAlias": "faces-cli",
5963
6079
  "pluginName": "faces-cli",
5964
6080
  "pluginType": "core",
@@ -5968,21 +6084,15 @@
5968
6084
  "relativePath": [
5969
6085
  "dist",
5970
6086
  "commands",
5971
- "compile",
5972
- "thread",
5973
- "delete.js"
6087
+ "face",
6088
+ "tag",
6089
+ "add.js"
5974
6090
  ]
5975
6091
  },
5976
- "compile:thread:edit": {
6092
+ "face:tag:all": {
5977
6093
  "aliases": [],
5978
- "args": {
5979
- "thread_id": {
5980
- "description": "Thread ID",
5981
- "name": "thread_id",
5982
- "required": true
5983
- }
5984
- },
5985
- "description": "Edit a thread (label and/or reassign face speaker)",
6094
+ "args": {},
6095
+ "description": "List all tags across all your faces",
5986
6096
  "flags": {
5987
6097
  "json": {
5988
6098
  "description": "Format output as json.",
@@ -6014,25 +6124,11 @@
6014
6124
  "hasDynamicHelp": false,
6015
6125
  "multiple": false,
6016
6126
  "type": "option"
6017
- },
6018
- "label": {
6019
- "description": "New thread label",
6020
- "name": "label",
6021
- "hasDynamicHelp": false,
6022
- "multiple": false,
6023
- "type": "option"
6024
- },
6025
- "face-speaker": {
6026
- "description": "Reassign face speaker: set this speaker to role=user, all others to role=assistant",
6027
- "name": "face-speaker",
6028
- "hasDynamicHelp": false,
6029
- "multiple": false,
6030
- "type": "option"
6031
6127
  }
6032
6128
  },
6033
6129
  "hasDynamicHelp": false,
6034
6130
  "hiddenAliases": [],
6035
- "id": "compile:thread:edit",
6131
+ "id": "face:tag:all",
6036
6132
  "pluginAlias": "faces-cli",
6037
6133
  "pluginName": "faces-cli",
6038
6134
  "pluginType": "core",
@@ -6042,21 +6138,21 @@
6042
6138
  "relativePath": [
6043
6139
  "dist",
6044
6140
  "commands",
6045
- "compile",
6046
- "thread",
6047
- "edit.js"
6141
+ "face",
6142
+ "tag",
6143
+ "all.js"
6048
6144
  ]
6049
6145
  },
6050
- "compile:thread:get": {
6146
+ "face:tag:list": {
6051
6147
  "aliases": [],
6052
6148
  "args": {
6053
- "thread_id": {
6054
- "description": "Thread ID",
6055
- "name": "thread_id",
6149
+ "alias": {
6150
+ "description": "Face alias",
6151
+ "name": "alias",
6056
6152
  "required": true
6057
6153
  }
6058
6154
  },
6059
- "description": "Get a thread by ID",
6155
+ "description": "List tags on a face",
6060
6156
  "flags": {
6061
6157
  "json": {
6062
6158
  "description": "Format output as json.",
@@ -6092,7 +6188,7 @@
6092
6188
  },
6093
6189
  "hasDynamicHelp": false,
6094
6190
  "hiddenAliases": [],
6095
- "id": "compile:thread:get",
6191
+ "id": "face:tag:list",
6096
6192
  "pluginAlias": "faces-cli",
6097
6193
  "pluginName": "faces-cli",
6098
6194
  "pluginType": "core",
@@ -6102,21 +6198,26 @@
6102
6198
  "relativePath": [
6103
6199
  "dist",
6104
6200
  "commands",
6105
- "compile",
6106
- "thread",
6107
- "get.js"
6201
+ "face",
6202
+ "tag",
6203
+ "list.js"
6108
6204
  ]
6109
6205
  },
6110
- "compile:thread:list": {
6206
+ "face:tag:remove": {
6111
6207
  "aliases": [],
6112
6208
  "args": {
6113
- "face_id": {
6209
+ "alias": {
6114
6210
  "description": "Face alias",
6115
- "name": "face_id",
6211
+ "name": "alias",
6212
+ "required": true
6213
+ },
6214
+ "tag": {
6215
+ "description": "Tag to remove",
6216
+ "name": "tag",
6116
6217
  "required": true
6117
6218
  }
6118
6219
  },
6119
- "description": "List threads for a face",
6220
+ "description": "Remove a tag from a face",
6120
6221
  "flags": {
6121
6222
  "json": {
6122
6223
  "description": "Format output as json.",
@@ -6152,7 +6253,7 @@
6152
6253
  },
6153
6254
  "hasDynamicHelp": false,
6154
6255
  "hiddenAliases": [],
6155
- "id": "compile:thread:list",
6256
+ "id": "face:tag:remove",
6156
6257
  "pluginAlias": "faces-cli",
6157
6258
  "pluginName": "faces-cli",
6158
6259
  "pluginType": "core",
@@ -6162,21 +6263,21 @@
6162
6263
  "relativePath": [
6163
6264
  "dist",
6164
6265
  "commands",
6165
- "compile",
6166
- "thread",
6167
- "list.js"
6266
+ "face",
6267
+ "tag",
6268
+ "remove.js"
6168
6269
  ]
6169
6270
  },
6170
- "compile:thread:make": {
6271
+ "face:tag:set": {
6171
6272
  "aliases": [],
6172
6273
  "args": {
6173
- "thread_id": {
6174
- "description": "Thread ID",
6175
- "name": "thread_id",
6274
+ "alias": {
6275
+ "description": "Face alias",
6276
+ "name": "alias",
6176
6277
  "required": true
6177
6278
  }
6178
6279
  },
6179
- "description": "Compile an existing thread (prepare + sync in one step)",
6280
+ "description": "Replace all tags on a face",
6180
6281
  "flags": {
6181
6282
  "json": {
6182
6283
  "description": "Format output as json.",
@@ -6209,24 +6310,18 @@
6209
6310
  "multiple": false,
6210
6311
  "type": "option"
6211
6312
  },
6212
- "timeout": {
6213
- "description": "Compile timeout in seconds (default: 600)",
6214
- "name": "timeout",
6215
- "default": 600,
6313
+ "tag": {
6314
+ "description": "Tag to set (repeatable, replaces all)",
6315
+ "name": "tag",
6316
+ "required": true,
6216
6317
  "hasDynamicHelp": false,
6217
- "multiple": false,
6318
+ "multiple": true,
6218
6319
  "type": "option"
6219
- },
6220
- "no-wait": {
6221
- "description": "Return immediately after triggering compilation. Prints the thread ID for manual polling.",
6222
- "name": "no-wait",
6223
- "allowNo": false,
6224
- "type": "boolean"
6225
6320
  }
6226
6321
  },
6227
6322
  "hasDynamicHelp": false,
6228
6323
  "hiddenAliases": [],
6229
- "id": "compile:thread:make",
6324
+ "id": "face:tag:set",
6230
6325
  "pluginAlias": "faces-cli",
6231
6326
  "pluginName": "faces-cli",
6232
6327
  "pluginType": "core",
@@ -6236,21 +6331,21 @@
6236
6331
  "relativePath": [
6237
6332
  "dist",
6238
6333
  "commands",
6239
- "compile",
6240
- "thread",
6241
- "make.js"
6334
+ "face",
6335
+ "tag",
6336
+ "set.js"
6242
6337
  ]
6243
6338
  },
6244
- "compile:thread:message": {
6339
+ "team:tag:add": {
6245
6340
  "aliases": [],
6246
6341
  "args": {
6247
- "thread_id": {
6248
- "description": "Thread ID",
6249
- "name": "thread_id",
6342
+ "team_id": {
6343
+ "description": "Team ID",
6344
+ "name": "team_id",
6250
6345
  "required": true
6251
6346
  }
6252
6347
  },
6253
- "description": "Send a user message to a thread",
6348
+ "description": "Add tags to a team (appends, idempotent)",
6254
6349
  "flags": {
6255
6350
  "json": {
6256
6351
  "description": "Format output as json.",
@@ -6283,25 +6378,18 @@
6283
6378
  "multiple": false,
6284
6379
  "type": "option"
6285
6380
  },
6286
- "message": {
6287
- "char": "m",
6288
- "description": "User message to append",
6289
- "name": "message",
6381
+ "tag": {
6382
+ "description": "Tag to add (repeatable)",
6383
+ "name": "tag",
6290
6384
  "required": true,
6291
6385
  "hasDynamicHelp": false,
6292
- "multiple": false,
6386
+ "multiple": true,
6293
6387
  "type": "option"
6294
- },
6295
- "oauth-only": {
6296
- "description": "Prevent fallback to paid system key (use OAuth only)",
6297
- "name": "oauth-only",
6298
- "allowNo": false,
6299
- "type": "boolean"
6300
6388
  }
6301
6389
  },
6302
6390
  "hasDynamicHelp": false,
6303
6391
  "hiddenAliases": [],
6304
- "id": "compile:thread:message",
6392
+ "id": "team:tag:add",
6305
6393
  "pluginAlias": "faces-cli",
6306
6394
  "pluginName": "faces-cli",
6307
6395
  "pluginType": "core",
@@ -6311,21 +6399,21 @@
6311
6399
  "relativePath": [
6312
6400
  "dist",
6313
6401
  "commands",
6314
- "compile",
6315
- "thread",
6316
- "message.js"
6402
+ "team",
6403
+ "tag",
6404
+ "add.js"
6317
6405
  ]
6318
6406
  },
6319
- "compile:thread:pause": {
6407
+ "team:tag:list": {
6320
6408
  "aliases": [],
6321
6409
  "args": {
6322
- "thread_id": {
6323
- "description": "Thread ID",
6324
- "name": "thread_id",
6410
+ "team_id": {
6411
+ "description": "Team ID",
6412
+ "name": "team_id",
6325
6413
  "required": true
6326
6414
  }
6327
6415
  },
6328
- "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.",
6416
+ "description": "List tags on a team",
6329
6417
  "flags": {
6330
6418
  "json": {
6331
6419
  "description": "Format output as json.",
@@ -6357,25 +6445,11 @@
6357
6445
  "hasDynamicHelp": false,
6358
6446
  "multiple": false,
6359
6447
  "type": "option"
6360
- },
6361
- "no-wait": {
6362
- "description": "Return as soon as the pause is accepted, without waiting for the compile to stop.",
6363
- "name": "no-wait",
6364
- "allowNo": false,
6365
- "type": "boolean"
6366
- },
6367
- "timeout": {
6368
- "description": "Seconds to wait for the compile to stop (default: 60)",
6369
- "name": "timeout",
6370
- "default": 60,
6371
- "hasDynamicHelp": false,
6372
- "multiple": false,
6373
- "type": "option"
6374
6448
  }
6375
6449
  },
6376
6450
  "hasDynamicHelp": false,
6377
6451
  "hiddenAliases": [],
6378
- "id": "compile:thread:pause",
6452
+ "id": "team:tag:list",
6379
6453
  "pluginAlias": "faces-cli",
6380
6454
  "pluginName": "faces-cli",
6381
6455
  "pluginType": "core",
@@ -6385,21 +6459,26 @@
6385
6459
  "relativePath": [
6386
6460
  "dist",
6387
6461
  "commands",
6388
- "compile",
6389
- "thread",
6390
- "pause.js"
6462
+ "team",
6463
+ "tag",
6464
+ "list.js"
6391
6465
  ]
6392
6466
  },
6393
- "compile:thread:reset": {
6467
+ "team:tag:remove": {
6394
6468
  "aliases": [],
6395
6469
  "args": {
6396
- "thread_id": {
6397
- "description": "Thread ID",
6398
- "name": "thread_id",
6470
+ "team_id": {
6471
+ "description": "Team ID",
6472
+ "name": "team_id",
6473
+ "required": true
6474
+ },
6475
+ "tag": {
6476
+ "description": "Tag to remove",
6477
+ "name": "tag",
6399
6478
  "required": true
6400
6479
  }
6401
6480
  },
6402
- "description": "Reset thread compilation progress (wipe extraction, keep source messages)",
6481
+ "description": "Remove a tag from a team",
6403
6482
  "flags": {
6404
6483
  "json": {
6405
6484
  "description": "Format output as json.",
@@ -6431,17 +6510,11 @@
6431
6510
  "hasDynamicHelp": false,
6432
6511
  "multiple": false,
6433
6512
  "type": "option"
6434
- },
6435
- "yes": {
6436
- "description": "Skip confirmation",
6437
- "name": "yes",
6438
- "allowNo": false,
6439
- "type": "boolean"
6440
6513
  }
6441
6514
  },
6442
6515
  "hasDynamicHelp": false,
6443
6516
  "hiddenAliases": [],
6444
- "id": "compile:thread:reset",
6517
+ "id": "team:tag:remove",
6445
6518
  "pluginAlias": "faces-cli",
6446
6519
  "pluginName": "faces-cli",
6447
6520
  "pluginType": "core",
@@ -6451,21 +6524,21 @@
6451
6524
  "relativePath": [
6452
6525
  "dist",
6453
6526
  "commands",
6454
- "compile",
6455
- "thread",
6456
- "reset.js"
6527
+ "team",
6528
+ "tag",
6529
+ "remove.js"
6457
6530
  ]
6458
6531
  },
6459
- "compile:thread:sync": {
6532
+ "team:tag:set": {
6460
6533
  "aliases": [],
6461
6534
  "args": {
6462
- "thread_id": {
6463
- "description": "Thread ID",
6464
- "name": "thread_id",
6535
+ "team_id": {
6536
+ "description": "Team ID",
6537
+ "name": "team_id",
6465
6538
  "required": true
6466
6539
  }
6467
6540
  },
6468
- "description": "Archive and sync a thread into a face",
6541
+ "description": "Replace all tags on a team",
6469
6542
  "flags": {
6470
6543
  "json": {
6471
6544
  "description": "Format output as json.",
@@ -6497,11 +6570,19 @@
6497
6570
  "hasDynamicHelp": false,
6498
6571
  "multiple": false,
6499
6572
  "type": "option"
6573
+ },
6574
+ "tag": {
6575
+ "description": "Tag to set (repeatable, replaces all)",
6576
+ "name": "tag",
6577
+ "required": true,
6578
+ "hasDynamicHelp": false,
6579
+ "multiple": true,
6580
+ "type": "option"
6500
6581
  }
6501
6582
  },
6502
6583
  "hasDynamicHelp": false,
6503
6584
  "hiddenAliases": [],
6504
- "id": "compile:thread:sync",
6585
+ "id": "team:tag:set",
6505
6586
  "pluginAlias": "faces-cli",
6506
6587
  "pluginName": "faces-cli",
6507
6588
  "pluginType": "core",
@@ -6511,11 +6592,11 @@
6511
6592
  "relativePath": [
6512
6593
  "dist",
6513
6594
  "commands",
6514
- "compile",
6515
- "thread",
6516
- "sync.js"
6595
+ "team",
6596
+ "tag",
6597
+ "set.js"
6517
6598
  ]
6518
6599
  }
6519
6600
  },
6520
- "version": "1.7.14"
6601
+ "version": "1.7.16"
6521
6602
  }