@outlit/cli 3.0.0 → 3.1.1

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 (2) hide show
  1. package/dist/cli.js +2846 -704
  2. package/package.json +2 -2
package/dist/cli.js CHANGED
@@ -104,7 +104,7 @@ var package_default;
104
104
  var init_package = __esm(() => {
105
105
  package_default = {
106
106
  name: "@outlit/cli",
107
- version: "3.0.0",
107
+ version: "3.1.1",
108
108
  description: "CLI for querying Outlit customer context and installing agent skills",
109
109
  license: "Apache-2.0",
110
110
  repository: {
@@ -147,7 +147,7 @@ var init_package = __esm(() => {
147
147
  },
148
148
  dependencies: {
149
149
  "@clack/prompts": "^1.0.1",
150
- "@outlit/tools": "^2.0.0",
150
+ "@outlit/tools": "^2.1.1",
151
151
  citty: "^0.2.1"
152
152
  },
153
153
  devDependencies: {
@@ -1722,6 +1722,7 @@ var init_dist4 = __esm(() => {
1722
1722
  "outlit_list_users",
1723
1723
  "outlit_list_workspace_users",
1724
1724
  "outlit_get_customer",
1725
+ "outlit_get_customer_relationship",
1725
1726
  "outlit_assign_customer_owner",
1726
1727
  "outlit_grant_customer_access",
1727
1728
  "outlit_update_customer_access",
@@ -1751,9 +1752,12 @@ var init_dist4 = __esm(() => {
1751
1752
  "outlit_update_customer_activation",
1752
1753
  "outlit_get_workspace_settings",
1753
1754
  "outlit_update_workspace_settings",
1754
- "outlit_list_behavior_metric_sources",
1755
- "outlit_list_behavior_metric_events",
1756
- "outlit_create_behavior_metric"
1755
+ "outlit_list_features",
1756
+ "outlit_create_feature",
1757
+ "outlit_archive_feature",
1758
+ "outlit_get_customer_features",
1759
+ "outlit_list_attention_items",
1760
+ "outlit_get_attention_item"
1757
1761
  ];
1758
1762
  publicToolContracts = {
1759
1763
  outlit_list_customers: {
@@ -2259,6 +2263,47 @@ var init_dist4 = __esm(() => {
2259
2263
  type: "null"
2260
2264
  }
2261
2265
  ]
2266
+ },
2267
+ relationshipRole: {
2268
+ anyOf: [
2269
+ {
2270
+ type: "string"
2271
+ },
2272
+ {
2273
+ type: "null"
2274
+ }
2275
+ ]
2276
+ },
2277
+ jobTitle: {
2278
+ anyOf: [
2279
+ {
2280
+ type: "string"
2281
+ },
2282
+ {
2283
+ type: "null"
2284
+ }
2285
+ ]
2286
+ },
2287
+ department: {
2288
+ anyOf: [
2289
+ {
2290
+ type: "string"
2291
+ },
2292
+ {
2293
+ type: "null"
2294
+ }
2295
+ ]
2296
+ },
2297
+ employmentStartDate: {
2298
+ anyOf: [
2299
+ {
2300
+ type: "string",
2301
+ pattern: "^\\d{4}-\\d{2}-\\d{2}$"
2302
+ },
2303
+ {
2304
+ type: "null"
2305
+ }
2306
+ ]
2262
2307
  }
2263
2308
  },
2264
2309
  required: [
@@ -2270,7 +2315,11 @@ var init_dist4 = __esm(() => {
2270
2315
  "customerDomain",
2271
2316
  "journeyStage",
2272
2317
  "lastActivityAt",
2273
- "daysSinceActivity"
2318
+ "daysSinceActivity",
2319
+ "relationshipRole",
2320
+ "jobTitle",
2321
+ "department",
2322
+ "employmentStartDate"
2274
2323
  ],
2275
2324
  additionalProperties: false
2276
2325
  }
@@ -2703,6 +2752,47 @@ var init_dist4 = __esm(() => {
2703
2752
  type: "null"
2704
2753
  }
2705
2754
  ]
2755
+ },
2756
+ relationshipRole: {
2757
+ anyOf: [
2758
+ {
2759
+ type: "string"
2760
+ },
2761
+ {
2762
+ type: "null"
2763
+ }
2764
+ ]
2765
+ },
2766
+ jobTitle: {
2767
+ anyOf: [
2768
+ {
2769
+ type: "string"
2770
+ },
2771
+ {
2772
+ type: "null"
2773
+ }
2774
+ ]
2775
+ },
2776
+ department: {
2777
+ anyOf: [
2778
+ {
2779
+ type: "string"
2780
+ },
2781
+ {
2782
+ type: "null"
2783
+ }
2784
+ ]
2785
+ },
2786
+ employmentStartDate: {
2787
+ anyOf: [
2788
+ {
2789
+ type: "string",
2790
+ pattern: "^\\d{4}-\\d{2}-\\d{2}$"
2791
+ },
2792
+ {
2793
+ type: "null"
2794
+ }
2795
+ ]
2706
2796
  }
2707
2797
  },
2708
2798
  required: [
@@ -2710,7 +2800,11 @@ var init_dist4 = __esm(() => {
2710
2800
  "email",
2711
2801
  "name",
2712
2802
  "journeyStage",
2713
- "lastActivityAt"
2803
+ "lastActivityAt",
2804
+ "relationshipRole",
2805
+ "jobTitle",
2806
+ "department",
2807
+ "employmentStartDate"
2714
2808
  ],
2715
2809
  additionalProperties: false
2716
2810
  }
@@ -3256,6 +3350,157 @@ var init_dist4 = __esm(() => {
3256
3350
  additionalProperties: false
3257
3351
  }
3258
3352
  },
3353
+ outlit_get_customer_relationship: {
3354
+ toolName: "outlit_get_customer_relationship",
3355
+ commandId: "customer.relationship.get",
3356
+ commandVersion: 1,
3357
+ ownerDomain: "customers",
3358
+ title: "Get Customer Relationship",
3359
+ description: "Get the bounded, evidence-backed relationship shown on a customer page. Returns a summary, categorized current statements with ISO observed-at timestamps when supported, source labels, and the compiled summary timestamp when available without raw facts, quotes, or internal status.",
3360
+ inputSchema: {
3361
+ $schema: "https://json-schema.org/draft/2020-12/schema",
3362
+ type: "object",
3363
+ properties: {
3364
+ customer: {
3365
+ type: "string",
3366
+ minLength: 1,
3367
+ maxLength: 500,
3368
+ description: "Customer ID, domain, or exact customer name to look up"
3369
+ }
3370
+ },
3371
+ required: [
3372
+ "customer"
3373
+ ],
3374
+ additionalProperties: false
3375
+ },
3376
+ outputSchema: {
3377
+ $schema: "https://json-schema.org/draft/2020-12/schema",
3378
+ type: "object",
3379
+ properties: {
3380
+ customer: {
3381
+ type: "object",
3382
+ properties: {
3383
+ id: {
3384
+ type: "string"
3385
+ },
3386
+ name: {
3387
+ anyOf: [
3388
+ {
3389
+ type: "string"
3390
+ },
3391
+ {
3392
+ type: "null"
3393
+ }
3394
+ ]
3395
+ },
3396
+ domain: {
3397
+ anyOf: [
3398
+ {
3399
+ type: "string"
3400
+ },
3401
+ {
3402
+ type: "null"
3403
+ }
3404
+ ]
3405
+ }
3406
+ },
3407
+ required: [
3408
+ "id",
3409
+ "name",
3410
+ "domain"
3411
+ ],
3412
+ additionalProperties: false
3413
+ },
3414
+ relationship: {
3415
+ type: "object",
3416
+ properties: {
3417
+ summary: {
3418
+ anyOf: [
3419
+ {
3420
+ type: "string",
3421
+ minLength: 1,
3422
+ maxLength: 240
3423
+ },
3424
+ {
3425
+ type: "null"
3426
+ }
3427
+ ]
3428
+ },
3429
+ items: {
3430
+ maxItems: 8,
3431
+ type: "array",
3432
+ items: {
3433
+ type: "object",
3434
+ properties: {
3435
+ category: {
3436
+ type: "string",
3437
+ minLength: 1,
3438
+ maxLength: 120
3439
+ },
3440
+ statement: {
3441
+ type: "string",
3442
+ minLength: 1,
3443
+ maxLength: 500
3444
+ },
3445
+ observedAt: {
3446
+ anyOf: [
3447
+ {
3448
+ type: "string",
3449
+ format: "date-time",
3450
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
3451
+ },
3452
+ {
3453
+ type: "null"
3454
+ }
3455
+ ]
3456
+ },
3457
+ sourceLabels: {
3458
+ maxItems: 4,
3459
+ type: "array",
3460
+ items: {
3461
+ type: "string",
3462
+ minLength: 1,
3463
+ maxLength: 100
3464
+ }
3465
+ }
3466
+ },
3467
+ required: [
3468
+ "category",
3469
+ "statement",
3470
+ "observedAt",
3471
+ "sourceLabels"
3472
+ ],
3473
+ additionalProperties: false
3474
+ }
3475
+ },
3476
+ updatedAt: {
3477
+ anyOf: [
3478
+ {
3479
+ type: "string",
3480
+ format: "date-time",
3481
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
3482
+ },
3483
+ {
3484
+ type: "null"
3485
+ }
3486
+ ]
3487
+ }
3488
+ },
3489
+ required: [
3490
+ "summary",
3491
+ "items",
3492
+ "updatedAt"
3493
+ ],
3494
+ additionalProperties: false
3495
+ }
3496
+ },
3497
+ required: [
3498
+ "customer",
3499
+ "relationship"
3500
+ ],
3501
+ additionalProperties: false
3502
+ }
3503
+ },
3259
3504
  outlit_assign_customer_owner: {
3260
3505
  toolName: "outlit_assign_customer_owner",
3261
3506
  commandId: "customer.owner.assign",
@@ -3573,13 +3818,13 @@ var init_dist4 = __esm(() => {
3573
3818
  ]
3574
3819
  },
3575
3820
  startDate: {
3576
- description: "Start of time window (ISO 8601, e.g. '2025-01-01T00:00:00Z'). Cannot be used with timeframe.",
3821
+ description: "Start of time window, inclusive (ISO 8601 UTC, e.g. '2025-01-01T00:00:00.000Z'). Cannot be used with timeframe.",
3577
3822
  type: "string",
3578
3823
  format: "date-time",
3579
3824
  pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
3580
3825
  },
3581
3826
  endDate: {
3582
- description: "End of time window (ISO 8601, e.g. '2025-01-31T23:59:59Z'). Cannot be used with timeframe.",
3827
+ description: "End of time window, inclusive of the instant it names (ISO 8601 UTC, e.g. '2025-01-31T23:59:59.999Z'). Use millisecond precision: timestamps are stored to the millisecond, so '...T23:59:59Z' includes only the first instant of that second and excludes the rest of it. Cannot be used with timeframe.",
3583
3828
  type: "string",
3584
3829
  format: "date-time",
3585
3830
  pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
@@ -10457,17 +10702,34 @@ Returns column definitions and example queries for each view.`,
10457
10702
  additionalProperties: false
10458
10703
  }
10459
10704
  },
10460
- outlit_list_behavior_metric_sources: {
10461
- toolName: "outlit_list_behavior_metric_sources",
10462
- commandId: "behavior_metric_source.list",
10705
+ outlit_list_features: {
10706
+ toolName: "outlit_list_features",
10707
+ commandId: "value_feature_workspace.get",
10463
10708
  commandVersion: 1,
10464
- ownerDomain: "behavior_metrics",
10465
- title: "List Behavior Metric Sources",
10466
- description: "List product-event sources eligible for Behavior Metric discovery.",
10709
+ ownerDomain: "value_features",
10710
+ title: "List Features",
10711
+ description: "List configured features, exact historical usage, eligible sources, and observed event candidates.",
10467
10712
  inputSchema: {
10468
10713
  $schema: "https://json-schema.org/draft/2020-12/schema",
10469
10714
  type: "object",
10470
- properties: {},
10715
+ properties: {
10716
+ sourceKey: {
10717
+ type: "string",
10718
+ pattern: "^metric_source_v1_[a-f0-9]{32}$"
10719
+ },
10720
+ weeks: {
10721
+ default: 12,
10722
+ type: "integer",
10723
+ minimum: 1,
10724
+ maximum: 53
10725
+ },
10726
+ candidateLimit: {
10727
+ default: 100,
10728
+ type: "integer",
10729
+ minimum: 1,
10730
+ maximum: 100
10731
+ }
10732
+ },
10471
10733
  additionalProperties: false
10472
10734
  },
10473
10735
  outputSchema: {
@@ -10513,217 +10775,593 @@ Returns column definitions and example queries for each view.`,
10513
10775
  ],
10514
10776
  additionalProperties: false
10515
10777
  }
10516
- }
10517
- },
10518
- required: [
10519
- "sources"
10520
- ],
10521
- additionalProperties: false
10522
- }
10523
- },
10524
- outlit_list_behavior_metric_events: {
10525
- toolName: "outlit_list_behavior_metric_events",
10526
- commandId: "behavior_metric_event.list",
10527
- commandVersion: 1,
10528
- ownerDomain: "behavior_metrics",
10529
- title: "List Behavior Metric Events",
10530
- description: "List attributed event candidates for a Behavior Metric source.",
10531
- inputSchema: {
10532
- $schema: "https://json-schema.org/draft/2020-12/schema",
10533
- type: "object",
10534
- properties: {
10535
- sourceKey: {
10536
- type: "string",
10537
- pattern: "^metric_source_v1_[a-f0-9]{32}$"
10538
10778
  },
10539
- weeks: {
10540
- default: 12,
10541
- type: "integer",
10542
- minimum: 1,
10543
- maximum: 53
10779
+ selectedSourceKey: {
10780
+ anyOf: [
10781
+ {
10782
+ type: "string",
10783
+ pattern: "^metric_source_v1_[a-f0-9]{32}$"
10784
+ },
10785
+ {
10786
+ type: "null"
10787
+ }
10788
+ ]
10544
10789
  },
10545
- limit: {
10546
- default: 100,
10790
+ workspaceActiveFeatureCount: {
10547
10791
  type: "integer",
10548
- minimum: 1,
10549
- maximum: 100
10550
- }
10551
- },
10552
- required: [
10553
- "sourceKey"
10554
- ],
10555
- additionalProperties: false
10556
- },
10557
- outputSchema: {
10558
- $schema: "https://json-schema.org/draft/2020-12/schema",
10559
- type: "object",
10560
- properties: {
10561
- events: {
10792
+ minimum: 0,
10793
+ maximum: 9007199254740991
10794
+ },
10795
+ features: {
10796
+ maxItems: 100,
10562
10797
  type: "array",
10563
10798
  items: {
10564
10799
  type: "object",
10565
10800
  properties: {
10566
- eventName: {
10801
+ id: {
10567
10802
  type: "string",
10568
- minLength: 1,
10569
- maxLength: 191
10803
+ pattern: "^value_feature_v1_[a-f0-9]{32}$"
10570
10804
  },
10571
- eventCount: {
10572
- type: "integer",
10573
- minimum: 0,
10574
- maximum: 9007199254740991
10805
+ revision: {
10806
+ type: "string",
10807
+ pattern: "^value_feature_revision_v1_[a-f0-9]{32}$"
10575
10808
  },
10576
- distinctCustomers: {
10577
- type: "integer",
10578
- minimum: 0,
10579
- maximum: 9007199254740991
10809
+ sourceKey: {
10810
+ type: "string",
10811
+ pattern: "^metric_source_v1_[a-f0-9]{32}$"
10580
10812
  },
10581
- activeWeeks: {
10582
- type: "integer",
10583
- minimum: 1,
10584
- maximum: 53
10813
+ featureKey: {
10814
+ type: "string",
10815
+ maxLength: 64,
10816
+ pattern: "^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$"
10585
10817
  },
10586
- propertyKeys: {
10587
- maxItems: 10,
10588
- type: "array",
10589
- items: {
10590
- type: "string",
10591
- minLength: 1,
10592
- maxLength: 191
10593
- }
10594
- }
10595
- },
10596
- required: [
10597
- "eventName",
10598
- "eventCount",
10599
- "distinctCustomers",
10600
- "activeWeeks",
10601
- "propertyKeys"
10602
- ],
10603
- additionalProperties: false
10604
- }
10605
- },
10606
- truncated: {
10607
- type: "boolean"
10608
- }
10609
- },
10610
- required: [
10611
- "events",
10612
- "truncated"
10613
- ],
10614
- additionalProperties: false
10615
- }
10616
- },
10617
- outlit_create_behavior_metric: {
10618
- toolName: "outlit_create_behavior_metric",
10619
- commandId: "behavior_metric.create",
10620
- commandVersion: 1,
10621
- ownerDomain: "behavior_metrics",
10622
- title: "Create Behavior Metric",
10623
- description: "Create or idempotently return an event-based Behavior Metric in ENABLED and SHADOW.",
10624
- inputSchema: {
10625
- $schema: "https://json-schema.org/draft/2020-12/schema",
10626
- type: "object",
10627
- properties: {
10628
- sourceKey: {
10629
- type: "string",
10630
- pattern: "^metric_source_v1_[a-f0-9]{32}$"
10631
- },
10632
- eventName: {
10633
- type: "string",
10634
- minLength: 1,
10635
- maxLength: 191
10636
- },
10637
- behaviorKey: {
10638
- type: "string",
10639
- maxLength: 64,
10640
- pattern: "^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$"
10641
- },
10642
- label: {
10643
- type: "string",
10644
- minLength: 1,
10645
- maxLength: 255
10646
- },
10647
- propertyFilters: {
10648
- default: [],
10649
- maxItems: 5,
10650
- type: "array",
10651
- items: {
10652
- oneOf: [
10653
- {
10818
+ name: {
10819
+ type: "string",
10820
+ minLength: 1,
10821
+ maxLength: 255
10822
+ },
10823
+ rule: {
10654
10824
  type: "object",
10655
10825
  properties: {
10656
- property: {
10826
+ eventName: {
10657
10827
  type: "string",
10658
10828
  minLength: 1,
10659
10829
  maxLength: 191
10660
10830
  },
10661
- operator: {
10662
- type: "string",
10663
- const: "equals"
10664
- },
10665
- value: {
10666
- oneOf: [
10667
- {
10831
+ propertyFilters: {
10832
+ maxItems: 5,
10833
+ type: "array",
10834
+ items: {
10835
+ oneOf: [
10836
+ {
10837
+ type: "object",
10838
+ properties: {
10839
+ property: {
10840
+ type: "string",
10841
+ minLength: 1,
10842
+ maxLength: 191
10843
+ },
10844
+ operator: {
10845
+ type: "string",
10846
+ const: "equals"
10847
+ },
10848
+ value: {
10849
+ oneOf: [
10850
+ {
10851
+ type: "object",
10852
+ properties: {
10853
+ type: {
10854
+ type: "string",
10855
+ const: "string"
10856
+ },
10857
+ value: {
10858
+ type: "string",
10859
+ maxLength: 191
10860
+ }
10861
+ },
10862
+ required: [
10863
+ "type",
10864
+ "value"
10865
+ ],
10866
+ additionalProperties: false
10867
+ },
10868
+ {
10869
+ type: "object",
10870
+ properties: {
10871
+ type: {
10872
+ type: "string",
10873
+ const: "number"
10874
+ },
10875
+ value: {
10876
+ type: "number",
10877
+ minimum: -9007199254740991,
10878
+ maximum: 9007199254740991
10879
+ }
10880
+ },
10881
+ required: [
10882
+ "type",
10883
+ "value"
10884
+ ],
10885
+ additionalProperties: false
10886
+ },
10887
+ {
10888
+ type: "object",
10889
+ properties: {
10890
+ type: {
10891
+ type: "string",
10892
+ const: "boolean"
10893
+ },
10894
+ value: {
10895
+ type: "boolean"
10896
+ }
10897
+ },
10898
+ required: [
10899
+ "type",
10900
+ "value"
10901
+ ],
10902
+ additionalProperties: false
10903
+ }
10904
+ ]
10905
+ }
10906
+ },
10907
+ required: [
10908
+ "property",
10909
+ "operator",
10910
+ "value"
10911
+ ],
10912
+ additionalProperties: false
10913
+ },
10914
+ {
10915
+ type: "object",
10916
+ properties: {
10917
+ property: {
10918
+ type: "string",
10919
+ minLength: 1,
10920
+ maxLength: 191
10921
+ },
10922
+ operator: {
10923
+ type: "string",
10924
+ const: "exists"
10925
+ }
10926
+ },
10927
+ required: [
10928
+ "property",
10929
+ "operator"
10930
+ ],
10931
+ additionalProperties: false
10932
+ }
10933
+ ]
10934
+ }
10935
+ }
10936
+ },
10937
+ required: [
10938
+ "eventName",
10939
+ "propertyFilters"
10940
+ ],
10941
+ additionalProperties: false
10942
+ },
10943
+ evidence: {
10944
+ oneOf: [
10945
+ {
10946
+ type: "object",
10947
+ properties: {
10948
+ window: {
10668
10949
  type: "object",
10669
10950
  properties: {
10670
- type: {
10951
+ startAt: {
10671
10952
  type: "string",
10672
- const: "string"
10953
+ format: "date-time",
10954
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
10673
10955
  },
10674
- value: {
10956
+ endAt: {
10675
10957
  type: "string",
10676
- maxLength: 191
10958
+ format: "date-time",
10959
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
10677
10960
  }
10678
10961
  },
10679
10962
  required: [
10680
- "type",
10681
- "value"
10963
+ "startAt",
10964
+ "endAt"
10682
10965
  ],
10683
10966
  additionalProperties: false
10684
10967
  },
10685
- {
10686
- type: "object",
10687
- properties: {
10688
- type: {
10968
+ coverage: {
10969
+ type: "string",
10970
+ enum: [
10971
+ "complete",
10972
+ "partial"
10973
+ ]
10974
+ },
10975
+ eventCount: {
10976
+ type: "integer",
10977
+ minimum: 0,
10978
+ maximum: 9007199254740991
10979
+ },
10980
+ activeDays: {
10981
+ type: "integer",
10982
+ minimum: 0,
10983
+ maximum: 9007199254740991
10984
+ },
10985
+ activeWeeks: {
10986
+ type: "integer",
10987
+ minimum: 0,
10988
+ maximum: 53
10989
+ },
10990
+ firstObservedAt: {
10991
+ anyOf: [
10992
+ {
10689
10993
  type: "string",
10690
- const: "number"
10994
+ format: "date-time",
10995
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
10691
10996
  },
10692
- value: {
10693
- type: "number",
10694
- minimum: -9007199254740991,
10695
- maximum: 9007199254740991
10997
+ {
10998
+ type: "null"
10696
10999
  }
10697
- },
10698
- required: [
10699
- "type",
10700
- "value"
10701
- ],
10702
- additionalProperties: false
11000
+ ]
10703
11001
  },
10704
- {
11002
+ lastObservedAt: {
11003
+ anyOf: [
11004
+ {
11005
+ type: "string",
11006
+ format: "date-time",
11007
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
11008
+ },
11009
+ {
11010
+ type: "null"
11011
+ }
11012
+ ]
11013
+ },
11014
+ distinctCustomers: {
11015
+ type: "integer",
11016
+ minimum: 0,
11017
+ maximum: 9007199254740991
11018
+ }
11019
+ },
11020
+ required: [
11021
+ "window",
11022
+ "coverage",
11023
+ "eventCount",
11024
+ "activeDays",
11025
+ "activeWeeks",
11026
+ "firstObservedAt",
11027
+ "lastObservedAt",
11028
+ "distinctCustomers"
11029
+ ],
11030
+ additionalProperties: false
11031
+ },
11032
+ {
11033
+ type: "object",
11034
+ properties: {
11035
+ window: {
10705
11036
  type: "object",
10706
11037
  properties: {
10707
- type: {
11038
+ startAt: {
10708
11039
  type: "string",
10709
- const: "boolean"
11040
+ format: "date-time",
11041
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
10710
11042
  },
10711
- value: {
10712
- type: "boolean"
11043
+ endAt: {
11044
+ type: "string",
11045
+ format: "date-time",
11046
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
10713
11047
  }
10714
11048
  },
10715
11049
  required: [
10716
- "type",
10717
- "value"
11050
+ "startAt",
11051
+ "endAt"
10718
11052
  ],
10719
11053
  additionalProperties: false
11054
+ },
11055
+ coverage: {
11056
+ type: "string",
11057
+ const: "unavailable"
11058
+ },
11059
+ reason: {
11060
+ type: "string",
11061
+ enum: [
11062
+ "SOURCE_BLOCKED",
11063
+ "SOURCE_NOT_READY",
11064
+ "QUERY_FAILED"
11065
+ ]
10720
11066
  }
10721
- ]
11067
+ },
11068
+ required: [
11069
+ "window",
11070
+ "coverage",
11071
+ "reason"
11072
+ ],
11073
+ additionalProperties: false
10722
11074
  }
11075
+ ]
11076
+ }
11077
+ },
11078
+ required: [
11079
+ "id",
11080
+ "revision",
11081
+ "sourceKey",
11082
+ "featureKey",
11083
+ "name",
11084
+ "rule",
11085
+ "evidence"
11086
+ ],
11087
+ additionalProperties: false
11088
+ }
11089
+ },
11090
+ candidates: {
11091
+ oneOf: [
11092
+ {
11093
+ type: "object",
11094
+ properties: {
11095
+ status: {
11096
+ type: "string",
11097
+ const: "ready"
10723
11098
  },
10724
- required: [
10725
- "property",
10726
- "operator",
11099
+ items: {
11100
+ maxItems: 100,
11101
+ type: "array",
11102
+ items: {
11103
+ type: "object",
11104
+ properties: {
11105
+ eventName: {
11106
+ type: "string",
11107
+ minLength: 1,
11108
+ maxLength: 191
11109
+ },
11110
+ eventCount: {
11111
+ type: "integer",
11112
+ minimum: 0,
11113
+ maximum: 9007199254740991
11114
+ },
11115
+ distinctCustomers: {
11116
+ type: "integer",
11117
+ minimum: 0,
11118
+ maximum: 9007199254740991
11119
+ },
11120
+ activeWeeks: {
11121
+ type: "integer",
11122
+ minimum: 1,
11123
+ maximum: 53
11124
+ },
11125
+ propertyKeys: {
11126
+ maxItems: 10,
11127
+ type: "array",
11128
+ items: {
11129
+ type: "string",
11130
+ minLength: 1,
11131
+ maxLength: 191
11132
+ }
11133
+ }
11134
+ },
11135
+ required: [
11136
+ "eventName",
11137
+ "eventCount",
11138
+ "distinctCustomers",
11139
+ "activeWeeks",
11140
+ "propertyKeys"
11141
+ ],
11142
+ additionalProperties: false
11143
+ }
11144
+ },
11145
+ truncated: {
11146
+ type: "boolean"
11147
+ }
11148
+ },
11149
+ required: [
11150
+ "status",
11151
+ "items",
11152
+ "truncated"
11153
+ ],
11154
+ additionalProperties: false
11155
+ },
11156
+ {
11157
+ type: "object",
11158
+ properties: {
11159
+ status: {
11160
+ type: "string",
11161
+ const: "partial"
11162
+ },
11163
+ items: {
11164
+ maxItems: 100,
11165
+ type: "array",
11166
+ items: {
11167
+ type: "object",
11168
+ properties: {
11169
+ eventName: {
11170
+ type: "string",
11171
+ minLength: 1,
11172
+ maxLength: 191
11173
+ },
11174
+ eventCount: {
11175
+ type: "integer",
11176
+ minimum: 0,
11177
+ maximum: 9007199254740991
11178
+ },
11179
+ distinctCustomers: {
11180
+ type: "integer",
11181
+ minimum: 0,
11182
+ maximum: 9007199254740991
11183
+ },
11184
+ activeWeeks: {
11185
+ type: "integer",
11186
+ minimum: 1,
11187
+ maximum: 53
11188
+ },
11189
+ propertyKeys: {
11190
+ maxItems: 10,
11191
+ type: "array",
11192
+ items: {
11193
+ type: "string",
11194
+ minLength: 1,
11195
+ maxLength: 191
11196
+ }
11197
+ }
11198
+ },
11199
+ required: [
11200
+ "eventName",
11201
+ "eventCount",
11202
+ "distinctCustomers",
11203
+ "activeWeeks",
11204
+ "propertyKeys"
11205
+ ],
11206
+ additionalProperties: false
11207
+ }
11208
+ },
11209
+ truncated: {
11210
+ type: "boolean"
11211
+ }
11212
+ },
11213
+ required: [
11214
+ "status",
11215
+ "items",
11216
+ "truncated"
11217
+ ],
11218
+ additionalProperties: false
11219
+ },
11220
+ {
11221
+ type: "object",
11222
+ properties: {
11223
+ status: {
11224
+ type: "string",
11225
+ const: "unavailable"
11226
+ },
11227
+ reason: {
11228
+ type: "string",
11229
+ enum: [
11230
+ "SOURCE_BLOCKED",
11231
+ "SOURCE_NOT_READY",
11232
+ "QUERY_FAILED"
11233
+ ]
11234
+ }
11235
+ },
11236
+ required: [
11237
+ "status",
11238
+ "reason"
11239
+ ],
11240
+ additionalProperties: false
11241
+ }
11242
+ ]
11243
+ }
11244
+ },
11245
+ required: [
11246
+ "sources",
11247
+ "selectedSourceKey",
11248
+ "workspaceActiveFeatureCount",
11249
+ "features",
11250
+ "candidates"
11251
+ ],
11252
+ additionalProperties: false
11253
+ }
11254
+ },
11255
+ outlit_create_feature: {
11256
+ toolName: "outlit_create_feature",
11257
+ commandId: "value_feature.create",
11258
+ commandVersion: 1,
11259
+ ownerDomain: "value_features",
11260
+ title: "Create Feature",
11261
+ description: "Create or idempotently return one customer-value Feature observed by one event rule.",
11262
+ inputSchema: {
11263
+ $schema: "https://json-schema.org/draft/2020-12/schema",
11264
+ type: "object",
11265
+ properties: {
11266
+ sourceKey: {
11267
+ type: "string",
11268
+ pattern: "^metric_source_v1_[a-f0-9]{32}$"
11269
+ },
11270
+ eventName: {
11271
+ type: "string",
11272
+ minLength: 1,
11273
+ maxLength: 191
11274
+ },
11275
+ featureKey: {
11276
+ type: "string",
11277
+ maxLength: 64,
11278
+ pattern: "^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$"
11279
+ },
11280
+ name: {
11281
+ type: "string",
11282
+ minLength: 1,
11283
+ maxLength: 255
11284
+ },
11285
+ propertyFilters: {
11286
+ default: [],
11287
+ maxItems: 5,
11288
+ type: "array",
11289
+ items: {
11290
+ oneOf: [
11291
+ {
11292
+ type: "object",
11293
+ properties: {
11294
+ property: {
11295
+ type: "string",
11296
+ minLength: 1,
11297
+ maxLength: 191
11298
+ },
11299
+ operator: {
11300
+ type: "string",
11301
+ const: "equals"
11302
+ },
11303
+ value: {
11304
+ oneOf: [
11305
+ {
11306
+ type: "object",
11307
+ properties: {
11308
+ type: {
11309
+ type: "string",
11310
+ const: "string"
11311
+ },
11312
+ value: {
11313
+ type: "string",
11314
+ maxLength: 191
11315
+ }
11316
+ },
11317
+ required: [
11318
+ "type",
11319
+ "value"
11320
+ ],
11321
+ additionalProperties: false
11322
+ },
11323
+ {
11324
+ type: "object",
11325
+ properties: {
11326
+ type: {
11327
+ type: "string",
11328
+ const: "number"
11329
+ },
11330
+ value: {
11331
+ type: "number",
11332
+ minimum: -9007199254740991,
11333
+ maximum: 9007199254740991
11334
+ }
11335
+ },
11336
+ required: [
11337
+ "type",
11338
+ "value"
11339
+ ],
11340
+ additionalProperties: false
11341
+ },
11342
+ {
11343
+ type: "object",
11344
+ properties: {
11345
+ type: {
11346
+ type: "string",
11347
+ const: "boolean"
11348
+ },
11349
+ value: {
11350
+ type: "boolean"
11351
+ }
11352
+ },
11353
+ required: [
11354
+ "type",
11355
+ "value"
11356
+ ],
11357
+ additionalProperties: false
11358
+ }
11359
+ ]
11360
+ }
11361
+ },
11362
+ required: [
11363
+ "property",
11364
+ "operator",
10727
11365
  "value"
10728
11366
  ],
10729
11367
  additionalProperties: false
@@ -10754,8 +11392,8 @@ Returns column definitions and example queries for each view.`,
10754
11392
  required: [
10755
11393
  "sourceKey",
10756
11394
  "eventName",
10757
- "behaviorKey",
10758
- "label"
11395
+ "featureKey",
11396
+ "name"
10759
11397
  ],
10760
11398
  additionalProperties: false
10761
11399
  },
@@ -10766,234 +11404,1393 @@ Returns column definitions and example queries for each view.`,
10766
11404
  created: {
10767
11405
  type: "boolean"
10768
11406
  },
10769
- metric: {
11407
+ feature: {
10770
11408
  type: "object",
10771
11409
  properties: {
11410
+ id: {
11411
+ type: "string",
11412
+ pattern: "^value_feature_v1_[a-f0-9]{32}$"
11413
+ },
11414
+ revision: {
11415
+ type: "string",
11416
+ pattern: "^value_feature_revision_v1_[a-f0-9]{32}$"
11417
+ },
10772
11418
  sourceKey: {
10773
11419
  type: "string",
10774
11420
  pattern: "^metric_source_v1_[a-f0-9]{32}$"
10775
11421
  },
10776
- behaviorKey: {
11422
+ featureKey: {
10777
11423
  type: "string",
10778
11424
  maxLength: 64,
10779
11425
  pattern: "^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$"
10780
11426
  },
10781
- label: {
11427
+ name: {
10782
11428
  type: "string",
10783
11429
  minLength: 1,
10784
11430
  maxLength: 255
10785
11431
  },
10786
- eventSelection: {
10787
- oneOf: [
10788
- {
10789
- type: "object",
10790
- properties: {
10791
- mode: {
10792
- type: "string",
10793
- const: "exact_event_names"
10794
- },
10795
- eventNames: {
10796
- minItems: 1,
10797
- maxItems: 1,
10798
- type: "array",
10799
- items: {
10800
- type: "string",
10801
- minLength: 1,
10802
- maxLength: 191
10803
- }
10804
- }
10805
- },
10806
- required: [
10807
- "mode",
10808
- "eventNames"
10809
- ],
10810
- additionalProperties: false
11432
+ rule: {
11433
+ type: "object",
11434
+ properties: {
11435
+ eventName: {
11436
+ type: "string",
11437
+ minLength: 1,
11438
+ maxLength: 191
10811
11439
  },
10812
- {
10813
- type: "object",
10814
- properties: {
10815
- mode: {
10816
- type: "string",
10817
- const: "configured_event"
10818
- },
10819
- eventName: {
10820
- type: "string",
10821
- minLength: 1,
10822
- maxLength: 191
10823
- },
10824
- propertyFilters: {
10825
- minItems: 1,
10826
- maxItems: 5,
10827
- type: "array",
10828
- items: {
10829
- oneOf: [
10830
- {
10831
- type: "object",
10832
- properties: {
10833
- property: {
10834
- type: "string",
10835
- minLength: 1,
10836
- maxLength: 191
10837
- },
10838
- operator: {
10839
- type: "string",
10840
- const: "equals"
10841
- },
10842
- value: {
10843
- oneOf: [
10844
- {
10845
- type: "object",
10846
- properties: {
10847
- type: {
10848
- type: "string",
10849
- const: "string"
10850
- },
10851
- value: {
10852
- type: "string",
10853
- maxLength: 191
10854
- }
10855
- },
10856
- required: [
10857
- "type",
10858
- "value"
10859
- ],
10860
- additionalProperties: false
11440
+ propertyFilters: {
11441
+ maxItems: 5,
11442
+ type: "array",
11443
+ items: {
11444
+ oneOf: [
11445
+ {
11446
+ type: "object",
11447
+ properties: {
11448
+ property: {
11449
+ type: "string",
11450
+ minLength: 1,
11451
+ maxLength: 191
11452
+ },
11453
+ operator: {
11454
+ type: "string",
11455
+ const: "equals"
11456
+ },
11457
+ value: {
11458
+ oneOf: [
11459
+ {
11460
+ type: "object",
11461
+ properties: {
11462
+ type: {
11463
+ type: "string",
11464
+ const: "string"
10861
11465
  },
10862
- {
10863
- type: "object",
10864
- properties: {
10865
- type: {
10866
- type: "string",
10867
- const: "number"
10868
- },
10869
- value: {
10870
- type: "number",
10871
- minimum: -9007199254740991,
10872
- maximum: 9007199254740991
10873
- }
10874
- },
10875
- required: [
10876
- "type",
10877
- "value"
10878
- ],
10879
- additionalProperties: false
11466
+ value: {
11467
+ type: "string",
11468
+ maxLength: 191
11469
+ }
11470
+ },
11471
+ required: [
11472
+ "type",
11473
+ "value"
11474
+ ],
11475
+ additionalProperties: false
11476
+ },
11477
+ {
11478
+ type: "object",
11479
+ properties: {
11480
+ type: {
11481
+ type: "string",
11482
+ const: "number"
10880
11483
  },
10881
- {
10882
- type: "object",
10883
- properties: {
10884
- type: {
10885
- type: "string",
10886
- const: "boolean"
10887
- },
10888
- value: {
10889
- type: "boolean"
10890
- }
10891
- },
10892
- required: [
10893
- "type",
10894
- "value"
10895
- ],
10896
- additionalProperties: false
11484
+ value: {
11485
+ type: "number",
11486
+ minimum: -9007199254740991,
11487
+ maximum: 9007199254740991
10897
11488
  }
10898
- ]
10899
- }
10900
- },
10901
- required: [
10902
- "property",
10903
- "operator",
10904
- "value"
10905
- ],
10906
- additionalProperties: false
10907
- },
10908
- {
10909
- type: "object",
10910
- properties: {
10911
- property: {
10912
- type: "string",
10913
- minLength: 1,
10914
- maxLength: 191
11489
+ },
11490
+ required: [
11491
+ "type",
11492
+ "value"
11493
+ ],
11494
+ additionalProperties: false
10915
11495
  },
10916
- operator: {
10917
- type: "string",
10918
- const: "exists"
11496
+ {
11497
+ type: "object",
11498
+ properties: {
11499
+ type: {
11500
+ type: "string",
11501
+ const: "boolean"
11502
+ },
11503
+ value: {
11504
+ type: "boolean"
11505
+ }
11506
+ },
11507
+ required: [
11508
+ "type",
11509
+ "value"
11510
+ ],
11511
+ additionalProperties: false
10919
11512
  }
10920
- },
10921
- required: [
10922
- "property",
10923
- "operator"
10924
- ],
10925
- additionalProperties: false
11513
+ ]
10926
11514
  }
10927
- ]
11515
+ },
11516
+ required: [
11517
+ "property",
11518
+ "operator",
11519
+ "value"
11520
+ ],
11521
+ additionalProperties: false
11522
+ },
11523
+ {
11524
+ type: "object",
11525
+ properties: {
11526
+ property: {
11527
+ type: "string",
11528
+ minLength: 1,
11529
+ maxLength: 191
11530
+ },
11531
+ operator: {
11532
+ type: "string",
11533
+ const: "exists"
11534
+ }
11535
+ },
11536
+ required: [
11537
+ "property",
11538
+ "operator"
11539
+ ],
11540
+ additionalProperties: false
10928
11541
  }
10929
- }
10930
- },
10931
- required: [
10932
- "mode",
10933
- "eventName",
10934
- "propertyFilters"
10935
- ],
10936
- additionalProperties: false
11542
+ ]
11543
+ }
10937
11544
  }
10938
- ]
11545
+ },
11546
+ required: [
11547
+ "eventName",
11548
+ "propertyFilters"
11549
+ ],
11550
+ additionalProperties: false
11551
+ }
11552
+ },
11553
+ required: [
11554
+ "id",
11555
+ "revision",
11556
+ "sourceKey",
11557
+ "featureKey",
11558
+ "name",
11559
+ "rule"
11560
+ ],
11561
+ additionalProperties: false
11562
+ }
11563
+ },
11564
+ required: [
11565
+ "created",
11566
+ "feature"
11567
+ ],
11568
+ additionalProperties: false
11569
+ }
11570
+ },
11571
+ outlit_archive_feature: {
11572
+ toolName: "outlit_archive_feature",
11573
+ commandId: "value_feature.archive",
11574
+ commandVersion: 1,
11575
+ ownerDomain: "value_features",
11576
+ title: "Archive Feature",
11577
+ description: "Archive a Feature when at least one other active Feature remains.",
11578
+ inputSchema: {
11579
+ $schema: "https://json-schema.org/draft/2020-12/schema",
11580
+ type: "object",
11581
+ properties: {
11582
+ id: {
11583
+ type: "string",
11584
+ pattern: "^value_feature_v1_[a-f0-9]{32}$"
11585
+ },
11586
+ revision: {
11587
+ type: "string",
11588
+ pattern: "^value_feature_revision_v1_[a-f0-9]{32}$"
11589
+ }
11590
+ },
11591
+ required: [
11592
+ "id",
11593
+ "revision"
11594
+ ],
11595
+ additionalProperties: false
11596
+ },
11597
+ outputSchema: {
11598
+ $schema: "https://json-schema.org/draft/2020-12/schema",
11599
+ type: "object",
11600
+ properties: {
11601
+ archived: {
11602
+ type: "boolean",
11603
+ const: true
11604
+ },
11605
+ feature: {
11606
+ type: "object",
11607
+ properties: {
11608
+ id: {
11609
+ type: "string",
11610
+ pattern: "^value_feature_v1_[a-f0-9]{32}$"
10939
11611
  },
10940
- status: {
11612
+ revision: {
11613
+ type: "string",
11614
+ pattern: "^value_feature_revision_v1_[a-f0-9]{32}$"
11615
+ }
11616
+ },
11617
+ required: [
11618
+ "id",
11619
+ "revision"
11620
+ ],
11621
+ additionalProperties: false
11622
+ }
11623
+ },
11624
+ required: [
11625
+ "archived",
11626
+ "feature"
11627
+ ],
11628
+ additionalProperties: false
11629
+ }
11630
+ },
11631
+ outlit_get_customer_features: {
11632
+ toolName: "outlit_get_customer_features",
11633
+ commandId: "customer_feature_usage.get",
11634
+ commandVersion: 1,
11635
+ ownerDomain: "value_features",
11636
+ title: "Get Customer Features",
11637
+ description: "Read exact historical feature-usage evidence for one authorized customer.",
11638
+ inputSchema: {
11639
+ $schema: "https://json-schema.org/draft/2020-12/schema",
11640
+ type: "object",
11641
+ properties: {
11642
+ customer: {
11643
+ type: "string",
11644
+ minLength: 1,
11645
+ maxLength: 500
11646
+ },
11647
+ weeks: {
11648
+ default: 12,
11649
+ type: "integer",
11650
+ minimum: 1,
11651
+ maximum: 53
11652
+ },
11653
+ includeWeeklyUsage: {
11654
+ default: false,
11655
+ type: "boolean"
11656
+ }
11657
+ },
11658
+ required: [
11659
+ "customer"
11660
+ ],
11661
+ additionalProperties: false
11662
+ },
11663
+ outputSchema: {
11664
+ $schema: "https://json-schema.org/draft/2020-12/schema",
11665
+ type: "object",
11666
+ properties: {
11667
+ customer: {
11668
+ type: "object",
11669
+ properties: {
11670
+ id: {
10941
11671
  type: "string",
10942
- const: "ENABLED"
11672
+ minLength: 1,
11673
+ maxLength: 191
10943
11674
  },
10944
- evaluationMode: {
11675
+ name: {
10945
11676
  type: "string",
10946
- const: "SHADOW"
11677
+ minLength: 1,
11678
+ maxLength: 255
11679
+ }
11680
+ },
11681
+ required: [
11682
+ "id",
11683
+ "name"
11684
+ ],
11685
+ additionalProperties: false
11686
+ },
11687
+ features: {
11688
+ maxItems: 100,
11689
+ type: "array",
11690
+ items: {
11691
+ type: "object",
11692
+ properties: {
11693
+ id: {
11694
+ type: "string",
11695
+ pattern: "^value_feature_v1_[a-f0-9]{32}$"
11696
+ },
11697
+ revision: {
11698
+ type: "string",
11699
+ pattern: "^value_feature_revision_v1_[a-f0-9]{32}$"
11700
+ },
11701
+ sourceKey: {
11702
+ type: "string",
11703
+ pattern: "^metric_source_v1_[a-f0-9]{32}$"
11704
+ },
11705
+ featureKey: {
11706
+ type: "string",
11707
+ maxLength: 64,
11708
+ pattern: "^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$"
11709
+ },
11710
+ name: {
11711
+ type: "string",
11712
+ minLength: 1,
11713
+ maxLength: 255
11714
+ },
11715
+ rule: {
11716
+ type: "object",
11717
+ properties: {
11718
+ eventName: {
11719
+ type: "string",
11720
+ minLength: 1,
11721
+ maxLength: 191
11722
+ },
11723
+ propertyFilters: {
11724
+ maxItems: 5,
11725
+ type: "array",
11726
+ items: {
11727
+ oneOf: [
11728
+ {
11729
+ type: "object",
11730
+ properties: {
11731
+ property: {
11732
+ type: "string",
11733
+ minLength: 1,
11734
+ maxLength: 191
11735
+ },
11736
+ operator: {
11737
+ type: "string",
11738
+ const: "equals"
11739
+ },
11740
+ value: {
11741
+ oneOf: [
11742
+ {
11743
+ type: "object",
11744
+ properties: {
11745
+ type: {
11746
+ type: "string",
11747
+ const: "string"
11748
+ },
11749
+ value: {
11750
+ type: "string",
11751
+ maxLength: 191
11752
+ }
11753
+ },
11754
+ required: [
11755
+ "type",
11756
+ "value"
11757
+ ],
11758
+ additionalProperties: false
11759
+ },
11760
+ {
11761
+ type: "object",
11762
+ properties: {
11763
+ type: {
11764
+ type: "string",
11765
+ const: "number"
11766
+ },
11767
+ value: {
11768
+ type: "number",
11769
+ minimum: -9007199254740991,
11770
+ maximum: 9007199254740991
11771
+ }
11772
+ },
11773
+ required: [
11774
+ "type",
11775
+ "value"
11776
+ ],
11777
+ additionalProperties: false
11778
+ },
11779
+ {
11780
+ type: "object",
11781
+ properties: {
11782
+ type: {
11783
+ type: "string",
11784
+ const: "boolean"
11785
+ },
11786
+ value: {
11787
+ type: "boolean"
11788
+ }
11789
+ },
11790
+ required: [
11791
+ "type",
11792
+ "value"
11793
+ ],
11794
+ additionalProperties: false
11795
+ }
11796
+ ]
11797
+ }
11798
+ },
11799
+ required: [
11800
+ "property",
11801
+ "operator",
11802
+ "value"
11803
+ ],
11804
+ additionalProperties: false
11805
+ },
11806
+ {
11807
+ type: "object",
11808
+ properties: {
11809
+ property: {
11810
+ type: "string",
11811
+ minLength: 1,
11812
+ maxLength: 191
11813
+ },
11814
+ operator: {
11815
+ type: "string",
11816
+ const: "exists"
11817
+ }
11818
+ },
11819
+ required: [
11820
+ "property",
11821
+ "operator"
11822
+ ],
11823
+ additionalProperties: false
11824
+ }
11825
+ ]
11826
+ }
11827
+ }
11828
+ },
11829
+ required: [
11830
+ "eventName",
11831
+ "propertyFilters"
11832
+ ],
11833
+ additionalProperties: false
11834
+ },
11835
+ evidence: {
11836
+ oneOf: [
11837
+ {
11838
+ type: "object",
11839
+ properties: {
11840
+ window: {
11841
+ type: "object",
11842
+ properties: {
11843
+ startAt: {
11844
+ type: "string",
11845
+ format: "date-time",
11846
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
11847
+ },
11848
+ endAt: {
11849
+ type: "string",
11850
+ format: "date-time",
11851
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
11852
+ }
11853
+ },
11854
+ required: [
11855
+ "startAt",
11856
+ "endAt"
11857
+ ],
11858
+ additionalProperties: false
11859
+ },
11860
+ coverage: {
11861
+ type: "string",
11862
+ enum: [
11863
+ "complete",
11864
+ "partial"
11865
+ ]
11866
+ },
11867
+ eventCount: {
11868
+ type: "integer",
11869
+ minimum: 0,
11870
+ maximum: 9007199254740991
11871
+ },
11872
+ activeDays: {
11873
+ type: "integer",
11874
+ minimum: 0,
11875
+ maximum: 9007199254740991
11876
+ },
11877
+ activeWeeks: {
11878
+ type: "integer",
11879
+ minimum: 0,
11880
+ maximum: 53
11881
+ },
11882
+ firstObservedAt: {
11883
+ anyOf: [
11884
+ {
11885
+ type: "string",
11886
+ format: "date-time",
11887
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
11888
+ },
11889
+ {
11890
+ type: "null"
11891
+ }
11892
+ ]
11893
+ },
11894
+ lastObservedAt: {
11895
+ anyOf: [
11896
+ {
11897
+ type: "string",
11898
+ format: "date-time",
11899
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
11900
+ },
11901
+ {
11902
+ type: "null"
11903
+ }
11904
+ ]
11905
+ },
11906
+ weeklyUsage: {
11907
+ maxItems: 53,
11908
+ type: "array",
11909
+ items: {
11910
+ oneOf: [
11911
+ {
11912
+ type: "object",
11913
+ properties: {
11914
+ weekStartAt: {
11915
+ type: "string",
11916
+ format: "date-time",
11917
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
11918
+ },
11919
+ coverage: {
11920
+ type: "string",
11921
+ enum: [
11922
+ "complete",
11923
+ "partial"
11924
+ ]
11925
+ },
11926
+ eventCount: {
11927
+ type: "integer",
11928
+ minimum: 0,
11929
+ maximum: 9007199254740991
11930
+ },
11931
+ activeDays: {
11932
+ type: "integer",
11933
+ minimum: 0,
11934
+ maximum: 7
11935
+ }
11936
+ },
11937
+ required: [
11938
+ "weekStartAt",
11939
+ "coverage",
11940
+ "eventCount",
11941
+ "activeDays"
11942
+ ],
11943
+ additionalProperties: false
11944
+ },
11945
+ {
11946
+ type: "object",
11947
+ properties: {
11948
+ weekStartAt: {
11949
+ type: "string",
11950
+ format: "date-time",
11951
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
11952
+ },
11953
+ coverage: {
11954
+ type: "string",
11955
+ const: "unavailable"
11956
+ }
11957
+ },
11958
+ required: [
11959
+ "weekStartAt",
11960
+ "coverage"
11961
+ ],
11962
+ additionalProperties: false
11963
+ }
11964
+ ]
11965
+ }
11966
+ }
11967
+ },
11968
+ required: [
11969
+ "window",
11970
+ "coverage",
11971
+ "eventCount",
11972
+ "activeDays",
11973
+ "activeWeeks",
11974
+ "firstObservedAt",
11975
+ "lastObservedAt"
11976
+ ],
11977
+ additionalProperties: false
11978
+ },
11979
+ {
11980
+ type: "object",
11981
+ properties: {
11982
+ window: {
11983
+ type: "object",
11984
+ properties: {
11985
+ startAt: {
11986
+ type: "string",
11987
+ format: "date-time",
11988
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
11989
+ },
11990
+ endAt: {
11991
+ type: "string",
11992
+ format: "date-time",
11993
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
11994
+ }
11995
+ },
11996
+ required: [
11997
+ "startAt",
11998
+ "endAt"
11999
+ ],
12000
+ additionalProperties: false
12001
+ },
12002
+ coverage: {
12003
+ type: "string",
12004
+ const: "unavailable"
12005
+ },
12006
+ reason: {
12007
+ type: "string",
12008
+ enum: [
12009
+ "SOURCE_BLOCKED",
12010
+ "SOURCE_NOT_READY",
12011
+ "QUERY_FAILED"
12012
+ ]
12013
+ }
12014
+ },
12015
+ required: [
12016
+ "window",
12017
+ "coverage",
12018
+ "reason"
12019
+ ],
12020
+ additionalProperties: false
12021
+ }
12022
+ ]
12023
+ }
12024
+ },
12025
+ required: [
12026
+ "id",
12027
+ "revision",
12028
+ "sourceKey",
12029
+ "featureKey",
12030
+ "name",
12031
+ "rule",
12032
+ "evidence"
12033
+ ],
12034
+ additionalProperties: false
12035
+ }
12036
+ }
12037
+ },
12038
+ required: [
12039
+ "customer",
12040
+ "features"
12041
+ ],
12042
+ additionalProperties: false
12043
+ }
12044
+ },
12045
+ outlit_list_attention_items: {
12046
+ toolName: "outlit_list_attention_items",
12047
+ commandId: "attention.list",
12048
+ commandVersion: 1,
12049
+ ownerDomain: "attention",
12050
+ title: "List Attention Items",
12051
+ description: "List authorized open or resolved Attention items. Returns bounded customer identity, current priority, ARR importance, lifecycle timestamps, and a prepared-action URL without evidence bodies or internal agent state.",
12052
+ inputSchema: {
12053
+ $schema: "https://json-schema.org/draft/2020-12/schema",
12054
+ type: "object",
12055
+ properties: {
12056
+ status: {
12057
+ description: "Attention lifecycle to list (default: open)",
12058
+ default: "open",
12059
+ type: "string",
12060
+ enum: [
12061
+ "open",
12062
+ "resolved"
12063
+ ]
12064
+ },
12065
+ customerId: {
12066
+ description: "Filter by exact customer ID",
12067
+ type: "string",
12068
+ format: "uuid",
12069
+ pattern: "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
12070
+ },
12071
+ limit: {
12072
+ description: "Results per page (default: 25, max: 100)",
12073
+ default: 25,
12074
+ type: "integer",
12075
+ minimum: 1,
12076
+ maximum: 100
12077
+ },
12078
+ cursor: {
12079
+ description: "Opaque cursor from a previous response with the same filters",
12080
+ type: "string",
12081
+ minLength: 1,
12082
+ maxLength: 2000
12083
+ }
12084
+ },
12085
+ additionalProperties: false
12086
+ },
12087
+ outputSchema: {
12088
+ $schema: "https://json-schema.org/draft/2020-12/schema",
12089
+ type: "object",
12090
+ properties: {
12091
+ items: {
12092
+ maxItems: 100,
12093
+ type: "array",
12094
+ items: {
12095
+ type: "object",
12096
+ properties: {
12097
+ id: {
12098
+ type: "string",
12099
+ minLength: 1,
12100
+ maxLength: 500
12101
+ },
12102
+ customer: {
12103
+ type: "object",
12104
+ properties: {
12105
+ id: {
12106
+ type: "string",
12107
+ minLength: 1,
12108
+ maxLength: 500
12109
+ },
12110
+ name: {
12111
+ type: "string",
12112
+ minLength: 1,
12113
+ maxLength: 500
12114
+ },
12115
+ domain: {
12116
+ type: "string",
12117
+ maxLength: 253
12118
+ },
12119
+ ownerName: {
12120
+ anyOf: [
12121
+ {
12122
+ type: "string",
12123
+ minLength: 1,
12124
+ maxLength: 500
12125
+ },
12126
+ {
12127
+ type: "null"
12128
+ }
12129
+ ]
12130
+ }
12131
+ },
12132
+ required: [
12133
+ "id",
12134
+ "name",
12135
+ "domain",
12136
+ "ownerName"
12137
+ ],
12138
+ additionalProperties: false
12139
+ },
12140
+ title: {
12141
+ type: "string",
12142
+ minLength: 1,
12143
+ maxLength: 240
12144
+ },
12145
+ priority: {
12146
+ type: "string",
12147
+ enum: [
12148
+ "NORMAL",
12149
+ "HIGH",
12150
+ "URGENT"
12151
+ ]
12152
+ },
12153
+ evidenceCount: {
12154
+ type: "integer",
12155
+ minimum: 0,
12156
+ maximum: 50
12157
+ },
12158
+ lifecycle: {
12159
+ type: "object",
12160
+ properties: {
12161
+ status: {
12162
+ type: "string",
12163
+ enum: [
12164
+ "open",
12165
+ "resolved"
12166
+ ]
12167
+ },
12168
+ customerVisibleAt: {
12169
+ type: "string",
12170
+ format: "date-time",
12171
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
12172
+ },
12173
+ resolvedAt: {
12174
+ anyOf: [
12175
+ {
12176
+ type: "string",
12177
+ format: "date-time",
12178
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
12179
+ },
12180
+ {
12181
+ type: "null"
12182
+ }
12183
+ ]
12184
+ },
12185
+ reopenedAt: {
12186
+ anyOf: [
12187
+ {
12188
+ type: "string",
12189
+ format: "date-time",
12190
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
12191
+ },
12192
+ {
12193
+ type: "null"
12194
+ }
12195
+ ]
12196
+ },
12197
+ createdAt: {
12198
+ type: "string",
12199
+ format: "date-time",
12200
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
12201
+ },
12202
+ updatedAt: {
12203
+ type: "string",
12204
+ format: "date-time",
12205
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
12206
+ },
12207
+ materialUpdateAt: {
12208
+ anyOf: [
12209
+ {
12210
+ type: "string",
12211
+ format: "date-time",
12212
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
12213
+ },
12214
+ {
12215
+ type: "null"
12216
+ }
12217
+ ]
12218
+ }
12219
+ },
12220
+ required: [
12221
+ "status",
12222
+ "customerVisibleAt",
12223
+ "resolvedAt",
12224
+ "reopenedAt",
12225
+ "createdAt",
12226
+ "updatedAt",
12227
+ "materialUpdateAt"
12228
+ ],
12229
+ additionalProperties: false
12230
+ },
12231
+ accountImportance: {
12232
+ type: "object",
12233
+ properties: {
12234
+ arrCents: {
12235
+ anyOf: [
12236
+ {
12237
+ type: "number",
12238
+ minimum: 0
12239
+ },
12240
+ {
12241
+ type: "null"
12242
+ }
12243
+ ]
12244
+ },
12245
+ currency: {
12246
+ anyOf: [
12247
+ {
12248
+ type: "string",
12249
+ pattern: "^[A-Z]{3}$"
12250
+ },
12251
+ {
12252
+ type: "null"
12253
+ }
12254
+ ]
12255
+ },
12256
+ arrShareWithinCurrency: {
12257
+ anyOf: [
12258
+ {
12259
+ type: "number",
12260
+ minimum: 0,
12261
+ maximum: 1
12262
+ },
12263
+ {
12264
+ type: "null"
12265
+ }
12266
+ ],
12267
+ description: "Organization ARR share among customers using the same currency"
12268
+ },
12269
+ arrPercentileWithinCurrency: {
12270
+ anyOf: [
12271
+ {
12272
+ type: "number",
12273
+ minimum: 0,
12274
+ maximum: 100
12275
+ },
12276
+ {
12277
+ type: "null"
12278
+ }
12279
+ ],
12280
+ description: "ARR percentile among customers using the same currency"
12281
+ },
12282
+ segments: {
12283
+ maxItems: 50,
12284
+ type: "array",
12285
+ items: {
12286
+ type: "string",
12287
+ minLength: 1,
12288
+ maxLength: 240
12289
+ }
12290
+ }
12291
+ },
12292
+ required: [
12293
+ "arrCents",
12294
+ "currency",
12295
+ "arrShareWithinCurrency",
12296
+ "arrPercentileWithinCurrency",
12297
+ "segments"
12298
+ ],
12299
+ additionalProperties: false
12300
+ },
12301
+ preparedActionUrl: {
12302
+ anyOf: [
12303
+ {
12304
+ type: "string",
12305
+ maxLength: 2000,
12306
+ format: "uri"
12307
+ },
12308
+ {
12309
+ type: "null"
12310
+ }
12311
+ ]
12312
+ }
12313
+ },
12314
+ required: [
12315
+ "id",
12316
+ "customer",
12317
+ "title",
12318
+ "priority",
12319
+ "evidenceCount",
12320
+ "lifecycle",
12321
+ "accountImportance",
12322
+ "preparedActionUrl"
12323
+ ],
12324
+ additionalProperties: false
12325
+ }
12326
+ },
12327
+ pagination: {
12328
+ type: "object",
12329
+ properties: {
12330
+ hasMore: {
12331
+ type: "boolean"
12332
+ },
12333
+ nextCursor: {
12334
+ anyOf: [
12335
+ {
12336
+ type: "string",
12337
+ minLength: 1,
12338
+ maxLength: 2000
12339
+ },
12340
+ {
12341
+ type: "null"
12342
+ }
12343
+ ]
12344
+ },
12345
+ total: {
12346
+ type: "integer",
12347
+ minimum: 0,
12348
+ maximum: 9007199254740991
12349
+ }
12350
+ },
12351
+ required: [
12352
+ "hasMore",
12353
+ "nextCursor",
12354
+ "total"
12355
+ ],
12356
+ additionalProperties: false
12357
+ }
12358
+ },
12359
+ required: [
12360
+ "items",
12361
+ "pagination"
12362
+ ],
12363
+ additionalProperties: false
12364
+ }
12365
+ },
12366
+ outlit_get_attention_item: {
12367
+ toolName: "outlit_get_attention_item",
12368
+ commandId: "attention.get",
12369
+ commandVersion: 1,
12370
+ ownerDomain: "attention",
12371
+ title: "Get Attention Item",
12372
+ description: "Get one authorized Attention item with its bounded current assessment, timeline, evidence summaries, and prepared-action URL. Does not return evidence IDs, quotes, email drafts, or internal agent state.",
12373
+ inputSchema: {
12374
+ $schema: "https://json-schema.org/draft/2020-12/schema",
12375
+ type: "object",
12376
+ properties: {
12377
+ id: {
12378
+ type: "string",
12379
+ format: "uuid",
12380
+ pattern: "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
12381
+ description: "Exact Attention item ID"
12382
+ }
12383
+ },
12384
+ required: [
12385
+ "id"
12386
+ ],
12387
+ additionalProperties: false
12388
+ },
12389
+ outputSchema: {
12390
+ $schema: "https://json-schema.org/draft/2020-12/schema",
12391
+ type: "object",
12392
+ properties: {
12393
+ id: {
12394
+ type: "string",
12395
+ minLength: 1,
12396
+ maxLength: 500
12397
+ },
12398
+ customer: {
12399
+ type: "object",
12400
+ properties: {
12401
+ id: {
12402
+ type: "string",
12403
+ minLength: 1,
12404
+ maxLength: 500
12405
+ },
12406
+ name: {
12407
+ type: "string",
12408
+ minLength: 1,
12409
+ maxLength: 500
12410
+ },
12411
+ domain: {
12412
+ type: "string",
12413
+ maxLength: 253
12414
+ },
12415
+ ownerName: {
12416
+ anyOf: [
12417
+ {
12418
+ type: "string",
12419
+ minLength: 1,
12420
+ maxLength: 500
12421
+ },
12422
+ {
12423
+ type: "null"
12424
+ }
12425
+ ]
12426
+ }
12427
+ },
12428
+ required: [
12429
+ "id",
12430
+ "name",
12431
+ "domain",
12432
+ "ownerName"
12433
+ ],
12434
+ additionalProperties: false
12435
+ },
12436
+ title: {
12437
+ type: "string",
12438
+ minLength: 1,
12439
+ maxLength: 240
12440
+ },
12441
+ priority: {
12442
+ type: "string",
12443
+ enum: [
12444
+ "NORMAL",
12445
+ "HIGH",
12446
+ "URGENT"
12447
+ ]
12448
+ },
12449
+ evidenceCount: {
12450
+ type: "integer",
12451
+ minimum: 0,
12452
+ maximum: 50
12453
+ },
12454
+ lifecycle: {
12455
+ type: "object",
12456
+ properties: {
12457
+ status: {
12458
+ type: "string",
12459
+ enum: [
12460
+ "open",
12461
+ "resolved"
12462
+ ]
12463
+ },
12464
+ customerVisibleAt: {
12465
+ type: "string",
12466
+ format: "date-time",
12467
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
12468
+ },
12469
+ resolvedAt: {
12470
+ anyOf: [
12471
+ {
12472
+ type: "string",
12473
+ format: "date-time",
12474
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
12475
+ },
12476
+ {
12477
+ type: "null"
12478
+ }
12479
+ ]
12480
+ },
12481
+ reopenedAt: {
12482
+ anyOf: [
12483
+ {
12484
+ type: "string",
12485
+ format: "date-time",
12486
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
12487
+ },
12488
+ {
12489
+ type: "null"
12490
+ }
12491
+ ]
12492
+ },
12493
+ createdAt: {
12494
+ type: "string",
12495
+ format: "date-time",
12496
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
12497
+ },
12498
+ updatedAt: {
12499
+ type: "string",
12500
+ format: "date-time",
12501
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
12502
+ },
12503
+ materialUpdateAt: {
12504
+ anyOf: [
12505
+ {
12506
+ type: "string",
12507
+ format: "date-time",
12508
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
12509
+ },
12510
+ {
12511
+ type: "null"
12512
+ }
12513
+ ]
12514
+ }
12515
+ },
12516
+ required: [
12517
+ "status",
12518
+ "customerVisibleAt",
12519
+ "resolvedAt",
12520
+ "reopenedAt",
12521
+ "createdAt",
12522
+ "updatedAt",
12523
+ "materialUpdateAt"
12524
+ ],
12525
+ additionalProperties: false
12526
+ },
12527
+ accountImportance: {
12528
+ type: "object",
12529
+ properties: {
12530
+ arrCents: {
12531
+ anyOf: [
12532
+ {
12533
+ type: "number",
12534
+ minimum: 0
12535
+ },
12536
+ {
12537
+ type: "null"
12538
+ }
12539
+ ]
12540
+ },
12541
+ currency: {
12542
+ anyOf: [
12543
+ {
12544
+ type: "string",
12545
+ pattern: "^[A-Z]{3}$"
12546
+ },
12547
+ {
12548
+ type: "null"
12549
+ }
12550
+ ]
12551
+ },
12552
+ arrShareWithinCurrency: {
12553
+ anyOf: [
12554
+ {
12555
+ type: "number",
12556
+ minimum: 0,
12557
+ maximum: 1
12558
+ },
12559
+ {
12560
+ type: "null"
12561
+ }
12562
+ ],
12563
+ description: "Organization ARR share among customers using the same currency"
12564
+ },
12565
+ arrPercentileWithinCurrency: {
12566
+ anyOf: [
12567
+ {
12568
+ type: "number",
12569
+ minimum: 0,
12570
+ maximum: 100
12571
+ },
12572
+ {
12573
+ type: "null"
12574
+ }
12575
+ ],
12576
+ description: "ARR percentile among customers using the same currency"
12577
+ },
12578
+ segments: {
12579
+ maxItems: 50,
12580
+ type: "array",
12581
+ items: {
12582
+ type: "string",
12583
+ minLength: 1,
12584
+ maxLength: 240
12585
+ }
12586
+ }
12587
+ },
12588
+ required: [
12589
+ "arrCents",
12590
+ "currency",
12591
+ "arrShareWithinCurrency",
12592
+ "arrPercentileWithinCurrency",
12593
+ "segments"
12594
+ ],
12595
+ additionalProperties: false
12596
+ },
12597
+ preparedActionUrl: {
12598
+ anyOf: [
12599
+ {
12600
+ type: "string",
12601
+ maxLength: 2000,
12602
+ format: "uri"
12603
+ },
12604
+ {
12605
+ type: "null"
12606
+ }
12607
+ ]
12608
+ },
12609
+ whatChanged: {
12610
+ type: "string",
12611
+ minLength: 1,
12612
+ maxLength: 8000
12613
+ },
12614
+ whyItMatters: {
12615
+ type: "string",
12616
+ minLength: 1,
12617
+ maxLength: 8000
12618
+ },
12619
+ uncertainty: {
12620
+ anyOf: [
12621
+ {
12622
+ type: "string",
12623
+ minLength: 1,
12624
+ maxLength: 8000
12625
+ },
12626
+ {
12627
+ type: "null"
12628
+ }
12629
+ ]
12630
+ },
12631
+ priorityReason: {
12632
+ type: "string",
12633
+ minLength: 1,
12634
+ maxLength: 8000
12635
+ },
12636
+ timeline: {
12637
+ maxItems: 20,
12638
+ type: "array",
12639
+ items: {
12640
+ type: "object",
12641
+ properties: {
12642
+ title: {
12643
+ type: "string",
12644
+ minLength: 1,
12645
+ maxLength: 240
12646
+ },
12647
+ explanation: {
12648
+ type: "string",
12649
+ minLength: 1,
12650
+ maxLength: 4000
12651
+ },
12652
+ observedAt: {
12653
+ type: "string",
12654
+ format: "date-time",
12655
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
12656
+ }
10947
12657
  },
10948
- definitions: {
10949
- minItems: 2,
10950
- maxItems: 2,
10951
- type: "array",
10952
- items: {
10953
- type: "object",
10954
- properties: {
10955
- id: {
12658
+ required: [
12659
+ "title",
12660
+ "explanation",
12661
+ "observedAt"
12662
+ ],
12663
+ additionalProperties: false
12664
+ }
12665
+ },
12666
+ evidence: {
12667
+ maxItems: 20,
12668
+ type: "array",
12669
+ items: {
12670
+ type: "object",
12671
+ properties: {
12672
+ role: {
12673
+ type: "string",
12674
+ enum: [
12675
+ "supporting",
12676
+ "contradictory",
12677
+ "context"
12678
+ ]
12679
+ },
12680
+ kind: {
12681
+ type: "string",
12682
+ enum: [
12683
+ "metric",
12684
+ "communication",
12685
+ "record",
12686
+ "event"
12687
+ ]
12688
+ },
12689
+ title: {
12690
+ type: "string",
12691
+ minLength: 1,
12692
+ maxLength: 500
12693
+ },
12694
+ observedAt: {
12695
+ anyOf: [
12696
+ {
10956
12697
  type: "string",
10957
- format: "uuid",
10958
- pattern: "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
12698
+ format: "date-time",
12699
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
10959
12700
  },
10960
- metricKey: {
10961
- type: "string",
10962
- minLength: 1,
10963
- maxLength: 191
12701
+ {
12702
+ type: "null"
12703
+ }
12704
+ ]
12705
+ },
12706
+ window: {
12707
+ anyOf: [
12708
+ {
12709
+ type: "object",
12710
+ properties: {
12711
+ start: {
12712
+ type: "string",
12713
+ format: "date-time",
12714
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
12715
+ },
12716
+ end: {
12717
+ type: "string",
12718
+ format: "date-time",
12719
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
12720
+ }
12721
+ },
12722
+ required: [
12723
+ "start",
12724
+ "end"
12725
+ ],
12726
+ additionalProperties: false
10964
12727
  },
10965
- aggregation: {
10966
- type: "string",
10967
- enum: [
10968
- "active_days",
10969
- "event_count"
10970
- ]
12728
+ {
12729
+ type: "null"
10971
12730
  }
10972
- },
10973
- required: [
10974
- "id",
10975
- "metricKey",
10976
- "aggregation"
10977
- ],
10978
- additionalProperties: false
12731
+ ]
12732
+ },
12733
+ sourceLabel: {
12734
+ type: "string",
12735
+ minLength: 1,
12736
+ maxLength: 240
10979
12737
  }
12738
+ },
12739
+ required: [
12740
+ "role",
12741
+ "kind",
12742
+ "title",
12743
+ "observedAt",
12744
+ "window",
12745
+ "sourceLabel"
12746
+ ],
12747
+ additionalProperties: false
12748
+ }
12749
+ },
12750
+ latestUpdate: {
12751
+ anyOf: [
12752
+ {
12753
+ type: "object",
12754
+ properties: {
12755
+ updatedAt: {
12756
+ type: "string",
12757
+ format: "date-time",
12758
+ pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
12759
+ },
12760
+ summary: {
12761
+ type: "string",
12762
+ minLength: 1,
12763
+ maxLength: 8000
12764
+ }
12765
+ },
12766
+ required: [
12767
+ "updatedAt",
12768
+ "summary"
12769
+ ],
12770
+ additionalProperties: false
12771
+ },
12772
+ {
12773
+ type: "null"
10980
12774
  }
10981
- },
10982
- required: [
10983
- "sourceKey",
10984
- "behaviorKey",
10985
- "label",
10986
- "eventSelection",
10987
- "status",
10988
- "evaluationMode",
10989
- "definitions"
10990
- ],
10991
- additionalProperties: false
12775
+ ]
10992
12776
  }
10993
12777
  },
10994
12778
  required: [
10995
- "created",
10996
- "metric"
12779
+ "id",
12780
+ "customer",
12781
+ "title",
12782
+ "priority",
12783
+ "evidenceCount",
12784
+ "lifecycle",
12785
+ "accountImportance",
12786
+ "preparedActionUrl",
12787
+ "whatChanged",
12788
+ "whyItMatters",
12789
+ "uncertainty",
12790
+ "priorityReason",
12791
+ "timeline",
12792
+ "evidence",
12793
+ "latestUpdate"
10997
12794
  ],
10998
12795
  additionalProperties: false
10999
12796
  }
@@ -11029,6 +12826,7 @@ Returns column definitions and example queries for each view.`,
11029
12826
  "outlit_list_users",
11030
12827
  "outlit_list_workspace_users",
11031
12828
  "outlit_get_customer",
12829
+ "outlit_get_customer_relationship",
11032
12830
  "outlit_assign_customer_owner",
11033
12831
  "outlit_grant_customer_access",
11034
12832
  "outlit_update_customer_access",
@@ -11057,13 +12855,20 @@ Returns column definitions and example queries for each view.`,
11057
12855
  "outlit_preview_customer_activation",
11058
12856
  "outlit_update_customer_activation",
11059
12857
  "outlit_get_workspace_settings",
11060
- "outlit_update_workspace_settings"
12858
+ "outlit_update_workspace_settings",
12859
+ "outlit_list_features",
12860
+ "outlit_create_feature",
12861
+ "outlit_archive_feature",
12862
+ "outlit_get_customer_features",
12863
+ "outlit_list_attention_items",
12864
+ "outlit_get_attention_item"
11061
12865
  ],
11062
12866
  cli: [
11063
12867
  "outlit_list_customers",
11064
12868
  "outlit_list_users",
11065
12869
  "outlit_list_workspace_users",
11066
12870
  "outlit_get_customer",
12871
+ "outlit_get_customer_relationship",
11067
12872
  "outlit_assign_customer_owner",
11068
12873
  "outlit_grant_customer_access",
11069
12874
  "outlit_update_customer_access",
@@ -11093,9 +12898,12 @@ Returns column definitions and example queries for each view.`,
11093
12898
  "outlit_update_customer_activation",
11094
12899
  "outlit_get_workspace_settings",
11095
12900
  "outlit_update_workspace_settings",
11096
- "outlit_list_behavior_metric_sources",
11097
- "outlit_list_behavior_metric_events",
11098
- "outlit_create_behavior_metric"
12901
+ "outlit_list_features",
12902
+ "outlit_create_feature",
12903
+ "outlit_archive_feature",
12904
+ "outlit_get_customer_features",
12905
+ "outlit_list_attention_items",
12906
+ "outlit_get_attention_item"
11099
12907
  ]
11100
12908
  };
11101
12909
  toolGatewayTransport = {
@@ -12522,24 +14330,159 @@ var exports_update = {};
12522
14330
  __export(exports_update, {
12523
14331
  default: () => update_default
12524
14332
  });
12525
- var update_default;
12526
- var init_update = __esm(() => {
14333
+ var update_default;
14334
+ var init_update = __esm(() => {
14335
+ init_dist();
14336
+ init_auth();
14337
+ init_output2();
14338
+ init_activation();
14339
+ init_api();
14340
+ update_default = defineCommand2({
14341
+ meta: {
14342
+ name: "update",
14343
+ description: [
14344
+ "Update the exact ordinary product event used for monotonic activation.",
14345
+ "",
14346
+ "Core applies the first matching product event to eligible contacts and their resolved",
14347
+ "company. Applications keep sending ordinary events; the CLI does not activate subjects.",
14348
+ "",
14349
+ "Examples:",
14350
+ " outlit activation update --event integration_connected --json",
14351
+ "",
14352
+ AGENT_JSON_HINT
14353
+ ].join(`
14354
+ `)
14355
+ },
14356
+ args: {
14357
+ ...authArgs,
14358
+ ...outputArgs,
14359
+ ...activationEventArg
14360
+ },
14361
+ async run({ args }) {
14362
+ const json = !!args.json;
14363
+ const eventName = parseActivationEvent(args, json);
14364
+ const client = await getClientOrExit(args["api-key"], json);
14365
+ return runTool(client, "outlit_update_customer_activation", { eventName }, json, {
14366
+ spinnerMessage: "Updating activation event..."
14367
+ });
14368
+ }
14369
+ });
14370
+ });
14371
+
14372
+ // src/commands/activation/disable.ts
14373
+ var exports_disable = {};
14374
+ __export(exports_disable, {
14375
+ default: () => disable_default
14376
+ });
14377
+ var disable_default;
14378
+ var init_disable = __esm(() => {
14379
+ init_dist();
14380
+ init_auth();
14381
+ init_output2();
14382
+ init_api();
14383
+ disable_default = defineCommand2({
14384
+ meta: {
14385
+ name: "disable",
14386
+ description: [
14387
+ "Disable future activation matching for contacts and companies.",
14388
+ "",
14389
+ "Existing contact and company activation timestamps remain unchanged.",
14390
+ "",
14391
+ "Examples:",
14392
+ " outlit activation disable --json",
14393
+ "",
14394
+ AGENT_JSON_HINT
14395
+ ].join(`
14396
+ `)
14397
+ },
14398
+ args: {
14399
+ ...authArgs,
14400
+ ...outputArgs
14401
+ },
14402
+ async run({ args }) {
14403
+ const json = !!args.json;
14404
+ const client = await getClientOrExit(args["api-key"], json);
14405
+ return runTool(client, "outlit_update_customer_activation", { eventName: null }, json, {
14406
+ spinnerMessage: "Disabling activation matching..."
14407
+ });
14408
+ }
14409
+ });
14410
+ });
14411
+
14412
+ // src/commands/activation/index.ts
14413
+ var exports_activation = {};
14414
+ __export(exports_activation, {
14415
+ default: () => activation_default
14416
+ });
14417
+ var activation_default;
14418
+ var init_activation2 = __esm(() => {
14419
+ init_dist();
14420
+ init_output2();
14421
+ activation_default = defineCommand2({
14422
+ meta: {
14423
+ name: "activation",
14424
+ description: [
14425
+ "Inspect, preview, and configure the product event used for activation.",
14426
+ "",
14427
+ "The same exact event activates eligible contacts and their resolved company.",
14428
+ "Core writes each activation timestamp once; later matches are no-ops.",
14429
+ "",
14430
+ "Commands:",
14431
+ " get Get the configured activation event",
14432
+ " preview Preview historical exact-event matches",
14433
+ " update Update the configured activation event",
14434
+ " disable Disable future activation matching",
14435
+ "",
14436
+ "Examples:",
14437
+ " outlit activation get --json",
14438
+ " outlit activation preview --event integration_connected --json",
14439
+ " outlit activation update --event integration_connected --json",
14440
+ " outlit activation disable --json",
14441
+ "",
14442
+ AGENT_JSON_HINT
14443
+ ].join(`
14444
+ `)
14445
+ },
14446
+ subCommands: {
14447
+ get: () => Promise.resolve().then(() => (init_get(), exports_get)).then((module) => module.default),
14448
+ preview: () => Promise.resolve().then(() => (init_preview(), exports_preview)).then((module) => module.default),
14449
+ update: () => Promise.resolve().then(() => (init_update(), exports_update)).then((module) => module.default),
14450
+ disable: () => Promise.resolve().then(() => (init_disable(), exports_disable)).then((module) => module.default)
14451
+ }
14452
+ });
14453
+ });
14454
+
14455
+ // src/commands/attention/list.ts
14456
+ var exports_list = {};
14457
+ __export(exports_list, {
14458
+ default: () => list_default
14459
+ });
14460
+ function isOneOf(values, value) {
14461
+ return value !== undefined && values.includes(value);
14462
+ }
14463
+ var statuses, list_default;
14464
+ var init_list = __esm(() => {
14465
+ init_dist4();
12527
14466
  init_dist();
12528
14467
  init_auth();
12529
14468
  init_output2();
12530
- init_activation();
12531
14469
  init_api();
12532
- update_default = defineCommand2({
14470
+ init_output();
14471
+ statuses = ["open", "resolved"];
14472
+ list_default = defineCommand2({
12533
14473
  meta: {
12534
- name: "update",
14474
+ name: "list",
12535
14475
  description: [
12536
- "Update the exact ordinary product event used for monotonic activation.",
14476
+ "List authorized open or resolved Attention items.",
12537
14477
  "",
12538
- "Core applies the first matching product event to eligible contacts and their resolved",
12539
- "company. Applications keep sending ordinary events; the CLI does not activate subjects.",
14478
+ "The response is bounded and includes current priority, lifecycle, customer identity,",
14479
+ "Core-owned ARR importance, and a prepared-action URL when review is available. It does not include email drafts,",
14480
+ "evidence identifiers, raw source-quote fields, or internal agent state.",
12540
14481
  "",
12541
14482
  "Examples:",
12542
- " outlit activation update --event integration_connected --json",
14483
+ " outlit attention list",
14484
+ " outlit attention list --status resolved",
14485
+ " outlit attention list --customer-id 550e8400-e29b-41d4-a716-446655440000 --json",
12543
14486
  "",
12544
14487
  AGENT_JSON_HINT
12545
14488
  ].join(`
@@ -12548,40 +14491,73 @@ var init_update = __esm(() => {
12548
14491
  args: {
12549
14492
  ...authArgs,
12550
14493
  ...outputArgs,
12551
- ...activationEventArg
14494
+ status: {
14495
+ type: "string",
14496
+ description: "Lifecycle filter: open or resolved (Core default: open)"
14497
+ },
14498
+ "customer-id": {
14499
+ type: "string",
14500
+ description: "Filter by exact customer UUID"
14501
+ },
14502
+ limit: {
14503
+ type: "string",
14504
+ description: "Results per page (1-100; Core default: 25)"
14505
+ },
14506
+ cursor: {
14507
+ type: "string",
14508
+ description: "Opaque cursor from a previous response with the same filters"
14509
+ }
12552
14510
  },
12553
14511
  async run({ args }) {
12554
14512
  const json = !!args.json;
12555
- const eventName = parseActivationEvent(args, json);
14513
+ if (args.status !== undefined && !isOneOf(statuses, args.status)) {
14514
+ return outputError({ message: `--status must be one of: ${statuses.join(", ")}`, code: "invalid_input" }, json);
14515
+ }
14516
+ const params = {};
14517
+ if (args.status)
14518
+ params.status = args.status;
14519
+ if (args["customer-id"])
14520
+ params.customerId = args["customer-id"];
14521
+ if (args.limit) {
14522
+ const limit = Number(args.limit);
14523
+ if (!Number.isInteger(limit) || limit < 1 || limit > 100) {
14524
+ return outputError({ message: "--limit must be an integer between 1 and 100", code: "invalid_input" }, json);
14525
+ }
14526
+ params.limit = limit;
14527
+ }
14528
+ if (args.cursor)
14529
+ params.cursor = args.cursor;
12556
14530
  const client = await getClientOrExit(args["api-key"], json);
12557
- return runTool(client, "outlit_update_customer_activation", { eventName }, json, {
12558
- spinnerMessage: "Updating activation event..."
12559
- });
14531
+ return runTool(client, publicToolContracts.outlit_list_attention_items.toolName, params, json);
12560
14532
  }
12561
14533
  });
12562
14534
  });
12563
14535
 
12564
- // src/commands/activation/disable.ts
12565
- var exports_disable = {};
12566
- __export(exports_disable, {
12567
- default: () => disable_default
14536
+ // src/commands/attention/get.ts
14537
+ var exports_get2 = {};
14538
+ __export(exports_get2, {
14539
+ default: () => get_default2
12568
14540
  });
12569
- var disable_default;
12570
- var init_disable = __esm(() => {
14541
+ var get_default2;
14542
+ var init_get2 = __esm(() => {
14543
+ init_dist4();
12571
14544
  init_dist();
12572
14545
  init_auth();
12573
14546
  init_output2();
12574
14547
  init_api();
12575
- disable_default = defineCommand2({
14548
+ get_default2 = defineCommand2({
12576
14549
  meta: {
12577
- name: "disable",
14550
+ name: "get",
12578
14551
  description: [
12579
- "Disable future activation matching for contacts and companies.",
14552
+ "Get one authorized Attention item by exact ID.",
12580
14553
  "",
12581
- "Existing contact and company activation timestamps remain unchanged.",
14554
+ "Returns the bounded current assessment, timeline, evidence summaries, Core-owned ARR",
14555
+ "importance, and a prepared-action URL when review is available. It does not expose email drafts, evidence IDs,",
14556
+ "raw source-quote fields, or internal agent state.",
12582
14557
  "",
12583
14558
  "Examples:",
12584
- " outlit activation disable --json",
14559
+ " outlit attention get 550e8400-e29b-41d4-a716-446655440000",
14560
+ " outlit attention get 550e8400-e29b-41d4-a716-446655440000 --json",
12585
14561
  "",
12586
14562
  AGENT_JSON_HINT
12587
14563
  ].join(`
@@ -12589,57 +14565,47 @@ var init_disable = __esm(() => {
12589
14565
  },
12590
14566
  args: {
12591
14567
  ...authArgs,
12592
- ...outputArgs
14568
+ ...outputArgs,
14569
+ id: {
14570
+ type: "positional",
14571
+ description: "Exact Attention item UUID",
14572
+ required: true
14573
+ }
12593
14574
  },
12594
14575
  async run({ args }) {
12595
14576
  const json = !!args.json;
12596
14577
  const client = await getClientOrExit(args["api-key"], json);
12597
- return runTool(client, "outlit_update_customer_activation", { eventName: null }, json, {
12598
- spinnerMessage: "Disabling activation matching..."
12599
- });
14578
+ return runTool(client, publicToolContracts.outlit_get_attention_item.toolName, { id: args.id }, json);
12600
14579
  }
12601
14580
  });
12602
14581
  });
12603
14582
 
12604
- // src/commands/activation/index.ts
12605
- var exports_activation = {};
12606
- __export(exports_activation, {
12607
- default: () => activation_default
14583
+ // src/commands/attention/index.ts
14584
+ var exports_attention = {};
14585
+ __export(exports_attention, {
14586
+ default: () => attention_default
12608
14587
  });
12609
- var activation_default;
12610
- var init_activation2 = __esm(() => {
14588
+ var attention_default;
14589
+ var init_attention = __esm(() => {
12611
14590
  init_dist();
12612
14591
  init_output2();
12613
- activation_default = defineCommand2({
14592
+ attention_default = defineCommand2({
12614
14593
  meta: {
12615
- name: "activation",
14594
+ name: "attention",
12616
14595
  description: [
12617
- "Inspect, preview, and configure the product event used for activation.",
12618
- "",
12619
- "The same exact event activates eligible contacts and their resolved company.",
12620
- "Core writes each activation timestamp once; later matches are no-ops.",
12621
- "",
12622
- "Commands:",
12623
- " get Get the configured activation event",
12624
- " preview Preview historical exact-event matches",
12625
- " update Update the configured activation event",
12626
- " disable Disable future activation matching",
14596
+ "Inspect authorized customer Attention items.",
12627
14597
  "",
12628
- "Examples:",
12629
- " outlit activation get --json",
12630
- " outlit activation preview --event integration_connected --json",
12631
- " outlit activation update --event integration_connected --json",
12632
- " outlit activation disable --json",
14598
+ "Subcommands:",
14599
+ " list -- list open or resolved Attention items",
14600
+ " get -- get one Attention item by exact ID",
12633
14601
  "",
12634
14602
  AGENT_JSON_HINT
12635
14603
  ].join(`
12636
14604
  `)
12637
14605
  },
12638
14606
  subCommands: {
12639
- get: () => Promise.resolve().then(() => (init_get(), exports_get)).then((module) => module.default),
12640
- preview: () => Promise.resolve().then(() => (init_preview(), exports_preview)).then((module) => module.default),
12641
- update: () => Promise.resolve().then(() => (init_update(), exports_update)).then((module) => module.default),
12642
- disable: () => Promise.resolve().then(() => (init_disable(), exports_disable)).then((module) => module.default)
14607
+ list: () => Promise.resolve().then(() => (init_list(), exports_list)).then((module) => module.default),
14608
+ get: () => Promise.resolve().then(() => (init_get2(), exports_get2)).then((module) => module.default)
12643
14609
  }
12644
14610
  });
12645
14611
  });
@@ -12865,9 +14831,9 @@ var init_platform_input = __esm(() => {
12865
14831
  });
12866
14832
 
12867
14833
  // src/commands/customers/list.ts
12868
- var exports_list = {};
12869
- __export(exports_list, {
12870
- default: () => list_default
14834
+ var exports_list2 = {};
14835
+ __export(exports_list2, {
14836
+ default: () => list_default2
12871
14837
  });
12872
14838
  function normalizeCustomerListResult(data) {
12873
14839
  if (typeof data !== "object" || data === null || Array.isArray(data)) {
@@ -12896,8 +14862,8 @@ function normalizeCustomerListResult(data) {
12896
14862
  })
12897
14863
  };
12898
14864
  }
12899
- var list_default;
12900
- var init_list = __esm(() => {
14865
+ var list_default2;
14866
+ var init_list2 = __esm(() => {
12901
14867
  init_dist4();
12902
14868
  init_dist();
12903
14869
  init_auth();
@@ -12907,7 +14873,7 @@ var init_list = __esm(() => {
12907
14873
  init_api();
12908
14874
  init_output();
12909
14875
  init_platform_input();
12910
- list_default = defineCommand2({
14876
+ list_default2 = defineCommand2({
12911
14877
  meta: {
12912
14878
  name: "list",
12913
14879
  description: [
@@ -13039,38 +15005,190 @@ var init_list = __esm(() => {
13039
15005
  });
13040
15006
 
13041
15007
  // src/commands/customers/get.ts
13042
- var exports_get2 = {};
13043
- __export(exports_get2, {
13044
- default: () => get_default2
15008
+ var exports_get3 = {};
15009
+ __export(exports_get3, {
15010
+ default: () => get_default3
13045
15011
  });
13046
- var get_default2;
13047
- var init_get2 = __esm(() => {
15012
+ var get_default3;
15013
+ var init_get3 = __esm(() => {
13048
15014
  init_dist4();
13049
15015
  init_dist();
13050
15016
  init_auth();
13051
15017
  init_output2();
13052
15018
  init_api();
13053
15019
  init_config();
13054
- get_default2 = defineCommand2({
15020
+ get_default3 = defineCommand2({
15021
+ meta: {
15022
+ name: "get",
15023
+ description: [
15024
+ "Get details for a customer by ID, domain, or name.",
15025
+ "",
15026
+ "The customer argument accepts:",
15027
+ " - Customer domain (acme.com)",
15028
+ " - Customer ID (UUID)",
15029
+ " - Customer name (partial match)",
15030
+ "",
15031
+ 'The primary record is returned under "customer". --include users adds "users".',
15032
+ "",
15033
+ `Available include sections: ${customerIncludeSections.join(", ")}`,
15034
+ `Timeframes: ${customerTimeframes.join(", ")}`,
15035
+ "",
15036
+ "Examples:",
15037
+ " outlit customers get acme.com",
15038
+ " outlit customers get acme.com --include users,revenue",
15039
+ " outlit customers get acme.com --include users,revenue,recentTimeline --timeframe 90d",
15040
+ "",
15041
+ AGENT_JSON_HINT
15042
+ ].join(`
15043
+ `)
15044
+ },
15045
+ args: {
15046
+ ...authArgs,
15047
+ ...outputArgs,
15048
+ customer: {
15049
+ type: "positional",
15050
+ description: "Customer ID, domain (acme.com), or name",
15051
+ required: true
15052
+ },
15053
+ include: {
15054
+ type: "string",
15055
+ description: [
15056
+ "Comma-separated sections to include in response.",
15057
+ `Available: ${customerIncludeSections.join(", ")}`,
15058
+ 'Included sections use their contract keys, such as "users" and "revenue".'
15059
+ ].join(`
15060
+ `)
15061
+ },
15062
+ timeframe: {
15063
+ type: "string",
15064
+ description: "Timeframe for metrics (7d, 14d, 30d, 90d)",
15065
+ default: "30d"
15066
+ }
15067
+ },
15068
+ async run({ args }) {
15069
+ const json = !!args.json;
15070
+ const client = await getClientOrExit(args["api-key"], json);
15071
+ const params = {
15072
+ customer: args.customer,
15073
+ timeframe: args.timeframe
15074
+ };
15075
+ if (args.include) {
15076
+ params.include = splitCsv(args.include);
15077
+ }
15078
+ return runTool(client, publicToolContracts.outlit_get_customer.toolName, params, json);
15079
+ }
15080
+ });
15081
+ });
15082
+
15083
+ // src/commands/customers/relationship.ts
15084
+ var exports_relationship = {};
15085
+ __export(exports_relationship, {
15086
+ default: () => relationship_default
15087
+ });
15088
+ var relationship_default;
15089
+ var init_relationship = __esm(() => {
15090
+ init_dist4();
15091
+ init_dist();
15092
+ init_auth();
15093
+ init_output2();
15094
+ init_api();
15095
+ relationship_default = defineCommand2({
15096
+ meta: {
15097
+ name: "relationship",
15098
+ description: [
15099
+ "Get the bounded relationship for a customer.",
15100
+ "",
15101
+ "Returns the durable customer-detail read model: a relationship summary, up to eight categorized",
15102
+ "current statements, ISO observed-at timestamps when supported, source labels, and a compiled",
15103
+ "summary timestamp when available. It does not expand the compact customer get response, expose",
15104
+ "raw fact IDs or source quotes, or replace the chronological timeline.",
15105
+ "",
15106
+ "The customer argument accepts:",
15107
+ " - Customer domain (acme.com)",
15108
+ " - Customer ID (UUID)",
15109
+ " - Exact customer name",
15110
+ "",
15111
+ "Examples:",
15112
+ " outlit customers relationship acme.com",
15113
+ " outlit customers relationship acme.com --json",
15114
+ "",
15115
+ AGENT_JSON_HINT
15116
+ ].join(`
15117
+ `)
15118
+ },
15119
+ args: {
15120
+ ...authArgs,
15121
+ ...outputArgs,
15122
+ customer: {
15123
+ type: "positional",
15124
+ description: "Customer ID, domain (acme.com), or name",
15125
+ required: true
15126
+ }
15127
+ },
15128
+ async run({ args }) {
15129
+ const json = !!args.json;
15130
+ const client = await getClientOrExit(args["api-key"], json);
15131
+ return runTool(client, publicToolContracts.outlit_get_customer_relationship.toolName, { customer: args.customer }, json);
15132
+ }
15133
+ });
15134
+ });
15135
+
15136
+ // src/commands/features/input.ts
15137
+ function parseBoundedInteger2(value, fallback, flag, min, max, json) {
15138
+ const parsed = parseIntegerFlag(value, fallback, flag, json);
15139
+ if (parsed < min || parsed > max) {
15140
+ return outputError({ message: `${flag} must be an integer from ${min} to ${max}`, code: "invalid_input" }, json);
15141
+ }
15142
+ return parsed;
15143
+ }
15144
+ function parsePropertyFilters(value, json) {
15145
+ if (!value?.trim())
15146
+ return [];
15147
+ try {
15148
+ const parsed = JSON.parse(value);
15149
+ if (!Array.isArray(parsed)) {
15150
+ return outputError({ message: "--property-filters must be a JSON array", code: "invalid_input" }, json);
15151
+ }
15152
+ return parsed;
15153
+ } catch (error) {
15154
+ return outputError({
15155
+ message: `Invalid --property-filters JSON: ${errorMessage(error, "parse failed")}`,
15156
+ code: "invalid_input"
15157
+ }, json);
15158
+ }
15159
+ }
15160
+ var init_input = __esm(() => {
15161
+ init_output();
15162
+ init_platform_input();
15163
+ });
15164
+
15165
+ // src/commands/customers/features.ts
15166
+ var exports_features = {};
15167
+ __export(exports_features, {
15168
+ default: () => features_default
15169
+ });
15170
+ var features_default;
15171
+ var init_features = __esm(() => {
15172
+ init_dist4();
15173
+ init_dist();
15174
+ init_auth();
15175
+ init_output2();
15176
+ init_api();
15177
+ init_platform_input();
15178
+ init_input();
15179
+ features_default = defineCommand2({
13055
15180
  meta: {
13056
- name: "get",
15181
+ name: "features",
13057
15182
  description: [
13058
- "Get details for a customer by ID, domain, or name.",
13059
- "",
13060
- "The customer argument accepts:",
13061
- " - Customer domain (acme.com)",
13062
- " - Customer ID (UUID)",
13063
- " - Customer name (partial match)",
15183
+ "Read exact historical Feature usage for one authorized customer.",
15184
+ "Unavailable source evidence remains distinct from no matches in the requested window.",
13064
15185
  "",
13065
- 'The primary record is returned under "customer". --include users adds "users".',
13066
- "",
13067
- `Available include sections: ${customerIncludeSections.join(", ")}`,
13068
- `Timeframes: ${customerTimeframes.join(", ")}`,
15186
+ "The customer argument accepts a customer domain, UUID, or exact name.",
13069
15187
  "",
13070
15188
  "Examples:",
13071
- " outlit customers get acme.com",
13072
- " outlit customers get acme.com --include users,revenue",
13073
- " outlit customers get acme.com --include users,revenue,recentTimeline --timeframe 90d",
15189
+ " outlit customers features acme.com --json",
15190
+ " outlit customers features acme.com --weeks 6 --json",
15191
+ " outlit customers features acme.com --weeks 53 --weekly --json",
13074
15192
  "",
13075
15193
  AGENT_JSON_HINT
13076
15194
  ].join(`
@@ -13081,35 +15199,24 @@ var init_get2 = __esm(() => {
13081
15199
  ...outputArgs,
13082
15200
  customer: {
13083
15201
  type: "positional",
13084
- description: "Customer ID, domain (acme.com), or name",
15202
+ description: "Customer ID, domain (acme.com), or exact name",
13085
15203
  required: true
13086
15204
  },
13087
- include: {
13088
- type: "string",
13089
- description: [
13090
- "Comma-separated sections to include in response.",
13091
- `Available: ${customerIncludeSections.join(", ")}`,
13092
- 'Included sections use their contract keys, such as "users" and "revenue".'
13093
- ].join(`
13094
- `)
13095
- },
13096
- timeframe: {
13097
- type: "string",
13098
- description: "Timeframe for metrics (7d, 14d, 30d, 90d)",
13099
- default: "30d"
15205
+ weeks: { type: "string", description: "Historical usage window in weeks (1-53, default: 12)" },
15206
+ weekly: {
15207
+ type: "boolean",
15208
+ description: "Include ordered weekly event counts and active days",
15209
+ default: false
13100
15210
  }
13101
15211
  },
13102
15212
  async run({ args }) {
13103
15213
  const json = !!args.json;
13104
15214
  const client = await getClientOrExit(args["api-key"], json);
13105
- const params = {
13106
- customer: args.customer,
13107
- timeframe: args.timeframe
13108
- };
13109
- if (args.include) {
13110
- params.include = splitCsv(args.include);
13111
- }
13112
- return runTool(client, publicToolContracts.outlit_get_customer.toolName, params, json);
15215
+ return runTool(client, publicToolContracts.outlit_get_customer_features.toolName, {
15216
+ customer: requiredTrimmedString(args.customer, "<customer>", json),
15217
+ weeks: parseBoundedInteger2(args.weeks, 12, "--weeks", 1, 53, json),
15218
+ ...args.weekly ? { includeWeeklyUsage: true } : {}
15219
+ }, json, { spinnerMessage: "Loading customer feature usage..." });
13113
15220
  }
13114
15221
  });
13115
15222
  });
@@ -13163,7 +15270,7 @@ var init_timeline = __esm(() => {
13163
15270
  " outlit customers timeline acme.com",
13164
15271
  " outlit customers timeline acme.com --timeframe 90d",
13165
15272
  " outlit customers timeline acme.com --channels COMMUNICATION,MEETING",
13166
- " outlit customers timeline acme.com --start-date 2025-01-01T00:00:00Z --end-date 2025-03-01T23:59:59Z",
15273
+ " outlit customers timeline acme.com --start-date 2025-01-01T00:00:00Z --end-date 2025-03-01T23:59:59.999Z",
13167
15274
  " outlit customers timeline acme.com --event-types PAGE_VIEW,MEETING --limit 50",
13168
15275
  "",
13169
15276
  AGENT_JSON_HINT
@@ -13198,7 +15305,7 @@ var init_timeline = __esm(() => {
13198
15305
  },
13199
15306
  "end-date": {
13200
15307
  type: "string",
13201
- description: "End datetime for the event range (ISO 8601, e.g. 2025-03-01T23:59:59Z). When set, --timeframe is ignored."
15308
+ description: "End datetime for the event range (ISO 8601, e.g. 2025-03-01T23:59:59.999Z). When set, --timeframe is ignored."
13202
15309
  }
13203
15310
  },
13204
15311
  async run({ args }) {
@@ -13456,6 +15563,8 @@ var init_customers = __esm(() => {
13456
15563
  "Subcommands:",
13457
15564
  " list -- list customers with filters",
13458
15565
  " get -- get a specific customer by ID or domain",
15566
+ " relationship -- get the bounded relationship for a customer",
15567
+ " features -- get exact Feature usage for a customer",
13459
15568
  " timeline -- show activity timeline for a customer",
13460
15569
  " owner set -- assign a primary customer owner",
13461
15570
  " grant -- grant or change Viewer or Editor access",
@@ -13466,8 +15575,10 @@ var init_customers = __esm(() => {
13466
15575
  `)
13467
15576
  },
13468
15577
  subCommands: {
13469
- list: () => Promise.resolve().then(() => (init_list(), exports_list)).then((m) => m.default),
13470
- get: () => Promise.resolve().then(() => (init_get2(), exports_get2)).then((m) => m.default),
15578
+ list: () => Promise.resolve().then(() => (init_list2(), exports_list2)).then((m) => m.default),
15579
+ get: () => Promise.resolve().then(() => (init_get3(), exports_get3)).then((m) => m.default),
15580
+ relationship: () => Promise.resolve().then(() => (init_relationship(), exports_relationship)).then((m) => m.default),
15581
+ features: () => Promise.resolve().then(() => (init_features(), exports_features)).then((m) => m.default),
13471
15582
  timeline: () => Promise.resolve().then(() => (init_timeline(), exports_timeline)).then((m) => m.default),
13472
15583
  owner: () => Promise.resolve().then(() => (init_owner(), exports_owner)).then((m) => m.default),
13473
15584
  grant: () => Promise.resolve().then(() => (init_grant(), exports_grant)).then((m) => m.default),
@@ -13477,12 +15588,12 @@ var init_customers = __esm(() => {
13477
15588
  });
13478
15589
 
13479
15590
  // src/commands/users/list.ts
13480
- var exports_list2 = {};
13481
- __export(exports_list2, {
13482
- default: () => list_default2
15591
+ var exports_list3 = {};
15592
+ __export(exports_list3, {
15593
+ default: () => list_default3
13483
15594
  });
13484
- var list_default2;
13485
- var init_list2 = __esm(() => {
15595
+ var list_default3;
15596
+ var init_list3 = __esm(() => {
13486
15597
  init_dist4();
13487
15598
  init_dist();
13488
15599
  init_auth();
@@ -13491,7 +15602,7 @@ var init_list2 = __esm(() => {
13491
15602
  init_pagination();
13492
15603
  init_api();
13493
15604
  init_output();
13494
- list_default2 = defineCommand2({
15605
+ list_default3 = defineCommand2({
13495
15606
  meta: {
13496
15607
  name: "list",
13497
15608
  description: [
@@ -13594,15 +15705,15 @@ var init_users = __esm(() => {
13594
15705
  `)
13595
15706
  },
13596
15707
  subCommands: {
13597
- list: () => Promise.resolve().then(() => (init_list2(), exports_list2)).then((m) => m.default)
15708
+ list: () => Promise.resolve().then(() => (init_list3(), exports_list3)).then((m) => m.default)
13598
15709
  }
13599
15710
  });
13600
15711
  });
13601
15712
 
13602
15713
  // src/commands/ws-users/list.ts
13603
- var exports_list3 = {};
13604
- __export(exports_list3, {
13605
- default: () => list_default3
15714
+ var exports_list4 = {};
15715
+ __export(exports_list4, {
15716
+ default: () => list_default4
13606
15717
  });
13607
15718
  function isWorkspaceUserOrderField(value) {
13608
15719
  return typeof value === "string" && workspaceUserListOrderFields.some((field) => field === value);
@@ -13610,8 +15721,8 @@ function isWorkspaceUserOrderField(value) {
13610
15721
  function isOrderDirection(value) {
13611
15722
  return typeof value === "string" && orderDirections.some((direction) => direction === value);
13612
15723
  }
13613
- var orderDirections, workspaceUserOrderArgs, list_default3;
13614
- var init_list3 = __esm(() => {
15724
+ var orderDirections, workspaceUserOrderArgs, list_default4;
15725
+ var init_list4 = __esm(() => {
13615
15726
  init_dist4();
13616
15727
  init_dist();
13617
15728
  init_auth();
@@ -13632,7 +15743,7 @@ var init_list3 = __esm(() => {
13632
15743
  default: "desc"
13633
15744
  }
13634
15745
  };
13635
- list_default3 = defineCommand2({
15746
+ list_default4 = defineCommand2({
13636
15747
  meta: {
13637
15748
  name: "list",
13638
15749
  description: [
@@ -13740,7 +15851,7 @@ var init_ws_users = __esm(() => {
13740
15851
  `)
13741
15852
  },
13742
15853
  subCommands: {
13743
- list: () => Promise.resolve().then(() => (init_list3(), exports_list3)).then((m) => m.default)
15854
+ list: () => Promise.resolve().then(() => (init_list4(), exports_list4)).then((m) => m.default)
13744
15855
  }
13745
15856
  });
13746
15857
  });
@@ -14898,9 +17009,9 @@ var init_upgrade = __esm(() => {
14898
17009
  });
14899
17010
 
14900
17011
  // src/commands/facts/list.ts
14901
- var exports_list4 = {};
14902
- __export(exports_list4, {
14903
- default: () => list_default4
17012
+ var exports_list5 = {};
17013
+ __export(exports_list5, {
17014
+ default: () => list_default5
14904
17015
  });
14905
17016
  function parseCsvArg(value) {
14906
17017
  if (!value)
@@ -14918,7 +17029,7 @@ function normalizeSourceTypes(values) {
14918
17029
  return;
14919
17030
  return Array.from(new Set(values.map((value) => normalizeCustomerSourceType(value)))).filter((sourceType) => sourceType !== null);
14920
17031
  }
14921
- function isOneOf(values, value) {
17032
+ function isOneOf2(values, value) {
14922
17033
  return typeof value === "string" && values.includes(value);
14923
17034
  }
14924
17035
  function annotateFactFilterability(data) {
@@ -14939,15 +17050,15 @@ function annotateFactFilterability(data) {
14939
17050
  return {
14940
17051
  ...factRecord,
14941
17052
  filterability: {
14942
- factType: isOneOf(customerFactTypes, factRecord.factType) ? "public" : "internal",
14943
- factCategory: isOneOf(customerFactCategories, factRecord.factCategory) ? "public" : "internal"
17053
+ factType: isOneOf2(customerFactTypes, factRecord.factType) ? "public" : "internal",
17054
+ factCategory: isOneOf2(customerFactCategories, factRecord.factCategory) ? "public" : "internal"
14944
17055
  }
14945
17056
  };
14946
17057
  })
14947
17058
  };
14948
17059
  }
14949
- var sourceTypeDescription, list_default4;
14950
- var init_list4 = __esm(() => {
17060
+ var sourceTypeDescription, list_default5;
17061
+ var init_list5 = __esm(() => {
14951
17062
  init_dist4();
14952
17063
  init_dist();
14953
17064
  init_auth();
@@ -14957,7 +17068,7 @@ var init_list4 = __esm(() => {
14957
17068
  init_config();
14958
17069
  init_output();
14959
17070
  sourceTypeDescription = `${customerSourceTypes.join(", ")} (aliases: ${customerSourceTypeAliases.join(", ")})`;
14960
- list_default4 = defineCommand2({
17071
+ list_default5 = defineCommand2({
14961
17072
  meta: {
14962
17073
  name: "list",
14963
17074
  description: [
@@ -15016,11 +17127,11 @@ var init_list4 = __esm(() => {
15016
17127
  },
15017
17128
  async run({ args }) {
15018
17129
  const json = !!args.json;
15019
- const statuses = parseCsvArg(args.status);
17130
+ const statuses2 = parseCsvArg(args.status);
15020
17131
  const sourceTypes = parseCsvArg(args["source-types"]);
15021
17132
  const factTypes = parseCsvArg(args["fact-types"]);
15022
17133
  const factCategories = parseCsvArg(args["fact-categories"]);
15023
- const invalidStatuses = invalidValues(statuses, customerFactStatuses);
17134
+ const invalidStatuses = invalidValues(statuses2, customerFactStatuses);
15024
17135
  if (invalidStatuses.length > 0) {
15025
17136
  return outputError({
15026
17137
  message: `Unknown fact statuses: ${invalidStatuses.join(", ")}. Allowed: ${customerFactStatuses.join(", ")}`,
@@ -15082,8 +17193,8 @@ var init_list4 = __esm(() => {
15082
17193
  const params = {
15083
17194
  customer: args.customer
15084
17195
  };
15085
- if (statuses)
15086
- params.status = statuses;
17196
+ if (statuses2)
17197
+ params.status = statuses2;
15087
17198
  if (normalizedSourceTypes)
15088
17199
  params.sourceTypes = normalizedSourceTypes;
15089
17200
  if (factTypes)
@@ -15103,9 +17214,9 @@ var init_list4 = __esm(() => {
15103
17214
  });
15104
17215
 
15105
17216
  // src/commands/facts/get.ts
15106
- var exports_get3 = {};
15107
- __export(exports_get3, {
15108
- default: () => get_default3
17217
+ var exports_get4 = {};
17218
+ __export(exports_get4, {
17219
+ default: () => get_default4
15109
17220
  });
15110
17221
  function parseCsvArg2(value) {
15111
17222
  if (!value)
@@ -15113,15 +17224,15 @@ function parseCsvArg2(value) {
15113
17224
  const items = splitCsv(value).map((item) => item.trim()).filter(Boolean);
15114
17225
  return items.length > 0 ? items : undefined;
15115
17226
  }
15116
- var get_default3;
15117
- var init_get3 = __esm(() => {
17227
+ var get_default4;
17228
+ var init_get4 = __esm(() => {
15118
17229
  init_dist4();
15119
17230
  init_dist();
15120
17231
  init_auth();
15121
17232
  init_output2();
15122
17233
  init_api();
15123
17234
  init_config();
15124
- get_default3 = defineCommand2({
17235
+ get_default4 = defineCommand2({
15125
17236
  meta: {
15126
17237
  name: "get",
15127
17238
  description: [
@@ -15188,16 +17299,16 @@ var init_facts = __esm(() => {
15188
17299
  `)
15189
17300
  },
15190
17301
  subCommands: {
15191
- list: () => Promise.resolve().then(() => (init_list4(), exports_list4)).then((m) => m.default),
15192
- get: () => Promise.resolve().then(() => (init_get3(), exports_get3)).then((m) => m.default)
17302
+ list: () => Promise.resolve().then(() => (init_list5(), exports_list5)).then((m) => m.default),
17303
+ get: () => Promise.resolve().then(() => (init_get4(), exports_get4)).then((m) => m.default)
15193
17304
  }
15194
17305
  });
15195
17306
  });
15196
17307
 
15197
17308
  // src/commands/sources/list.ts
15198
- var exports_list5 = {};
15199
- __export(exports_list5, {
15200
- default: () => list_default5
17309
+ var exports_list6 = {};
17310
+ __export(exports_list6, {
17311
+ default: () => list_default6
15201
17312
  });
15202
17313
  function parseLimit(value, json) {
15203
17314
  if (!value)
@@ -15232,8 +17343,8 @@ function parseDateArg(name, value, json) {
15232
17343
  }
15233
17344
  return date;
15234
17345
  }
15235
- var sourceTypeDescription2, ISO_8601_UTC_DATE_TIME_REGEX, list_default5;
15236
- var init_list5 = __esm(() => {
17346
+ var sourceTypeDescription2, ISO_8601_UTC_DATE_TIME_REGEX, list_default6;
17347
+ var init_list6 = __esm(() => {
15237
17348
  init_dist4();
15238
17349
  init_dist();
15239
17350
  init_auth();
@@ -15242,7 +17353,7 @@ var init_list5 = __esm(() => {
15242
17353
  init_output();
15243
17354
  sourceTypeDescription2 = `${customerSourceTypes.join(", ")} (aliases: ${customerSourceTypeAliases.join(", ")})`;
15244
17355
  ISO_8601_UTC_DATE_TIME_REGEX = /^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$/;
15245
- list_default5 = defineCommand2({
17356
+ list_default6 = defineCommand2({
15246
17357
  meta: {
15247
17358
  name: "list",
15248
17359
  description: [
@@ -15366,12 +17477,12 @@ var init_list5 = __esm(() => {
15366
17477
  });
15367
17478
 
15368
17479
  // src/commands/sources/get.ts
15369
- var exports_get4 = {};
15370
- __export(exports_get4, {
15371
- default: () => get_default4
17480
+ var exports_get5 = {};
17481
+ __export(exports_get5, {
17482
+ default: () => get_default5
15372
17483
  });
15373
- var sourceTypeDescription3, get_default4;
15374
- var init_get4 = __esm(() => {
17484
+ var sourceTypeDescription3, get_default5;
17485
+ var init_get5 = __esm(() => {
15375
17486
  init_dist4();
15376
17487
  init_dist();
15377
17488
  init_auth();
@@ -15379,7 +17490,7 @@ var init_get4 = __esm(() => {
15379
17490
  init_api();
15380
17491
  init_output();
15381
17492
  sourceTypeDescription3 = `${customerSourceTypes.join(", ")} (aliases: ${customerSourceTypeAliases.join(", ")})`;
15382
- get_default4 = defineCommand2({
17493
+ get_default5 = defineCommand2({
15383
17494
  meta: {
15384
17495
  name: "get",
15385
17496
  description: [
@@ -15472,8 +17583,8 @@ var init_sources = __esm(() => {
15472
17583
  `)
15473
17584
  },
15474
17585
  subCommands: {
15475
- list: () => Promise.resolve().then(() => (init_list5(), exports_list5)).then((m) => m.default),
15476
- get: () => Promise.resolve().then(() => (init_get4(), exports_get4)).then((m) => m.default)
17586
+ list: () => Promise.resolve().then(() => (init_list6(), exports_list6)).then((m) => m.default),
17587
+ get: () => Promise.resolve().then(() => (init_get5(), exports_get5)).then((m) => m.default)
15477
17588
  }
15478
17589
  });
15479
17590
  });
@@ -15705,17 +17816,17 @@ var init_schema = __esm(() => {
15705
17816
  });
15706
17817
 
15707
17818
  // src/commands/destinations/list.ts
15708
- var exports_list6 = {};
15709
- __export(exports_list6, {
15710
- default: () => list_default6
17819
+ var exports_list7 = {};
17820
+ __export(exports_list7, {
17821
+ default: () => list_default7
15711
17822
  });
15712
- var list_default6;
15713
- var init_list6 = __esm(() => {
17823
+ var list_default7;
17824
+ var init_list7 = __esm(() => {
15714
17825
  init_dist();
15715
17826
  init_auth();
15716
17827
  init_output2();
15717
17828
  init_api();
15718
- list_default6 = defineCommand2({
17829
+ list_default7 = defineCommand2({
15719
17830
  meta: {
15720
17831
  name: "list",
15721
17832
  description: [
@@ -15756,17 +17867,17 @@ var init_list6 = __esm(() => {
15756
17867
  });
15757
17868
 
15758
17869
  // src/commands/destinations/get.ts
15759
- var exports_get5 = {};
15760
- __export(exports_get5, {
15761
- default: () => get_default5
17870
+ var exports_get6 = {};
17871
+ __export(exports_get6, {
17872
+ default: () => get_default6
15762
17873
  });
15763
- var get_default5;
15764
- var init_get5 = __esm(() => {
17874
+ var get_default6;
17875
+ var init_get6 = __esm(() => {
15765
17876
  init_dist();
15766
17877
  init_auth();
15767
17878
  init_output2();
15768
17879
  init_api();
15769
- get_default5 = defineCommand2({
17880
+ get_default6 = defineCommand2({
15770
17881
  meta: {
15771
17882
  name: "get",
15772
17883
  description: [
@@ -16121,8 +18232,8 @@ var init_destinations = __esm(() => {
16121
18232
  `)
16122
18233
  },
16123
18234
  subCommands: {
16124
- list: () => Promise.resolve().then(() => (init_list6(), exports_list6)).then((m) => m.default),
16125
- get: () => Promise.resolve().then(() => (init_get5(), exports_get5)).then((m) => m.default),
18235
+ list: () => Promise.resolve().then(() => (init_list7(), exports_list7)).then((m) => m.default),
18236
+ get: () => Promise.resolve().then(() => (init_get6(), exports_get6)).then((m) => m.default),
16126
18237
  create: () => Promise.resolve().then(() => (init_create(), exports_create)).then((m) => m.default),
16127
18238
  update: () => Promise.resolve().then(() => (init_update3(), exports_update2)).then((m) => m.default),
16128
18239
  enable: () => Promise.resolve().then(() => (init_enable(), exports_enable)).then((m) => m.default),
@@ -16132,69 +18243,88 @@ var init_destinations = __esm(() => {
16132
18243
  });
16133
18244
  });
16134
18245
 
16135
- // src/commands/metrics/sources.ts
16136
- var exports_sources2 = {};
16137
- __export(exports_sources2, {
16138
- default: () => sources_default2
18246
+ // src/commands/features/list.ts
18247
+ var exports_list8 = {};
18248
+ __export(exports_list8, {
18249
+ default: () => list_default8
16139
18250
  });
16140
- var sources_default2;
16141
- var init_sources2 = __esm(() => {
18251
+ var list_default8;
18252
+ var init_list8 = __esm(() => {
18253
+ init_dist4();
16142
18254
  init_dist();
16143
18255
  init_auth();
16144
18256
  init_output2();
16145
18257
  init_api();
16146
- sources_default2 = defineCommand2({
18258
+ init_platform_input();
18259
+ init_input();
18260
+ list_default8 = defineCommand2({
16147
18261
  meta: {
16148
- name: "sources",
18262
+ name: "list",
16149
18263
  description: [
16150
- "List product-event sources eligible for Behavior Metrics.",
18264
+ "List configured Features, their exact historical usage, and event candidates.",
18265
+ "When exactly one eligible source exists, Core selects it automatically.",
18266
+ "Candidate discovery returns ready or partial items, or an unavailable reason.",
18267
+ "Unavailable evidence remains distinct from zero usage.",
16151
18268
  "",
16152
- "Use the returned source key with `outlit metrics events --source <source-key>`.",
18269
+ "Examples:",
18270
+ " outlit features list --json",
18271
+ " outlit features list --source metric_source_v1_0123456789abcdef0123456789abcdef --weeks 4 --candidate-limit 20 --json",
16153
18272
  "",
16154
18273
  AGENT_JSON_HINT
16155
18274
  ].join(`
16156
18275
  `)
16157
18276
  },
16158
- args: { ...authArgs, ...outputArgs },
18277
+ args: {
18278
+ ...authArgs,
18279
+ ...outputArgs,
18280
+ source: { type: "string", description: "Optional product-event source key" },
18281
+ weeks: { type: "string", description: "Historical usage window in weeks (1-53, default: 12)" },
18282
+ "candidate-limit": {
18283
+ type: "string",
18284
+ description: "Maximum event candidates (1-100, default: 100)"
18285
+ }
18286
+ },
16159
18287
  async run({ args }) {
16160
18288
  const json = !!args.json;
16161
18289
  const client = await getClientOrExit(args["api-key"], json);
16162
- return runTool(client, "outlit_list_behavior_metric_sources", {}, json, {
16163
- spinnerMessage: "Loading Behavior Metric sources..."
18290
+ const input = {
18291
+ weeks: parseBoundedInteger2(args.weeks, 12, "--weeks", 1, 53, json),
18292
+ candidateLimit: parseBoundedInteger2(args["candidate-limit"], 100, "--candidate-limit", 1, 100, json)
18293
+ };
18294
+ const sourceKey = optionalTrimmedString(args.source);
18295
+ if (sourceKey)
18296
+ input.sourceKey = sourceKey;
18297
+ return runTool(client, publicToolContracts.outlit_list_features.toolName, input, json, {
18298
+ spinnerMessage: "Loading Features..."
16164
18299
  });
16165
18300
  }
16166
18301
  });
16167
18302
  });
16168
18303
 
16169
- // src/commands/metrics/events.ts
16170
- var exports_events = {};
16171
- __export(exports_events, {
16172
- default: () => events_default
18304
+ // src/commands/features/create.ts
18305
+ var exports_create2 = {};
18306
+ __export(exports_create2, {
18307
+ default: () => create_default2
16173
18308
  });
16174
- function parseBoundedInteger2(value, fallback, flag, min, max, json) {
16175
- const parsed = parseIntegerFlag(value, fallback, flag, json);
16176
- if (parsed < min || parsed > max) {
16177
- return outputError({ message: `${flag} must be an integer from ${min} to ${max}`, code: "invalid_input" }, json);
16178
- }
16179
- return parsed;
16180
- }
16181
- var events_default;
16182
- var init_events = __esm(() => {
18309
+ var create_default2;
18310
+ var init_create2 = __esm(() => {
18311
+ init_dist4();
16183
18312
  init_dist();
16184
18313
  init_auth();
16185
18314
  init_output2();
16186
18315
  init_api();
16187
- init_output();
16188
18316
  init_platform_input();
16189
- events_default = defineCommand2({
18317
+ init_input();
18318
+ create_default2 = defineCommand2({
16190
18319
  meta: {
16191
- name: "events",
18320
+ name: "create",
16192
18321
  description: [
16193
- "List attributed event candidates for a Behavior Metric source.",
18322
+ "Create or idempotently return one Feature observed by one exact event rule.",
18323
+ "Outlit creates the supporting weekly event-count and active-days metrics internally.",
16194
18324
  "",
16195
18325
  "Examples:",
16196
- " outlit metrics events --source metric_source_v1_0123456789abcdef0123456789abcdef --json",
16197
- " outlit metrics events --source metric_source_v1_0123456789abcdef0123456789abcdef --weeks 4 --limit 20 --json",
18326
+ " outlit features create --source metric_source_v1_0123456789abcdef0123456789abcdef --event report_exported --key reports_exported --name 'Reports exported' --json",
18327
+ ` outlit features create --source metric_source_v1_0123456789abcdef0123456789abcdef --event report_exported --key production_reports_exported --name 'Production reports exported' --property-filters '[{"property":"environment","operator":"equals","value":{"type":"string","value":"production"}}]' --json`,
16198
18328
  "",
16199
18329
  AGENT_JSON_HINT
16200
18330
  ].join(`
@@ -16203,60 +18333,52 @@ var init_events = __esm(() => {
16203
18333
  args: {
16204
18334
  ...authArgs,
16205
18335
  ...outputArgs,
16206
- source: { type: "string", description: "Behavior Metric source key" },
16207
- weeks: { type: "string", description: "History window in weeks (1-53, default: 12)" },
16208
- limit: { type: "string", description: "Maximum event candidates (1-100, default: 100)" }
18336
+ source: { type: "string", description: "Product-event source key" },
18337
+ event: { type: "string", description: "Exact tracked event name" },
18338
+ key: { type: "string", description: "Stable lower_snake_case feature key" },
18339
+ name: { type: "string", description: "Human-readable Feature name" },
18340
+ "property-filters": {
18341
+ type: "string",
18342
+ description: "Optional JSON array of exact or exists property filters"
18343
+ }
16209
18344
  },
16210
18345
  async run({ args }) {
16211
18346
  const json = !!args.json;
16212
18347
  const client = await getClientOrExit(args["api-key"], json);
16213
- return runTool(client, "outlit_list_behavior_metric_events", {
18348
+ return runTool(client, publicToolContracts.outlit_create_feature.toolName, {
16214
18349
  sourceKey: requiredTrimmedString(args.source, "--source", json),
16215
- weeks: parseBoundedInteger2(args.weeks, 12, "--weeks", 1, 53, json),
16216
- limit: parseBoundedInteger2(args.limit, 100, "--limit", 1, 100, json)
16217
- }, json, { spinnerMessage: "Loading Behavior Metric events..." });
18350
+ eventName: requiredString(args.event, "--event", json),
18351
+ featureKey: requiredTrimmedString(args.key, "--key", json),
18352
+ name: requiredTrimmedString(args.name, "--name", json),
18353
+ propertyFilters: parsePropertyFilters(args["property-filters"], json)
18354
+ }, json, { spinnerMessage: "Creating Feature..." });
16218
18355
  }
16219
18356
  });
16220
18357
  });
16221
18358
 
16222
- // src/commands/metrics/create.ts
16223
- var exports_create2 = {};
16224
- __export(exports_create2, {
16225
- default: () => create_default2
18359
+ // src/commands/features/archive.ts
18360
+ var exports_archive2 = {};
18361
+ __export(exports_archive2, {
18362
+ default: () => archive_default2
16226
18363
  });
16227
- function parsePropertyFilters(value, json) {
16228
- if (!value?.trim())
16229
- return [];
16230
- try {
16231
- const parsed = JSON.parse(value);
16232
- if (!Array.isArray(parsed)) {
16233
- return outputError({ message: "--property-filters must be a JSON array", code: "invalid_input" }, json);
16234
- }
16235
- return parsed;
16236
- } catch (error) {
16237
- return outputError({
16238
- message: `Invalid --property-filters JSON: ${errorMessage(error, "parse failed")}`,
16239
- code: "invalid_input"
16240
- }, json);
16241
- }
16242
- }
16243
- var create_default2;
16244
- var init_create2 = __esm(() => {
18364
+ var archive_default2;
18365
+ var init_archive2 = __esm(() => {
18366
+ init_dist4();
16245
18367
  init_dist();
16246
18368
  init_auth();
16247
18369
  init_output2();
16248
18370
  init_api();
16249
- init_output();
16250
18371
  init_platform_input();
16251
- create_default2 = defineCommand2({
18372
+ archive_default2 = defineCommand2({
16252
18373
  meta: {
16253
- name: "create",
18374
+ name: "archive",
16254
18375
  description: [
16255
- "Create an event-based Outlit Behavior Metric.",
18376
+ "Archive a Feature using its opaque id and current revision.",
18377
+ "Core rejects stale revisions and prevents archiving the final active feature.",
18378
+ "Self-service restore is not available in the MVP; retained historical usage is not deleted.",
16256
18379
  "",
16257
- "Examples:",
16258
- " outlit metrics create --source metric_source_v1_0123456789abcdef0123456789abcdef --event report_exported --key reports_exported --label 'Reports exported' --json",
16259
- ` outlit metrics create --source metric_source_v1_0123456789abcdef0123456789abcdef --event report_exported --key production_reports_exported --label 'Production reports exported' --property-filters '[{"property":"environment","operator":"equals","value":{"type":"string","value":"production"}}]' --json`,
18380
+ "Example:",
18381
+ " outlit features archive value_feature_v1_0123456789abcdef0123456789abcdef --revision value_feature_revision_v1_fedcba9876543210fedcba9876543210 --json",
16260
18382
  "",
16261
18383
  AGENT_JSON_HINT
16262
18384
  ].join(`
@@ -16265,81 +18387,66 @@ var init_create2 = __esm(() => {
16265
18387
  args: {
16266
18388
  ...authArgs,
16267
18389
  ...outputArgs,
16268
- source: { type: "string", description: "Behavior Metric source key" },
16269
- event: { type: "string", description: "Exact tracked event name" },
16270
- key: { type: "string", description: "Stable lower_snake_case metric key" },
16271
- label: { type: "string", description: "Human-readable metric label" },
16272
- "property-filters": {
16273
- type: "string",
16274
- description: "Optional JSON array of event property filters"
16275
- }
18390
+ id: { type: "positional", description: "Opaque Feature id", required: true },
18391
+ revision: { type: "string", description: "Current opaque Feature revision" }
16276
18392
  },
16277
18393
  async run({ args }) {
16278
18394
  const json = !!args.json;
16279
18395
  const client = await getClientOrExit(args["api-key"], json);
16280
- const input = {
16281
- sourceKey: requiredTrimmedString(args.source, "--source", json),
16282
- eventName: requiredString(args.event, "--event", json),
16283
- behaviorKey: requiredTrimmedString(args.key, "--key", json),
16284
- label: requiredTrimmedString(args.label, "--label", json),
16285
- propertyFilters: parsePropertyFilters(args["property-filters"], json)
16286
- };
16287
- return runTool(client, "outlit_create_behavior_metric", input, json, {
16288
- spinnerMessage: "Creating Behavior Metric..."
16289
- });
18396
+ return runTool(client, publicToolContracts.outlit_archive_feature.toolName, {
18397
+ id: requiredTrimmedString(args.id, "<id>", json),
18398
+ revision: requiredTrimmedString(args.revision, "--revision", json)
18399
+ }, json, { spinnerMessage: "Archiving Feature..." });
16290
18400
  }
16291
18401
  });
16292
18402
  });
16293
18403
 
16294
- // src/commands/metrics/index.ts
16295
- var exports_metrics = {};
16296
- __export(exports_metrics, {
16297
- default: () => metrics_default
18404
+ // src/commands/features/index.ts
18405
+ var exports_features2 = {};
18406
+ __export(exports_features2, {
18407
+ default: () => features_default2
16298
18408
  });
16299
- var metrics_default;
16300
- var init_metrics = __esm(() => {
18409
+ var features_default2;
18410
+ var init_features2 = __esm(() => {
16301
18411
  init_dist();
16302
18412
  init_output2();
16303
- metrics_default = defineCommand2({
18413
+ features_default2 = defineCommand2({
16304
18414
  meta: {
16305
- name: "metrics",
18415
+ name: "features",
16306
18416
  description: [
16307
- "Configure event-based Outlit Behavior Metrics.",
18417
+ "Configure workspace Features and inspect their exact historical usage.",
16308
18418
  "",
16309
18419
  "Commands:",
16310
- " sources List eligible event sources",
16311
- " events List event candidates for a source",
16312
- " create Create a Behavior Metric",
18420
+ " list Read features, evidence, sources, and event candidates",
18421
+ " create Create one event-based Feature",
18422
+ " archive <id> Archive a non-final Feature",
16313
18423
  "",
16314
- "Examples:",
16315
- " outlit metrics sources --json",
16316
- " outlit metrics events --source metric_source_v1_0123456789abcdef0123456789abcdef --json",
16317
- " outlit metrics create --source metric_source_v1_0123456789abcdef0123456789abcdef --event report_exported --key reports_exported --label 'Reports exported' --json",
18424
+ "Customer-level usage is available with `outlit customers features <customer>`.",
16318
18425
  "",
16319
18426
  AGENT_JSON_HINT
16320
18427
  ].join(`
16321
18428
  `)
16322
18429
  },
16323
18430
  subCommands: {
16324
- sources: () => Promise.resolve().then(() => (init_sources2(), exports_sources2)).then((module) => module.default),
16325
- events: () => Promise.resolve().then(() => (init_events(), exports_events)).then((module) => module.default),
16326
- create: () => Promise.resolve().then(() => (init_create2(), exports_create2)).then((module) => module.default)
18431
+ list: () => Promise.resolve().then(() => (init_list8(), exports_list8)).then((module) => module.default),
18432
+ create: () => Promise.resolve().then(() => (init_create2(), exports_create2)).then((module) => module.default),
18433
+ archive: () => Promise.resolve().then(() => (init_archive2(), exports_archive2)).then((module) => module.default)
16327
18434
  }
16328
18435
  });
16329
18436
  });
16330
18437
 
16331
18438
  // src/commands/settings/get.ts
16332
- var exports_get6 = {};
16333
- __export(exports_get6, {
16334
- default: () => get_default6
18439
+ var exports_get7 = {};
18440
+ __export(exports_get7, {
18441
+ default: () => get_default7
16335
18442
  });
16336
- var get_default6;
16337
- var init_get6 = __esm(() => {
18443
+ var get_default7;
18444
+ var init_get7 = __esm(() => {
16338
18445
  init_dist();
16339
18446
  init_auth();
16340
18447
  init_output2();
16341
18448
  init_api();
16342
- get_default6 = defineCommand2({
18449
+ get_default7 = defineCommand2({
16343
18450
  meta: {
16344
18451
  name: "get",
16345
18452
  description: [
@@ -16439,7 +18546,7 @@ var init_settings = __esm(() => {
16439
18546
  `)
16440
18547
  },
16441
18548
  subCommands: {
16442
- get: () => Promise.resolve().then(() => (init_get6(), exports_get6)).then((m) => m.default),
18549
+ get: () => Promise.resolve().then(() => (init_get7(), exports_get7)).then((m) => m.default),
16443
18550
  update: () => Promise.resolve().then(() => (init_update4(), exports_update3)).then((m) => m.default)
16444
18551
  }
16445
18552
  });
@@ -17402,6 +19509,20 @@ var init_completions = __esm(() => {
17402
19509
  { name: "--timeframe", desc: "Metrics timeframe" }
17403
19510
  ]
17404
19511
  },
19512
+ {
19513
+ name: "relationship",
19514
+ desc: "Get a bounded customer relationship",
19515
+ flags: [...COMMON]
19516
+ },
19517
+ {
19518
+ name: "features",
19519
+ desc: "Get exact Feature usage for a customer",
19520
+ flags: [
19521
+ ...COMMON,
19522
+ { name: "--weeks", desc: "Historical usage window (1-53 weeks)" },
19523
+ { name: "--weekly", desc: "Include ordered weekly usage" }
19524
+ ]
19525
+ },
17405
19526
  {
17406
19527
  name: "timeline",
17407
19528
  desc: "Show activity timeline",
@@ -17441,6 +19562,22 @@ var init_completions = __esm(() => {
17441
19562
  }
17442
19563
  ]
17443
19564
  },
19565
+ {
19566
+ name: "attention",
19567
+ desc: "Inspect customer Attention items",
19568
+ subs: [
19569
+ {
19570
+ name: "list",
19571
+ desc: "List open or resolved Attention items",
19572
+ flags: [
19573
+ ...PAGINATED,
19574
+ { name: "--status", desc: "Lifecycle: open or resolved" },
19575
+ { name: "--customer-id", desc: "Filter by exact customer UUID" }
19576
+ ]
19577
+ },
19578
+ { name: "get", desc: "Get one Attention item by exact ID", flags: [...COMMON] }
19579
+ ]
19580
+ },
17444
19581
  {
17445
19582
  name: "activation",
17446
19583
  desc: "Configure contact and company activation",
@@ -17656,35 +19793,35 @@ var init_completions = __esm(() => {
17656
19793
  ]
17657
19794
  },
17658
19795
  {
17659
- name: "metrics",
17660
- desc: "Configure Behavior Metrics",
19796
+ name: "features",
19797
+ desc: "Configure Features",
17661
19798
  subs: [
17662
19799
  {
17663
- name: "sources",
17664
- desc: "List product-event sources eligible for Behavior Metrics",
17665
- flags: [...COMMON]
17666
- },
17667
- {
17668
- name: "events",
17669
- desc: "List attributed event candidates for a Behavior Metric source",
19800
+ name: "list",
19801
+ desc: "Read workspace Features and usage evidence",
17670
19802
  flags: [
17671
19803
  ...COMMON,
17672
- { name: "--source", desc: "Behavior Metric source key" },
17673
- { name: "--weeks", desc: "History window in weeks (1-53, default: 12)" },
17674
- { name: "--limit", desc: "Maximum event candidates (1-100, default: 100)" }
19804
+ { name: "--source", desc: "Optional product-event source key" },
19805
+ { name: "--weeks", desc: "Historical usage window (1-53 weeks)" },
19806
+ { name: "--candidate-limit", desc: "Maximum event candidates (1-100)" }
17675
19807
  ]
17676
19808
  },
17677
19809
  {
17678
19810
  name: "create",
17679
- desc: "Create an event-based Behavior Metric",
19811
+ desc: "Create one event-based Feature",
17680
19812
  flags: [
17681
19813
  ...COMMON,
17682
- { name: "--source", desc: "Behavior Metric source key" },
19814
+ { name: "--source", desc: "Product-event source key" },
17683
19815
  { name: "--event", desc: "Exact tracked event name" },
17684
- { name: "--key", desc: "Stable lower_snake_case metric key" },
17685
- { name: "--label", desc: "Human-readable metric label" },
17686
- { name: "--property-filters", desc: "Optional JSON event property filters" }
19816
+ { name: "--key", desc: "Stable lower_snake_case feature key" },
19817
+ { name: "--name", desc: "Human-readable Feature name" },
19818
+ { name: "--property-filters", desc: "Optional JSON exact or exists filters" }
17687
19819
  ]
19820
+ },
19821
+ {
19822
+ name: "archive",
19823
+ desc: "Archive a non-final Feature",
19824
+ flags: [...COMMON, { name: "--revision", desc: "Current opaque feature revision" }]
17688
19825
  }
17689
19826
  ]
17690
19827
  },
@@ -18486,34 +20623,39 @@ async function startCli() {
18486
20623
  meta: {
18487
20624
  name: "outlit",
18488
20625
  version: CLI_VERSION,
18489
- description: `Outlit CLI -- customer intelligence from the terminal.
18490
-
18491
- Usage examples:
18492
- outlit onboard --agent codex --json
18493
- outlit customers list --billing-status PAYING --no-activity-in 30d
18494
- outlit customers get acme.com --include users,revenue
18495
- outlit customers timeline acme.com --timeframe 90d
18496
- outlit users list --journey-stage CHAMPION
18497
- outlit ws-users list --role CSM --has-owned-customers
18498
- outlit facts list acme.com --fact-types CHURN_RISK,EXPANSION
18499
- outlit facts get --fact-id fact_123 --include evidence
18500
- outlit sources get --source-type OPPORTUNITY --source-id opp_123
18501
- outlit search 'pricing objections last quarter' --source-types CALL,OPPORTUNITY
18502
- outlit sql 'SELECT * FROM activity LIMIT 10'
18503
- outlit schema activity
18504
- outlit activation get --json
18505
- outlit activation preview --event integration_connected --json
18506
- outlit destinations disable 10000000-0000-4000-8000-000000000003 --json
18507
- outlit metrics sources --json
18508
- outlit metrics events --source metric_source_v1_0123456789abcdef0123456789abcdef --json
18509
- outlit metrics create --source metric_source_v1_0123456789abcdef0123456789abcdef --event report_exported --key reports_exported --label 'Reports exported' --json
18510
- outlit doctor --json
18511
-
18512
- For AI agents: commands auto-output JSON when stdout is piped. No --json flag needed.`
20626
+ description: [
20627
+ "Outlit CLI -- customer intelligence from the terminal.",
20628
+ "",
20629
+ "Usage examples:",
20630
+ " outlit onboard --agent codex --json",
20631
+ " outlit customers list --billing-status PAYING --no-activity-in 30d",
20632
+ " outlit customers get acme.com --include users,revenue",
20633
+ " outlit customers relationship acme.com",
20634
+ " outlit customers timeline acme.com --timeframe 90d",
20635
+ " outlit users list --journey-stage ENGAGED",
20636
+ " outlit ws-users list --role CSM --has-owned-customers",
20637
+ " outlit facts list acme.com --fact-types CHURN_RISK,EXPANSION",
20638
+ " outlit facts get --fact-id fact_123 --include evidence",
20639
+ " outlit sources get --source-type OPPORTUNITY --source-id opp_123",
20640
+ " outlit search 'pricing objections last quarter' --source-types CALL,OPPORTUNITY",
20641
+ " outlit sql 'SELECT * FROM activity LIMIT 10'",
20642
+ " outlit schema activity",
20643
+ " outlit activation get --json",
20644
+ " outlit activation preview --event integration_connected --json",
20645
+ " outlit destinations disable 10000000-0000-4000-8000-000000000003 --json",
20646
+ " outlit features list --json",
20647
+ " outlit features create --source metric_source_v1_0123456789abcdef0123456789abcdef --event report_exported --key reports_exported --name 'Reports exported' --json",
20648
+ " outlit customers features acme.com --weekly --json",
20649
+ " outlit doctor --json",
20650
+ "",
20651
+ "For AI agents: commands auto-output JSON when stdout is piped. No --json flag needed."
20652
+ ].join(`
20653
+ `)
18513
20654
  },
18514
20655
  subCommands: {
18515
20656
  auth: () => Promise.resolve().then(() => (init_auth2(), exports_auth)).then((m) => m.default),
18516
20657
  activation: () => Promise.resolve().then(() => (init_activation2(), exports_activation)).then((m) => m.default),
20658
+ attention: () => Promise.resolve().then(() => (init_attention(), exports_attention)).then((m) => m.default),
18517
20659
  customers: () => Promise.resolve().then(() => (init_customers(), exports_customers)).then((m) => m.default),
18518
20660
  users: () => Promise.resolve().then(() => (init_users(), exports_users)).then((m) => m.default),
18519
20661
  "ws-users": () => Promise.resolve().then(() => (init_ws_users(), exports_ws_users)).then((m) => m.default),
@@ -18526,7 +20668,7 @@ For AI agents: commands auto-output JSON when stdout is piped. No --json flag ne
18526
20668
  sql: () => Promise.resolve().then(() => (init_sql(), exports_sql)).then((m) => m.default),
18527
20669
  schema: () => Promise.resolve().then(() => (init_schema(), exports_schema)).then((m) => m.default),
18528
20670
  destinations: () => Promise.resolve().then(() => (init_destinations(), exports_destinations)).then((m) => m.default),
18529
- metrics: () => Promise.resolve().then(() => (init_metrics(), exports_metrics)).then((module) => module.default),
20671
+ features: () => Promise.resolve().then(() => (init_features2(), exports_features2)).then((module) => module.default),
18530
20672
  settings: () => Promise.resolve().then(() => (init_settings(), exports_settings)).then((m) => m.default),
18531
20673
  integrations: () => Promise.resolve().then(() => (init_integrations(), exports_integrations)).then((m) => m.default),
18532
20674
  completions: () => Promise.resolve().then(() => (init_completions(), exports_completions)).then((m) => m.default),