faces-cli 1.7.9 → 1.7.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/catalog.d.ts +2 -12
  2. package/dist/catalog.js +2 -3
  3. package/dist/commands/chat/chat.d.ts +1 -0
  4. package/dist/commands/chat/chat.js +36 -3
  5. package/dist/commands/chat/messages.d.ts +1 -0
  6. package/dist/commands/chat/messages.js +5 -1
  7. package/dist/commands/chat/responses.d.ts +1 -0
  8. package/dist/commands/chat/responses.js +5 -1
  9. package/dist/commands/chat/thread.d.ts +1 -0
  10. package/dist/commands/chat/thread.js +31 -3
  11. package/dist/commands/compile/doc/create.d.ts +1 -0
  12. package/dist/commands/compile/doc/create.js +4 -0
  13. package/dist/commands/compile/doc/edit.d.ts +1 -0
  14. package/dist/commands/compile/doc/edit.js +4 -0
  15. package/dist/commands/compile/doc/index.d.ts +1 -0
  16. package/dist/commands/compile/doc/index.js +7 -3
  17. package/dist/commands/compile/doc/make.js +1 -1
  18. package/dist/commands/compile/thread/make.js +1 -1
  19. package/dist/commands/compile/upload.d.ts +1 -0
  20. package/dist/commands/compile/upload.js +10 -1
  21. package/dist/commands/face/diff.js +8 -6
  22. package/dist/commands/face/list.d.ts +1 -0
  23. package/dist/commands/face/list.js +16 -3
  24. package/dist/commands/face/neighbors.js +20 -4
  25. package/dist/commands/face/publish.d.ts +15 -0
  26. package/dist/commands/face/publish.js +41 -0
  27. package/dist/commands/face/share.d.ts +21 -0
  28. package/dist/commands/face/share.js +106 -0
  29. package/dist/commands/face/unpublish.d.ts +13 -0
  30. package/dist/commands/face/unpublish.js +30 -0
  31. package/dist/commands/face/unshare.d.ts +17 -0
  32. package/dist/commands/face/unshare.js +67 -0
  33. package/dist/poll.d.ts +1 -6
  34. package/dist/utils.d.ts +34 -0
  35. package/dist/utils.js +57 -0
  36. package/oclif.manifest.json +920 -540
  37. package/package.json +1 -1
@@ -632,10 +632,10 @@
632
632
  "whoami.js"
633
633
  ]
634
634
  },
635
- "billing:balance": {
635
+ "catalog:backup": {
636
636
  "aliases": [],
637
637
  "args": {},
638
- "description": "Show credit balance and payment method status",
638
+ "description": "Snapshot all faces, teams, and source material for migration",
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": "billing:balance",
674
+ "id": "catalog:backup",
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
- "billing",
685
- "balance.js"
684
+ "catalog",
685
+ "backup.js"
686
686
  ]
687
687
  },
