faces-cli 1.7.16 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2255,10 +2255,10 @@
2255
2255
  "show.js"
2256
2256
  ]
2257
2257
  },
2258
- "keys:create": {
2258
+ "face:attributes": {
2259
2259
  "aliases": [],
2260
2260
  "args": {},
2261
- "description": "Create a new API key (JWT required). The new key is saved to ~/.faces/config.json as api_key by default; pass --no-save to skip.",
2261
+ "description": "List all supported attribute keys",
2262
2262
  "flags": {
2263
2263
  "json": {
2264
2264
  "description": "Format output as json.",
@@ -2290,53 +2290,11 @@
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"
2335
2293
  }
2336
2294
  },
2337
2295
  "hasDynamicHelp": false,
2338
2296
  "hiddenAliases": [],
2339
- "id": "keys:create",
2297
+ "id": "face:attributes",
2340
2298
  "pluginAlias": "faces-cli",
2341
2299
  "pluginName": "faces-cli",
2342
2300
  "pluginType": "core",
@@ -2346,14 +2304,14 @@
2346
2304
  "relativePath": [
2347
2305
  "dist",
2348
2306
  "commands",
2349
- "keys",
2350
- "create.js"
2307
+ "face",
2308
+ "attributes.js"
2351
2309
  ]
2352
2310
  },
2353
- "keys:list": {
2311
+ "face:create": {
2354
2312
  "aliases": [],
2355
2313
  "args": {},
2356
- "description": "List all API keys (JWT required)",
2314
+ "description": "Create a new face",
2357
2315
  "flags": {
2358
2316
  "json": {
2359
2317
  "description": "Format output as json.",
@@ -2385,76 +2343,86 @@
2385
2343
  "hasDynamicHelp": false,
2386
2344
  "multiple": false,
2387
2345
  "type": "option"
2388
- }
2389
- },
2390
- "hasDynamicHelp": false,
2391
- "hiddenAliases": [],
2392
- "id": "keys:list",
2393
- "pluginAlias": "faces-cli",
2394
- "pluginName": "faces-cli",
2395
- "pluginType": "core",
2396
- "strict": true,
2397
- "enableJsonFlag": true,
2398
- "isESM": true,
2399
- "relativePath": [
2400
- "dist",
2401
- "commands",
2402
- "keys",
2403
- "list.js"
2404
- ]
2405
- },
2406
- "keys:revoke": {
2407
- "aliases": [],
2408
- "args": {
2409
- "key_id": {
2410
- "description": "Key ID",
2411
- "name": "key_id",
2412
- "required": true
2413
- }
2414
- },
2415
- "description": "Revoke an API key (JWT required)",
2416
- "flags": {
2417
- "json": {
2418
- "description": "Format output as json.",
2419
- "helpGroup": "GLOBAL",
2420
- "name": "json",
2421
- "allowNo": false,
2422
- "type": "boolean"
2423
2346
  },
2424
- "base-url": {
2425
- "description": "API base URL",
2426
- "env": "FACES_BASE_URL",
2427
- "name": "base-url",
2347
+ "name": {
2348
+ "description": "Display name",
2349
+ "name": "name",
2350
+ "required": true,
2428
2351
  "hasDynamicHelp": false,
2429
2352
  "multiple": false,
2430
2353
  "type": "option"
2431
2354
  },
2432
- "token": {
2433
- "description": "JWT bearer token",
2434
- "env": "FACES_TOKEN",
2435
- "name": "token",
2355
+ "alias": {
2356
+ "description": "Unique alias slug",
2357
+ "name": "alias",
2358
+ "required": true,
2436
2359
  "hasDynamicHelp": false,
2437
2360
  "multiple": false,
2438
2361
  "type": "option"
2439
2362
  },
2440
- "api-key": {
2441
- "description": "API key",
2442
- "env": "FACES_API_KEY",
2443
- "name": "api-key",
2363
+ "description": {
2364
+ "description": "Plain-text description / bio (max 1500 chars)",
2365
+ "name": "description",
2444
2366
  "hasDynamicHelp": false,
2445
2367
  "multiple": false,
2446
2368
  "type": "option"
2447
2369
  },
2448
- "yes": {
2449
- "description": "Skip confirmation",
2450
- "name": "yes",
2451
- "allowNo": false,
2452
- "type": "boolean"
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",
2380
+ "hasDynamicHelp": false,
2381
+ "multiple": false,
2382
+ "type": "option"
2383
+ },
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",
2387
+ "hasDynamicHelp": false,
2388
+ "multiple": false,
2389
+ "type": "option"
2390
+ },
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",
2408
+ "hasDynamicHelp": false,
2409
+ "multiple": false,
2410
+ "type": "option"
2411
+ },
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"
2453
2421
  }
2454
2422
  },
2455
2423
  "hasDynamicHelp": false,
2456
2424
  "hiddenAliases": [],
2457
- "id": "keys:revoke",
2425
+ "id": "face:create",
2458
2426
  "pluginAlias": "faces-cli",
2459
2427
  "pluginName": "faces-cli",
2460
2428
  "pluginType": "core",
@@ -2464,20 +2432,20 @@
2464
2432
  "relativePath": [
2465
2433
  "dist",
2466
2434
  "commands",
2467
- "keys",
2468
- "revoke.js"
2435
+ "face",
2436
+ "create.js"
2469
2437
  ]
2470
2438
  },
2471
- "keys:update": {
2439
+ "face:delete": {
2472
2440
  "aliases": [],
2473
2441
  "args": {
2474
- "key_id": {
2475
- "description": "Key ID",
2476
- "name": "key_id",
2442
+ "face_id": {
2443
+ "description": "Face alias",
2444
+ "name": "face_id",
2477
2445
  "required": true
2478
2446
  }
2479
2447
  },
2480
- "description": "Update API key metadata (JWT required)",
2448
+ "description": "Delete a face permanently",
2481
2449
  "flags": {
2482
2450
  "json": {
2483
2451
  "description": "Format output as json.",
@@ -2510,30 +2478,16 @@
2510
2478
  "multiple": false,
2511
2479
  "type": "option"
2512
2480
  },
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",
2481
+ "yes": {
2482
+ "description": "Skip confirmation",
2483
+ "name": "yes",
2530
2484
  "allowNo": false,
2531
2485
  "type": "boolean"
2532
2486
  }
2533
2487
  },
2534
2488
  "hasDynamicHelp": false,
2535
2489
  "hiddenAliases": [],
2536
- "id": "keys:update",
2490
+ "id": "face:delete",
2537
2491
  "pluginAlias": "faces-cli",
2538
2492
  "pluginName": "faces-cli",
2539
2493
  "pluginType": "core",
@@ -2543,14 +2497,14 @@
2543
2497
  "relativePath": [
2544
2498
  "dist",
2545
2499
  "commands",
2546
- "keys",
2547
- "update.js"
2500
+ "face",
2501
+ "delete.js"
2548
2502
  ]
2549
2503
  },
2550
- "face:attributes": {
2504
+ "face:diff": {
2551
2505
  "aliases": [],
2552
2506
  "args": {},
2553
- "description": "List all supported attribute keys",
2507
+ "description": "Compare owned faces pairwise across all centroid components",
2554
2508
  "flags": {
2555
2509
  "json": {
2556
2510
  "description": "Format output as json.",
@@ -2582,11 +2536,19 @@
2582
2536
  "hasDynamicHelp": false,
2583
2537
  "multiple": false,
2584
2538
  "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"
2585
2547
  }
2586
2548
  },
2587
2549
  "hasDynamicHelp": false,
2588
2550
  "hiddenAliases": [],
2589
- "id": "face:attributes",
2551
+ "id": "face:diff",
2590
2552
  "pluginAlias": "faces-cli",
2591
2553
  "pluginName": "faces-cli",
2592
2554
  "pluginType": "core",
@@ -2597,13 +2559,19 @@
2597
2559
  "dist",
2598
2560
  "commands",
2599
2561
  "face",
2600
- "attributes.js"
2562
+ "diff.js"
2601
2563
  ]
2602
2564
  },
2603
- "face:create": {
2565
+ "face:edit": {
2604
2566
  "aliases": [],
2605
- "args": {},
2606
- "description": "Create a new face",
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",
2607
2575
  "flags": {
2608
2576
  "json": {
2609
2577
  "description": "Format output as json.",
@@ -2637,17 +2605,8 @@
2637
2605
  "type": "option"
2638
2606
  },
2639
2607
  "name": {
2640
- "description": "Display name",
2608
+ "description": "New display name",
2641
2609
  "name": "name",
2642
- "required": true,
2643
- "hasDynamicHelp": false,
2644
- "multiple": false,
2645
- "type": "option"
2646
- },
2647
- "alias": {
2648
- "description": "Unique alias slug",
2649
- "name": "alias",
2650
- "required": true,
2651
2610
  "hasDynamicHelp": false,
2652
2611
  "multiple": false,
2653
2612
  "type": "option"
@@ -2660,7 +2619,7 @@
2660
2619
  "type": "option"
2661
2620
  },
2662
2621
  "tag": {
2663
- "description": "Tag label (repeatable, lowercase)",
2622
+ "description": "Replace all tags (repeatable, lowercase)",
2664
2623
  "name": "tag",
2665
2624
  "hasDynamicHelp": false,
2666
2625
  "multiple": true,
@@ -2674,258 +2633,7 @@
2674
2633
  "type": "option"
2675
2634
  },
2676
2635
  "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": {
2907
- "description": "Plain-text description / bio (max 1500 chars)",
2908
- "name": "description",
2909
- "hasDynamicHelp": false,
2910
- "multiple": false,
2911
- "type": "option"
2912
- },
2913
- "tag": {
2914
- "description": "Replace all tags (repeatable, lowercase)",
2915
- "name": "tag",
2916
- "hasDynamicHelp": false,
2917
- "multiple": true,
2918
- "type": "option"
2919
- },
2920
- "default-model": {
2921
- "description": "Default LLM for chat (e.g. gpt-4o-mini, claude-sonnet-4-6)",
2922
- "name": "default-model",
2923
- "hasDynamicHelp": false,
2924
- "multiple": false,
2925
- "type": "option"
2926
- },
2927
- "formula": {
2928
- "description": "New boolean formula (synthetic faces only)",
2636
+ "description": "New boolean formula (synthetic faces only)",
2929
2637
  "name": "formula",
2930
2638
  "hasDynamicHelp": false,
2931
2639
  "multiple": false,
@@ -3470,16 +3178,712 @@
3470
3178
  "allowNo": false,
3471
3179
  "type": "boolean"
3472
3180
  },
3473
- "yes": {
3474
- "description": "Skip the confirmation shown when someone would lose access",
3475
- "name": "yes",
3181
+ "yes": {
3182
+ "description": "Skip the confirmation shown when someone would lose access",
3183
+ "name": "yes",
3184
+ "allowNo": false,
3185
+ "type": "boolean"
3186
+ }
3187
+ },
3188
+ "hasDynamicHelp": false,
3189
+ "hiddenAliases": [],
3190
+ "id": "face:share",
3191
+ "pluginAlias": "faces-cli",
3192
+ "pluginName": "faces-cli",
3193
+ "pluginType": "core",
3194
+ "strict": true,
3195
+ "enableJsonFlag": true,
3196
+ "isESM": true,
3197
+ "relativePath": [
3198
+ "dist",
3199
+ "commands",
3200
+ "face",
3201
+ "share.js"
3202
+ ]
3203
+ },
3204
+ "face:sources": {
3205
+ "aliases": [],
3206
+ "args": {
3207
+ "alias": {
3208
+ "description": "Face alias",
3209
+ "name": "alias",
3210
+ "required": true
3211
+ }
3212
+ },
3213
+ "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.",
3214
+ "examples": [
3215
+ "<%= config.bin %> <%= command.id %> alice",
3216
+ "<%= config.bin %> <%= command.id %> alice --type thread",
3217
+ "<%= config.bin %> <%= command.id %> alice --json"
3218
+ ],
3219
+ "flags": {
3220
+ "json": {
3221
+ "description": "Format output as json.",
3222
+ "helpGroup": "GLOBAL",
3223
+ "name": "json",
3224
+ "allowNo": false,
3225
+ "type": "boolean"
3226
+ },
3227
+ "base-url": {
3228
+ "description": "API base URL",
3229
+ "env": "FACES_BASE_URL",
3230
+ "name": "base-url",
3231
+ "hasDynamicHelp": false,
3232
+ "multiple": false,
3233
+ "type": "option"
3234
+ },
3235
+ "token": {
3236
+ "description": "JWT bearer token",
3237
+ "env": "FACES_TOKEN",
3238
+ "name": "token",
3239
+ "hasDynamicHelp": false,
3240
+ "multiple": false,
3241
+ "type": "option"
3242
+ },
3243
+ "api-key": {
3244
+ "description": "API key",
3245
+ "env": "FACES_API_KEY",
3246
+ "name": "api-key",
3247
+ "hasDynamicHelp": false,
3248
+ "multiple": false,
3249
+ "type": "option"
3250
+ },
3251
+ "type": {
3252
+ "description": "Show only one kind of source",
3253
+ "name": "type",
3254
+ "hasDynamicHelp": false,
3255
+ "multiple": false,
3256
+ "options": [
3257
+ "doc",
3258
+ "thread"
3259
+ ],
3260
+ "type": "option"
3261
+ }
3262
+ },
3263
+ "hasDynamicHelp": false,
3264
+ "hiddenAliases": [],
3265
+ "id": "face:sources",
3266
+ "pluginAlias": "faces-cli",
3267
+ "pluginName": "faces-cli",
3268
+ "pluginType": "core",
3269
+ "strict": true,
3270
+ "enableJsonFlag": true,
3271
+ "isESM": true,
3272
+ "relativePath": [
3273
+ "dist",
3274
+ "commands",
3275
+ "face",
3276
+ "sources.js"
3277
+ ]
3278
+ },
3279
+ "face:stats": {
3280
+ "aliases": [],
3281
+ "args": {},
3282
+ "description": "Compile and chat stats for all owned faces",
3283
+ "flags": {
3284
+ "json": {
3285
+ "description": "Format output as json.",
3286
+ "helpGroup": "GLOBAL",
3287
+ "name": "json",
3288
+ "allowNo": false,
3289
+ "type": "boolean"
3290
+ },
3291
+ "base-url": {
3292
+ "description": "API base URL",
3293
+ "env": "FACES_BASE_URL",
3294
+ "name": "base-url",
3295
+ "hasDynamicHelp": false,
3296
+ "multiple": false,
3297
+ "type": "option"
3298
+ },
3299
+ "token": {
3300
+ "description": "JWT bearer token",
3301
+ "env": "FACES_TOKEN",
3302
+ "name": "token",
3303
+ "hasDynamicHelp": false,
3304
+ "multiple": false,
3305
+ "type": "option"
3306
+ },
3307
+ "api-key": {
3308
+ "description": "API key",
3309
+ "env": "FACES_API_KEY",
3310
+ "name": "api-key",
3311
+ "hasDynamicHelp": false,
3312
+ "multiple": false,
3313
+ "type": "option"
3314
+ }
3315
+ },
3316
+ "hasDynamicHelp": false,
3317
+ "hiddenAliases": [],
3318
+ "id": "face:stats",
3319
+ "pluginAlias": "faces-cli",
3320
+ "pluginName": "faces-cli",
3321
+ "pluginType": "core",
3322
+ "strict": true,
3323
+ "enableJsonFlag": true,
3324
+ "isESM": true,
3325
+ "relativePath": [
3326
+ "dist",
3327
+ "commands",
3328
+ "face",
3329
+ "stats.js"
3330
+ ]
3331
+ },
3332
+ "face:teams": {
3333
+ "aliases": [],
3334
+ "args": {
3335
+ "alias": {
3336
+ "description": "Face alias",
3337
+ "name": "alias",
3338
+ "required": true
3339
+ }
3340
+ },
3341
+ "description": "Set a face's team memberships (replaces all)",
3342
+ "flags": {
3343
+ "json": {
3344
+ "description": "Format output as json.",
3345
+ "helpGroup": "GLOBAL",
3346
+ "name": "json",
3347
+ "allowNo": false,
3348
+ "type": "boolean"
3349
+ },
3350
+ "base-url": {
3351
+ "description": "API base URL",
3352
+ "env": "FACES_BASE_URL",
3353
+ "name": "base-url",
3354
+ "hasDynamicHelp": false,
3355
+ "multiple": false,
3356
+ "type": "option"
3357
+ },
3358
+ "token": {
3359
+ "description": "JWT bearer token",
3360
+ "env": "FACES_TOKEN",
3361
+ "name": "token",
3362
+ "hasDynamicHelp": false,
3363
+ "multiple": false,
3364
+ "type": "option"
3365
+ },
3366
+ "api-key": {
3367
+ "description": "API key",
3368
+ "env": "FACES_API_KEY",
3369
+ "name": "api-key",
3370
+ "hasDynamicHelp": false,
3371
+ "multiple": false,
3372
+ "type": "option"
3373
+ },
3374
+ "team": {
3375
+ "description": "Team ID (repeatable, replaces all memberships)",
3376
+ "name": "team",
3377
+ "required": true,
3378
+ "hasDynamicHelp": false,
3379
+ "multiple": true,
3380
+ "type": "option"
3381
+ }
3382
+ },
3383
+ "hasDynamicHelp": false,
3384
+ "hiddenAliases": [],
3385
+ "id": "face:teams",
3386
+ "pluginAlias": "faces-cli",
3387
+ "pluginName": "faces-cli",
3388
+ "pluginType": "core",
3389
+ "strict": true,
3390
+ "enableJsonFlag": true,
3391
+ "isESM": true,
3392
+ "relativePath": [
3393
+ "dist",
3394
+ "commands",
3395
+ "face",
3396
+ "teams.js"
3397
+ ]
3398
+ },
3399
+ "face:unlock": {
3400
+ "aliases": [],
3401
+ "args": {
3402
+ "face_id": {
3403
+ "description": "Face alias",
3404
+ "name": "face_id",
3405
+ "required": true
3406
+ }
3407
+ },
3408
+ "description": "Unlock a face (make it writable again). Thaws the face and everything it owns (documents, threads, voiceprint).",
3409
+ "examples": [
3410
+ "<%= config.bin %> <%= command.id %> socrates"
3411
+ ],
3412
+ "flags": {
3413
+ "json": {
3414
+ "description": "Format output as json.",
3415
+ "helpGroup": "GLOBAL",
3416
+ "name": "json",
3417
+ "allowNo": false,
3418
+ "type": "boolean"
3419
+ },
3420
+ "base-url": {
3421
+ "description": "API base URL",
3422
+ "env": "FACES_BASE_URL",
3423
+ "name": "base-url",
3424
+ "hasDynamicHelp": false,
3425
+ "multiple": false,
3426
+ "type": "option"
3427
+ },
3428
+ "token": {
3429
+ "description": "JWT bearer token",
3430
+ "env": "FACES_TOKEN",
3431
+ "name": "token",
3432
+ "hasDynamicHelp": false,
3433
+ "multiple": false,
3434
+ "type": "option"
3435
+ },
3436
+ "api-key": {
3437
+ "description": "API key",
3438
+ "env": "FACES_API_KEY",
3439
+ "name": "api-key",
3440
+ "hasDynamicHelp": false,
3441
+ "multiple": false,
3442
+ "type": "option"
3443
+ }
3444
+ },
3445
+ "hasDynamicHelp": false,
3446
+ "hiddenAliases": [],
3447
+ "id": "face:unlock",
3448
+ "pluginAlias": "faces-cli",
3449
+ "pluginName": "faces-cli",
3450
+ "pluginType": "core",
3451
+ "strict": true,
3452
+ "enableJsonFlag": true,
3453
+ "isESM": true,
3454
+ "relativePath": [
3455
+ "dist",
3456
+ "commands",
3457
+ "face",
3458
+ "unlock.js"
3459
+ ]
3460
+ },
3461
+ "face:unpublish": {
3462
+ "aliases": [],
3463
+ "args": {
3464
+ "alias": {
3465
+ "description": "Face alias",
3466
+ "name": "alias",
3467
+ "required": true
3468
+ }
3469
+ },
3470
+ "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.",
3471
+ "flags": {
3472
+ "json": {
3473
+ "description": "Format output as json.",
3474
+ "helpGroup": "GLOBAL",
3475
+ "name": "json",
3476
+ "allowNo": false,
3477
+ "type": "boolean"
3478
+ },
3479
+ "base-url": {
3480
+ "description": "API base URL",
3481
+ "env": "FACES_BASE_URL",
3482
+ "name": "base-url",
3483
+ "hasDynamicHelp": false,
3484
+ "multiple": false,
3485
+ "type": "option"
3486
+ },
3487
+ "token": {
3488
+ "description": "JWT bearer token",
3489
+ "env": "FACES_TOKEN",
3490
+ "name": "token",
3491
+ "hasDynamicHelp": false,
3492
+ "multiple": false,
3493
+ "type": "option"
3494
+ },
3495
+ "api-key": {
3496
+ "description": "API key",
3497
+ "env": "FACES_API_KEY",
3498
+ "name": "api-key",
3499
+ "hasDynamicHelp": false,
3500
+ "multiple": false,
3501
+ "type": "option"
3502
+ }
3503
+ },
3504
+ "hasDynamicHelp": false,
3505
+ "hiddenAliases": [],
3506
+ "id": "face:unpublish",
3507
+ "pluginAlias": "faces-cli",
3508
+ "pluginName": "faces-cli",
3509
+ "pluginType": "core",
3510
+ "strict": true,
3511
+ "enableJsonFlag": true,
3512
+ "isESM": true,
3513
+ "relativePath": [
3514
+ "dist",
3515
+ "commands",
3516
+ "face",
3517
+ "unpublish.js"
3518
+ ]
3519
+ },
3520
+ "face:unshare": {
3521
+ "aliases": [],
3522
+ "args": {
3523
+ "alias": {
3524
+ "description": "Face alias",
3525
+ "name": "alias",
3526
+ "required": true
3527
+ }
3528
+ },
3529
+ "description": "Revoke access to a shared face. Takes effect immediately — there is no grace period.",
3530
+ "examples": [
3531
+ "<%= config.bin %> <%= command.id %> alice --from dana --yes",
3532
+ "<%= config.bin %> <%= command.id %> alice --all --yes"
3533
+ ],
3534
+ "flags": {
3535
+ "json": {
3536
+ "description": "Format output as json.",
3537
+ "helpGroup": "GLOBAL",
3538
+ "name": "json",
3539
+ "allowNo": false,
3540
+ "type": "boolean"
3541
+ },
3542
+ "base-url": {
3543
+ "description": "API base URL",
3544
+ "env": "FACES_BASE_URL",
3545
+ "name": "base-url",
3546
+ "hasDynamicHelp": false,
3547
+ "multiple": false,
3548
+ "type": "option"
3549
+ },
3550
+ "token": {
3551
+ "description": "JWT bearer token",
3552
+ "env": "FACES_TOKEN",
3553
+ "name": "token",
3554
+ "hasDynamicHelp": false,
3555
+ "multiple": false,
3556
+ "type": "option"
3557
+ },
3558
+ "api-key": {
3559
+ "description": "API key",
3560
+ "env": "FACES_API_KEY",
3561
+ "name": "api-key",
3562
+ "hasDynamicHelp": false,
3563
+ "multiple": false,
3564
+ "type": "option"
3565
+ },
3566
+ "from": {
3567
+ "description": "Account to revoke (repeatable)",
3568
+ "exclusive": [
3569
+ "all"
3570
+ ],
3571
+ "name": "from",
3572
+ "hasDynamicHelp": false,
3573
+ "multiple": true,
3574
+ "type": "option"
3575
+ },
3576
+ "all": {
3577
+ "description": "Revoke everyone",
3578
+ "exclusive": [
3579
+ "from"
3580
+ ],
3581
+ "name": "all",
3582
+ "allowNo": false,
3583
+ "type": "boolean"
3584
+ },
3585
+ "yes": {
3586
+ "description": "Skip confirmation",
3587
+ "name": "yes",
3588
+ "allowNo": false,
3589
+ "type": "boolean"
3590
+ }
3591
+ },
3592
+ "hasDynamicHelp": false,
3593
+ "hiddenAliases": [],
3594
+ "id": "face:unshare",
3595
+ "pluginAlias": "faces-cli",
3596
+ "pluginName": "faces-cli",
3597
+ "pluginType": "core",
3598
+ "strict": true,
3599
+ "enableJsonFlag": true,
3600
+ "isESM": true,
3601
+ "relativePath": [
3602
+ "dist",
3603
+ "commands",
3604
+ "face",
3605
+ "unshare.js"
3606
+ ]
3607
+ },
3608
+ "keys:create": {
3609
+ "aliases": [],
3610
+ "args": {},
3611
+ "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.",
3612
+ "flags": {
3613
+ "json": {
3614
+ "description": "Format output as json.",
3615
+ "helpGroup": "GLOBAL",
3616
+ "name": "json",
3617
+ "allowNo": false,
3618
+ "type": "boolean"
3619
+ },
3620
+ "base-url": {
3621
+ "description": "API base URL",
3622
+ "env": "FACES_BASE_URL",
3623
+ "name": "base-url",
3624
+ "hasDynamicHelp": false,
3625
+ "multiple": false,
3626
+ "type": "option"
3627
+ },
3628
+ "token": {
3629
+ "description": "JWT bearer token",
3630
+ "env": "FACES_TOKEN",
3631
+ "name": "token",
3632
+ "hasDynamicHelp": false,
3633
+ "multiple": false,
3634
+ "type": "option"
3635
+ },
3636
+ "api-key": {
3637
+ "description": "API key",
3638
+ "env": "FACES_API_KEY",
3639
+ "name": "api-key",
3640
+ "hasDynamicHelp": false,
3641
+ "multiple": false,
3642
+ "type": "option"
3643
+ },
3644
+ "name": {
3645
+ "description": "Key name/label",
3646
+ "name": "name",
3647
+ "required": true,
3648
+ "hasDynamicHelp": false,
3649
+ "multiple": false,
3650
+ "type": "option"
3651
+ },
3652
+ "expires-days": {
3653
+ "description": "Expiry in days (omit for no expiry)",
3654
+ "name": "expires-days",
3655
+ "hasDynamicHelp": false,
3656
+ "multiple": false,
3657
+ "type": "option"
3658
+ },
3659
+ "budget": {
3660
+ "description": "Spend budget in USD",
3661
+ "name": "budget",
3662
+ "hasDynamicHelp": false,
3663
+ "multiple": false,
3664
+ "type": "option"
3665
+ },
3666
+ "face": {
3667
+ "description": "Allowed face alias (repeatable)",
3668
+ "name": "face",
3669
+ "hasDynamicHelp": false,
3670
+ "multiple": true,
3671
+ "type": "option"
3672
+ },
3673
+ "model": {
3674
+ "description": "Allowed model name (repeatable)",
3675
+ "name": "model",
3676
+ "hasDynamicHelp": false,
3677
+ "multiple": true,
3678
+ "type": "option"
3679
+ },
3680
+ "save": {
3681
+ "description": "Save the new key to ~/.faces/config.json as api_key (default: true; use --no-save to skip)",
3682
+ "name": "save",
3683
+ "allowNo": true,
3684
+ "type": "boolean"
3685
+ }
3686
+ },
3687
+ "hasDynamicHelp": false,
3688
+ "hiddenAliases": [],
3689
+ "id": "keys:create",
3690
+ "pluginAlias": "faces-cli",
3691
+ "pluginName": "faces-cli",
3692
+ "pluginType": "core",
3693
+ "strict": true,
3694
+ "enableJsonFlag": true,
3695
+ "isESM": true,
3696
+ "relativePath": [
3697
+ "dist",
3698
+ "commands",
3699
+ "keys",
3700
+ "create.js"
3701
+ ]
3702
+ },
3703
+ "keys:list": {
3704
+ "aliases": [],
3705
+ "args": {},
3706
+ "description": "List all API keys (JWT required)",
3707
+ "flags": {
3708
+ "json": {
3709
+ "description": "Format output as json.",
3710
+ "helpGroup": "GLOBAL",
3711
+ "name": "json",
3712
+ "allowNo": false,
3713
+ "type": "boolean"
3714
+ },
3715
+ "base-url": {
3716
+ "description": "API base URL",
3717
+ "env": "FACES_BASE_URL",
3718
+ "name": "base-url",
3719
+ "hasDynamicHelp": false,
3720
+ "multiple": false,
3721
+ "type": "option"
3722
+ },
3723
+ "token": {
3724
+ "description": "JWT bearer token",
3725
+ "env": "FACES_TOKEN",
3726
+ "name": "token",
3727
+ "hasDynamicHelp": false,
3728
+ "multiple": false,
3729
+ "type": "option"
3730
+ },
3731
+ "api-key": {
3732
+ "description": "API key",
3733
+ "env": "FACES_API_KEY",
3734
+ "name": "api-key",
3735
+ "hasDynamicHelp": false,
3736
+ "multiple": false,
3737
+ "type": "option"
3738
+ }
3739
+ },
3740
+ "hasDynamicHelp": false,
3741
+ "hiddenAliases": [],
3742
+ "id": "keys:list",
3743
+ "pluginAlias": "faces-cli",
3744
+ "pluginName": "faces-cli",
3745
+ "pluginType": "core",
3746
+ "strict": true,
3747
+ "enableJsonFlag": true,
3748
+ "isESM": true,
3749
+ "relativePath": [
3750
+ "dist",
3751
+ "commands",
3752
+ "keys",
3753
+ "list.js"
3754
+ ]
3755
+ },
3756
+ "keys:revoke": {
3757
+ "aliases": [],
3758
+ "args": {
3759
+ "key_id": {
3760
+ "description": "Key ID",
3761
+ "name": "key_id",
3762
+ "required": true
3763
+ }
3764
+ },
3765
+ "description": "Revoke an API key (JWT required)",
3766
+ "flags": {
3767
+ "json": {
3768
+ "description": "Format output as json.",
3769
+ "helpGroup": "GLOBAL",
3770
+ "name": "json",
3771
+ "allowNo": false,
3772
+ "type": "boolean"
3773
+ },
3774
+ "base-url": {
3775
+ "description": "API base URL",
3776
+ "env": "FACES_BASE_URL",
3777
+ "name": "base-url",
3778
+ "hasDynamicHelp": false,
3779
+ "multiple": false,
3780
+ "type": "option"
3781
+ },
3782
+ "token": {
3783
+ "description": "JWT bearer token",
3784
+ "env": "FACES_TOKEN",
3785
+ "name": "token",
3786
+ "hasDynamicHelp": false,
3787
+ "multiple": false,
3788
+ "type": "option"
3789
+ },
3790
+ "api-key": {
3791
+ "description": "API key",
3792
+ "env": "FACES_API_KEY",
3793
+ "name": "api-key",
3794
+ "hasDynamicHelp": false,
3795
+ "multiple": false,
3796
+ "type": "option"
3797
+ },
3798
+ "yes": {
3799
+ "description": "Skip confirmation",
3800
+ "name": "yes",
3801
+ "allowNo": false,
3802
+ "type": "boolean"
3803
+ }
3804
+ },
3805
+ "hasDynamicHelp": false,
3806
+ "hiddenAliases": [],
3807
+ "id": "keys:revoke",
3808
+ "pluginAlias": "faces-cli",
3809
+ "pluginName": "faces-cli",
3810
+ "pluginType": "core",
3811
+ "strict": true,
3812
+ "enableJsonFlag": true,
3813
+ "isESM": true,
3814
+ "relativePath": [
3815
+ "dist",
3816
+ "commands",
3817
+ "keys",
3818
+ "revoke.js"
3819
+ ]
3820
+ },
3821
+ "keys:update": {
3822
+ "aliases": [],
3823
+ "args": {
3824
+ "key_id": {
3825
+ "description": "Key ID",
3826
+ "name": "key_id",
3827
+ "required": true
3828
+ }
3829
+ },
3830
+ "description": "Update API key metadata (JWT required)",
3831
+ "flags": {
3832
+ "json": {
3833
+ "description": "Format output as json.",
3834
+ "helpGroup": "GLOBAL",
3835
+ "name": "json",
3836
+ "allowNo": false,
3837
+ "type": "boolean"
3838
+ },
3839
+ "base-url": {
3840
+ "description": "API base URL",
3841
+ "env": "FACES_BASE_URL",
3842
+ "name": "base-url",
3843
+ "hasDynamicHelp": false,
3844
+ "multiple": false,
3845
+ "type": "option"
3846
+ },
3847
+ "token": {
3848
+ "description": "JWT bearer token",
3849
+ "env": "FACES_TOKEN",
3850
+ "name": "token",
3851
+ "hasDynamicHelp": false,
3852
+ "multiple": false,
3853
+ "type": "option"
3854
+ },
3855
+ "api-key": {
3856
+ "description": "API key",
3857
+ "env": "FACES_API_KEY",
3858
+ "name": "api-key",
3859
+ "hasDynamicHelp": false,
3860
+ "multiple": false,
3861
+ "type": "option"
3862
+ },
3863
+ "name": {
3864
+ "description": "New key name",
3865
+ "name": "name",
3866
+ "hasDynamicHelp": false,
3867
+ "multiple": false,
3868
+ "type": "option"
3869
+ },
3870
+ "budget": {
3871
+ "description": "New spend budget in USD",
3872
+ "name": "budget",
3873
+ "hasDynamicHelp": false,
3874
+ "multiple": false,
3875
+ "type": "option"
3876
+ },
3877
+ "reset-spent": {
3878
+ "description": "Reset spent amount to zero",
3879
+ "name": "reset-spent",
3476
3880
  "allowNo": false,
3477
3881
  "type": "boolean"
3478
3882
  }
3479
3883
  },
3480
3884
  "hasDynamicHelp": false,
3481
3885
  "hiddenAliases": [],
3482
- "id": "face:share",
3886
+ "id": "keys:update",
3483
3887
  "pluginAlias": "faces-cli",
3484
3888
  "pluginName": "faces-cli",
3485
3889
  "pluginType": "core",
@@ -3489,11 +3893,11 @@
3489
3893
  "relativePath": [
3490
3894
  "dist",
3491
3895
  "commands",
3492
- "face",
3493
- "share.js"
3896
+ "keys",
3897
+ "update.js"
3494
3898
  ]
3495
3899
  },
3496
- "face:sources": {
3900
+ "style:delete": {
3497
3901
  "aliases": [],
3498
3902
  "args": {
3499
3903
  "alias": {
@@ -3502,11 +3906,10 @@
3502
3906
  "required": true
3503
3907
  }
3504
3908
  },
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.",
3909
+ "description": "Delete a face's captured style. --scope map forgets the style and keeps the material it came from. --scope all deletes the uploaded material too, permanently. There is no default because the two differ by whether your material survives.",
3506
3910
  "examples": [
3507
- "<%= config.bin %> <%= command.id %> alice",
3508
- "<%= config.bin %> <%= command.id %> alice --type thread",
3509
- "<%= config.bin %> <%= command.id %> alice --json"
3911
+ "<%= config.bin %> <%= command.id %> alice --scope map",
3912
+ "<%= config.bin %> <%= command.id %> alice --scope all --yes"
3510
3913
  ],
3511
3914
  "flags": {
3512
3915
  "json": {
@@ -3540,21 +3943,28 @@
3540
3943
  "multiple": false,
3541
3944
  "type": "option"
3542
3945
  },
3543
- "type": {
3544
- "description": "Show only one kind of source",
3545
- "name": "type",
3946
+ "scope": {
3947
+ "description": "map: forget the style, keep the material. all: delete the material with it, permanently.",
3948
+ "name": "scope",
3949
+ "required": true,
3546
3950
  "hasDynamicHelp": false,
3547
3951
  "multiple": false,
3548
3952
  "options": [
3549
- "doc",
3550
- "thread"
3953
+ "map",
3954
+ "all"
3551
3955
  ],
3552
3956
  "type": "option"
3957
+ },
3958
+ "yes": {
3959
+ "description": "Skip confirmation",
3960
+ "name": "yes",
3961
+ "allowNo": false,
3962
+ "type": "boolean"
3553
3963
  }
3554
3964
  },
3555
3965
  "hasDynamicHelp": false,
3556
3966
  "hiddenAliases": [],
3557
- "id": "face:sources",
3967
+ "id": "style:delete",
3558
3968
  "pluginAlias": "faces-cli",
3559
3969
  "pluginName": "faces-cli",
3560
3970
  "pluginType": "core",
@@ -3564,14 +3974,26 @@
3564
3974
  "relativePath": [
3565
3975
  "dist",
3566
3976
  "commands",
3567
- "face",
3568
- "sources.js"
3977
+ "style",
3978
+ "delete.js"
3569
3979
  ]
3570
3980
  },
3571
- "face:stats": {
3981
+ "style:make": {
3572
3982
  "aliases": [],
3573
- "args": {},
3574
- "description": "Compile and chat stats for all owned faces",
3983
+ "args": {
3984
+ "alias": {
3985
+ "description": "Face alias",
3986
+ "name": "alias",
3987
+ "required": true
3988
+ }
3989
+ },
3990
+ "description": "Capture how a face writes, from its own material, and install it. This is style, not knowledge: compile teaches a face what it knows, style teaches it how it sounds. Name the sources to learn from with --source, or take everything ready with --all.",
3991
+ "examples": [
3992
+ "<%= config.bin %> <%= command.id %> alice --all",
3993
+ "<%= config.bin %> <%= command.id %> alice --source 1a2b3c4d --source 5e6f7a8b",
3994
+ "<%= config.bin %> <%= command.id %> alice --source 1a2b3c4d:essay",
3995
+ "<%= config.bin %> <%= command.id %> alice --all --medium essay --no-wait"
3996
+ ],
3575
3997
  "flags": {
3576
3998
  "json": {
3577
3999
  "description": "Format output as json.",
@@ -3603,11 +4025,71 @@
3603
4025
  "hasDynamicHelp": false,
3604
4026
  "multiple": false,
3605
4027
  "type": "option"
4028
+ },
4029
+ "source": {
4030
+ "description": "A document or thread to learn from, by id (repeatable). Append :<medium> to declare what it is, e.g. --source 1a2b3c4d:essay, when the source does not already say.",
4031
+ "name": "source",
4032
+ "hasDynamicHelp": false,
4033
+ "multiple": true,
4034
+ "type": "option"
4035
+ },
4036
+ "all": {
4037
+ "description": "Use every source on the face that is ready. Anything skipped is listed.",
4038
+ "name": "all",
4039
+ "allowNo": false,
4040
+ "type": "boolean"
4041
+ },
4042
+ "medium": {
4043
+ "description": "Medium for any selected source that does not declare one. Each medium is analysed on its own, so an essay never teaches a rule about email.",
4044
+ "name": "medium",
4045
+ "hasDynamicHelp": false,
4046
+ "multiple": false,
4047
+ "type": "option"
4048
+ },
4049
+ "model": {
4050
+ "description": "Analyst model (default: gpt-5.6-terra)",
4051
+ "name": "model",
4052
+ "hasDynamicHelp": false,
4053
+ "multiple": false,
4054
+ "type": "option"
4055
+ },
4056
+ "allow-paid": {
4057
+ "description": "Permit a build that bills. Without this a build is free or it does not run. Needed for any model outside the free tier, and to allow the paid route when a free quota is exhausted.",
4058
+ "name": "allow-paid",
4059
+ "allowNo": false,
4060
+ "type": "boolean"
4061
+ },
4062
+ "compile": {
4063
+ "description": "Compile any named source that is not compiled yet, before capturing style. On by default. --no-compile captures style from what is already compiled and never bills for compilation.",
4064
+ "name": "compile",
4065
+ "allowNo": true,
4066
+ "type": "boolean"
4067
+ },
4068
+ "best-of": {
4069
+ "description": "Generate N candidates and keep the best (1-5, default 1)",
4070
+ "name": "best-of",
4071
+ "hasDynamicHelp": false,
4072
+ "multiple": false,
4073
+ "type": "option"
4074
+ },
4075
+ "no-wait": {
4076
+ "description": "Start the build and return the job id without polling.",
4077
+ "name": "no-wait",
4078
+ "allowNo": false,
4079
+ "type": "boolean"
4080
+ },
4081
+ "timeout": {
4082
+ "description": "How long to wait, in seconds (default: 3600)",
4083
+ "name": "timeout",
4084
+ "default": 3600,
4085
+ "hasDynamicHelp": false,
4086
+ "multiple": false,
4087
+ "type": "option"
3606
4088
  }
3607
4089
  },
3608
4090
  "hasDynamicHelp": false,
3609
4091
  "hiddenAliases": [],
3610
- "id": "face:stats",
4092
+ "id": "style:make",
3611
4093
  "pluginAlias": "faces-cli",
3612
4094
  "pluginName": "faces-cli",
3613
4095
  "pluginType": "core",
@@ -3617,11 +4099,11 @@
3617
4099
  "relativePath": [
3618
4100
  "dist",
3619
4101
  "commands",
3620
- "face",
3621
- "stats.js"
4102
+ "style",
4103
+ "make.js"
3622
4104
  ]
3623
4105
  },
3624
- "face:teams": {
4106
+ "style:revert": {
3625
4107
  "aliases": [],
3626
4108
  "args": {
3627
4109
  "alias": {
@@ -3630,7 +4112,10 @@
3630
4112
  "required": true
3631
4113
  }
3632
4114
  },
3633
- "description": "Set a face's team memberships (replaces all)",
4115
+ "description": "Go back to the style a face had before the last style:make. It steps backwards through the kept versions and there is no step forward, so the way to undo a revert is to capture the style again. It changes how the face writes immediately, so it asks first.",
4116
+ "examples": [
4117
+ "<%= config.bin %> <%= command.id %> alice --yes"
4118
+ ],
3634
4119
  "flags": {
3635
4120
  "json": {
3636
4121
  "description": "Format output as json.",
@@ -3663,18 +4148,16 @@
3663
4148
  "multiple": false,
3664
4149
  "type": "option"
3665
4150
  },
3666
- "team": {
3667
- "description": "Team ID (repeatable, replaces all memberships)",
3668
- "name": "team",
3669
- "required": true,
3670
- "hasDynamicHelp": false,
3671
- "multiple": true,
3672
- "type": "option"
4151
+ "yes": {
4152
+ "description": "Skip confirmation",
4153
+ "name": "yes",
4154
+ "allowNo": false,
4155
+ "type": "boolean"
3673
4156
  }
3674
4157
  },
3675
4158
  "hasDynamicHelp": false,
3676
4159
  "hiddenAliases": [],
3677
- "id": "face:teams",
4160
+ "id": "style:revert",
3678
4161
  "pluginAlias": "faces-cli",
3679
4162
  "pluginName": "faces-cli",
3680
4163
  "pluginType": "core",
@@ -3684,22 +4167,24 @@
3684
4167
  "relativePath": [
3685
4168
  "dist",
3686
4169
  "commands",
3687
- "face",
3688
- "teams.js"
4170
+ "style",
4171
+ "revert.js"
3689
4172
  ]
3690
4173
  },
3691
- "face:unlock": {
4174
+ "style:status": {
3692
4175
  "aliases": [],
3693
4176
  "args": {
3694
- "face_id": {
3695
- "description": "Face alias",
3696
- "name": "face_id",
3697
- "required": true
4177
+ "job_id": {
4178
+ "description": "Build job id",
4179
+ "name": "job_id",
4180
+ "required": false
3698
4181
  }
3699
4182
  },
3700
- "description": "Unlock a face (make it writable again). Thaws the face and everything it owns (documents, threads, voiceprint).",
4183
+ "description": "Read a style build. Give a job id for one build, or --face to list a face's recent builds. Listing is how you find a job id you no longer have.",
3701
4184
  "examples": [
3702
- "<%= config.bin %> <%= command.id %> socrates"
4185
+ "<%= config.bin %> <%= command.id %> 7a8b9c0d",
4186
+ "<%= config.bin %> <%= command.id %> --face alice",
4187
+ "<%= config.bin %> <%= command.id %> 7a8b9c0d --wait"
3703
4188
  ],
3704
4189
  "flags": {
3705
4190
  "json": {
@@ -3732,11 +4217,40 @@
3732
4217
  "hasDynamicHelp": false,
3733
4218
  "multiple": false,
3734
4219
  "type": "option"
4220
+ },
4221
+ "face": {
4222
+ "description": "List recent builds for this face instead of reading one job",
4223
+ "name": "face",
4224
+ "hasDynamicHelp": false,
4225
+ "multiple": false,
4226
+ "type": "option"
4227
+ },
4228
+ "limit": {
4229
+ "description": "How many builds to list with --face (default: 10)",
4230
+ "name": "limit",
4231
+ "default": 10,
4232
+ "hasDynamicHelp": false,
4233
+ "multiple": false,
4234
+ "type": "option"
4235
+ },
4236
+ "wait": {
4237
+ "description": "Block until the job finishes",
4238
+ "name": "wait",
4239
+ "allowNo": false,
4240
+ "type": "boolean"
4241
+ },
4242
+ "timeout": {
4243
+ "description": "How long to wait with --wait, in seconds (default: 3600)",
4244
+ "name": "timeout",
4245
+ "default": 3600,
4246
+ "hasDynamicHelp": false,
4247
+ "multiple": false,
4248
+ "type": "option"
3735
4249
  }
3736
4250
  },
3737
4251
  "hasDynamicHelp": false,
3738
4252
  "hiddenAliases": [],
3739
- "id": "face:unlock",
4253
+ "id": "style:status",
3740
4254
  "pluginAlias": "faces-cli",
3741
4255
  "pluginName": "faces-cli",
3742
4256
  "pluginType": "core",
@@ -3746,20 +4260,30 @@
3746
4260
  "relativePath": [
3747
4261
  "dist",
3748
4262
  "commands",
3749
- "face",
3750
- "unlock.js"
4263
+ "style",
4264
+ "status.js"
3751
4265
  ]
3752
4266
  },
3753
- "face:unpublish": {
4267
+ "style:upload": {
3754
4268
  "aliases": [],
3755
4269
  "args": {
3756
4270
  "alias": {
3757
4271
  "description": "Face alias",
3758
4272
  "name": "alias",
3759
4273
  "required": true
4274
+ },
4275
+ "file": {
4276
+ "description": "Corpus file",
4277
+ "name": "file",
4278
+ "required": true
3760
4279
  }
3761
4280
  },
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.",
4281
+ "description": "Load a corpus of a person's own writing (a mail export, a message archive) as source material for style capture. This only stores the material: nothing is compiled and nothing is billed. Capture the style afterwards with style:make.",
4282
+ "examples": [
4283
+ "<%= config.bin %> <%= command.id %> alice ./mail.jsonl",
4284
+ "<%= config.bin %> <%= command.id %> alice ./thread.json --type thread_json",
4285
+ "<%= config.bin %> <%= command.id %> alice ./mail.jsonl --messages-per-room 100 --strict"
4286
+ ],
3763
4287
  "flags": {
3764
4288
  "json": {
3765
4289
  "description": "Format output as json.",
@@ -3791,11 +4315,37 @@
3791
4315
  "hasDynamicHelp": false,
3792
4316
  "multiple": false,
3793
4317
  "type": "option"
4318
+ },
4319
+ "type": {
4320
+ "description": "email_jsonl: one message per line, split across several rooms. thread_json: a JSON array that becomes a single room.",
4321
+ "name": "type",
4322
+ "default": "email_jsonl",
4323
+ "hasDynamicHelp": false,
4324
+ "multiple": false,
4325
+ "options": [
4326
+ "email_jsonl",
4327
+ "thread_json"
4328
+ ],
4329
+ "type": "option"
4330
+ },
4331
+ "messages-per-room": {
4332
+ "description": "How many messages per room when the type is email_jsonl (1-1000, default: 50)",
4333
+ "name": "messages-per-room",
4334
+ "default": 50,
4335
+ "hasDynamicHelp": false,
4336
+ "multiple": false,
4337
+ "type": "option"
4338
+ },
4339
+ "strict": {
4340
+ "description": "Reject the whole upload if any message is invalid. By default invalid messages are skipped and reported, because a corpus is statistical and a few bad lines are not worth losing the rest.",
4341
+ "name": "strict",
4342
+ "allowNo": false,
4343
+ "type": "boolean"
3794
4344
  }
3795
4345
  },
3796
4346
  "hasDynamicHelp": false,
3797
4347
  "hiddenAliases": [],
3798
- "id": "face:unpublish",
4348
+ "id": "style:upload",
3799
4349
  "pluginAlias": "faces-cli",
3800
4350
  "pluginName": "faces-cli",
3801
4351
  "pluginType": "core",
@@ -3805,11 +4355,11 @@
3805
4355
  "relativePath": [
3806
4356
  "dist",
3807
4357
  "commands",
3808
- "face",
3809
- "unpublish.js"
4358
+ "style",
4359
+ "upload.js"
3810
4360
  ]
3811
4361
  },
3812
- "face:unshare": {
4362
+ "style:versions": {
3813
4363
  "aliases": [],
3814
4364
  "args": {
3815
4365
  "alias": {
@@ -3818,10 +4368,10 @@
3818
4368
  "required": true
3819
4369
  }
3820
4370
  },
3821
- "description": "Revoke access to a shared face. Takes effect immediately there is no grace period.",
4371
+ "description": "List the styles captured for a face, and which one it is writing in now. Each style:make keeps the previous one, so this is what style:revert has to go back to.",
3822
4372
  "examples": [
3823
- "<%= config.bin %> <%= command.id %> alice --from dana --yes",
3824
- "<%= config.bin %> <%= command.id %> alice --all --yes"
4373
+ "<%= config.bin %> <%= command.id %> alice",
4374
+ "<%= config.bin %> <%= command.id %> alice --json"
3825
4375
  ],
3826
4376
  "flags": {
3827
4377
  "json": {
@@ -3854,36 +4404,11 @@
3854
4404
  "hasDynamicHelp": false,
3855
4405
  "multiple": false,
3856
4406
  "type": "option"
3857
- },
3858
- "from": {
3859
- "description": "Account to revoke (repeatable)",
3860
- "exclusive": [
3861
- "all"
3862
- ],
3863
- "name": "from",
3864
- "hasDynamicHelp": false,
3865
- "multiple": true,
3866
- "type": "option"
3867
- },
3868
- "all": {
3869
- "description": "Revoke everyone",
3870
- "exclusive": [
3871
- "from"
3872
- ],
3873
- "name": "all",
3874
- "allowNo": false,
3875
- "type": "boolean"
3876
- },
3877
- "yes": {
3878
- "description": "Skip confirmation",
3879
- "name": "yes",
3880
- "allowNo": false,
3881
- "type": "boolean"
3882
4407
  }
3883
4408
  },
3884
4409
  "hasDynamicHelp": false,
3885
4410
  "hiddenAliases": [],
3886
- "id": "face:unshare",
4411
+ "id": "style:versions",
3887
4412
  "pluginAlias": "faces-cli",
3888
4413
  "pluginName": "faces-cli",
3889
4414
  "pluginType": "core",
@@ -3893,8 +4418,8 @@
3893
4418
  "relativePath": [
3894
4419
  "dist",
3895
4420
  "commands",
3896
- "face",
3897
- "unshare.js"
4421
+ "style",
4422
+ "versions.js"
3898
4423
  ]
3899
4424
  },
3900
4425
  "team:add": {
@@ -5339,16 +5864,16 @@
5339
5864
  "reset.js"
5340
5865
  ]
5341
5866
  },
5342
- "compile:thread:create": {
5867
+ "face:tag:add": {
5343
5868
  "aliases": [],
5344
5869
  "args": {
5345
- "face_id": {
5870
+ "alias": {
5346
5871
  "description": "Face alias",
5347
- "name": "face_id",
5872
+ "name": "alias",
5348
5873
  "required": true
5349
5874
  }
5350
5875
  },
5351
- "description": "Start a new thread for a face",
5876
+ "description": "Add tags to a face (appends, idempotent)",
5352
5877
  "flags": {
5353
5878
  "json": {
5354
5879
  "description": "Format output as json.",
@@ -5381,23 +5906,18 @@
5381
5906
  "multiple": false,
5382
5907
  "type": "option"
5383
5908
  },
5384
- "label": {
5385
- "description": "Thread label",
5386
- "name": "label",
5909
+ "tag": {
5910
+ "description": "Tag to add (repeatable)",
5911
+ "name": "tag",
5912
+ "required": true,
5387
5913
  "hasDynamicHelp": false,
5388
- "multiple": false,
5914
+ "multiple": true,
5389
5915
  "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"
5396
5916
  }
5397
5917
  },
5398
5918
  "hasDynamicHelp": false,
5399
5919
  "hiddenAliases": [],
5400
- "id": "compile:thread:create",
5920
+ "id": "face:tag:add",
5401
5921
  "pluginAlias": "faces-cli",
5402
5922
  "pluginName": "faces-cli",
5403
5923
  "pluginType": "core",
@@ -5407,21 +5927,15 @@
5407
5927
  "relativePath": [
5408
5928
  "dist",
5409
5929
  "commands",
5410
- "compile",
5411
- "thread",
5412
- "create.js"
5930
+ "face",
5931
+ "tag",
5932
+ "add.js"
5413
5933
  ]
5414
5934
  },
5415
- "compile:thread:delete": {
5935
+ "face:tag:all": {
5416
5936
  "aliases": [],
5417
- "args": {
5418
- "thread_id": {
5419
- "description": "Thread ID",
5420
- "name": "thread_id",
5421
- "required": true
5422
- }
5423
- },
5424
- "description": "Delete a thread",
5937
+ "args": {},
5938
+ "description": "List all tags across all your faces",
5425
5939
  "flags": {
5426
5940
  "json": {
5427
5941
  "description": "Format output as json.",
@@ -5453,17 +5967,11 @@
5453
5967
  "hasDynamicHelp": false,
5454
5968
  "multiple": false,
5455
5969
  "type": "option"
5456
- },
5457
- "yes": {
5458
- "description": "Skip confirmation",
5459
- "name": "yes",
5460
- "allowNo": false,
5461
- "type": "boolean"
5462
5970
  }
5463
5971
  },
5464
5972
  "hasDynamicHelp": false,
5465
5973
  "hiddenAliases": [],
5466
- "id": "compile:thread:delete",
5974
+ "id": "face:tag:all",
5467
5975
  "pluginAlias": "faces-cli",
5468
5976
  "pluginName": "faces-cli",
5469
5977
  "pluginType": "core",
@@ -5473,21 +5981,21 @@
5473
5981
  "relativePath": [
5474
5982
  "dist",
5475
5983
  "commands",
5476
- "compile",
5477
- "thread",
5478
- "delete.js"
5984
+ "face",
5985
+ "tag",
5986
+ "all.js"
5479
5987
  ]
5480
5988
  },
5481
- "compile:thread:edit": {
5989
+ "face:tag:list": {
5482
5990
  "aliases": [],
5483
5991
  "args": {
5484
- "thread_id": {
5485
- "description": "Thread ID",
5486
- "name": "thread_id",
5992
+ "alias": {
5993
+ "description": "Face alias",
5994
+ "name": "alias",
5487
5995
  "required": true
5488
5996
  }
5489
5997
  },
5490
- "description": "Edit a thread (label and/or reassign face speaker)",
5998
+ "description": "List tags on a face",
5491
5999
  "flags": {
5492
6000
  "json": {
5493
6001
  "description": "Format output as json.",
@@ -5519,25 +6027,11 @@
5519
6027
  "hasDynamicHelp": false,
5520
6028
  "multiple": false,
5521
6029
  "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"
5536
6030
  }
5537
6031
  },
5538
6032
  "hasDynamicHelp": false,
5539
6033
  "hiddenAliases": [],
5540
- "id": "compile:thread:edit",
6034
+ "id": "face:tag:list",
5541
6035
  "pluginAlias": "faces-cli",
5542
6036
  "pluginName": "faces-cli",
5543
6037
  "pluginType": "core",
@@ -5547,21 +6041,26 @@
5547
6041
  "relativePath": [
5548
6042
  "dist",
5549
6043
  "commands",
5550
- "compile",
5551
- "thread",
5552
- "edit.js"
6044
+ "face",
6045
+ "tag",
6046
+ "list.js"
5553
6047
  ]
5554
6048
  },
5555
- "compile:thread:get": {
6049
+ "face:tag:remove": {
5556
6050
  "aliases": [],
5557
6051
  "args": {
5558
- "thread_id": {
5559
- "description": "Thread ID",
5560
- "name": "thread_id",
6052
+ "alias": {
6053
+ "description": "Face alias",
6054
+ "name": "alias",
6055
+ "required": true
6056
+ },
6057
+ "tag": {
6058
+ "description": "Tag to remove",
6059
+ "name": "tag",
5561
6060
  "required": true
5562
6061
  }
5563
6062
  },
5564
- "description": "Get a thread by ID",
6063
+ "description": "Remove a tag from a face",
5565
6064
  "flags": {
5566
6065
  "json": {
5567
6066
  "description": "Format output as json.",
@@ -5597,7 +6096,7 @@
5597
6096
  },
5598
6097
  "hasDynamicHelp": false,
5599
6098
  "hiddenAliases": [],
5600
- "id": "compile:thread:get",
6099
+ "id": "face:tag:remove",
5601
6100
  "pluginAlias": "faces-cli",
5602
6101
  "pluginName": "faces-cli",
5603
6102
  "pluginType": "core",
@@ -5607,21 +6106,21 @@
5607
6106
  "relativePath": [
5608
6107
  "dist",
5609
6108
  "commands",
5610
- "compile",
5611
- "thread",
5612
- "get.js"
6109
+ "face",
6110
+ "tag",
6111
+ "remove.js"
5613
6112
  ]
5614
6113
  },
5615
- "compile:thread:list": {
6114
+ "face:tag:set": {
5616
6115
  "aliases": [],
5617
6116
  "args": {
5618
- "face_id": {
6117
+ "alias": {
5619
6118
  "description": "Face alias",
5620
- "name": "face_id",
6119
+ "name": "alias",
5621
6120
  "required": true
5622
6121
  }
5623
6122
  },
5624
- "description": "List threads for a face",
6123
+ "description": "Replace all tags on a face",
5625
6124
  "flags": {
5626
6125
  "json": {
5627
6126
  "description": "Format output as json.",
@@ -5653,11 +6152,19 @@
5653
6152
  "hasDynamicHelp": false,
5654
6153
  "multiple": false,
5655
6154
  "type": "option"
6155
+ },
6156
+ "tag": {
6157
+ "description": "Tag to set (repeatable, replaces all)",
6158
+ "name": "tag",
6159
+ "required": true,
6160
+ "hasDynamicHelp": false,
6161
+ "multiple": true,
6162
+ "type": "option"
5656
6163
  }
5657
6164
  },
5658
6165
  "hasDynamicHelp": false,
5659
6166
  "hiddenAliases": [],
5660
- "id": "compile:thread:list",
6167
+ "id": "face:tag:set",
5661
6168
  "pluginAlias": "faces-cli",
5662
6169
  "pluginName": "faces-cli",
5663
6170
  "pluginType": "core",
@@ -5667,21 +6174,21 @@
5667
6174
  "relativePath": [
5668
6175
  "dist",
5669
6176
  "commands",
5670
- "compile",
5671
- "thread",
5672
- "list.js"
6177
+ "face",
6178
+ "tag",
6179
+ "set.js"
5673
6180
  ]
5674
6181
  },
5675
- "compile:thread:make": {
6182
+ "team:tag:add": {
5676
6183
  "aliases": [],
5677
6184
  "args": {
5678
- "thread_id": {
5679
- "description": "Thread ID",
5680
- "name": "thread_id",
6185
+ "team_id": {
6186
+ "description": "Team ID",
6187
+ "name": "team_id",
5681
6188
  "required": true
5682
6189
  }
5683
6190
  },
5684
- "description": "Compile an existing thread (prepare + sync in one step)",
6191
+ "description": "Add tags to a team (appends, idempotent)",
5685
6192
  "flags": {
5686
6193
  "json": {
5687
6194
  "description": "Format output as json.",
@@ -5714,24 +6221,18 @@
5714
6221
  "multiple": false,
5715
6222
  "type": "option"
5716
6223
  },
5717
- "timeout": {
5718
- "description": "Compile timeout in seconds (default: 600)",
5719
- "name": "timeout",
5720
- "default": 600,
6224
+ "tag": {
6225
+ "description": "Tag to add (repeatable)",
6226
+ "name": "tag",
6227
+ "required": true,
5721
6228
  "hasDynamicHelp": false,
5722
- "multiple": false,
6229
+ "multiple": true,
5723
6230
  "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"
5730
6231
  }
5731
6232
  },
5732
6233
  "hasDynamicHelp": false,
5733
6234
  "hiddenAliases": [],
5734
- "id": "compile:thread:make",
6235
+ "id": "team:tag:add",
5735
6236
  "pluginAlias": "faces-cli",
5736
6237
  "pluginName": "faces-cli",
5737
6238
  "pluginType": "core",
@@ -5741,21 +6242,21 @@
5741
6242
  "relativePath": [
5742
6243
  "dist",
5743
6244
  "commands",
5744
- "compile",
5745
- "thread",
5746
- "make.js"
6245
+ "team",
6246
+ "tag",
6247
+ "add.js"
5747
6248
  ]
5748
6249
  },
5749
- "compile:thread:message": {
6250
+ "team:tag:list": {
5750
6251
  "aliases": [],
5751
6252
  "args": {
5752
- "thread_id": {
5753
- "description": "Thread ID",
5754
- "name": "thread_id",
6253
+ "team_id": {
6254
+ "description": "Team ID",
6255
+ "name": "team_id",
5755
6256
  "required": true
5756
6257
  }
5757
6258
  },
5758
- "description": "Send a user message to a thread",
6259
+ "description": "List tags on a team",
5759
6260
  "flags": {
5760
6261
  "json": {
5761
6262
  "description": "Format output as json.",
@@ -5787,26 +6288,11 @@
5787
6288
  "hasDynamicHelp": false,
5788
6289
  "multiple": false,
5789
6290
  "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"
5805
6291
  }
5806
6292
  },
5807
6293
  "hasDynamicHelp": false,
5808
6294
  "hiddenAliases": [],
5809
- "id": "compile:thread:message",
6295
+ "id": "team:tag:list",
5810
6296
  "pluginAlias": "faces-cli",
5811
6297
  "pluginName": "faces-cli",
5812
6298
  "pluginType": "core",
@@ -5816,21 +6302,26 @@
5816
6302
  "relativePath": [
5817
6303
  "dist",
5818
6304
  "commands",
5819
- "compile",
5820
- "thread",
5821
- "message.js"
6305
+ "team",
6306
+ "tag",
6307
+ "list.js"
5822
6308
  ]
5823
6309
  },
5824
- "compile:thread:pause": {
6310
+ "team:tag:remove": {
5825
6311
  "aliases": [],
5826
6312
  "args": {
5827
- "thread_id": {
5828
- "description": "Thread ID",
5829
- "name": "thread_id",
6313
+ "team_id": {
6314
+ "description": "Team ID",
6315
+ "name": "team_id",
6316
+ "required": true
6317
+ },
6318
+ "tag": {
6319
+ "description": "Tag to remove",
6320
+ "name": "tag",
5830
6321
  "required": true
5831
6322
  }
5832
6323
  },
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.",
6324
+ "description": "Remove a tag from a team",
5834
6325
  "flags": {
5835
6326
  "json": {
5836
6327
  "description": "Format output as json.",
@@ -5862,25 +6353,11 @@
5862
6353
  "hasDynamicHelp": false,
5863
6354
  "multiple": false,
5864
6355
  "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"
5879
6356
  }
5880
6357
  },
5881
6358
  "hasDynamicHelp": false,
5882
6359
  "hiddenAliases": [],
5883
- "id": "compile:thread:pause",
6360
+ "id": "team:tag:remove",
5884
6361
  "pluginAlias": "faces-cli",
5885
6362
  "pluginName": "faces-cli",
5886
6363
  "pluginType": "core",
@@ -5890,21 +6367,21 @@
5890
6367
  "relativePath": [
5891
6368
  "dist",
5892
6369
  "commands",
5893
- "compile",
5894
- "thread",
5895
- "pause.js"
6370
+ "team",
6371
+ "tag",
6372
+ "remove.js"
5896
6373
  ]
5897
6374
  },
5898
- "compile:thread:reset": {
6375
+ "team:tag:set": {
5899
6376
  "aliases": [],
5900
6377
  "args": {
5901
- "thread_id": {
5902
- "description": "Thread ID",
5903
- "name": "thread_id",
6378
+ "team_id": {
6379
+ "description": "Team ID",
6380
+ "name": "team_id",
5904
6381
  "required": true
5905
6382
  }
5906
6383
  },
5907
- "description": "Reset thread compilation progress (wipe extraction, keep source messages)",
6384
+ "description": "Replace all tags on a team",
5908
6385
  "flags": {
5909
6386
  "json": {
5910
6387
  "description": "Format output as json.",
@@ -5937,16 +6414,18 @@
5937
6414
  "multiple": false,
5938
6415
  "type": "option"
5939
6416
  },
5940
- "yes": {
5941
- "description": "Skip confirmation",
5942
- "name": "yes",
5943
- "allowNo": false,
5944
- "type": "boolean"
6417
+ "tag": {
6418
+ "description": "Tag to set (repeatable, replaces all)",
6419
+ "name": "tag",
6420
+ "required": true,
6421
+ "hasDynamicHelp": false,
6422
+ "multiple": true,
6423
+ "type": "option"
5945
6424
  }
5946
6425
  },
5947
6426
  "hasDynamicHelp": false,
5948
6427
  "hiddenAliases": [],
5949
- "id": "compile:thread:reset",
6428
+ "id": "team:tag:set",
5950
6429
  "pluginAlias": "faces-cli",
5951
6430
  "pluginName": "faces-cli",
5952
6431
  "pluginType": "core",
@@ -5956,21 +6435,21 @@
5956
6435
  "relativePath": [
5957
6436
  "dist",
5958
6437
  "commands",
5959
- "compile",
5960
- "thread",
5961
- "reset.js"
6438
+ "team",
6439
+ "tag",
6440
+ "set.js"
5962
6441
  ]
5963
6442
  },
5964
- "compile:thread:sync": {
6443
+ "compile:thread:create": {
5965
6444
  "aliases": [],
5966
6445
  "args": {
5967
- "thread_id": {
5968
- "description": "Thread ID",
5969
- "name": "thread_id",
6446
+ "face_id": {
6447
+ "description": "Face alias",
6448
+ "name": "face_id",
5970
6449
  "required": true
5971
6450
  }
5972
6451
  },
5973
- "description": "Archive and sync a thread into a face",
6452
+ "description": "Start a new thread for a face",
5974
6453
  "flags": {
5975
6454
  "json": {
5976
6455
  "description": "Format output as json.",
@@ -6002,11 +6481,24 @@
6002
6481
  "hasDynamicHelp": false,
6003
6482
  "multiple": false,
6004
6483
  "type": "option"
6484
+ },
6485
+ "label": {
6486
+ "description": "Thread label",
6487
+ "name": "label",
6488
+ "hasDynamicHelp": false,
6489
+ "multiple": false,
6490
+ "type": "option"
6491
+ },
6492
+ "oauth-only": {
6493
+ "description": "Prevent fallback to paid system key (use OAuth only)",
6494
+ "name": "oauth-only",
6495
+ "allowNo": false,
6496
+ "type": "boolean"
6005
6497
  }
6006
6498
  },
6007
6499
  "hasDynamicHelp": false,
6008
6500
  "hiddenAliases": [],
6009
- "id": "compile:thread:sync",
6501
+ "id": "compile:thread:create",
6010
6502
  "pluginAlias": "faces-cli",
6011
6503
  "pluginName": "faces-cli",
6012
6504
  "pluginType": "core",
@@ -6018,19 +6510,19 @@
6018
6510
  "commands",
6019
6511
  "compile",
6020
6512
  "thread",
6021
- "sync.js"
6513
+ "create.js"
6022
6514
  ]
6023
6515
  },
6024
- "face:tag:add": {
6516
+ "compile:thread:delete": {
6025
6517
  "aliases": [],
6026
6518
  "args": {
6027
- "alias": {
6028
- "description": "Face alias",
6029
- "name": "alias",
6519
+ "thread_id": {
6520
+ "description": "Thread ID",
6521
+ "name": "thread_id",
6030
6522
  "required": true
6031
6523
  }
6032
6524
  },
6033
- "description": "Add tags to a face (appends, idempotent)",
6525
+ "description": "Delete a thread",
6034
6526
  "flags": {
6035
6527
  "json": {
6036
6528
  "description": "Format output as json.",
@@ -6063,18 +6555,16 @@
6063
6555
  "multiple": false,
6064
6556
  "type": "option"
6065
6557
  },
6066
- "tag": {
6067
- "description": "Tag to add (repeatable)",
6068
- "name": "tag",
6069
- "required": true,
6070
- "hasDynamicHelp": false,
6071
- "multiple": true,
6072
- "type": "option"
6558
+ "yes": {
6559
+ "description": "Skip confirmation",
6560
+ "name": "yes",
6561
+ "allowNo": false,
6562
+ "type": "boolean"
6073
6563
  }
6074
6564
  },
6075
6565
  "hasDynamicHelp": false,
6076
6566
  "hiddenAliases": [],
6077
- "id": "face:tag:add",
6567
+ "id": "compile:thread:delete",
6078
6568
  "pluginAlias": "faces-cli",
6079
6569
  "pluginName": "faces-cli",
6080
6570
  "pluginType": "core",
@@ -6084,15 +6574,21 @@
6084
6574
  "relativePath": [
6085
6575
  "dist",
6086
6576
  "commands",
6087
- "face",
6088
- "tag",
6089
- "add.js"
6577
+ "compile",
6578
+ "thread",
6579
+ "delete.js"
6090
6580
  ]
6091
6581
  },
6092
- "face:tag:all": {
6582
+ "compile:thread:edit": {
6093
6583
  "aliases": [],
6094
- "args": {},
6095
- "description": "List all tags across all your faces",
6584
+ "args": {
6585
+ "thread_id": {
6586
+ "description": "Thread ID",
6587
+ "name": "thread_id",
6588
+ "required": true
6589
+ }
6590
+ },
6591
+ "description": "Edit a thread (label and/or reassign face speaker)",
6096
6592
  "flags": {
6097
6593
  "json": {
6098
6594
  "description": "Format output as json.",
@@ -6124,11 +6620,25 @@
6124
6620
  "hasDynamicHelp": false,
6125
6621
  "multiple": false,
6126
6622
  "type": "option"
6623
+ },
6624
+ "label": {
6625
+ "description": "New thread label",
6626
+ "name": "label",
6627
+ "hasDynamicHelp": false,
6628
+ "multiple": false,
6629
+ "type": "option"
6630
+ },
6631
+ "face-speaker": {
6632
+ "description": "Reassign face speaker: set this speaker to role=user, all others to role=assistant",
6633
+ "name": "face-speaker",
6634
+ "hasDynamicHelp": false,
6635
+ "multiple": false,
6636
+ "type": "option"
6127
6637
  }
6128
6638
  },
6129
6639
  "hasDynamicHelp": false,
6130
6640
  "hiddenAliases": [],
6131
- "id": "face:tag:all",
6641
+ "id": "compile:thread:edit",
6132
6642
  "pluginAlias": "faces-cli",
6133
6643
  "pluginName": "faces-cli",
6134
6644
  "pluginType": "core",
@@ -6138,21 +6648,21 @@
6138
6648
  "relativePath": [
6139
6649
  "dist",
6140
6650
  "commands",
6141
- "face",
6142
- "tag",
6143
- "all.js"
6651
+ "compile",
6652
+ "thread",
6653
+ "edit.js"
6144
6654
  ]
6145
6655
  },
6146
- "face:tag:list": {
6656
+ "compile:thread:get": {
6147
6657
  "aliases": [],
6148
6658
  "args": {
6149
- "alias": {
6150
- "description": "Face alias",
6151
- "name": "alias",
6659
+ "thread_id": {
6660
+ "description": "Thread ID",
6661
+ "name": "thread_id",
6152
6662
  "required": true
6153
6663
  }
6154
6664
  },
6155
- "description": "List tags on a face",
6665
+ "description": "Get a thread by ID",
6156
6666
  "flags": {
6157
6667
  "json": {
6158
6668
  "description": "Format output as json.",
@@ -6188,7 +6698,7 @@
6188
6698
  },
6189
6699
  "hasDynamicHelp": false,
6190
6700
  "hiddenAliases": [],
6191
- "id": "face:tag:list",
6701
+ "id": "compile:thread:get",
6192
6702
  "pluginAlias": "faces-cli",
6193
6703
  "pluginName": "faces-cli",
6194
6704
  "pluginType": "core",
@@ -6198,26 +6708,21 @@
6198
6708
  "relativePath": [
6199
6709
  "dist",
6200
6710
  "commands",
6201
- "face",
6202
- "tag",
6203
- "list.js"
6711
+ "compile",
6712
+ "thread",
6713
+ "get.js"
6204
6714
  ]
6205
6715
  },
6206
- "face:tag:remove": {
6716
+ "compile:thread:list": {
6207
6717
  "aliases": [],
6208
6718
  "args": {
6209
- "alias": {
6719
+ "face_id": {
6210
6720
  "description": "Face alias",
6211
- "name": "alias",
6212
- "required": true
6213
- },
6214
- "tag": {
6215
- "description": "Tag to remove",
6216
- "name": "tag",
6721
+ "name": "face_id",
6217
6722
  "required": true
6218
6723
  }
6219
6724
  },
6220
- "description": "Remove a tag from a face",
6725
+ "description": "List threads for a face",
6221
6726
  "flags": {
6222
6727
  "json": {
6223
6728
  "description": "Format output as json.",
@@ -6253,7 +6758,7 @@
6253
6758
  },
6254
6759
  "hasDynamicHelp": false,
6255
6760
  "hiddenAliases": [],
6256
- "id": "face:tag:remove",
6761
+ "id": "compile:thread:list",
6257
6762
  "pluginAlias": "faces-cli",
6258
6763
  "pluginName": "faces-cli",
6259
6764
  "pluginType": "core",
@@ -6263,21 +6768,21 @@
6263
6768
  "relativePath": [
6264
6769
  "dist",
6265
6770
  "commands",
6266
- "face",
6267
- "tag",
6268
- "remove.js"
6771
+ "compile",
6772
+ "thread",
6773
+ "list.js"
6269
6774
  ]
6270
6775
  },
6271
- "face:tag:set": {
6776
+ "compile:thread:make": {
6272
6777
  "aliases": [],
6273
6778
  "args": {
6274
- "alias": {
6275
- "description": "Face alias",
6276
- "name": "alias",
6779
+ "thread_id": {
6780
+ "description": "Thread ID",
6781
+ "name": "thread_id",
6277
6782
  "required": true
6278
6783
  }
6279
6784
  },
6280
- "description": "Replace all tags on a face",
6785
+ "description": "Compile an existing thread (prepare + sync in one step)",
6281
6786
  "flags": {
6282
6787
  "json": {
6283
6788
  "description": "Format output as json.",
@@ -6310,18 +6815,24 @@
6310
6815
  "multiple": false,
6311
6816
  "type": "option"
6312
6817
  },
6313
- "tag": {
6314
- "description": "Tag to set (repeatable, replaces all)",
6315
- "name": "tag",
6316
- "required": true,
6818
+ "timeout": {
6819
+ "description": "Compile timeout in seconds (default: 600)",
6820
+ "name": "timeout",
6821
+ "default": 600,
6317
6822
  "hasDynamicHelp": false,
6318
- "multiple": true,
6823
+ "multiple": false,
6319
6824
  "type": "option"
6825
+ },
6826
+ "no-wait": {
6827
+ "description": "Return immediately after triggering compilation. Prints the thread ID for manual polling.",
6828
+ "name": "no-wait",
6829
+ "allowNo": false,
6830
+ "type": "boolean"
6320
6831
  }
6321
6832
  },
6322
6833
  "hasDynamicHelp": false,
6323
6834
  "hiddenAliases": [],
6324
- "id": "face:tag:set",
6835
+ "id": "compile:thread:make",
6325
6836
  "pluginAlias": "faces-cli",
6326
6837
  "pluginName": "faces-cli",
6327
6838
  "pluginType": "core",
@@ -6331,21 +6842,21 @@
6331
6842
  "relativePath": [
6332
6843
  "dist",
6333
6844
  "commands",
6334
- "face",
6335
- "tag",
6336
- "set.js"
6845
+ "compile",
6846
+ "thread",
6847
+ "make.js"
6337
6848
  ]
6338
6849
  },
6339
- "team:tag:add": {
6850
+ "compile:thread:message": {
6340
6851
  "aliases": [],
6341
6852
  "args": {
6342
- "team_id": {
6343
- "description": "Team ID",
6344
- "name": "team_id",
6853
+ "thread_id": {
6854
+ "description": "Thread ID",
6855
+ "name": "thread_id",
6345
6856
  "required": true
6346
6857
  }
6347
6858
  },
6348
- "description": "Add tags to a team (appends, idempotent)",
6859
+ "description": "Send a user message to a thread",
6349
6860
  "flags": {
6350
6861
  "json": {
6351
6862
  "description": "Format output as json.",
@@ -6378,18 +6889,25 @@
6378
6889
  "multiple": false,
6379
6890
  "type": "option"
6380
6891
  },
6381
- "tag": {
6382
- "description": "Tag to add (repeatable)",
6383
- "name": "tag",
6892
+ "message": {
6893
+ "char": "m",
6894
+ "description": "User message to append",
6895
+ "name": "message",
6384
6896
  "required": true,
6385
6897
  "hasDynamicHelp": false,
6386
- "multiple": true,
6898
+ "multiple": false,
6387
6899
  "type": "option"
6900
+ },
6901
+ "oauth-only": {
6902
+ "description": "Prevent fallback to paid system key (use OAuth only)",
6903
+ "name": "oauth-only",
6904
+ "allowNo": false,
6905
+ "type": "boolean"
6388
6906
  }
6389
6907
  },
6390
6908
  "hasDynamicHelp": false,
6391
6909
  "hiddenAliases": [],
6392
- "id": "team:tag:add",
6910
+ "id": "compile:thread:message",
6393
6911
  "pluginAlias": "faces-cli",
6394
6912
  "pluginName": "faces-cli",
6395
6913
  "pluginType": "core",
@@ -6399,21 +6917,21 @@
6399
6917
  "relativePath": [
6400
6918
  "dist",
6401
6919
  "commands",
6402
- "team",
6403
- "tag",
6404
- "add.js"
6920
+ "compile",
6921
+ "thread",
6922
+ "message.js"
6405
6923
  ]
6406
6924
  },
6407
- "team:tag:list": {
6925
+ "compile:thread:pause": {
6408
6926
  "aliases": [],
6409
6927
  "args": {
6410
- "team_id": {
6411
- "description": "Team ID",
6412
- "name": "team_id",
6928
+ "thread_id": {
6929
+ "description": "Thread ID",
6930
+ "name": "thread_id",
6413
6931
  "required": true
6414
6932
  }
6415
6933
  },
6416
- "description": "List tags on a team",
6934
+ "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.",
6417
6935
  "flags": {
6418
6936
  "json": {
6419
6937
  "description": "Format output as json.",
@@ -6445,11 +6963,25 @@
6445
6963
  "hasDynamicHelp": false,
6446
6964
  "multiple": false,
6447
6965
  "type": "option"
6966
+ },
6967
+ "no-wait": {
6968
+ "description": "Return as soon as the pause is accepted, without waiting for the compile to stop.",
6969
+ "name": "no-wait",
6970
+ "allowNo": false,
6971
+ "type": "boolean"
6972
+ },
6973
+ "timeout": {
6974
+ "description": "Seconds to wait for the compile to stop (default: 60)",
6975
+ "name": "timeout",
6976
+ "default": 60,
6977
+ "hasDynamicHelp": false,
6978
+ "multiple": false,
6979
+ "type": "option"
6448
6980
  }
6449
6981
  },
6450
6982
  "hasDynamicHelp": false,
6451
6983
  "hiddenAliases": [],
6452
- "id": "team:tag:list",
6984
+ "id": "compile:thread:pause",
6453
6985
  "pluginAlias": "faces-cli",
6454
6986
  "pluginName": "faces-cli",
6455
6987
  "pluginType": "core",
@@ -6459,26 +6991,21 @@
6459
6991
  "relativePath": [
6460
6992
  "dist",
6461
6993
  "commands",
6462
- "team",
6463
- "tag",
6464
- "list.js"
6994
+ "compile",
6995
+ "thread",
6996
+ "pause.js"
6465
6997
  ]
6466
6998
  },
6467
- "team:tag:remove": {
6999
+ "compile:thread:reset": {
6468
7000
  "aliases": [],
6469
7001
  "args": {
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",
7002
+ "thread_id": {
7003
+ "description": "Thread ID",
7004
+ "name": "thread_id",
6478
7005
  "required": true
6479
7006
  }
6480
7007
  },
6481
- "description": "Remove a tag from a team",
7008
+ "description": "Reset thread compilation progress (wipe extraction, keep source messages)",
6482
7009
  "flags": {
6483
7010
  "json": {
6484
7011
  "description": "Format output as json.",
@@ -6510,11 +7037,17 @@
6510
7037
  "hasDynamicHelp": false,
6511
7038
  "multiple": false,
6512
7039
  "type": "option"
7040
+ },
7041
+ "yes": {
7042
+ "description": "Skip confirmation",
7043
+ "name": "yes",
7044
+ "allowNo": false,
7045
+ "type": "boolean"
6513
7046
  }
6514
7047
  },
6515
7048
  "hasDynamicHelp": false,
6516
7049
  "hiddenAliases": [],
6517
- "id": "team:tag:remove",
7050
+ "id": "compile:thread:reset",
6518
7051
  "pluginAlias": "faces-cli",
6519
7052
  "pluginName": "faces-cli",
6520
7053
  "pluginType": "core",
@@ -6524,21 +7057,21 @@
6524
7057
  "relativePath": [
6525
7058
  "dist",
6526
7059
  "commands",
6527
- "team",
6528
- "tag",
6529
- "remove.js"
7060
+ "compile",
7061
+ "thread",
7062
+ "reset.js"
6530
7063
  ]
6531
7064
  },
6532
- "team:tag:set": {
7065
+ "compile:thread:sync": {
6533
7066
  "aliases": [],
6534
7067
  "args": {
6535
- "team_id": {
6536
- "description": "Team ID",
6537
- "name": "team_id",
7068
+ "thread_id": {
7069
+ "description": "Thread ID",
7070
+ "name": "thread_id",
6538
7071
  "required": true
6539
7072
  }
6540
7073
  },
6541
- "description": "Replace all tags on a team",
7074
+ "description": "Archive and sync a thread into a face",
6542
7075
  "flags": {
6543
7076
  "json": {
6544
7077
  "description": "Format output as json.",
@@ -6570,19 +7103,11 @@
6570
7103
  "hasDynamicHelp": false,
6571
7104
  "multiple": false,
6572
7105
  "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"
6581
7106
  }
6582
7107
  },
6583
7108
  "hasDynamicHelp": false,
6584
7109
  "hiddenAliases": [],
6585
- "id": "team:tag:set",
7110
+ "id": "compile:thread:sync",
6586
7111
  "pluginAlias": "faces-cli",
6587
7112
  "pluginName": "faces-cli",
6588
7113
  "pluginType": "core",
@@ -6592,11 +7117,11 @@
6592
7117
  "relativePath": [
6593
7118
  "dist",
6594
7119
  "commands",
6595
- "team",
6596
- "tag",
6597
- "set.js"
7120
+ "compile",
7121
+ "thread",
7122
+ "sync.js"
6598
7123
  ]
6599
7124
  }
6600
7125
  },
6601
- "version": "1.7.16"
7126
+ "version": "1.8.0"
6602
7127
  }