688
- "billing:card-setup": {
688
+ "catalog:doctor": {
689
689
  "aliases": [],
690
690
  "args": {},
691
- "description": "Get a Stripe card setup URL to save a payment method",
691
+ "description": "Diagnose and repair the local face and team catalog",
692
692
  "flags": {
693
693
  "json": {
694
694
  "description": "Format output as json.",
@@ -720,11 +720,23 @@
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"
723
735
  }
724
736
  },
725
737
  "hasDynamicHelp": false,
726
738
  "hiddenAliases": [],
727
- "id": "billing:card-setup",
739
+ "id": "catalog:doctor",
728
740
  "pluginAlias": "faces-cli",
729
741
  "pluginName": "faces-cli",
730
742
  "pluginType": "core",
@@ -734,14 +746,14 @@
734
746
  "relativePath": [
735
747
  "dist",
736
748
  "commands",
737
- "billing",
738
- "card-setup.js"
749
+ "catalog",
750
+ "doctor.js"
739
751
  ]
740
752
  },
741
- "billing:llm-costs": {
753
+ "catalog:list": {
742
754
  "aliases": [],
743
755
  "args": {},
744
- "description": "List available LLMs and their per-token costs",
756
+ "description": "List all faces in the local catalog",
745
757
  "flags": {
746
758
  "json": {
747
759
  "description": "Format output as json.",
@@ -773,18 +785,11 @@
773
785
  "hasDynamicHelp": false,
774
786
  "multiple": false,
775
787
  "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"
783
788
  }
784
789
  },
785
790
  "hasDynamicHelp": false,
786
791
  "hiddenAliases": [],
787
- "id": "billing:llm-costs",
792
+ "id": "catalog:list",
788
793
  "pluginAlias": "faces-cli",
789
794
  "pluginName": "faces-cli",
790
795
  "pluginType": "core",
@@ -794,14 +799,14 @@
794
799
  "relativePath": [
795
800
  "dist",
796
801
  "commands",
797
- "billing",
798
- "llm-costs.js"
802
+ "catalog",
803
+ "list.js"
799
804
  ]
800
805
  },
801
- "billing:topup": {
806
+ "catalog:manyfaced": {
802
807
  "aliases": [],
803
808
  "args": {},
804
- "description": "Top up credit balance using saved payment method",
809
+ "description": "Browse and install community manyfaced skills from github.com/facessh/manyfaced",
805
810
  "flags": {
806
811
  "json": {
807
812
  "description": "Format output as json.",
@@ -834,25 +839,37 @@
834
839
  "multiple": false,
835
840
  "type": "option"
836
841
  },
837
- "amount": {
838
- "description": "Top-up amount in USD (min $1)",
839
- "name": "amount",
840
- "required": true,
842
+ "skill": {
843
+ "description": "Show details for a specific skill",
844
+ "name": "skill",
841
845
  "hasDynamicHelp": false,
842
846
  "multiple": false,
843
847
  "type": "option"
844
848
  },
845
- "payment-ref": {
846
- "description": "Payment reference (admin/test path)",
847
- "name": "payment-ref",
849
+ "install": {
850
+ "description": "Install a skill by name",
851
+ "name": "install",
852
+ "hasDynamicHelp": false,
853
+ "multiple": false,
854
+ "type": "option"
855
+ },
856
+ "skills-dir": {
857
+ "description": "Directory to install skills into (required for --install)",
858
+ "name": "skills-dir",
848
859
  "hasDynamicHelp": false,
849
860
  "multiple": false,
850
861
  "type": "option"
862
+ },
863
+ "refresh": {
864
+ "description": "Force refresh the skill index (ignore cache)",
865
+ "name": "refresh",
866
+ "allowNo": false,
867
+ "type": "boolean"
851
868
  }
852
869
  },
853
870
  "hasDynamicHelp": false,
854
871
  "hiddenAliases": [],
855
- "id": "billing:topup",
872
+ "id": "catalog:manyfaced",
856
873
  "pluginAlias": "faces-cli",
857
874
  "pluginName": "faces-cli",
858
875
  "pluginType": "core",
@@ -862,14 +879,19 @@
862
879
  "relativePath": [
863
880
  "dist",
864
881
  "commands",
865
- "billing",
866
- "topup.js"
882
+ "catalog",
883
+ "manyfaced.js"
867
884
  ]
868
885
  },
869
- "billing:usage": {
886
+ "catalog:restore": {
870
887
  "aliases": [],
871
- "args": {},
872
- "description": "Aggregated usage analytics",
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",
873
895
  "flags": {
874
896
  "json": {
875
897
  "description": "Format output as json.",
@@ -902,37 +924,16 @@
902
924
  "multiple": false,
903
925
  "type": "option"
904
926
  },
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"
927
+ "compile": {
928
+ "description": "Run compile:all after restoring",
929
+ "name": "compile",
930
+ "allowNo": false,
931
+ "type": "boolean"
931
932
  }
932
933
  },
933
934
  "hasDynamicHelp": false,
934
935
  "hiddenAliases": [],
935
- "id": "billing:usage",
936
+ "id": "catalog:restore",
936
937
  "pluginAlias": "faces-cli",
937
938
  "pluginName": "faces-cli",
938
939
  "pluginType": "core",
@@ -942,14 +943,14 @@
942
943
  "relativePath": [
943
944
  "dist",
944
945
  "commands",
945
- "billing",
946
- "usage.js"
946
+ "catalog",
947
+ "restore.js"
947
948
  ]
948
949
  },
949
- "catalog:backup": {
950
+ "billing:balance": {
950
951
  "aliases": [],
951
952
  "args": {},
952
- "description": "Snapshot all faces, teams, and source material for migration",
953
+ "description": "Show credit balance and payment method status",
953
954
  "flags": {
954
955
  "json": {
955
956
  "description": "Format output as json.",
@@ -985,7 +986,7 @@
985
986
  },
986
987
  "hasDynamicHelp": false,
987
988
  "hiddenAliases": [],
988
- "id": "catalog:backup",
989
+ "id": "billing:balance",
989
990
  "pluginAlias": "faces-cli",
990
991
  "pluginName": "faces-cli",
991
992
  "pluginType": "core",
@@ -995,14 +996,14 @@
995
996
  "relativePath": [
996
997
  "dist",
997
998
  "commands",
998
- "catalog",
999
- "backup.js"
999
+ "billing",
1000
+ "balance.js"
1000
1001
  ]
1001
1002
  },
1002
- "catalog:doctor": {
1003
+ "billing:card-setup": {
1003
1004
  "aliases": [],
1004
1005
  "args": {},
1005
- "description": "Diagnose and repair the local face and team catalog",
1006
+ "description": "Get a Stripe card setup URL to save a payment method",
1006
1007
  "flags": {
1007
1008
  "json": {
1008
1009
  "description": "Format output as json.",
@@ -1034,23 +1035,11 @@
1034
1035
  "hasDynamicHelp": false,
1035
1036
  "multiple": false,
1036
1037
  "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"
1049
1038
  }
1050
1039
  },
1051
1040
  "hasDynamicHelp": false,
1052
1041
  "hiddenAliases": [],
1053
- "id": "catalog:doctor",
1042
+ "id": "billing:card-setup",
1054
1043
  "pluginAlias": "faces-cli",
1055
1044
  "pluginName": "faces-cli",
1056
1045
  "pluginType": "core",
@@ -1060,14 +1049,14 @@
1060
1049
  "relativePath": [
1061
1050
  "dist",
1062
1051
  "commands",
1063
- "catalog",
1064
- "doctor.js"
1052
+ "billing",
1053
+ "card-setup.js"
1065
1054
  ]
1066
1055
  },
1067
- "catalog:list": {
1056
+ "billing:llm-costs": {
1068
1057
  "aliases": [],
1069
1058
  "args": {},
1070
- "description": "List all faces in the local catalog",
1059
+ "description": "List available LLMs and their per-token costs",
1071
1060
  "flags": {
1072
1061
  "json": {
1073
1062
  "description": "Format output as json.",
@@ -1099,11 +1088,18 @@
1099
1088
  "hasDynamicHelp": false,
1100
1089
  "multiple": false,
1101
1090
  "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"
1102
1098
  }
1103
1099
  },
1104
1100
  "hasDynamicHelp": false,
1105
1101
  "hiddenAliases": [],
1106
- "id": "catalog:list",
1102
+ "id": "billing:llm-costs",
1107
1103
  "pluginAlias": "faces-cli",
1108
1104
  "pluginName": "faces-cli",
1109
1105
  "pluginType": "core",
@@ -1113,14 +1109,14 @@
1113
1109
  "relativePath": [
1114
1110
  "dist",
1115
1111
  "commands",
1116
- "catalog",
1117
- "list.js"
1112
+ "billing",
1113
+ "llm-costs.js"
1118
1114
  ]
1119
1115
  },
1120
- "catalog:manyfaced": {
1116
+ "billing:topup": {
1121
1117
  "aliases": [],
1122
1118
  "args": {},
1123
- "description": "Browse and install community manyfaced skills from github.com/facessh/manyfaced",
1119
+ "description": "Top up credit balance using saved payment method",
1124
1120
  "flags": {
1125
1121
  "json": {
1126
1122
  "description": "Format output as json.",
@@ -1153,37 +1149,25 @@
1153
1149
  "multiple": false,
1154
1150
  "type": "option"
1155
1151
  },
1156
- "skill": {
1157
- "description": "Show details for a specific skill",
1158
- "name": "skill",
1159
- "hasDynamicHelp": false,
1160
- "multiple": false,
1161
- "type": "option"
1162
- },
1163
- "install": {
1164
- "description": "Install a skill by name",
1165
- "name": "install",
1152
+ "amount": {
1153
+ "description": "Top-up amount in USD (min $1)",
1154
+ "name": "amount",
1155
+ "required": true,
1166
1156
  "hasDynamicHelp": false,
1167
1157
  "multiple": false,
1168
1158
  "type": "option"
1169
1159
  },
1170
- "skills-dir": {
1171
- "description": "Directory to install skills into (required for --install)",
1172
- "name": "skills-dir",
1160
+ "payment-ref": {
1161
+ "description": "Payment reference (admin/test path)",
1162
+ "name": "payment-ref",
1173
1163
  "hasDynamicHelp": false,
1174
1164
  "multiple": false,
1175
1165
  "type": "option"
1176
- },
1177
- "refresh": {
1178
- "description": "Force refresh the skill index (ignore cache)",
1179
- "name": "refresh",
1180
- "allowNo": false,
1181
- "type": "boolean"
1182
1166
  }
1183
1167
  },
1184
1168
  "hasDynamicHelp": false,
1185
1169
  "hiddenAliases": [],
1186
- "id": "catalog:manyfaced",
1170
+ "id": "billing:topup",
1187
1171
  "pluginAlias": "faces-cli",
1188
1172
  "pluginName": "faces-cli",
1189
1173
  "pluginType": "core",
@@ -1193,19 +1177,14 @@
1193
1177
  "relativePath": [
1194
1178
  "dist",
1195
1179
  "commands",
1196
- "catalog",
1197
- "manyfaced.js"
1180
+ "billing",
1181
+ "topup.js"
1198
1182
  ]
1199
1183
  },
1200
- "catalog:restore": {
1184
+ "billing:usage": {
1201
1185
  "aliases": [],
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",
1186
+ "args": {},
1187
+ "description": "Aggregated usage analytics",
1209
1188
  "flags": {
1210
1189
  "json": {
1211
1190
  "description": "Format output as json.",
@@ -1238,33 +1217,54 @@
1238
1217
  "multiple": false,
1239
1218
  "type": "option"
1240
1219
  },
1241
- "compile": {
1242
- "description": "Run compile:all after restoring",
1243
- "name": "compile",
1244
- "allowNo": false,
1245
- "type": "boolean"
1246
- }
1247
- },
1248
- "hasDynamicHelp": false,
1249
- "hiddenAliases": [],
1250
- "id": "catalog:restore",
1251
- "pluginAlias": "faces-cli",
1252
- "pluginName": "faces-cli",
1253
- "pluginType": "core",
1254
- "strict": true,
1255
- "enableJsonFlag": true,
1256
- "isESM": true,
1257
- "relativePath": [
1258
- "dist",
1259
- "commands",
1260
- "catalog",
1261
- "restore.js"
1262
- ]
1263
- },
1264
- "chat:chat": {
1265
- "aliases": [],
1266
- "args": {
1267
- "face_username": {
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
+ }
1247
+ },
1248
+ "hasDynamicHelp": false,
1249
+ "hiddenAliases": [],
1250
+ "id": "billing:usage",
1251
+ "pluginAlias": "faces-cli",
1252
+ "pluginName": "faces-cli",
1253
+ "pluginType": "core",
1254
+ "strict": true,
1255
+ "enableJsonFlag": true,
1256
+ "isESM": true,
1257
+ "relativePath": [
1258
+ "dist",
1259
+ "commands",
1260
+ "billing",
1261
+ "usage.js"
1262
+ ]
1263
+ },
1264
+ "chat:chat": {
1265
+ "aliases": [],
1266
+ "args": {
1267
+ "face_username": {
1268
1268
  "description": "Face alias (alias@model, owner:alias@model for a published face, or a composite formula like \"(a | b)@model\"). Omit when using --formula.",
1269
1269
  "name": "face_username",
1270
1270
  "required": false
@@ -1371,6 +1371,13 @@
1371
1371
  "allowNo": false,
1372
1372
  "type": "boolean"
1373
1373
  },
1374
+ "medium": {
1375
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
1376
+ "name": "medium",
1377
+ "hasDynamicHelp": false,
1378
+ "multiple": false,
1379
+ "type": "option"
1380
+ },
1374
1381
  "oauth-only": {
1375
1382
  "description": "Prevent fallback to paid system key (use OAuth only)",
1376
1383
  "name": "oauth-only",
@@ -1398,7 +1405,7 @@
1398
1405
  "aliases": [],
1399
1406
  "args": {
1400
1407
  "face_model": {
1401
- "description": "Face model (e.g. myface, myface@claude-sonnet-4-6, or head:judge@claude-sonnet-4-6)",
1408
+ "description": "Face model (e.g. myface, myface@claude-sonnet-4-6, or head:socrates@claude-sonnet-4-6)",
1402
1409
  "name": "face_model",
1403
1410
  "required": true
1404
1411
  }
@@ -1466,6 +1473,13 @@
1466
1473
  "multiple": false,
1467
1474
  "type": "option"
1468
1475
  },
1476
+ "medium": {
1477
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
1478
+ "name": "medium",
1479
+ "hasDynamicHelp": false,
1480
+ "multiple": false,
1481
+ "type": "option"
1482
+ },
1469
1483
  "oauth-only": {
1470
1484
  "description": "Prevent fallback to paid system key (use OAuth only)",
1471
1485
  "name": "oauth-only",
@@ -1493,7 +1507,7 @@
1493
1507
  "aliases": [],
1494
1508
  "args": {
1495
1509
  "face_model": {
1496
- "description": "Face model (e.g. myface, myface@gpt-4o, or head:logician@gpt-5.4)",
1510
+ "description": "Face model (e.g. myface, myface@gpt-4o, or head:socrates@gpt-5.4)",
1497
1511
  "name": "face_model",
1498
1512
  "required": true
1499
1513
  }
@@ -1553,6 +1567,13 @@
1553
1567
  "allowNo": false,
1554
1568
  "type": "boolean"
1555
1569
  },
1570
+ "medium": {
1571
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
1572
+ "name": "medium",
1573
+ "hasDynamicHelp": false,
1574
+ "multiple": false,
1575
+ "type": "option"
1576
+ },
1556
1577
  "oauth-only": {
1557
1578
  "description": "Prevent fallback to paid system key (use OAuth only)",
1558
1579
  "name": "oauth-only",
@@ -1681,6 +1702,13 @@
1681
1702
  "allowNo": false,
1682
1703
  "type": "boolean"
1683
1704
  },
1705
+ "medium": {
1706
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
1707
+ "name": "medium",
1708
+ "hasDynamicHelp": false,
1709
+ "multiple": false,
1710
+ "type": "option"
1711
+ },
1684
1712
  "oauth-only": {
1685
1713
  "description": "Prevent fallback to paid system key",
1686
1714
  "name": "oauth-only",
@@ -1949,7 +1977,7 @@
1949
1977
  "required": true
1950
1978
  }
1951
1979
  },
1952
- "description": "Upload a file (text/PDF/audio/video) to compile into a face",
1980
+ "description": "Upload a file (text/PDF/Word .docx/audio/video) to compile into a face",
1953
1981
  "flags": {
1954
1982
  "json": {
1955
1983
  "description": "Format output as json.",
@@ -2014,6 +2042,13 @@
2014
2042
  ],
2015
2043
  "type": "option"
2016
2044
  },
2045
+ "medium": {
2046
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not. Only valid with --kind document.",
2047
+ "name": "medium",
2048
+ "hasDynamicHelp": false,
2049
+ "multiple": false,
2050
+ "type": "option"
2051
+ },
2017
2052
  "face-speaker": {
2018
2053
  "description": "Speaker name to map to the face (thread only). If omitted, auto-detected from face name.",
2019
2054
  "name": "face-speaker",
@@ -2792,11 +2827,17 @@
2792
2827
  "type": "option"
2793
2828
  },
2794
2829
  "public": {
2795
- "description": "Include published faces from other accounts",
2830
+ "description": "Include published faces from other accounts (open to everybody)",
2796
2831
  "name": "public",
2797
2832
  "allowNo": false,
2798
2833
  "type": "boolean"
2799
2834
  },
2835
+ "shared": {
2836
+ "description": "Include faces other accounts have shared with YOU in particular",
2837
+ "name": "shared",
2838
+ "allowNo": false,
2839
+ "type": "boolean"
2840
+ },
2800
2841
  "system": {
2801
2842
  "description": "Show only the curated system faces (published faces owned by 'head')",
2802
2843
  "name": "system",
@@ -2947,17 +2988,11 @@
2947
2988
  "type": "option"
2948
2989
  },
2949
2990
  "component": {
2950
- "description": "Centroid component to rank on (beta, delta, epsilon are the principal components of a face; face is their composite)",
2991
+ "description": "What to rank on: `face` for overall similarity, or a component position such as 1. Which positions are comparable varies; the API names them if you pick a wrong one.",
2951
2992
  "name": "component",
2952
2993
  "default": "face",
2953
2994
  "hasDynamicHelp": false,
2954
2995
  "multiple": false,
2955
- "options": [
2956
- "face",
2957
- "beta",
2958
- "delta",
2959
- "epsilon"
2960
- ],
2961
2996
  "type": "option"
2962
2997
  },
2963
2998
  "direction": {
@@ -2989,10 +3024,19 @@
2989
3024
  "neighbors.js"
2990
3025
  ]
2991
3026
  },
2992
- "face:stats": {
3027
+ "face:publish": {
2993
3028
  "aliases": [],
2994
- "args": {},
2995
- "description": "Compile and chat stats for all owned faces",
3029
+ "args": {
3030
+ "alias": {
3031
+ "description": "Face alias",
3032
+ "name": "alias",
3033
+ "required": true
3034
+ }
3035
+ },
3036
+ "description": "Publish a face so EVERY account can chat with it. This is a global override: while it is on, everyone can reach the face regardless of who it is shared with. You still pay only to compile it; whoever chats pays for their own inference.",
3037
+ "examples": [
3038
+ "<%= config.bin %> <%= command.id %> alice --yes"
3039
+ ],
2996
3040
  "flags": {
2997
3041
  "json": {
2998
3042
  "description": "Format output as json.",
@@ -3024,11 +3068,17 @@
3024
3068
  "hasDynamicHelp": false,
3025
3069
  "multiple": false,
3026
3070
  "type": "option"
3071
+ },
3072
+ "yes": {
3073
+ "description": "Skip confirmation",
3074
+ "name": "yes",
3075
+ "allowNo": false,
3076
+ "type": "boolean"
3027
3077
  }
3028
3078
  },
3029
3079
  "hasDynamicHelp": false,
3030
3080
  "hiddenAliases": [],
3031
- "id": "face:stats",
3081
+ "id": "face:publish",
3032
3082
  "pluginAlias": "faces-cli",
3033
3083
  "pluginName": "faces-cli",
3034
3084
  "pluginType": "core",
@@ -3039,10 +3089,10 @@
3039
3089
  "dist",
3040
3090
  "commands",
3041
3091
  "face",
3042
- "stats.js"
3092
+ "publish.js"
3043
3093
  ]
3044
3094
  },
3045
- "face:teams": {
3095
+ "face:share": {
3046
3096
  "aliases": [],
3047
3097
  "args": {
3048
3098
  "alias": {
@@ -3051,7 +3101,13 @@
3051
3101
  "required": true
3052
3102
  }
3053
3103
  },
3054
- "description": "Set a face's team memberships (replaces all)",
3104
+ "description": "Share a face so named accounts can chat with it. Sharing grants chat and nothing else: no reading its documents, no compiling, no re-sharing, and never its profile addendum. --add keeps the current list; --with replaces it.",
3105
+ "examples": [
3106
+ "<%= config.bin %> <%= command.id %> alice --list",
3107
+ "<%= config.bin %> <%= command.id %> alice --add dana",
3108
+ "<%= config.bin %> <%= command.id %> alice --with dana --with sam@example.com",
3109
+ "<%= config.bin %> <%= command.id %> alice --none --yes"
3110
+ ],
3055
3111
  "flags": {
3056
3112
  "json": {
3057
3113
  "description": "Format output as json.",
@@ -3084,18 +3140,54 @@
3084
3140
  "multiple": false,
3085
3141
  "type": "option"
3086
3142
  },
3087
- "team": {
3088
- "description": "Team ID (repeatable, replaces all memberships)",
3089
- "name": "team",
3090
- "required": true,
3143
+ "list": {
3144
+ "description": "Show who the face is shared with, and change nothing",
3145
+ "name": "list",
3146
+ "allowNo": false,
3147
+ "type": "boolean"
3148
+ },
3149
+ "add": {
3150
+ "description": "Add an account, keeping everyone already on the list — username or email (repeatable)",
3151
+ "exclusive": [
3152
+ "with",
3153
+ "none"
3154
+ ],
3155
+ "name": "add",
3156
+ "hasDynamicHelp": false,
3157
+ "multiple": true,
3158
+ "type": "option"
3159
+ },
3160
+ "with": {
3161
+ "description": "Set the list to exactly these accounts, dropping anyone else (repeatable)",
3162
+ "exclusive": [
3163
+ "add",
3164
+ "none"
3165
+ ],
3166
+ "name": "with",
3091
3167
  "hasDynamicHelp": false,
3092
3168
  "multiple": true,
3093
3169
  "type": "option"
3170
+ },
3171
+ "none": {
3172
+ "description": "Revoke everyone",
3173
+ "exclusive": [
3174
+ "add",
3175
+ "with"
3176
+ ],
3177
+ "name": "none",
3178
+ "allowNo": false,
3179
+ "type": "boolean"
3180
+ },
3181
+ "yes": {
3182
+ "description": "Skip the confirmation shown when someone would lose access",
3183
+ "name": "yes",
3184
+ "allowNo": false,
3185
+ "type": "boolean"
3094
3186
  }
3095
3187
  },
3096
3188
  "hasDynamicHelp": false,
3097
3189
  "hiddenAliases": [],
3098
- "id": "face:teams",
3190
+ "id": "face:share",
3099
3191
  "pluginAlias": "faces-cli",
3100
3192
  "pluginName": "faces-cli",
3101
3193
  "pluginType": "core",
@@ -3106,22 +3198,13 @@
3106
3198
  "dist",
3107
3199
  "commands",
3108
3200
  "face",
3109
- "teams.js"
3201
+ "share.js"
3110
3202
  ]
3111
3203
  },
3112
- "face:unlock": {
3204
+ "face:stats": {
3113
3205
  "aliases": [],
3114
- "args": {
3115
- "face_id": {
3116
- "description": "Face alias",
3117
- "name": "face_id",
3118
- "required": true
3119
- }
3120
- },
3121
- "description": "Unlock a face (make it writable again). Thaws the face and everything it owns (documents, threads, voiceprint).",
3122
- "examples": [
3123
- "<%= config.bin %> <%= command.id %> socrates"
3124
- ],
3206
+ "args": {},
3207
+ "description": "Compile and chat stats for all owned faces",
3125
3208
  "flags": {
3126
3209
  "json": {
3127
3210
  "description": "Format output as json.",
@@ -3157,7 +3240,7 @@
3157
3240
  },
3158
3241
  "hasDynamicHelp": false,
3159
3242
  "hiddenAliases": [],
3160
- "id": "face:unlock",
3243
+ "id": "face:stats",
3161
3244
  "pluginAlias": "faces-cli",
3162
3245
  "pluginName": "faces-cli",
3163
3246
  "pluginType": "core",
@@ -3168,13 +3251,19 @@
3168
3251
  "dist",
3169
3252
  "commands",
3170
3253
  "face",
3171
- "unlock.js"
3254
+ "stats.js"
3172
3255
  ]
3173
3256
  },
3174
- "keys:create": {
3257
+ "face:teams": {
3175
3258
  "aliases": [],
3176
- "args": {},
3177
- "description": "Create a new API key (JWT required). The new key is saved to ~/.faces/config.json as api_key by default; pass --no-save to skip.",
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)",
3178
3267
  "flags": {
3179
3268
  "json": {
3180
3269
  "description": "Format output as json.",
@@ -3207,52 +3296,18 @@
3207
3296
  "multiple": false,
3208
3297
  "type": "option"
3209
3298
  },
3210
- "name": {
3211
- "description": "Key name/label",
3212
- "name": "name",
3299
+ "team": {
3300
+ "description": "Team ID (repeatable, replaces all memberships)",
3301
+ "name": "team",
3213
3302
  "required": true,
3214
3303
  "hasDynamicHelp": false,
3215
- "multiple": false,
3216
- "type": "option"
3217
- },
3218
- "expires-days": {
3219
- "description": "Expiry in days (omit for no expiry)",
3220
- "name": "expires-days",
3221
- "hasDynamicHelp": false,
3222
- "multiple": false,
3223
- "type": "option"
3224
- },
3225
- "budget": {
3226
- "description": "Spend budget in USD",
3227
- "name": "budget",
3228
- "hasDynamicHelp": false,
3229
- "multiple": false,
3230
- "type": "option"
3231
- },
3232
- "face": {
3233
- "description": "Allowed face alias (repeatable)",
3234
- "name": "face",
3235
- "hasDynamicHelp": false,
3236
3304
  "multiple": true,
3237
3305
  "type": "option"
3238
- },
3239
- "model": {
3240
- "description": "Allowed model name (repeatable)",
3241
- "name": "model",
3242
- "hasDynamicHelp": false,
3243
- "multiple": true,
3244
- "type": "option"
3245
- },
3246
- "save": {
3247
- "description": "Save the new key to ~/.faces/config.json as api_key (default: true; use --no-save to skip)",
3248
- "name": "save",
3249
- "allowNo": true,
3250
- "type": "boolean"
3251
3306
  }
3252
3307
  },
3253
3308
  "hasDynamicHelp": false,
3254
3309
  "hiddenAliases": [],
3255
- "id": "keys:create",
3310
+ "id": "face:teams",
3256
3311
  "pluginAlias": "faces-cli",
3257
3312
  "pluginName": "faces-cli",
3258
3313
  "pluginType": "core",
@@ -3262,14 +3317,23 @@
3262
3317
  "relativePath": [
3263
3318
  "dist",
3264
3319
  "commands",
3265
- "keys",
3266
- "create.js"
3320
+ "face",
3321
+ "teams.js"
3267
3322
  ]
3268
3323
  },
3269
- "keys:list": {
3324
+ "face:unlock": {
3270
3325
  "aliases": [],
3271
- "args": {},
3272
- "description": "List all API keys (JWT required)",
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
+ ],
3273
3337
  "flags": {
3274
3338
  "json": {
3275
3339
  "description": "Format output as json.",
@@ -3305,7 +3369,7 @@
3305
3369
  },
3306
3370
  "hasDynamicHelp": false,
3307
3371
  "hiddenAliases": [],
3308
- "id": "keys:list",
3372
+ "id": "face:unlock",
3309
3373
  "pluginAlias": "faces-cli",
3310
3374
  "pluginName": "faces-cli",
3311
3375
  "pluginType": "core",
@@ -3315,20 +3379,20 @@
3315
3379
  "relativePath": [
3316
3380
  "dist",
3317
3381
  "commands",
3318
- "keys",
3319
- "list.js"
3382
+ "face",
3383
+ "unlock.js"
3320
3384
  ]
3321
3385
  },
3322
- "keys:revoke": {
3386
+ "face:unpublish": {
3323
3387
  "aliases": [],
3324
3388
  "args": {
3325
- "key_id": {
3326
- "description": "Key ID",
3327
- "name": "key_id",
3389
+ "alias": {
3390
+ "description": "Face alias",
3391
+ "name": "alias",
3328
3392
  "required": true
3329
3393
  }
3330
3394
  },
3331
- "description": "Revoke an API key (JWT required)",
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.",
3332
3396
  "flags": {
3333
3397
  "json": {
3334
3398
  "description": "Format output as json.",
@@ -3360,17 +3424,11 @@
3360
3424
  "hasDynamicHelp": false,
3361
3425
  "multiple": false,
3362
3426
  "type": "option"
3363
- },
3364
- "yes": {
3365
- "description": "Skip confirmation",
3366
- "name": "yes",
3367
- "allowNo": false,
3368
- "type": "boolean"
3369
3427
  }
3370
3428
  },
3371
3429
  "hasDynamicHelp": false,
3372
3430
  "hiddenAliases": [],
3373
- "id": "keys:revoke",
3431
+ "id": "face:unpublish",
3374
3432
  "pluginAlias": "faces-cli",
3375
3433
  "pluginName": "faces-cli",
3376
3434
  "pluginType": "core",
@@ -3380,20 +3438,24 @@
3380
3438
  "relativePath": [
3381
3439
  "dist",
3382
3440
  "commands",
3383
- "keys",
3384
- "revoke.js"
3441
+ "face",
3442
+ "unpublish.js"
3385
3443
  ]
3386
3444
  },
3387
- "keys:update": {
3445
+ "face:unshare": {
3388
3446
  "aliases": [],
3389
3447
  "args": {
3390
- "key_id": {
3391
- "description": "Key ID",
3392
- "name": "key_id",
3448
+ "alias": {
3449
+ "description": "Face alias",
3450
+ "name": "alias",
3393
3451
  "required": true
3394
3452
  }
3395
3453
  },
3396
- "description": "Update API key metadata (JWT required)",
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
+ ],
3397
3459
  "flags": {
3398
3460
  "json": {
3399
3461
  "description": "Format output as json.",
@@ -3426,10 +3488,307 @@
3426
3488
  "multiple": false,
3427
3489
  "type": "option"
3428
3490
  },
3429
- "name": {
3430
- "description": "New key name",
3431
- "name": "name",
3432
- "hasDynamicHelp": false,
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
+ }
3516
+ },
3517
+ "hasDynamicHelp": false,
3518
+ "hiddenAliases": [],
3519
+ "id": "face:unshare",
3520
+ "pluginAlias": "faces-cli",
3521
+ "pluginName": "faces-cli",
3522
+ "pluginType": "core",
3523
+ "strict": true,
3524
+ "enableJsonFlag": true,
3525
+ "isESM": true,
3526
+ "relativePath": [
3527
+ "dist",
3528
+ "commands",
3529
+ "face",
3530
+ "unshare.js"
3531
+ ]
3532
+ },
3533
+ "keys:create": {
3534
+ "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.",
3537
+ "flags": {
3538
+ "json": {
3539
+ "description": "Format output as json.",
3540
+ "helpGroup": "GLOBAL",
3541
+ "name": "json",
3542
+ "allowNo": false,
3543
+ "type": "boolean"
3544
+ },
3545
+ "base-url": {
3546
+ "description": "API base URL",
3547
+ "env": "FACES_BASE_URL",
3548
+ "name": "base-url",
3549
+ "hasDynamicHelp": false,
3550
+ "multiple": false,
3551
+ "type": "option"
3552
+ },
3553
+ "token": {
3554
+ "description": "JWT bearer token",
3555
+ "env": "FACES_TOKEN",
3556
+ "name": "token",
3557
+ "hasDynamicHelp": false,
3558
+ "multiple": false,
3559
+ "type": "option"
3560
+ },
3561
+ "api-key": {
3562
+ "description": "API key",
3563
+ "env": "FACES_API_KEY",
3564
+ "name": "api-key",
3565
+ "hasDynamicHelp": false,
3566
+ "multiple": false,
3567
+ "type": "option"
3568
+ },
3569
+ "name": {
3570
+ "description": "Key name/label",
3571
+ "name": "name",
3572
+ "required": true,
3573
+ "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
+ "multiple": true,
3603
+ "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
+ }
3611
+ },
3612
+ "hasDynamicHelp": false,
3613
+ "hiddenAliases": [],
3614
+ "id": "keys:create",
3615
+ "pluginAlias": "faces-cli",
3616
+ "pluginName": "faces-cli",
3617
+ "pluginType": "core",
3618
+ "strict": true,
3619
+ "enableJsonFlag": true,
3620
+ "isESM": true,
3621
+ "relativePath": [
3622
+ "dist",
3623
+ "commands",
3624
+ "keys",
3625
+ "create.js"
3626
+ ]
3627
+ },
3628
+ "keys:list": {
3629
+ "aliases": [],
3630
+ "args": {},
3631
+ "description": "List all API keys (JWT required)",
3632
+ "flags": {
3633
+ "json": {
3634
+ "description": "Format output as json.",
3635
+ "helpGroup": "GLOBAL",
3636
+ "name": "json",
3637
+ "allowNo": false,
3638
+ "type": "boolean"
3639
+ },
3640
+ "base-url": {
3641
+ "description": "API base URL",
3642
+ "env": "FACES_BASE_URL",
3643
+ "name": "base-url",
3644
+ "hasDynamicHelp": false,
3645
+ "multiple": false,
3646
+ "type": "option"
3647
+ },
3648
+ "token": {
3649
+ "description": "JWT bearer token",
3650
+ "env": "FACES_TOKEN",
3651
+ "name": "token",
3652
+ "hasDynamicHelp": false,
3653
+ "multiple": false,
3654
+ "type": "option"
3655
+ },
3656
+ "api-key": {
3657
+ "description": "API key",
3658
+ "env": "FACES_API_KEY",
3659
+ "name": "api-key",
3660
+ "hasDynamicHelp": false,
3661
+ "multiple": false,
3662
+ "type": "option"
3663
+ }
3664
+ },
3665
+ "hasDynamicHelp": false,
3666
+ "hiddenAliases": [],
3667
+ "id": "keys:list",
3668
+ "pluginAlias": "faces-cli",
3669
+ "pluginName": "faces-cli",
3670
+ "pluginType": "core",
3671
+ "strict": true,
3672
+ "enableJsonFlag": true,
3673
+ "isESM": true,
3674
+ "relativePath": [
3675
+ "dist",
3676
+ "commands",
3677
+ "keys",
3678
+ "list.js"
3679
+ ]
3680
+ },
3681
+ "keys:revoke": {
3682
+ "aliases": [],
3683
+ "args": {
3684
+ "key_id": {
3685
+ "description": "Key ID",
3686
+ "name": "key_id",
3687
+ "required": true
3688
+ }
3689
+ },
3690
+ "description": "Revoke an API key (JWT required)",
3691
+ "flags": {
3692
+ "json": {
3693
+ "description": "Format output as json.",
3694
+ "helpGroup": "GLOBAL",
3695
+ "name": "json",
3696
+ "allowNo": false,
3697
+ "type": "boolean"
3698
+ },
3699
+ "base-url": {
3700
+ "description": "API base URL",
3701
+ "env": "FACES_BASE_URL",
3702
+ "name": "base-url",
3703
+ "hasDynamicHelp": false,
3704
+ "multiple": false,
3705
+ "type": "option"
3706
+ },
3707
+ "token": {
3708
+ "description": "JWT bearer token",
3709
+ "env": "FACES_TOKEN",
3710
+ "name": "token",
3711
+ "hasDynamicHelp": false,
3712
+ "multiple": false,
3713
+ "type": "option"
3714
+ },
3715
+ "api-key": {
3716
+ "description": "API key",
3717
+ "env": "FACES_API_KEY",
3718
+ "name": "api-key",
3719
+ "hasDynamicHelp": false,
3720
+ "multiple": false,
3721
+ "type": "option"
3722
+ },
3723
+ "yes": {
3724
+ "description": "Skip confirmation",
3725
+ "name": "yes",
3726
+ "allowNo": false,
3727
+ "type": "boolean"
3728
+ }
3729
+ },
3730
+ "hasDynamicHelp": false,
3731
+ "hiddenAliases": [],
3732
+ "id": "keys:revoke",
3733
+ "pluginAlias": "faces-cli",
3734
+ "pluginName": "faces-cli",
3735
+ "pluginType": "core",
3736
+ "strict": true,
3737
+ "enableJsonFlag": true,
3738
+ "isESM": true,
3739
+ "relativePath": [
3740
+ "dist",
3741
+ "commands",
3742
+ "keys",
3743
+ "revoke.js"
3744
+ ]
3745
+ },
3746
+ "keys:update": {
3747
+ "aliases": [],
3748
+ "args": {
3749
+ "key_id": {
3750
+ "description": "Key ID",
3751
+ "name": "key_id",
3752
+ "required": true
3753
+ }
3754
+ },
3755
+ "description": "Update API key metadata (JWT required)",
3756
+ "flags": {
3757
+ "json": {
3758
+ "description": "Format output as json.",
3759
+ "helpGroup": "GLOBAL",
3760
+ "name": "json",
3761
+ "allowNo": false,
3762
+ "type": "boolean"
3763
+ },
3764
+ "base-url": {
3765
+ "description": "API base URL",
3766
+ "env": "FACES_BASE_URL",
3767
+ "name": "base-url",
3768
+ "hasDynamicHelp": false,
3769
+ "multiple": false,
3770
+ "type": "option"
3771
+ },
3772
+ "token": {
3773
+ "description": "JWT bearer token",
3774
+ "env": "FACES_TOKEN",
3775
+ "name": "token",
3776
+ "hasDynamicHelp": false,
3777
+ "multiple": false,
3778
+ "type": "option"
3779
+ },
3780
+ "api-key": {
3781
+ "description": "API key",
3782
+ "env": "FACES_API_KEY",
3783
+ "name": "api-key",
3784
+ "hasDynamicHelp": false,
3785
+ "multiple": false,
3786
+ "type": "option"
3787
+ },
3788
+ "name": {
3789
+ "description": "New key name",
3790
+ "name": "name",
3791
+ "hasDynamicHelp": false,
3433
3792
  "multiple": false,
3434
3793
  "type": "option"
3435
3794
  },
@@ -4248,6 +4607,13 @@
4248
4607
  "multiple": false,
4249
4608
  "type": "option"
4250
4609
  },
4610
+ "medium": {
4611
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
4612
+ "name": "medium",
4613
+ "hasDynamicHelp": false,
4614
+ "multiple": false,
4615
+ "type": "option"
4616
+ },
4251
4617
  "perspective": {
4252
4618
  "description": "Perspective (first-person or third-person)",
4253
4619
  "name": "perspective",
@@ -4401,6 +4767,13 @@
4401
4767
  "multiple": false,
4402
4768
  "type": "option"
4403
4769
  },
4770
+ "medium": {
4771
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
4772
+ "name": "medium",
4773
+ "hasDynamicHelp": false,
4774
+ "multiple": false,
4775
+ "type": "option"
4776
+ },
4404
4777
  "perspective": {
4405
4778
  "description": "Perspective (first-person or third-person)",
4406
4779
  "name": "perspective",
@@ -4560,6 +4933,13 @@
4560
4933
  "multiple": true,
4561
4934
  "type": "option"
4562
4935
  },
4936
+ "medium": {
4937
+ "description": "What sort of writing this is — e.g. email, text message, social post, essay, academic paper, blog post, legal document, thread reply, conversation (covers speech: transcripts, interviews, calls). Common synonyms fold automatically. Omit it if you do not know: a wrong declaration is worse than none, because a declaration is trusted and an absence is not.",
4938
+ "name": "medium",
4939
+ "hasDynamicHelp": false,
4940
+ "multiple": false,
4941
+ "type": "option"
4942
+ },
4563
4943
  "perspective": {
4564
4944
  "description": "Perspective",
4565
4945
  "name": "perspective",
@@ -4878,16 +5258,16 @@
4878
5258
  "reset.js"
4879
5259
  ]
4880
5260
  },
4881
- "compile:thread:create": {
5261
+ "face:tag:add": {
4882
5262
  "aliases": [],
4883
5263
  "args": {
4884
- "face_id": {
5264
+ "alias": {
4885
5265
  "description": "Face alias",
4886
- "name": "face_id",
5266
+ "name": "alias",
4887
5267
  "required": true
4888
5268
  }
4889
5269
  },
4890
- "description": "Start a new thread for a face",
5270
+ "description": "Add tags to a face (appends, idempotent)",
4891
5271
  "flags": {
4892
5272
  "json": {
4893
5273
  "description": "Format output as json.",
@@ -4920,23 +5300,18 @@
4920
5300
  "multiple": false,
4921
5301
  "type": "option"
4922
5302
  },
4923
- "label": {
4924
- "description": "Thread label",
4925
- "name": "label",
5303
+ "tag": {
5304
+ "description": "Tag to add (repeatable)",
5305
+ "name": "tag",
5306
+ "required": true,
4926
5307
  "hasDynamicHelp": false,
4927
- "multiple": false,
5308
+ "multiple": true,
4928
5309
  "type": "option"
4929
- },
4930
- "oauth-only": {
4931
- "description": "Prevent fallback to paid system key (use OAuth only)",
4932
- "name": "oauth-only",
4933
- "allowNo": false,
4934
- "type": "boolean"
4935
5310
  }
4936
5311
  },
4937
5312
  "hasDynamicHelp": false,
4938
5313
  "hiddenAliases": [],
4939
- "id": "compile:thread:create",
5314
+ "id": "face:tag:add",
4940
5315
  "pluginAlias": "faces-cli",
4941
5316
  "pluginName": "faces-cli",
4942
5317
  "pluginType": "core",
@@ -4946,21 +5321,15 @@
4946
5321
  "relativePath": [
4947
5322
  "dist",
4948
5323
  "commands",
4949
- "compile",
4950
- "thread",
4951
- "create.js"
5324
+ "face",
5325
+ "tag",
5326
+ "add.js"
4952
5327
  ]
4953
5328
  },
4954
- "compile:thread:delete": {
5329
+ "face:tag:all": {
4955
5330
  "aliases": [],
4956
- "args": {
4957
- "thread_id": {
4958
- "description": "Thread ID",
4959
- "name": "thread_id",
4960
- "required": true
4961
- }
4962
- },
4963
- "description": "Delete a thread",
5331
+ "args": {},
5332
+ "description": "List all tags across all your faces",
4964
5333
  "flags": {
4965
5334
  "json": {
4966
5335
  "description": "Format output as json.",
@@ -4992,17 +5361,11 @@
4992
5361
  "hasDynamicHelp": false,
4993
5362
  "multiple": false,
4994
5363
  "type": "option"
4995
- },
4996
- "yes": {
4997
- "description": "Skip confirmation",
4998
- "name": "yes",
4999
- "allowNo": false,
5000
- "type": "boolean"
5001
5364
  }
5002
5365
  },
5003
5366
  "hasDynamicHelp": false,
5004
5367
  "hiddenAliases": [],
5005
- "id": "compile:thread:delete",
5368
+ "id": "face:tag:all",
5006
5369
  "pluginAlias": "faces-cli",
5007
5370
  "pluginName": "faces-cli",
5008
5371
  "pluginType": "core",
@@ -5012,21 +5375,21 @@
5012
5375
  "relativePath": [
5013
5376
  "dist",
5014
5377
  "commands",
5015
- "compile",
5016
- "thread",
5017
- "delete.js"
5378
+ "face",
5379
+ "tag",
5380
+ "all.js"
5018
5381
  ]
5019
5382
  },
5020
- "compile:thread:edit": {
5383
+ "face:tag:list": {
5021
5384
  "aliases": [],
5022
5385
  "args": {
5023
- "thread_id": {
5024
- "description": "Thread ID",
5025
- "name": "thread_id",
5386
+ "alias": {
5387
+ "description": "Face alias",
5388
+ "name": "alias",
5026
5389
  "required": true
5027
5390
  }
5028
5391
  },
5029
- "description": "Edit a thread (label and/or reassign face speaker)",
5392
+ "description": "List tags on a face",
5030
5393
  "flags": {
5031
5394
  "json": {
5032
5395
  "description": "Format output as json.",
@@ -5058,25 +5421,11 @@
5058
5421
  "hasDynamicHelp": false,
5059
5422
  "multiple": false,
5060
5423
  "type": "option"
5061
- },
5062
- "label": {
5063
- "description": "New thread label",
5064
- "name": "label",
5065
- "hasDynamicHelp": false,
5066
- "multiple": false,
5067
- "type": "option"
5068
- },
5069
- "face-speaker": {
5070
- "description": "Reassign face speaker: set this speaker to role=user, all others to role=assistant",
5071
- "name": "face-speaker",
5072
- "hasDynamicHelp": false,
5073
- "multiple": false,
5074
- "type": "option"
5075
5424
  }
5076
5425
  },
5077
5426
  "hasDynamicHelp": false,
5078
5427
  "hiddenAliases": [],
5079
- "id": "compile:thread:edit",
5428
+ "id": "face:tag:list",
5080
5429
  "pluginAlias": "faces-cli",
5081
5430
  "pluginName": "faces-cli",
5082
5431
  "pluginType": "core",
@@ -5086,21 +5435,26 @@
5086
5435
  "relativePath": [
5087
5436
  "dist",
5088
5437
  "commands",
5089
- "compile",
5090
- "thread",
5091
- "edit.js"
5438
+ "face",
5439
+ "tag",
5440
+ "list.js"
5092
5441
  ]
5093
5442
  },
5094
- "compile:thread:get": {
5443
+ "face:tag:remove": {
5095
5444
  "aliases": [],
5096
5445
  "args": {
5097
- "thread_id": {
5098
- "description": "Thread ID",
5099
- "name": "thread_id",
5446
+ "alias": {
5447
+ "description": "Face alias",
5448
+ "name": "alias",
5449
+ "required": true
5450
+ },
5451
+ "tag": {
5452
+ "description": "Tag to remove",
5453
+ "name": "tag",
5100
5454
  "required": true
5101
5455
  }
5102
5456
  },
5103
- "description": "Get a thread by ID",
5457
+ "description": "Remove a tag from a face",
5104
5458
  "flags": {
5105
5459
  "json": {
5106
5460
  "description": "Format output as json.",
@@ -5136,7 +5490,7 @@
5136
5490
  },
5137
5491
  "hasDynamicHelp": false,
5138
5492
  "hiddenAliases": [],
5139
- "id": "compile:thread:get",
5493
+ "id": "face:tag:remove",
5140
5494
  "pluginAlias": "faces-cli",
5141
5495
  "pluginName": "faces-cli",
5142
5496
  "pluginType": "core",
@@ -5146,21 +5500,21 @@
5146
5500
  "relativePath": [
5147
5501
  "dist",
5148
5502
  "commands",
5149
- "compile",
5150
- "thread",
5151
- "get.js"
5503
+ "face",
5504
+ "tag",
5505
+ "remove.js"
5152
5506
  ]
5153
5507
  },
5154
- "compile:thread:list": {
5508
+ "face:tag:set": {
5155
5509
  "aliases": [],
5156
5510
  "args": {
5157
- "face_id": {
5511
+ "alias": {
5158
5512
  "description": "Face alias",
5159
- "name": "face_id",
5513
+ "name": "alias",
5160
5514
  "required": true
5161
5515
  }
5162
5516
  },
5163
- "description": "List threads for a face",
5517
+ "description": "Replace all tags on a face",
5164
5518
  "flags": {
5165
5519
  "json": {
5166
5520
  "description": "Format output as json.",
@@ -5192,11 +5546,19 @@
5192
5546
  "hasDynamicHelp": false,
5193
5547
  "multiple": false,
5194
5548
  "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"
5195
5557
  }
5196
5558
  },
5197
5559
  "hasDynamicHelp": false,
5198
5560
  "hiddenAliases": [],
5199
- "id": "compile:thread:list",
5561
+ "id": "face:tag:set",
5200
5562
  "pluginAlias": "faces-cli",
5201
5563
  "pluginName": "faces-cli",
5202
5564
  "pluginType": "core",
@@ -5206,21 +5568,21 @@
5206
5568
  "relativePath": [
5207
5569
  "dist",
5208
5570
  "commands",
5209
- "compile",
5210
- "thread",
5211
- "list.js"
5571
+ "face",
5572
+ "tag",
5573
+ "set.js"
5212
5574
  ]
5213
5575
  },
5214
- "compile:thread:make": {
5576
+ "team:tag:add": {
5215
5577
  "aliases": [],
5216
5578
  "args": {
5217
- "thread_id": {
5218
- "description": "Thread ID",
5219
- "name": "thread_id",
5579
+ "team_id": {
5580
+ "description": "Team ID",
5581
+ "name": "team_id",
5220
5582
  "required": true
5221
5583
  }
5222
5584
  },
5223
- "description": "Compile an existing thread (prepare + sync in one step)",
5585
+ "description": "Add tags to a team (appends, idempotent)",
5224
5586
  "flags": {
5225
5587
  "json": {
5226
5588
  "description": "Format output as json.",
@@ -5253,24 +5615,18 @@
5253
5615
  "multiple": false,
5254
5616
  "type": "option"
5255
5617
  },
5256
- "timeout": {
5257
- "description": "Compile timeout in seconds (default: 600)",
5258
- "name": "timeout",
5259
- "default": 600,
5618
+ "tag": {
5619
+ "description": "Tag to add (repeatable)",
5620
+ "name": "tag",
5621
+ "required": true,
5260
5622
  "hasDynamicHelp": false,
5261
- "multiple": false,
5623
+ "multiple": true,
5262
5624
  "type": "option"
5263
- },
5264
- "no-wait": {
5265
- "description": "Return immediately after triggering compilation. Prints the thread ID for manual polling.",
5266
- "name": "no-wait",
5267
- "allowNo": false,
5268
- "type": "boolean"
5269
5625
  }
5270
5626
  },
5271
5627
  "hasDynamicHelp": false,
5272
5628
  "hiddenAliases": [],
5273
- "id": "compile:thread:make",
5629
+ "id": "team:tag:add",
5274
5630
  "pluginAlias": "faces-cli",
5275
5631
  "pluginName": "faces-cli",
5276
5632
  "pluginType": "core",
@@ -5280,21 +5636,21 @@
5280
5636
  "relativePath": [
5281
5637
  "dist",
5282
5638
  "commands",
5283
- "compile",
5284
- "thread",
5285
- "make.js"
5639
+ "team",
5640
+ "tag",
5641
+ "add.js"
5286
5642
  ]
5287
5643
  },
5288
- "compile:thread:message": {
5644
+ "team:tag:list": {
5289
5645
  "aliases": [],
5290
5646
  "args": {
5291
- "thread_id": {
5292
- "description": "Thread ID",
5293
- "name": "thread_id",
5647
+ "team_id": {
5648
+ "description": "Team ID",
5649
+ "name": "team_id",
5294
5650
  "required": true
5295
5651
  }
5296
5652
  },
5297
- "description": "Send a user message to a thread",
5653
+ "description": "List tags on a team",
5298
5654
  "flags": {
5299
5655
  "json": {
5300
5656
  "description": "Format output as json.",
@@ -5326,26 +5682,11 @@
5326
5682
  "hasDynamicHelp": false,
5327
5683
  "multiple": false,
5328
5684
  "type": "option"
5329
- },
5330
- "message": {
5331
- "char": "m",
5332
- "description": "User message to append",
5333
- "name": "message",
5334
- "required": true,
5335
- "hasDynamicHelp": false,
5336
- "multiple": false,
5337
- "type": "option"
5338
- },
5339
- "oauth-only": {
5340
- "description": "Prevent fallback to paid system key (use OAuth only)",
5341
- "name": "oauth-only",
5342
- "allowNo": false,
5343
- "type": "boolean"
5344
5685
  }
5345
5686
  },
5346
5687
  "hasDynamicHelp": false,
5347
5688
  "hiddenAliases": [],
5348
- "id": "compile:thread:message",
5689
+ "id": "team:tag:list",
5349
5690
  "pluginAlias": "faces-cli",
5350
5691
  "pluginName": "faces-cli",
5351
5692
  "pluginType": "core",
@@ -5355,21 +5696,26 @@
5355
5696
  "relativePath": [
5356
5697
  "dist",
5357
5698
  "commands",
5358
- "compile",
5359
- "thread",
5360
- "message.js"
5699
+ "team",
5700
+ "tag",
5701
+ "list.js"
5361
5702
  ]
5362
5703
  },
5363
- "compile:thread:pause": {
5704
+ "team:tag:remove": {
5364
5705
  "aliases": [],
5365
5706
  "args": {
5366
- "thread_id": {
5367
- "description": "Thread ID",
5368
- "name": "thread_id",
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",
5369
5715
  "required": true
5370
5716
  }
5371
5717
  },
5372
- "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.",
5718
+ "description": "Remove a tag from a team",
5373
5719
  "flags": {
5374
5720
  "json": {
5375
5721
  "description": "Format output as json.",
@@ -5401,25 +5747,11 @@
5401
5747
  "hasDynamicHelp": false,
5402
5748
  "multiple": false,
5403
5749
  "type": "option"
5404
- },
5405
- "no-wait": {
5406
- "description": "Return as soon as the pause is accepted, without waiting for the compile to stop.",
5407
- "name": "no-wait",
5408
- "allowNo": false,
5409
- "type": "boolean"
5410
- },
5411
- "timeout": {
5412
- "description": "Seconds to wait for the compile to stop (default: 60)",
5413
- "name": "timeout",
5414
- "default": 60,
5415
- "hasDynamicHelp": false,
5416
- "multiple": false,
5417
- "type": "option"
5418
5750
  }
5419
5751
  },
5420
5752
  "hasDynamicHelp": false,
5421
5753
  "hiddenAliases": [],
5422
- "id": "compile:thread:pause",
5754
+ "id": "team:tag:remove",
5423
5755
  "pluginAlias": "faces-cli",
5424
5756
  "pluginName": "faces-cli",
5425
5757
  "pluginType": "core",
@@ -5429,21 +5761,21 @@
5429
5761
  "relativePath": [
5430
5762
  "dist",
5431
5763
  "commands",
5432
- "compile",
5433
- "thread",
5434
- "pause.js"
5764
+ "team",
5765
+ "tag",
5766
+ "remove.js"
5435
5767
  ]
5436
5768
  },
5437
- "compile:thread:reset": {
5769
+ "team:tag:set": {
5438
5770
  "aliases": [],
5439
5771
  "args": {
5440
- "thread_id": {
5441
- "description": "Thread ID",
5442
- "name": "thread_id",
5772
+ "team_id": {
5773
+ "description": "Team ID",
5774
+ "name": "team_id",
5443
5775
  "required": true
5444
5776
  }
5445
5777
  },
5446
- "description": "Reset thread compilation progress (wipe extraction, keep source messages)",
5778
+ "description": "Replace all tags on a team",
5447
5779
  "flags": {
5448
5780
  "json": {
5449
5781
  "description": "Format output as json.",
@@ -5476,16 +5808,18 @@
5476
5808
  "multiple": false,
5477
5809
  "type": "option"
5478
5810
  },
5479
- "yes": {
5480
- "description": "Skip confirmation",
5481
- "name": "yes",
5482
- "allowNo": false,
5483
- "type": "boolean"
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"
5484
5818
  }
5485
5819
  },
5486
5820
  "hasDynamicHelp": false,
5487
5821
  "hiddenAliases": [],
5488
- "id": "compile:thread:reset",
5822
+ "id": "team:tag:set",
5489
5823
  "pluginAlias": "faces-cli",
5490
5824
  "pluginName": "faces-cli",
5491
5825
  "pluginType": "core",
@@ -5495,21 +5829,21 @@
5495
5829
  "relativePath": [
5496
5830
  "dist",
5497
5831
  "commands",
5498
- "compile",
5499
- "thread",
5500
- "reset.js"
5832
+ "team",
5833
+ "tag",
5834
+ "set.js"
5501
5835
  ]
5502
5836
  },
5503
- "compile:thread:sync": {
5837
+ "compile:thread:create": {
5504
5838
  "aliases": [],
5505
5839
  "args": {
5506
- "thread_id": {
5507
- "description": "Thread ID",
5508
- "name": "thread_id",
5840
+ "face_id": {
5841
+ "description": "Face alias",
5842
+ "name": "face_id",
5509
5843
  "required": true
5510
5844
  }
5511
5845
  },
5512
- "description": "Archive and sync a thread into a face",
5846
+ "description": "Start a new thread for a face",
5513
5847
  "flags": {
5514
5848
  "json": {
5515
5849
  "description": "Format output as json.",
@@ -5541,11 +5875,24 @@
5541
5875
  "hasDynamicHelp": false,
5542
5876
  "multiple": false,
5543
5877
  "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"
5544
5891
  }
5545
5892
  },
5546
5893
  "hasDynamicHelp": false,
5547
5894
  "hiddenAliases": [],
5548
- "id": "compile:thread:sync",
5895
+ "id": "compile:thread:create",
5549
5896
  "pluginAlias": "faces-cli",
5550
5897
  "pluginName": "faces-cli",
5551
5898
  "pluginType": "core",
@@ -5557,19 +5904,19 @@
5557
5904
  "commands",
5558
5905
  "compile",
5559
5906
  "thread",
5560
- "sync.js"
5907
+ "create.js"
5561
5908
  ]
5562
5909
  },
5563
- "face:tag:add": {
5910
+ "compile:thread:delete": {
5564
5911
  "aliases": [],
5565
5912
  "args": {
5566
- "alias": {
5567
- "description": "Face alias",
5568
- "name": "alias",
5913
+ "thread_id": {
5914
+ "description": "Thread ID",
5915
+ "name": "thread_id",
5569
5916
  "required": true
5570
5917
  }
5571
5918
  },
5572
- "description": "Add tags to a face (appends, idempotent)",
5919
+ "description": "Delete a thread",
5573
5920
  "flags": {
5574
5921
  "json": {
5575
5922
  "description": "Format output as json.",
@@ -5602,18 +5949,16 @@
5602
5949
  "multiple": false,
5603
5950
  "type": "option"
5604
5951
  },
5605
- "tag": {
5606
- "description": "Tag to add (repeatable)",
5607
- "name": "tag",
5608
- "required": true,
5609
- "hasDynamicHelp": false,
5610
- "multiple": true,
5611
- "type": "option"
5952
+ "yes": {
5953
+ "description": "Skip confirmation",
5954
+ "name": "yes",
5955
+ "allowNo": false,
5956
+ "type": "boolean"
5612
5957
  }
5613
5958
  },
5614
5959
  "hasDynamicHelp": false,
5615
5960
  "hiddenAliases": [],
5616
- "id": "face:tag:add",
5961
+ "id": "compile:thread:delete",
5617
5962
  "pluginAlias": "faces-cli",
5618
5963
  "pluginName": "faces-cli",
5619
5964
  "pluginType": "core",
@@ -5623,15 +5968,21 @@
5623
5968
  "relativePath": [
5624
5969
  "dist",
5625
5970
  "commands",
5626
- "face",
5627
- "tag",
5628
- "add.js"
5971
+ "compile",
5972
+ "thread",
5973
+ "delete.js"
5629
5974
  ]
5630
5975
  },
5631
- "face:tag:all": {
5976
+ "compile:thread:edit": {
5632
5977
  "aliases": [],
5633
- "args": {},
5634
- "description": "List all tags across all your faces",
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)",
5635
5986
  "flags": {
5636
5987
  "json": {
5637
5988
  "description": "Format output as json.",
@@ -5663,11 +6014,25 @@
5663
6014
  "hasDynamicHelp": false,
5664
6015
  "multiple": false,
5665
6016
  "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"
5666
6031
  }
5667
6032
  },
5668
6033
  "hasDynamicHelp": false,
5669
6034
  "hiddenAliases": [],
5670
- "id": "face:tag:all",
6035
+ "id": "compile:thread:edit",
5671
6036
  "pluginAlias": "faces-cli",
5672
6037
  "pluginName": "faces-cli",
5673
6038
  "pluginType": "core",
@@ -5677,21 +6042,21 @@
5677
6042
  "relativePath": [
5678
6043
  "dist",
5679
6044
  "commands",
5680
- "face",
5681
- "tag",
5682
- "all.js"
6045
+ "compile",
6046
+ "thread",
6047
+ "edit.js"
5683
6048
  ]
5684
6049
  },
5685
- "face:tag:list": {
6050
+ "compile:thread:get": {
5686
6051
  "aliases": [],
5687
6052
  "args": {
5688
- "alias": {
5689
- "description": "Face alias",
5690
- "name": "alias",
6053
+ "thread_id": {
6054
+ "description": "Thread ID",
6055
+ "name": "thread_id",
5691
6056
  "required": true
5692
6057
  }
5693
6058
  },
5694
- "description": "List tags on a face",
6059
+ "description": "Get a thread by ID",
5695
6060
  "flags": {
5696
6061
  "json": {
5697
6062
  "description": "Format output as json.",
@@ -5727,7 +6092,7 @@
5727
6092
  },
5728
6093
  "hasDynamicHelp": false,
5729
6094
  "hiddenAliases": [],
5730
- "id": "face:tag:list",
6095
+ "id": "compile:thread:get",
5731
6096
  "pluginAlias": "faces-cli",
5732
6097
  "pluginName": "faces-cli",
5733
6098
  "pluginType": "core",
@@ -5737,26 +6102,21 @@
5737
6102
  "relativePath": [
5738
6103
  "dist",
5739
6104
  "commands",
5740
- "face",
5741
- "tag",
5742
- "list.js"
6105
+ "compile",
6106
+ "thread",
6107
+ "get.js"
5743
6108
  ]
5744
6109
  },
5745
- "face:tag:remove": {
6110
+ "compile:thread:list": {
5746
6111
  "aliases": [],
5747
6112
  "args": {
5748
- "alias": {
6113
+ "face_id": {
5749
6114
  "description": "Face alias",
5750
- "name": "alias",
5751
- "required": true
5752
- },
5753
- "tag": {
5754
- "description": "Tag to remove",
5755
- "name": "tag",
6115
+ "name": "face_id",
5756
6116
  "required": true
5757
6117
  }
5758
6118
  },
5759
- "description": "Remove a tag from a face",
6119
+ "description": "List threads for a face",
5760
6120
  "flags": {
5761
6121
  "json": {
5762
6122
  "description": "Format output as json.",
@@ -5792,7 +6152,7 @@
5792
6152
  },
5793
6153
  "hasDynamicHelp": false,
5794
6154
  "hiddenAliases": [],
5795
- "id": "face:tag:remove",
6155
+ "id": "compile:thread:list",
5796
6156
  "pluginAlias": "faces-cli",
5797
6157
  "pluginName": "faces-cli",
5798
6158
  "pluginType": "core",
@@ -5802,21 +6162,21 @@
5802
6162
  "relativePath": [
5803
6163
  "dist",
5804
6164
  "commands",
5805
- "face",
5806
- "tag",
5807
- "remove.js"
6165
+ "compile",
6166
+ "thread",
6167
+ "list.js"
5808
6168
  ]
5809
6169
  },
5810
- "face:tag:set": {
6170
+ "compile:thread:make": {
5811
6171
  "aliases": [],
5812
6172
  "args": {
5813
- "alias": {
5814
- "description": "Face alias",
5815
- "name": "alias",
6173
+ "thread_id": {
6174
+ "description": "Thread ID",
6175
+ "name": "thread_id",
5816
6176
  "required": true
5817
6177
  }
5818
6178
  },
5819
- "description": "Replace all tags on a face",
6179
+ "description": "Compile an existing thread (prepare + sync in one step)",
5820
6180
  "flags": {
5821
6181
  "json": {
5822
6182
  "description": "Format output as json.",
@@ -5849,18 +6209,24 @@
5849
6209
  "multiple": false,
5850
6210
  "type": "option"
5851
6211
  },
5852
- "tag": {
5853
- "description": "Tag to set (repeatable, replaces all)",
5854
- "name": "tag",
5855
- "required": true,
6212
+ "timeout": {
6213
+ "description": "Compile timeout in seconds (default: 600)",
6214
+ "name": "timeout",
6215
+ "default": 600,
5856
6216
  "hasDynamicHelp": false,
5857
- "multiple": true,
6217
+ "multiple": false,
5858
6218
  "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"
5859
6225
  }
5860
6226
  },
5861
6227
  "hasDynamicHelp": false,
5862
6228
  "hiddenAliases": [],
5863
- "id": "face:tag:set",
6229
+ "id": "compile:thread:make",
5864
6230
  "pluginAlias": "faces-cli",
5865
6231
  "pluginName": "faces-cli",
5866
6232
  "pluginType": "core",
@@ -5870,21 +6236,21 @@
5870
6236
  "relativePath": [
5871
6237
  "dist",
5872
6238
  "commands",
5873
- "face",
5874
- "tag",
5875
- "set.js"
6239
+ "compile",
6240
+ "thread",
6241
+ "make.js"
5876
6242
  ]
5877
6243
  },
5878
- "team:tag:add": {
6244
+ "compile:thread:message": {
5879
6245
  "aliases": [],
5880
6246
  "args": {
5881
- "team_id": {
5882
- "description": "Team ID",
5883
- "name": "team_id",
6247
+ "thread_id": {
6248
+ "description": "Thread ID",
6249
+ "name": "thread_id",
5884
6250
  "required": true
5885
6251
  }
5886
6252
  },
5887
- "description": "Add tags to a team (appends, idempotent)",
6253
+ "description": "Send a user message to a thread",
5888
6254
  "flags": {
5889
6255
  "json": {
5890
6256
  "description": "Format output as json.",
@@ -5917,18 +6283,25 @@
5917
6283
  "multiple": false,
5918
6284
  "type": "option"
5919
6285
  },
5920
- "tag": {
5921
- "description": "Tag to add (repeatable)",
5922
- "name": "tag",
6286
+ "message": {
6287
+ "char": "m",
6288
+ "description": "User message to append",
6289
+ "name": "message",
5923
6290
  "required": true,
5924
6291
  "hasDynamicHelp": false,
5925
- "multiple": true,
6292
+ "multiple": false,
5926
6293
  "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"
5927
6300
  }
5928
6301
  },
5929
6302
  "hasDynamicHelp": false,
5930
6303
  "hiddenAliases": [],
5931
- "id": "team:tag:add",
6304
+ "id": "compile:thread:message",
5932
6305
  "pluginAlias": "faces-cli",
5933
6306
  "pluginName": "faces-cli",
5934
6307
  "pluginType": "core",
@@ -5938,21 +6311,21 @@
5938
6311
  "relativePath": [
5939
6312
  "dist",
5940
6313
  "commands",
5941
- "team",
5942
- "tag",
5943
- "add.js"
6314
+ "compile",
6315
+ "thread",
6316
+ "message.js"
5944
6317
  ]
5945
6318
  },
5946
- "team:tag:list": {
6319
+ "compile:thread:pause": {
5947
6320
  "aliases": [],
5948
6321
  "args": {
5949
- "team_id": {
5950
- "description": "Team ID",
5951
- "name": "team_id",
6322
+ "thread_id": {
6323
+ "description": "Thread ID",
6324
+ "name": "thread_id",
5952
6325
  "required": true
5953
6326
  }
5954
6327
  },
5955
- "description": "List tags on a team",
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.",
5956
6329
  "flags": {
5957
6330
  "json": {
5958
6331
  "description": "Format output as json.",
@@ -5984,11 +6357,25 @@
5984
6357
  "hasDynamicHelp": false,
5985
6358
  "multiple": false,
5986
6359
  "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"
5987
6374
  }
5988
6375
  },
5989
6376
  "hasDynamicHelp": false,
5990
6377
  "hiddenAliases": [],
5991
- "id": "team:tag:list",
6378
+ "id": "compile:thread:pause",
5992
6379
  "pluginAlias": "faces-cli",
5993
6380
  "pluginName": "faces-cli",
5994
6381
  "pluginType": "core",
@@ -5998,26 +6385,21 @@
5998
6385
  "relativePath": [
5999
6386
  "dist",
6000
6387
  "commands",
6001
- "team",
6002
- "tag",
6003
- "list.js"
6388
+ "compile",
6389
+ "thread",
6390
+ "pause.js"
6004
6391
  ]
6005
6392
  },
6006
- "team:tag:remove": {
6393
+ "compile:thread:reset": {
6007
6394
  "aliases": [],
6008
6395
  "args": {
6009
- "team_id": {
6010
- "description": "Team ID",
6011
- "name": "team_id",
6012
- "required": true
6013
- },
6014
- "tag": {
6015
- "description": "Tag to remove",
6016
- "name": "tag",
6396
+ "thread_id": {
6397
+ "description": "Thread ID",
6398
+ "name": "thread_id",
6017
6399
  "required": true
6018
6400
  }
6019
6401
  },
6020
- "description": "Remove a tag from a team",
6402
+ "description": "Reset thread compilation progress (wipe extraction, keep source messages)",
6021
6403
  "flags": {
6022
6404
  "json": {
6023
6405
  "description": "Format output as json.",
@@ -6049,11 +6431,17 @@
6049
6431
  "hasDynamicHelp": false,
6050
6432
  "multiple": false,
6051
6433
  "type": "option"
6434
+ },
6435
+ "yes": {
6436
+ "description": "Skip confirmation",
6437
+ "name": "yes",
6438
+ "allowNo": false,
6439
+ "type": "boolean"
6052
6440
  }
6053
6441
  },
6054
6442
  "hasDynamicHelp": false,
6055
6443
  "hiddenAliases": [],
6056
- "id": "team:tag:remove",
6444
+ "id": "compile:thread:reset",
6057
6445
  "pluginAlias": "faces-cli",
6058
6446
  "pluginName": "faces-cli",
6059
6447
  "pluginType": "core",
@@ -6063,21 +6451,21 @@
6063
6451
  "relativePath": [
6064
6452
  "dist",
6065
6453
  "commands",
6066
- "team",
6067
- "tag",
6068
- "remove.js"
6454
+ "compile",
6455
+ "thread",
6456
+ "reset.js"
6069
6457
  ]
6070
6458
  },
6071
- "team:tag:set": {
6459
+ "compile:thread:sync": {
6072
6460
  "aliases": [],
6073
6461
  "args": {
6074
- "team_id": {
6075
- "description": "Team ID",
6076
- "name": "team_id",
6462
+ "thread_id": {
6463
+ "description": "Thread ID",
6464
+ "name": "thread_id",
6077
6465
  "required": true
6078
6466
  }
6079
6467
  },
6080
- "description": "Replace all tags on a team",
6468
+ "description": "Archive and sync a thread into a face",
6081
6469
  "flags": {
6082
6470
  "json": {
6083
6471
  "description": "Format output as json.",
@@ -6109,19 +6497,11 @@
6109
6497
  "hasDynamicHelp": false,
6110
6498
  "multiple": false,
6111
6499
  "type": "option"
6112
- },
6113
- "tag": {
6114
- "description": "Tag to set (repeatable, replaces all)",
6115
- "name": "tag",
6116
- "required": true,
6117
- "hasDynamicHelp": false,
6118
- "multiple": true,
6119
- "type": "option"
6120
6500
  }
6121
6501
  },
6122
6502
  "hasDynamicHelp": false,
6123
6503
  "hiddenAliases": [],
6124
- "id": "team:tag:set",
6504
+ "id": "compile:thread:sync",
6125
6505
  "pluginAlias": "faces-cli",
6126
6506
  "pluginName": "faces-cli",
6127
6507
  "pluginType": "core",
@@ -6131,11 +6511,11 @@
6131
6511
  "relativePath": [
6132
6512
  "dist",
6133
6513
  "commands",
6134
- "team",
6135
- "tag",
6136
- "set.js"
6514
+ "compile",
6515
+ "thread",
6516
+ "sync.js"
6137
6517
  ]
6138
6518
  }
6139
6519
  },
6140
- "version": "1.7.9"
6520
+ "version": "1.7.14"
6141
6521
  }