@outlit/cli 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.js +2793 -741
  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.0",
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.0",
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: {
@@ -3256,6 +3260,157 @@ var init_dist4 = __esm(() => {
3256
3260
  additionalProperties: false
3257
3261
  }
3258
3262
  },
3263
+ outlit_get_customer_relationship: {
3264
+ toolName: "outlit_get_customer_relationship",
3265
+ commandId: "customer.relationship.get",
3266
+ commandVersion: 1,
3267
+ ownerDomain: "customers",
3268
+ title: "Get Customer Relationship",
3269
+ 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.",
3270
+ inputSchema: {
3271
+ $schema: "https://json-schema.org/draft/2020-12/schema",
3272
+ type: "object",
3273
+ properties: {
3274
+ customer: {
3275
+ type: "string",
3276
+ minLength: 1,
3277
+ maxLength: 500,
3278
+ description: "Customer ID, domain, or exact customer name to look up"
3279
+ }
3280
+ },
3281
+ required: [
3282
+ "customer"
3283
+ ],
3284
+ additionalProperties: false
3285
+ },
3286
+ outputSchema: {
3287
+ $schema: "https://json-schema.org/draft/2020-12/schema",
3288
+ type: "object",
3289
+ properties: {
3290
+ customer: {
3291
+ type: "object",
3292
+ properties: {
3293
+ id: {
3294
+ type: "string"
3295
+ },
3296
+ name: {
3297
+ anyOf: [
3298
+ {
3299
+ type: "string"
3300
+ },
3301
+ {
3302
+ type: "null"
3303
+ }
3304
+ ]
3305
+ },
3306
+ domain: {
3307
+ anyOf: [
3308
+ {
3309
+ type: "string"
3310
+ },
3311
+ {
3312
+ type: "null"
3313
+ }
3314
+ ]
3315
+ }
3316
+ },
3317
+ required: [
3318
+ "id",
3319
+ "name",
3320
+ "domain"
3321
+ ],
3322
+ additionalProperties: false
3323
+ },
3324
+ relationship: {
3325
+ type: "object",
3326
+ properties: {
3327
+ summary: {
3328
+ anyOf: [
3329
+ {
3330
+ type: "string",
3331
+ minLength: 1,
3332
+ maxLength: 240
3333
+ },
3334
+ {
3335
+ type: "null"
3336
+ }
3337
+ ]
3338
+ },
3339
+ items: {
3340
+ maxItems: 8,
3341
+ type: "array",
3342
+ items: {
3343
+ type: "object",
3344
+ properties: {
3345
+ category: {
3346
+ type: "string",
3347
+ minLength: 1,
3348
+ maxLength: 120
3349
+ },
3350
+ statement: {
3351
+ type: "string",
3352
+ minLength: 1,
3353
+ maxLength: 500
3354
+ },
3355
+ observedAt: {
3356
+ anyOf: [
3357
+ {
3358
+ type: "string",
3359
+ format: "date-time",
3360
+ 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))$"
3361
+ },
3362
+ {
3363
+ type: "null"
3364
+ }
3365
+ ]
3366
+ },
3367
+ sourceLabels: {
3368
+ maxItems: 4,
3369
+ type: "array",
3370
+ items: {
3371
+ type: "string",
3372
+ minLength: 1,
3373
+ maxLength: 100
3374
+ }
3375
+ }
3376
+ },
3377
+ required: [
3378
+ "category",
3379
+ "statement",
3380
+ "observedAt",
3381
+ "sourceLabels"
3382
+ ],
3383
+ additionalProperties: false
3384
+ }
3385
+ },
3386
+ updatedAt: {
3387
+ anyOf: [
3388
+ {
3389
+ type: "string",
3390
+ format: "date-time",
3391
+ 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))$"
3392
+ },
3393
+ {
3394
+ type: "null"
3395
+ }
3396
+ ]
3397
+ }
3398
+ },
3399
+ required: [
3400
+ "summary",
3401
+ "items",
3402
+ "updatedAt"
3403
+ ],
3404
+ additionalProperties: false
3405
+ }
3406
+ },
3407
+ required: [
3408
+ "customer",
3409
+ "relationship"
3410
+ ],
3411
+ additionalProperties: false
3412
+ }
3413
+ },
3259
3414
  outlit_assign_customer_owner: {
3260
3415
  toolName: "outlit_assign_customer_owner",
3261
3416
  commandId: "customer.owner.assign",
@@ -3573,13 +3728,13 @@ var init_dist4 = __esm(() => {
3573
3728
  ]
3574
3729
  },
3575
3730
  startDate: {
3576
- description: "Start of time window (ISO 8601, e.g. '2025-01-01T00:00:00Z'). Cannot be used with timeframe.",
3731
+ description: "Start of time window, inclusive (ISO 8601 UTC, e.g. '2025-01-01T00:00:00.000Z'). Cannot be used with timeframe.",
3577
3732
  type: "string",
3578
3733
  format: "date-time",
3579
3734
  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
3735
  },
3581
3736
  endDate: {
3582
- description: "End of time window (ISO 8601, e.g. '2025-01-31T23:59:59Z'). Cannot be used with timeframe.",
3737
+ 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
3738
  type: "string",
3584
3739
  format: "date-time",
3585
3740
  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 +10612,34 @@ Returns column definitions and example queries for each view.`,
10457
10612
  additionalProperties: false
10458
10613
  }
10459
10614
  },
10460
- outlit_list_behavior_metric_sources: {
10461
- toolName: "outlit_list_behavior_metric_sources",
10462
- commandId: "behavior_metric_source.list",
10615
+ outlit_list_features: {
10616
+ toolName: "outlit_list_features",
10617
+ commandId: "value_feature_workspace.get",
10463
10618
  commandVersion: 1,
10464
- ownerDomain: "behavior_metrics",
10465
- title: "List Behavior Metric Sources",
10466
- description: "List product-event sources eligible for Behavior Metric discovery.",
10619
+ ownerDomain: "value_features",
10620
+ title: "List Features",
10621
+ description: "List configured features, exact historical usage, eligible sources, and observed event candidates.",
10467
10622
  inputSchema: {
10468
10623
  $schema: "https://json-schema.org/draft/2020-12/schema",
10469
10624
  type: "object",
10470
- properties: {},
10625
+ properties: {
10626
+ sourceKey: {
10627
+ type: "string",
10628
+ pattern: "^metric_source_v1_[a-f0-9]{32}$"
10629
+ },
10630
+ weeks: {
10631
+ default: 12,
10632
+ type: "integer",
10633
+ minimum: 1,
10634
+ maximum: 53
10635
+ },
10636
+ candidateLimit: {
10637
+ default: 100,
10638
+ type: "integer",
10639
+ minimum: 1,
10640
+ maximum: 100
10641
+ }
10642
+ },
10471
10643
  additionalProperties: false
10472
10644
  },
10473
10645
  outputSchema: {
@@ -10513,487 +10685,2022 @@ Returns column definitions and example queries for each view.`,
10513
10685
  ],
10514
10686
  additionalProperties: false
10515
10687
  }
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
10688
  },
10539
- weeks: {
10540
- default: 12,
10541
- type: "integer",
10542
- minimum: 1,
10543
- maximum: 53
10689
+ selectedSourceKey: {
10690
+ anyOf: [
10691
+ {
10692
+ type: "string",
10693
+ pattern: "^metric_source_v1_[a-f0-9]{32}$"
10694
+ },
10695
+ {
10696
+ type: "null"
10697
+ }
10698
+ ]
10544
10699
  },
10545
- limit: {
10546
- default: 100,
10700
+ workspaceActiveFeatureCount: {
10547
10701
  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: {
10702
+ minimum: 0,
10703
+ maximum: 9007199254740991
10704
+ },
10705
+ features: {
10706
+ maxItems: 100,
10562
10707
  type: "array",
10563
10708
  items: {
10564
10709
  type: "object",
10565
10710
  properties: {
10566
- eventName: {
10711
+ id: {
10567
10712
  type: "string",
10568
- minLength: 1,
10569
- maxLength: 191
10713
+ pattern: "^value_feature_v1_[a-f0-9]{32}$"
10570
10714
  },
10571
- eventCount: {
10572
- type: "integer",
10573
- minimum: 0,
10574
- maximum: 9007199254740991
10715
+ revision: {
10716
+ type: "string",
10717
+ pattern: "^value_feature_revision_v1_[a-f0-9]{32}$"
10575
10718
  },
10576
- distinctCustomers: {
10577
- type: "integer",
10578
- minimum: 0,
10579
- maximum: 9007199254740991
10719
+ sourceKey: {
10720
+ type: "string",
10721
+ pattern: "^metric_source_v1_[a-f0-9]{32}$"
10580
10722
  },
10581
- activeWeeks: {
10582
- type: "integer",
10583
- minimum: 1,
10584
- maximum: 53
10723
+ featureKey: {
10724
+ type: "string",
10725
+ maxLength: 64,
10726
+ pattern: "^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$"
10585
10727
  },
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
- {
10728
+ name: {
10729
+ type: "string",
10730
+ minLength: 1,
10731
+ maxLength: 255
10732
+ },
10733
+ rule: {
10654
10734
  type: "object",
10655
10735
  properties: {
10656
- property: {
10736
+ eventName: {
10657
10737
  type: "string",
10658
10738
  minLength: 1,
10659
10739
  maxLength: 191
10660
10740
  },
10661
- operator: {
10662
- type: "string",
10663
- const: "equals"
10664
- },
10665
- value: {
10666
- oneOf: [
10667
- {
10741
+ propertyFilters: {
10742
+ maxItems: 5,
10743
+ type: "array",
10744
+ items: {
10745
+ oneOf: [
10746
+ {
10747
+ type: "object",
10748
+ properties: {
10749
+ property: {
10750
+ type: "string",
10751
+ minLength: 1,
10752
+ maxLength: 191
10753
+ },
10754
+ operator: {
10755
+ type: "string",
10756
+ const: "equals"
10757
+ },
10758
+ value: {
10759
+ oneOf: [
10760
+ {
10761
+ type: "object",
10762
+ properties: {
10763
+ type: {
10764
+ type: "string",
10765
+ const: "string"
10766
+ },
10767
+ value: {
10768
+ type: "string",
10769
+ maxLength: 191
10770
+ }
10771
+ },
10772
+ required: [
10773
+ "type",
10774
+ "value"
10775
+ ],
10776
+ additionalProperties: false
10777
+ },
10778
+ {
10779
+ type: "object",
10780
+ properties: {
10781
+ type: {
10782
+ type: "string",
10783
+ const: "number"
10784
+ },
10785
+ value: {
10786
+ type: "number",
10787
+ minimum: -9007199254740991,
10788
+ maximum: 9007199254740991
10789
+ }
10790
+ },
10791
+ required: [
10792
+ "type",
10793
+ "value"
10794
+ ],
10795
+ additionalProperties: false
10796
+ },
10797
+ {
10798
+ type: "object",
10799
+ properties: {
10800
+ type: {
10801
+ type: "string",
10802
+ const: "boolean"
10803
+ },
10804
+ value: {
10805
+ type: "boolean"
10806
+ }
10807
+ },
10808
+ required: [
10809
+ "type",
10810
+ "value"
10811
+ ],
10812
+ additionalProperties: false
10813
+ }
10814
+ ]
10815
+ }
10816
+ },
10817
+ required: [
10818
+ "property",
10819
+ "operator",
10820
+ "value"
10821
+ ],
10822
+ additionalProperties: false
10823
+ },
10824
+ {
10825
+ type: "object",
10826
+ properties: {
10827
+ property: {
10828
+ type: "string",
10829
+ minLength: 1,
10830
+ maxLength: 191
10831
+ },
10832
+ operator: {
10833
+ type: "string",
10834
+ const: "exists"
10835
+ }
10836
+ },
10837
+ required: [
10838
+ "property",
10839
+ "operator"
10840
+ ],
10841
+ additionalProperties: false
10842
+ }
10843
+ ]
10844
+ }
10845
+ }
10846
+ },
10847
+ required: [
10848
+ "eventName",
10849
+ "propertyFilters"
10850
+ ],
10851
+ additionalProperties: false
10852
+ },
10853
+ evidence: {
10854
+ oneOf: [
10855
+ {
10856
+ type: "object",
10857
+ properties: {
10858
+ window: {
10668
10859
  type: "object",
10669
10860
  properties: {
10670
- type: {
10861
+ startAt: {
10671
10862
  type: "string",
10672
- const: "string"
10863
+ format: "date-time",
10864
+ 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
10865
  },
10674
- value: {
10866
+ endAt: {
10675
10867
  type: "string",
10676
- maxLength: 191
10868
+ format: "date-time",
10869
+ 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
10870
  }
10678
10871
  },
10679
10872
  required: [
10680
- "type",
10681
- "value"
10873
+ "startAt",
10874
+ "endAt"
10682
10875
  ],
10683
10876
  additionalProperties: false
10684
10877
  },
10685
- {
10686
- type: "object",
10687
- properties: {
10688
- type: {
10878
+ coverage: {
10879
+ type: "string",
10880
+ enum: [
10881
+ "complete",
10882
+ "partial"
10883
+ ]
10884
+ },
10885
+ eventCount: {
10886
+ type: "integer",
10887
+ minimum: 0,
10888
+ maximum: 9007199254740991
10889
+ },
10890
+ activeDays: {
10891
+ type: "integer",
10892
+ minimum: 0,
10893
+ maximum: 9007199254740991
10894
+ },
10895
+ activeWeeks: {
10896
+ type: "integer",
10897
+ minimum: 0,
10898
+ maximum: 53
10899
+ },
10900
+ firstObservedAt: {
10901
+ anyOf: [
10902
+ {
10689
10903
  type: "string",
10690
- const: "number"
10904
+ format: "date-time",
10905
+ 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
10906
  },
10692
- value: {
10693
- type: "number",
10694
- minimum: -9007199254740991,
10695
- maximum: 9007199254740991
10907
+ {
10908
+ type: "null"
10696
10909
  }
10697
- },
10698
- required: [
10699
- "type",
10700
- "value"
10701
- ],
10702
- additionalProperties: false
10910
+ ]
10703
10911
  },
10704
- {
10912
+ lastObservedAt: {
10913
+ anyOf: [
10914
+ {
10915
+ type: "string",
10916
+ format: "date-time",
10917
+ 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)))$"
10918
+ },
10919
+ {
10920
+ type: "null"
10921
+ }
10922
+ ]
10923
+ },
10924
+ distinctCustomers: {
10925
+ type: "integer",
10926
+ minimum: 0,
10927
+ maximum: 9007199254740991
10928
+ }
10929
+ },
10930
+ required: [
10931
+ "window",
10932
+ "coverage",
10933
+ "eventCount",
10934
+ "activeDays",
10935
+ "activeWeeks",
10936
+ "firstObservedAt",
10937
+ "lastObservedAt",
10938
+ "distinctCustomers"
10939
+ ],
10940
+ additionalProperties: false
10941
+ },
10942
+ {
10943
+ type: "object",
10944
+ properties: {
10945
+ window: {
10705
10946
  type: "object",
10706
10947
  properties: {
10707
- type: {
10948
+ startAt: {
10708
10949
  type: "string",
10709
- const: "boolean"
10950
+ format: "date-time",
10951
+ 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
10952
  },
10711
- value: {
10712
- type: "boolean"
10953
+ endAt: {
10954
+ type: "string",
10955
+ format: "date-time",
10956
+ 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
10957
  }
10714
10958
  },
10715
10959
  required: [
10716
- "type",
10717
- "value"
10960
+ "startAt",
10961
+ "endAt"
10718
10962
  ],
10719
10963
  additionalProperties: false
10964
+ },
10965
+ coverage: {
10966
+ type: "string",
10967
+ const: "unavailable"
10968
+ },
10969
+ reason: {
10970
+ type: "string",
10971
+ enum: [
10972
+ "SOURCE_BLOCKED",
10973
+ "SOURCE_NOT_READY",
10974
+ "QUERY_FAILED"
10975
+ ]
10720
10976
  }
10721
- ]
10722
- }
10723
- },
10724
- required: [
10725
- "property",
10726
- "operator",
10727
- "value"
10728
- ],
10729
- additionalProperties: false
10730
- },
10731
- {
10732
- type: "object",
10733
- properties: {
10734
- property: {
10735
- type: "string",
10736
- minLength: 1,
10737
- maxLength: 191
10738
- },
10739
- operator: {
10740
- type: "string",
10741
- const: "exists"
10977
+ },
10978
+ required: [
10979
+ "window",
10980
+ "coverage",
10981
+ "reason"
10982
+ ],
10983
+ additionalProperties: false
10742
10984
  }
10743
- },
10744
- required: [
10745
- "property",
10746
- "operator"
10747
- ],
10748
- additionalProperties: false
10985
+ ]
10749
10986
  }
10750
- ]
10987
+ },
10988
+ required: [
10989
+ "id",
10990
+ "revision",
10991
+ "sourceKey",
10992
+ "featureKey",
10993
+ "name",
10994
+ "rule",
10995
+ "evidence"
10996
+ ],
10997
+ additionalProperties: false
10751
10998
  }
10752
- }
10753
- },
10754
- required: [
10755
- "sourceKey",
10756
- "eventName",
10757
- "behaviorKey",
10758
- "label"
10759
- ],
10760
- additionalProperties: false
10761
- },
10762
- outputSchema: {
10763
- $schema: "https://json-schema.org/draft/2020-12/schema",
10764
- type: "object",
10765
- properties: {
10766
- created: {
10767
- type: "boolean"
10768
10999
  },
10769
- metric: {
10770
- type: "object",
10771
- properties: {
10772
- sourceKey: {
10773
- type: "string",
10774
- pattern: "^metric_source_v1_[a-f0-9]{32}$"
10775
- },
10776
- behaviorKey: {
10777
- type: "string",
10778
- maxLength: 64,
10779
- pattern: "^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$"
10780
- },
10781
- label: {
10782
- type: "string",
10783
- minLength: 1,
10784
- maxLength: 255
10785
- },
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: {
11000
+ candidates: {
11001
+ oneOf: [
11002
+ {
11003
+ type: "object",
11004
+ properties: {
11005
+ status: {
11006
+ type: "string",
11007
+ const: "ready"
11008
+ },
11009
+ items: {
11010
+ maxItems: 100,
11011
+ type: "array",
11012
+ items: {
11013
+ type: "object",
11014
+ properties: {
11015
+ eventName: {
10800
11016
  type: "string",
10801
11017
  minLength: 1,
10802
11018
  maxLength: 191
10803
- }
10804
- }
10805
- },
10806
- required: [
10807
- "mode",
10808
- "eventNames"
10809
- ],
10810
- additionalProperties: false
10811
- },
10812
- {
10813
- type: "object",
10814
- properties: {
10815
- mode: {
10816
- type: "string",
10817
- const: "configured_event"
11019
+ },
11020
+ eventCount: {
11021
+ type: "integer",
11022
+ minimum: 0,
11023
+ maximum: 9007199254740991
11024
+ },
11025
+ distinctCustomers: {
11026
+ type: "integer",
11027
+ minimum: 0,
11028
+ maximum: 9007199254740991
11029
+ },
11030
+ activeWeeks: {
11031
+ type: "integer",
11032
+ minimum: 1,
11033
+ maximum: 53
11034
+ },
11035
+ propertyKeys: {
11036
+ maxItems: 10,
11037
+ type: "array",
11038
+ items: {
11039
+ type: "string",
11040
+ minLength: 1,
11041
+ maxLength: 191
11042
+ }
11043
+ }
10818
11044
  },
10819
- eventName: {
10820
- type: "string",
10821
- minLength: 1,
10822
- maxLength: 191
11045
+ required: [
11046
+ "eventName",
11047
+ "eventCount",
11048
+ "distinctCustomers",
11049
+ "activeWeeks",
11050
+ "propertyKeys"
11051
+ ],
11052
+ additionalProperties: false
11053
+ }
11054
+ },
11055
+ truncated: {
11056
+ type: "boolean"
11057
+ }
11058
+ },
11059
+ required: [
11060
+ "status",
11061
+ "items",
11062
+ "truncated"
11063
+ ],
11064
+ additionalProperties: false
11065
+ },
11066
+ {
11067
+ type: "object",
11068
+ properties: {
11069
+ status: {
11070
+ type: "string",
11071
+ const: "partial"
11072
+ },
11073
+ items: {
11074
+ maxItems: 100,
11075
+ type: "array",
11076
+ items: {
11077
+ type: "object",
11078
+ properties: {
11079
+ eventName: {
11080
+ type: "string",
11081
+ minLength: 1,
11082
+ maxLength: 191
11083
+ },
11084
+ eventCount: {
11085
+ type: "integer",
11086
+ minimum: 0,
11087
+ maximum: 9007199254740991
11088
+ },
11089
+ distinctCustomers: {
11090
+ type: "integer",
11091
+ minimum: 0,
11092
+ maximum: 9007199254740991
11093
+ },
11094
+ activeWeeks: {
11095
+ type: "integer",
11096
+ minimum: 1,
11097
+ maximum: 53
11098
+ },
11099
+ propertyKeys: {
11100
+ maxItems: 10,
11101
+ type: "array",
11102
+ items: {
11103
+ type: "string",
11104
+ minLength: 1,
11105
+ maxLength: 191
11106
+ }
11107
+ }
10823
11108
  },
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
11109
+ required: [
11110
+ "eventName",
11111
+ "eventCount",
11112
+ "distinctCustomers",
11113
+ "activeWeeks",
11114
+ "propertyKeys"
11115
+ ],
11116
+ additionalProperties: false
11117
+ }
11118
+ },
11119
+ truncated: {
11120
+ type: "boolean"
11121
+ }
11122
+ },
11123
+ required: [
11124
+ "status",
11125
+ "items",
11126
+ "truncated"
11127
+ ],
11128
+ additionalProperties: false
11129
+ },
11130
+ {
11131
+ type: "object",
11132
+ properties: {
11133
+ status: {
11134
+ type: "string",
11135
+ const: "unavailable"
11136
+ },
11137
+ reason: {
11138
+ type: "string",
11139
+ enum: [
11140
+ "SOURCE_BLOCKED",
11141
+ "SOURCE_NOT_READY",
11142
+ "QUERY_FAILED"
11143
+ ]
11144
+ }
11145
+ },
11146
+ required: [
11147
+ "status",
11148
+ "reason"
11149
+ ],
11150
+ additionalProperties: false
11151
+ }
11152
+ ]
11153
+ }
11154
+ },
11155
+ required: [
11156
+ "sources",
11157
+ "selectedSourceKey",
11158
+ "workspaceActiveFeatureCount",
11159
+ "features",
11160
+ "candidates"
11161
+ ],
11162
+ additionalProperties: false
11163
+ }
11164
+ },
11165
+ outlit_create_feature: {
11166
+ toolName: "outlit_create_feature",
11167
+ commandId: "value_feature.create",
11168
+ commandVersion: 1,
11169
+ ownerDomain: "value_features",
11170
+ title: "Create Feature",
11171
+ description: "Create or idempotently return one customer-value Feature observed by one event rule.",
11172
+ inputSchema: {
11173
+ $schema: "https://json-schema.org/draft/2020-12/schema",
11174
+ type: "object",
11175
+ properties: {
11176
+ sourceKey: {
11177
+ type: "string",
11178
+ pattern: "^metric_source_v1_[a-f0-9]{32}$"
11179
+ },
11180
+ eventName: {
11181
+ type: "string",
11182
+ minLength: 1,
11183
+ maxLength: 191
11184
+ },
11185
+ featureKey: {
11186
+ type: "string",
11187
+ maxLength: 64,
11188
+ pattern: "^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$"
11189
+ },
11190
+ name: {
11191
+ type: "string",
11192
+ minLength: 1,
11193
+ maxLength: 255
11194
+ },
11195
+ propertyFilters: {
11196
+ default: [],
11197
+ maxItems: 5,
11198
+ type: "array",
11199
+ items: {
11200
+ oneOf: [
11201
+ {
11202
+ type: "object",
11203
+ properties: {
11204
+ property: {
11205
+ type: "string",
11206
+ minLength: 1,
11207
+ maxLength: 191
11208
+ },
11209
+ operator: {
11210
+ type: "string",
11211
+ const: "equals"
11212
+ },
11213
+ value: {
11214
+ oneOf: [
11215
+ {
11216
+ type: "object",
11217
+ properties: {
11218
+ type: {
11219
+ type: "string",
11220
+ const: "string"
11221
+ },
11222
+ value: {
11223
+ type: "string",
11224
+ maxLength: 191
11225
+ }
11226
+ },
11227
+ required: [
11228
+ "type",
11229
+ "value"
11230
+ ],
11231
+ additionalProperties: false
11232
+ },
11233
+ {
11234
+ type: "object",
11235
+ properties: {
11236
+ type: {
11237
+ type: "string",
11238
+ const: "number"
11239
+ },
11240
+ value: {
11241
+ type: "number",
11242
+ minimum: -9007199254740991,
11243
+ maximum: 9007199254740991
11244
+ }
11245
+ },
11246
+ required: [
11247
+ "type",
11248
+ "value"
11249
+ ],
11250
+ additionalProperties: false
11251
+ },
11252
+ {
11253
+ type: "object",
11254
+ properties: {
11255
+ type: {
11256
+ type: "string",
11257
+ const: "boolean"
11258
+ },
11259
+ value: {
11260
+ type: "boolean"
11261
+ }
11262
+ },
11263
+ required: [
11264
+ "type",
11265
+ "value"
11266
+ ],
11267
+ additionalProperties: false
11268
+ }
11269
+ ]
11270
+ }
11271
+ },
11272
+ required: [
11273
+ "property",
11274
+ "operator",
11275
+ "value"
11276
+ ],
11277
+ additionalProperties: false
11278
+ },
11279
+ {
11280
+ type: "object",
11281
+ properties: {
11282
+ property: {
11283
+ type: "string",
11284
+ minLength: 1,
11285
+ maxLength: 191
11286
+ },
11287
+ operator: {
11288
+ type: "string",
11289
+ const: "exists"
11290
+ }
11291
+ },
11292
+ required: [
11293
+ "property",
11294
+ "operator"
11295
+ ],
11296
+ additionalProperties: false
11297
+ }
11298
+ ]
11299
+ }
11300
+ }
11301
+ },
11302
+ required: [
11303
+ "sourceKey",
11304
+ "eventName",
11305
+ "featureKey",
11306
+ "name"
11307
+ ],
11308
+ additionalProperties: false
11309
+ },
11310
+ outputSchema: {
11311
+ $schema: "https://json-schema.org/draft/2020-12/schema",
11312
+ type: "object",
11313
+ properties: {
11314
+ created: {
11315
+ type: "boolean"
11316
+ },
11317
+ feature: {
11318
+ type: "object",
11319
+ properties: {
11320
+ id: {
11321
+ type: "string",
11322
+ pattern: "^value_feature_v1_[a-f0-9]{32}$"
11323
+ },
11324
+ revision: {
11325
+ type: "string",
11326
+ pattern: "^value_feature_revision_v1_[a-f0-9]{32}$"
11327
+ },
11328
+ sourceKey: {
11329
+ type: "string",
11330
+ pattern: "^metric_source_v1_[a-f0-9]{32}$"
11331
+ },
11332
+ featureKey: {
11333
+ type: "string",
11334
+ maxLength: 64,
11335
+ pattern: "^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$"
11336
+ },
11337
+ name: {
11338
+ type: "string",
11339
+ minLength: 1,
11340
+ maxLength: 255
11341
+ },
11342
+ rule: {
11343
+ type: "object",
11344
+ properties: {
11345
+ eventName: {
11346
+ type: "string",
11347
+ minLength: 1,
11348
+ maxLength: 191
11349
+ },
11350
+ propertyFilters: {
11351
+ maxItems: 5,
11352
+ type: "array",
11353
+ items: {
11354
+ oneOf: [
11355
+ {
11356
+ type: "object",
11357
+ properties: {
11358
+ property: {
11359
+ type: "string",
11360
+ minLength: 1,
11361
+ maxLength: 191
11362
+ },
11363
+ operator: {
11364
+ type: "string",
11365
+ const: "equals"
11366
+ },
11367
+ value: {
11368
+ oneOf: [
11369
+ {
11370
+ type: "object",
11371
+ properties: {
11372
+ type: {
11373
+ type: "string",
11374
+ const: "string"
11375
+ },
11376
+ value: {
11377
+ type: "string",
11378
+ maxLength: 191
11379
+ }
11380
+ },
11381
+ required: [
11382
+ "type",
11383
+ "value"
11384
+ ],
11385
+ additionalProperties: false
10837
11386
  },
10838
- operator: {
10839
- type: "string",
10840
- const: "equals"
11387
+ {
11388
+ type: "object",
11389
+ properties: {
11390
+ type: {
11391
+ type: "string",
11392
+ const: "number"
11393
+ },
11394
+ value: {
11395
+ type: "number",
11396
+ minimum: -9007199254740991,
11397
+ maximum: 9007199254740991
11398
+ }
11399
+ },
11400
+ required: [
11401
+ "type",
11402
+ "value"
11403
+ ],
11404
+ additionalProperties: false
10841
11405
  },
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
- }
11406
+ {
11407
+ type: "object",
11408
+ properties: {
11409
+ type: {
11410
+ type: "string",
11411
+ const: "boolean"
11412
+ },
11413
+ value: {
11414
+ type: "boolean"
11415
+ }
11416
+ },
11417
+ required: [
11418
+ "type",
11419
+ "value"
11420
+ ],
11421
+ additionalProperties: false
11422
+ }
11423
+ ]
11424
+ }
11425
+ },
11426
+ required: [
11427
+ "property",
11428
+ "operator",
11429
+ "value"
11430
+ ],
11431
+ additionalProperties: false
11432
+ },
11433
+ {
11434
+ type: "object",
11435
+ properties: {
11436
+ property: {
11437
+ type: "string",
11438
+ minLength: 1,
11439
+ maxLength: 191
11440
+ },
11441
+ operator: {
11442
+ type: "string",
11443
+ const: "exists"
11444
+ }
11445
+ },
11446
+ required: [
11447
+ "property",
11448
+ "operator"
11449
+ ],
11450
+ additionalProperties: false
11451
+ }
11452
+ ]
11453
+ }
11454
+ }
11455
+ },
11456
+ required: [
11457
+ "eventName",
11458
+ "propertyFilters"
11459
+ ],
11460
+ additionalProperties: false
11461
+ }
11462
+ },
11463
+ required: [
11464
+ "id",
11465
+ "revision",
11466
+ "sourceKey",
11467
+ "featureKey",
11468
+ "name",
11469
+ "rule"
11470
+ ],
11471
+ additionalProperties: false
11472
+ }
11473
+ },
11474
+ required: [
11475
+ "created",
11476
+ "feature"
11477
+ ],
11478
+ additionalProperties: false
11479
+ }
11480
+ },
11481
+ outlit_archive_feature: {
11482
+ toolName: "outlit_archive_feature",
11483
+ commandId: "value_feature.archive",
11484
+ commandVersion: 1,
11485
+ ownerDomain: "value_features",
11486
+ title: "Archive Feature",
11487
+ description: "Archive a Feature when at least one other active Feature remains.",
11488
+ inputSchema: {
11489
+ $schema: "https://json-schema.org/draft/2020-12/schema",
11490
+ type: "object",
11491
+ properties: {
11492
+ id: {
11493
+ type: "string",
11494
+ pattern: "^value_feature_v1_[a-f0-9]{32}$"
11495
+ },
11496
+ revision: {
11497
+ type: "string",
11498
+ pattern: "^value_feature_revision_v1_[a-f0-9]{32}$"
11499
+ }
11500
+ },
11501
+ required: [
11502
+ "id",
11503
+ "revision"
11504
+ ],
11505
+ additionalProperties: false
11506
+ },
11507
+ outputSchema: {
11508
+ $schema: "https://json-schema.org/draft/2020-12/schema",
11509
+ type: "object",
11510
+ properties: {
11511
+ archived: {
11512
+ type: "boolean",
11513
+ const: true
11514
+ },
11515
+ feature: {
11516
+ type: "object",
11517
+ properties: {
11518
+ id: {
11519
+ type: "string",
11520
+ pattern: "^value_feature_v1_[a-f0-9]{32}$"
11521
+ },
11522
+ revision: {
11523
+ type: "string",
11524
+ pattern: "^value_feature_revision_v1_[a-f0-9]{32}$"
11525
+ }
11526
+ },
11527
+ required: [
11528
+ "id",
11529
+ "revision"
11530
+ ],
11531
+ additionalProperties: false
11532
+ }
11533
+ },
11534
+ required: [
11535
+ "archived",
11536
+ "feature"
11537
+ ],
11538
+ additionalProperties: false
11539
+ }
11540
+ },
11541
+ outlit_get_customer_features: {
11542
+ toolName: "outlit_get_customer_features",
11543
+ commandId: "customer_feature_usage.get",
11544
+ commandVersion: 1,
11545
+ ownerDomain: "value_features",
11546
+ title: "Get Customer Features",
11547
+ description: "Read exact historical feature-usage evidence for one authorized customer.",
11548
+ inputSchema: {
11549
+ $schema: "https://json-schema.org/draft/2020-12/schema",
11550
+ type: "object",
11551
+ properties: {
11552
+ customer: {
11553
+ type: "string",
11554
+ minLength: 1,
11555
+ maxLength: 500
11556
+ },
11557
+ weeks: {
11558
+ default: 12,
11559
+ type: "integer",
11560
+ minimum: 1,
11561
+ maximum: 53
11562
+ },
11563
+ includeWeeklyUsage: {
11564
+ default: false,
11565
+ type: "boolean"
11566
+ }
11567
+ },
11568
+ required: [
11569
+ "customer"
11570
+ ],
11571
+ additionalProperties: false
11572
+ },
11573
+ outputSchema: {
11574
+ $schema: "https://json-schema.org/draft/2020-12/schema",
11575
+ type: "object",
11576
+ properties: {
11577
+ customer: {
11578
+ type: "object",
11579
+ properties: {
11580
+ id: {
11581
+ type: "string",
11582
+ minLength: 1,
11583
+ maxLength: 191
11584
+ },
11585
+ name: {
11586
+ type: "string",
11587
+ minLength: 1,
11588
+ maxLength: 255
11589
+ }
11590
+ },
11591
+ required: [
11592
+ "id",
11593
+ "name"
11594
+ ],
11595
+ additionalProperties: false
11596
+ },
11597
+ features: {
11598
+ maxItems: 100,
11599
+ type: "array",
11600
+ items: {
11601
+ type: "object",
11602
+ properties: {
11603
+ id: {
11604
+ type: "string",
11605
+ pattern: "^value_feature_v1_[a-f0-9]{32}$"
11606
+ },
11607
+ revision: {
11608
+ type: "string",
11609
+ pattern: "^value_feature_revision_v1_[a-f0-9]{32}$"
11610
+ },
11611
+ sourceKey: {
11612
+ type: "string",
11613
+ pattern: "^metric_source_v1_[a-f0-9]{32}$"
11614
+ },
11615
+ featureKey: {
11616
+ type: "string",
11617
+ maxLength: 64,
11618
+ pattern: "^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$"
11619
+ },
11620
+ name: {
11621
+ type: "string",
11622
+ minLength: 1,
11623
+ maxLength: 255
11624
+ },
11625
+ rule: {
11626
+ type: "object",
11627
+ properties: {
11628
+ eventName: {
11629
+ type: "string",
11630
+ minLength: 1,
11631
+ maxLength: 191
11632
+ },
11633
+ propertyFilters: {
11634
+ maxItems: 5,
11635
+ type: "array",
11636
+ items: {
11637
+ oneOf: [
11638
+ {
11639
+ type: "object",
11640
+ properties: {
11641
+ property: {
11642
+ type: "string",
11643
+ minLength: 1,
11644
+ maxLength: 191
11645
+ },
11646
+ operator: {
11647
+ type: "string",
11648
+ const: "equals"
11649
+ },
11650
+ value: {
11651
+ oneOf: [
11652
+ {
11653
+ type: "object",
11654
+ properties: {
11655
+ type: {
11656
+ type: "string",
11657
+ const: "string"
10855
11658
  },
10856
- required: [
10857
- "type",
10858
- "value"
10859
- ],
10860
- additionalProperties: false
11659
+ value: {
11660
+ type: "string",
11661
+ maxLength: 191
11662
+ }
10861
11663
  },
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
- }
11664
+ required: [
11665
+ "type",
11666
+ "value"
11667
+ ],
11668
+ additionalProperties: false
11669
+ },
11670
+ {
11671
+ type: "object",
11672
+ properties: {
11673
+ type: {
11674
+ type: "string",
11675
+ const: "number"
10874
11676
  },
10875
- required: [
10876
- "type",
10877
- "value"
10878
- ],
10879
- additionalProperties: false
11677
+ value: {
11678
+ type: "number",
11679
+ minimum: -9007199254740991,
11680
+ maximum: 9007199254740991
11681
+ }
10880
11682
  },
10881
- {
10882
- type: "object",
10883
- properties: {
10884
- type: {
10885
- type: "string",
10886
- const: "boolean"
10887
- },
10888
- value: {
10889
- type: "boolean"
10890
- }
11683
+ required: [
11684
+ "type",
11685
+ "value"
11686
+ ],
11687
+ additionalProperties: false
11688
+ },
11689
+ {
11690
+ type: "object",
11691
+ properties: {
11692
+ type: {
11693
+ type: "string",
11694
+ const: "boolean"
10891
11695
  },
10892
- required: [
10893
- "type",
10894
- "value"
10895
- ],
10896
- additionalProperties: false
10897
- }
10898
- ]
10899
- }
11696
+ value: {
11697
+ type: "boolean"
11698
+ }
11699
+ },
11700
+ required: [
11701
+ "type",
11702
+ "value"
11703
+ ],
11704
+ additionalProperties: false
11705
+ }
11706
+ ]
11707
+ }
11708
+ },
11709
+ required: [
11710
+ "property",
11711
+ "operator",
11712
+ "value"
11713
+ ],
11714
+ additionalProperties: false
11715
+ },
11716
+ {
11717
+ type: "object",
11718
+ properties: {
11719
+ property: {
11720
+ type: "string",
11721
+ minLength: 1,
11722
+ maxLength: 191
10900
11723
  },
10901
- required: [
10902
- "property",
10903
- "operator",
10904
- "value"
10905
- ],
10906
- additionalProperties: false
11724
+ operator: {
11725
+ type: "string",
11726
+ const: "exists"
11727
+ }
11728
+ },
11729
+ required: [
11730
+ "property",
11731
+ "operator"
11732
+ ],
11733
+ additionalProperties: false
11734
+ }
11735
+ ]
11736
+ }
11737
+ }
11738
+ },
11739
+ required: [
11740
+ "eventName",
11741
+ "propertyFilters"
11742
+ ],
11743
+ additionalProperties: false
11744
+ },
11745
+ evidence: {
11746
+ oneOf: [
11747
+ {
11748
+ type: "object",
11749
+ properties: {
11750
+ window: {
11751
+ type: "object",
11752
+ properties: {
11753
+ startAt: {
11754
+ type: "string",
11755
+ format: "date-time",
11756
+ 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)))$"
11757
+ },
11758
+ endAt: {
11759
+ type: "string",
11760
+ format: "date-time",
11761
+ 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)))$"
11762
+ }
11763
+ },
11764
+ required: [
11765
+ "startAt",
11766
+ "endAt"
11767
+ ],
11768
+ additionalProperties: false
11769
+ },
11770
+ coverage: {
11771
+ type: "string",
11772
+ enum: [
11773
+ "complete",
11774
+ "partial"
11775
+ ]
11776
+ },
11777
+ eventCount: {
11778
+ type: "integer",
11779
+ minimum: 0,
11780
+ maximum: 9007199254740991
11781
+ },
11782
+ activeDays: {
11783
+ type: "integer",
11784
+ minimum: 0,
11785
+ maximum: 9007199254740991
11786
+ },
11787
+ activeWeeks: {
11788
+ type: "integer",
11789
+ minimum: 0,
11790
+ maximum: 53
11791
+ },
11792
+ firstObservedAt: {
11793
+ anyOf: [
11794
+ {
11795
+ type: "string",
11796
+ format: "date-time",
11797
+ 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)))$"
11798
+ },
11799
+ {
11800
+ type: "null"
11801
+ }
11802
+ ]
11803
+ },
11804
+ lastObservedAt: {
11805
+ anyOf: [
11806
+ {
11807
+ type: "string",
11808
+ format: "date-time",
11809
+ 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)))$"
11810
+ },
11811
+ {
11812
+ type: "null"
11813
+ }
11814
+ ]
11815
+ },
11816
+ weeklyUsage: {
11817
+ maxItems: 53,
11818
+ type: "array",
11819
+ items: {
11820
+ oneOf: [
11821
+ {
11822
+ type: "object",
11823
+ properties: {
11824
+ weekStartAt: {
11825
+ type: "string",
11826
+ format: "date-time",
11827
+ 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)))$"
11828
+ },
11829
+ coverage: {
11830
+ type: "string",
11831
+ enum: [
11832
+ "complete",
11833
+ "partial"
11834
+ ]
11835
+ },
11836
+ eventCount: {
11837
+ type: "integer",
11838
+ minimum: 0,
11839
+ maximum: 9007199254740991
11840
+ },
11841
+ activeDays: {
11842
+ type: "integer",
11843
+ minimum: 0,
11844
+ maximum: 7
11845
+ }
11846
+ },
11847
+ required: [
11848
+ "weekStartAt",
11849
+ "coverage",
11850
+ "eventCount",
11851
+ "activeDays"
11852
+ ],
11853
+ additionalProperties: false
11854
+ },
11855
+ {
11856
+ type: "object",
11857
+ properties: {
11858
+ weekStartAt: {
11859
+ type: "string",
11860
+ format: "date-time",
11861
+ 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)))$"
11862
+ },
11863
+ coverage: {
11864
+ type: "string",
11865
+ const: "unavailable"
11866
+ }
11867
+ },
11868
+ required: [
11869
+ "weekStartAt",
11870
+ "coverage"
11871
+ ],
11872
+ additionalProperties: false
11873
+ }
11874
+ ]
11875
+ }
11876
+ }
11877
+ },
11878
+ required: [
11879
+ "window",
11880
+ "coverage",
11881
+ "eventCount",
11882
+ "activeDays",
11883
+ "activeWeeks",
11884
+ "firstObservedAt",
11885
+ "lastObservedAt"
11886
+ ],
11887
+ additionalProperties: false
11888
+ },
11889
+ {
11890
+ type: "object",
11891
+ properties: {
11892
+ window: {
11893
+ type: "object",
11894
+ properties: {
11895
+ startAt: {
11896
+ type: "string",
11897
+ format: "date-time",
11898
+ 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)))$"
10907
11899
  },
10908
- {
10909
- type: "object",
10910
- properties: {
10911
- property: {
10912
- type: "string",
10913
- minLength: 1,
10914
- maxLength: 191
10915
- },
10916
- operator: {
10917
- type: "string",
10918
- const: "exists"
10919
- }
10920
- },
10921
- required: [
10922
- "property",
10923
- "operator"
10924
- ],
10925
- additionalProperties: false
11900
+ endAt: {
11901
+ type: "string",
11902
+ format: "date-time",
11903
+ 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)))$"
10926
11904
  }
11905
+ },
11906
+ required: [
11907
+ "startAt",
11908
+ "endAt"
11909
+ ],
11910
+ additionalProperties: false
11911
+ },
11912
+ coverage: {
11913
+ type: "string",
11914
+ const: "unavailable"
11915
+ },
11916
+ reason: {
11917
+ type: "string",
11918
+ enum: [
11919
+ "SOURCE_BLOCKED",
11920
+ "SOURCE_NOT_READY",
11921
+ "QUERY_FAILED"
10927
11922
  ]
10928
11923
  }
11924
+ },
11925
+ required: [
11926
+ "window",
11927
+ "coverage",
11928
+ "reason"
11929
+ ],
11930
+ additionalProperties: false
11931
+ }
11932
+ ]
11933
+ }
11934
+ },
11935
+ required: [
11936
+ "id",
11937
+ "revision",
11938
+ "sourceKey",
11939
+ "featureKey",
11940
+ "name",
11941
+ "rule",
11942
+ "evidence"
11943
+ ],
11944
+ additionalProperties: false
11945
+ }
11946
+ }
11947
+ },
11948
+ required: [
11949
+ "customer",
11950
+ "features"
11951
+ ],
11952
+ additionalProperties: false
11953
+ }
11954
+ },
11955
+ outlit_list_attention_items: {
11956
+ toolName: "outlit_list_attention_items",
11957
+ commandId: "attention.list",
11958
+ commandVersion: 1,
11959
+ ownerDomain: "attention",
11960
+ title: "List Attention Items",
11961
+ 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.",
11962
+ inputSchema: {
11963
+ $schema: "https://json-schema.org/draft/2020-12/schema",
11964
+ type: "object",
11965
+ properties: {
11966
+ status: {
11967
+ description: "Attention lifecycle to list (default: open)",
11968
+ default: "open",
11969
+ type: "string",
11970
+ enum: [
11971
+ "open",
11972
+ "resolved"
11973
+ ]
11974
+ },
11975
+ customerId: {
11976
+ description: "Filter by exact customer ID",
11977
+ type: "string",
11978
+ format: "uuid",
11979
+ 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)$"
11980
+ },
11981
+ limit: {
11982
+ description: "Results per page (default: 25, max: 100)",
11983
+ default: 25,
11984
+ type: "integer",
11985
+ minimum: 1,
11986
+ maximum: 100
11987
+ },
11988
+ cursor: {
11989
+ description: "Opaque cursor from a previous response with the same filters",
11990
+ type: "string",
11991
+ minLength: 1,
11992
+ maxLength: 2000
11993
+ }
11994
+ },
11995
+ additionalProperties: false
11996
+ },
11997
+ outputSchema: {
11998
+ $schema: "https://json-schema.org/draft/2020-12/schema",
11999
+ type: "object",
12000
+ properties: {
12001
+ items: {
12002
+ maxItems: 100,
12003
+ type: "array",
12004
+ items: {
12005
+ type: "object",
12006
+ properties: {
12007
+ id: {
12008
+ type: "string",
12009
+ minLength: 1,
12010
+ maxLength: 500
12011
+ },
12012
+ customer: {
12013
+ type: "object",
12014
+ properties: {
12015
+ id: {
12016
+ type: "string",
12017
+ minLength: 1,
12018
+ maxLength: 500
12019
+ },
12020
+ name: {
12021
+ type: "string",
12022
+ minLength: 1,
12023
+ maxLength: 500
12024
+ },
12025
+ domain: {
12026
+ type: "string",
12027
+ maxLength: 253
12028
+ },
12029
+ ownerName: {
12030
+ anyOf: [
12031
+ {
12032
+ type: "string",
12033
+ minLength: 1,
12034
+ maxLength: 500
12035
+ },
12036
+ {
12037
+ type: "null"
12038
+ }
12039
+ ]
12040
+ }
12041
+ },
12042
+ required: [
12043
+ "id",
12044
+ "name",
12045
+ "domain",
12046
+ "ownerName"
12047
+ ],
12048
+ additionalProperties: false
12049
+ },
12050
+ title: {
12051
+ type: "string",
12052
+ minLength: 1,
12053
+ maxLength: 240
12054
+ },
12055
+ priority: {
12056
+ type: "string",
12057
+ enum: [
12058
+ "NORMAL",
12059
+ "HIGH",
12060
+ "URGENT"
12061
+ ]
12062
+ },
12063
+ evidenceCount: {
12064
+ type: "integer",
12065
+ minimum: 0,
12066
+ maximum: 50
12067
+ },
12068
+ lifecycle: {
12069
+ type: "object",
12070
+ properties: {
12071
+ status: {
12072
+ type: "string",
12073
+ enum: [
12074
+ "open",
12075
+ "resolved"
12076
+ ]
12077
+ },
12078
+ customerVisibleAt: {
12079
+ type: "string",
12080
+ format: "date-time",
12081
+ 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))$"
12082
+ },
12083
+ resolvedAt: {
12084
+ anyOf: [
12085
+ {
12086
+ type: "string",
12087
+ format: "date-time",
12088
+ 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))$"
12089
+ },
12090
+ {
12091
+ type: "null"
12092
+ }
12093
+ ]
12094
+ },
12095
+ reopenedAt: {
12096
+ anyOf: [
12097
+ {
12098
+ type: "string",
12099
+ format: "date-time",
12100
+ 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))$"
12101
+ },
12102
+ {
12103
+ type: "null"
12104
+ }
12105
+ ]
12106
+ },
12107
+ createdAt: {
12108
+ type: "string",
12109
+ format: "date-time",
12110
+ 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))$"
12111
+ },
12112
+ updatedAt: {
12113
+ type: "string",
12114
+ format: "date-time",
12115
+ 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))$"
12116
+ },
12117
+ materialUpdateAt: {
12118
+ anyOf: [
12119
+ {
12120
+ type: "string",
12121
+ format: "date-time",
12122
+ 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))$"
12123
+ },
12124
+ {
12125
+ type: "null"
12126
+ }
12127
+ ]
12128
+ }
12129
+ },
12130
+ required: [
12131
+ "status",
12132
+ "customerVisibleAt",
12133
+ "resolvedAt",
12134
+ "reopenedAt",
12135
+ "createdAt",
12136
+ "updatedAt",
12137
+ "materialUpdateAt"
12138
+ ],
12139
+ additionalProperties: false
12140
+ },
12141
+ accountImportance: {
12142
+ type: "object",
12143
+ properties: {
12144
+ arrCents: {
12145
+ anyOf: [
12146
+ {
12147
+ type: "number",
12148
+ minimum: 0
12149
+ },
12150
+ {
12151
+ type: "null"
12152
+ }
12153
+ ]
12154
+ },
12155
+ currency: {
12156
+ anyOf: [
12157
+ {
12158
+ type: "string",
12159
+ pattern: "^[A-Z]{3}$"
12160
+ },
12161
+ {
12162
+ type: "null"
12163
+ }
12164
+ ]
12165
+ },
12166
+ arrShareWithinCurrency: {
12167
+ anyOf: [
12168
+ {
12169
+ type: "number",
12170
+ minimum: 0,
12171
+ maximum: 1
12172
+ },
12173
+ {
12174
+ type: "null"
12175
+ }
12176
+ ],
12177
+ description: "Organization ARR share among customers using the same currency"
12178
+ },
12179
+ arrPercentileWithinCurrency: {
12180
+ anyOf: [
12181
+ {
12182
+ type: "number",
12183
+ minimum: 0,
12184
+ maximum: 100
12185
+ },
12186
+ {
12187
+ type: "null"
12188
+ }
12189
+ ],
12190
+ description: "ARR percentile among customers using the same currency"
12191
+ },
12192
+ segments: {
12193
+ maxItems: 50,
12194
+ type: "array",
12195
+ items: {
12196
+ type: "string",
12197
+ minLength: 1,
12198
+ maxLength: 240
10929
12199
  }
12200
+ }
12201
+ },
12202
+ required: [
12203
+ "arrCents",
12204
+ "currency",
12205
+ "arrShareWithinCurrency",
12206
+ "arrPercentileWithinCurrency",
12207
+ "segments"
12208
+ ],
12209
+ additionalProperties: false
12210
+ },
12211
+ preparedActionUrl: {
12212
+ anyOf: [
12213
+ {
12214
+ type: "string",
12215
+ maxLength: 2000,
12216
+ format: "uri"
10930
12217
  },
10931
- required: [
10932
- "mode",
10933
- "eventName",
10934
- "propertyFilters"
10935
- ],
10936
- additionalProperties: false
12218
+ {
12219
+ type: "null"
12220
+ }
12221
+ ]
12222
+ }
12223
+ },
12224
+ required: [
12225
+ "id",
12226
+ "customer",
12227
+ "title",
12228
+ "priority",
12229
+ "evidenceCount",
12230
+ "lifecycle",
12231
+ "accountImportance",
12232
+ "preparedActionUrl"
12233
+ ],
12234
+ additionalProperties: false
12235
+ }
12236
+ },
12237
+ pagination: {
12238
+ type: "object",
12239
+ properties: {
12240
+ hasMore: {
12241
+ type: "boolean"
12242
+ },
12243
+ nextCursor: {
12244
+ anyOf: [
12245
+ {
12246
+ type: "string",
12247
+ minLength: 1,
12248
+ maxLength: 2000
12249
+ },
12250
+ {
12251
+ type: "null"
10937
12252
  }
10938
12253
  ]
10939
12254
  },
12255
+ total: {
12256
+ type: "integer",
12257
+ minimum: 0,
12258
+ maximum: 9007199254740991
12259
+ }
12260
+ },
12261
+ required: [
12262
+ "hasMore",
12263
+ "nextCursor",
12264
+ "total"
12265
+ ],
12266
+ additionalProperties: false
12267
+ }
12268
+ },
12269
+ required: [
12270
+ "items",
12271
+ "pagination"
12272
+ ],
12273
+ additionalProperties: false
12274
+ }
12275
+ },
12276
+ outlit_get_attention_item: {
12277
+ toolName: "outlit_get_attention_item",
12278
+ commandId: "attention.get",
12279
+ commandVersion: 1,
12280
+ ownerDomain: "attention",
12281
+ title: "Get Attention Item",
12282
+ 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.",
12283
+ inputSchema: {
12284
+ $schema: "https://json-schema.org/draft/2020-12/schema",
12285
+ type: "object",
12286
+ properties: {
12287
+ id: {
12288
+ type: "string",
12289
+ format: "uuid",
12290
+ 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)$",
12291
+ description: "Exact Attention item ID"
12292
+ }
12293
+ },
12294
+ required: [
12295
+ "id"
12296
+ ],
12297
+ additionalProperties: false
12298
+ },
12299
+ outputSchema: {
12300
+ $schema: "https://json-schema.org/draft/2020-12/schema",
12301
+ type: "object",
12302
+ properties: {
12303
+ id: {
12304
+ type: "string",
12305
+ minLength: 1,
12306
+ maxLength: 500
12307
+ },
12308
+ customer: {
12309
+ type: "object",
12310
+ properties: {
12311
+ id: {
12312
+ type: "string",
12313
+ minLength: 1,
12314
+ maxLength: 500
12315
+ },
12316
+ name: {
12317
+ type: "string",
12318
+ minLength: 1,
12319
+ maxLength: 500
12320
+ },
12321
+ domain: {
12322
+ type: "string",
12323
+ maxLength: 253
12324
+ },
12325
+ ownerName: {
12326
+ anyOf: [
12327
+ {
12328
+ type: "string",
12329
+ minLength: 1,
12330
+ maxLength: 500
12331
+ },
12332
+ {
12333
+ type: "null"
12334
+ }
12335
+ ]
12336
+ }
12337
+ },
12338
+ required: [
12339
+ "id",
12340
+ "name",
12341
+ "domain",
12342
+ "ownerName"
12343
+ ],
12344
+ additionalProperties: false
12345
+ },
12346
+ title: {
12347
+ type: "string",
12348
+ minLength: 1,
12349
+ maxLength: 240
12350
+ },
12351
+ priority: {
12352
+ type: "string",
12353
+ enum: [
12354
+ "NORMAL",
12355
+ "HIGH",
12356
+ "URGENT"
12357
+ ]
12358
+ },
12359
+ evidenceCount: {
12360
+ type: "integer",
12361
+ minimum: 0,
12362
+ maximum: 50
12363
+ },
12364
+ lifecycle: {
12365
+ type: "object",
12366
+ properties: {
10940
12367
  status: {
10941
12368
  type: "string",
10942
- const: "ENABLED"
12369
+ enum: [
12370
+ "open",
12371
+ "resolved"
12372
+ ]
12373
+ },
12374
+ customerVisibleAt: {
12375
+ type: "string",
12376
+ format: "date-time",
12377
+ 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))$"
12378
+ },
12379
+ resolvedAt: {
12380
+ anyOf: [
12381
+ {
12382
+ type: "string",
12383
+ format: "date-time",
12384
+ 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))$"
12385
+ },
12386
+ {
12387
+ type: "null"
12388
+ }
12389
+ ]
12390
+ },
12391
+ reopenedAt: {
12392
+ anyOf: [
12393
+ {
12394
+ type: "string",
12395
+ format: "date-time",
12396
+ 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))$"
12397
+ },
12398
+ {
12399
+ type: "null"
12400
+ }
12401
+ ]
12402
+ },
12403
+ createdAt: {
12404
+ type: "string",
12405
+ format: "date-time",
12406
+ 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))$"
12407
+ },
12408
+ updatedAt: {
12409
+ type: "string",
12410
+ format: "date-time",
12411
+ 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))$"
12412
+ },
12413
+ materialUpdateAt: {
12414
+ anyOf: [
12415
+ {
12416
+ type: "string",
12417
+ format: "date-time",
12418
+ 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))$"
12419
+ },
12420
+ {
12421
+ type: "null"
12422
+ }
12423
+ ]
12424
+ }
12425
+ },
12426
+ required: [
12427
+ "status",
12428
+ "customerVisibleAt",
12429
+ "resolvedAt",
12430
+ "reopenedAt",
12431
+ "createdAt",
12432
+ "updatedAt",
12433
+ "materialUpdateAt"
12434
+ ],
12435
+ additionalProperties: false
12436
+ },
12437
+ accountImportance: {
12438
+ type: "object",
12439
+ properties: {
12440
+ arrCents: {
12441
+ anyOf: [
12442
+ {
12443
+ type: "number",
12444
+ minimum: 0
12445
+ },
12446
+ {
12447
+ type: "null"
12448
+ }
12449
+ ]
12450
+ },
12451
+ currency: {
12452
+ anyOf: [
12453
+ {
12454
+ type: "string",
12455
+ pattern: "^[A-Z]{3}$"
12456
+ },
12457
+ {
12458
+ type: "null"
12459
+ }
12460
+ ]
12461
+ },
12462
+ arrShareWithinCurrency: {
12463
+ anyOf: [
12464
+ {
12465
+ type: "number",
12466
+ minimum: 0,
12467
+ maximum: 1
12468
+ },
12469
+ {
12470
+ type: "null"
12471
+ }
12472
+ ],
12473
+ description: "Organization ARR share among customers using the same currency"
12474
+ },
12475
+ arrPercentileWithinCurrency: {
12476
+ anyOf: [
12477
+ {
12478
+ type: "number",
12479
+ minimum: 0,
12480
+ maximum: 100
12481
+ },
12482
+ {
12483
+ type: "null"
12484
+ }
12485
+ ],
12486
+ description: "ARR percentile among customers using the same currency"
12487
+ },
12488
+ segments: {
12489
+ maxItems: 50,
12490
+ type: "array",
12491
+ items: {
12492
+ type: "string",
12493
+ minLength: 1,
12494
+ maxLength: 240
12495
+ }
12496
+ }
12497
+ },
12498
+ required: [
12499
+ "arrCents",
12500
+ "currency",
12501
+ "arrShareWithinCurrency",
12502
+ "arrPercentileWithinCurrency",
12503
+ "segments"
12504
+ ],
12505
+ additionalProperties: false
12506
+ },
12507
+ preparedActionUrl: {
12508
+ anyOf: [
12509
+ {
12510
+ type: "string",
12511
+ maxLength: 2000,
12512
+ format: "uri"
10943
12513
  },
10944
- evaluationMode: {
12514
+ {
12515
+ type: "null"
12516
+ }
12517
+ ]
12518
+ },
12519
+ whatChanged: {
12520
+ type: "string",
12521
+ minLength: 1,
12522
+ maxLength: 8000
12523
+ },
12524
+ whyItMatters: {
12525
+ type: "string",
12526
+ minLength: 1,
12527
+ maxLength: 8000
12528
+ },
12529
+ uncertainty: {
12530
+ anyOf: [
12531
+ {
10945
12532
  type: "string",
10946
- const: "SHADOW"
12533
+ minLength: 1,
12534
+ maxLength: 8000
12535
+ },
12536
+ {
12537
+ type: "null"
12538
+ }
12539
+ ]
12540
+ },
12541
+ priorityReason: {
12542
+ type: "string",
12543
+ minLength: 1,
12544
+ maxLength: 8000
12545
+ },
12546
+ timeline: {
12547
+ maxItems: 20,
12548
+ type: "array",
12549
+ items: {
12550
+ type: "object",
12551
+ properties: {
12552
+ title: {
12553
+ type: "string",
12554
+ minLength: 1,
12555
+ maxLength: 240
12556
+ },
12557
+ explanation: {
12558
+ type: "string",
12559
+ minLength: 1,
12560
+ maxLength: 4000
12561
+ },
12562
+ observedAt: {
12563
+ type: "string",
12564
+ format: "date-time",
12565
+ 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))$"
12566
+ }
10947
12567
  },
10948
- definitions: {
10949
- minItems: 2,
10950
- maxItems: 2,
10951
- type: "array",
10952
- items: {
10953
- type: "object",
10954
- properties: {
10955
- id: {
12568
+ required: [
12569
+ "title",
12570
+ "explanation",
12571
+ "observedAt"
12572
+ ],
12573
+ additionalProperties: false
12574
+ }
12575
+ },
12576
+ evidence: {
12577
+ maxItems: 20,
12578
+ type: "array",
12579
+ items: {
12580
+ type: "object",
12581
+ properties: {
12582
+ role: {
12583
+ type: "string",
12584
+ enum: [
12585
+ "supporting",
12586
+ "contradictory",
12587
+ "context"
12588
+ ]
12589
+ },
12590
+ kind: {
12591
+ type: "string",
12592
+ enum: [
12593
+ "metric",
12594
+ "communication",
12595
+ "record",
12596
+ "event"
12597
+ ]
12598
+ },
12599
+ title: {
12600
+ type: "string",
12601
+ minLength: 1,
12602
+ maxLength: 500
12603
+ },
12604
+ observedAt: {
12605
+ anyOf: [
12606
+ {
10956
12607
  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)$"
12608
+ format: "date-time",
12609
+ 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
12610
  },
10960
- metricKey: {
10961
- type: "string",
10962
- minLength: 1,
10963
- maxLength: 191
12611
+ {
12612
+ type: "null"
12613
+ }
12614
+ ]
12615
+ },
12616
+ window: {
12617
+ anyOf: [
12618
+ {
12619
+ type: "object",
12620
+ properties: {
12621
+ start: {
12622
+ type: "string",
12623
+ format: "date-time",
12624
+ 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))$"
12625
+ },
12626
+ end: {
12627
+ type: "string",
12628
+ format: "date-time",
12629
+ 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))$"
12630
+ }
12631
+ },
12632
+ required: [
12633
+ "start",
12634
+ "end"
12635
+ ],
12636
+ additionalProperties: false
10964
12637
  },
10965
- aggregation: {
10966
- type: "string",
10967
- enum: [
10968
- "active_days",
10969
- "event_count"
10970
- ]
12638
+ {
12639
+ type: "null"
10971
12640
  }
10972
- },
10973
- required: [
10974
- "id",
10975
- "metricKey",
10976
- "aggregation"
10977
- ],
10978
- additionalProperties: false
12641
+ ]
12642
+ },
12643
+ sourceLabel: {
12644
+ type: "string",
12645
+ minLength: 1,
12646
+ maxLength: 240
10979
12647
  }
12648
+ },
12649
+ required: [
12650
+ "role",
12651
+ "kind",
12652
+ "title",
12653
+ "observedAt",
12654
+ "window",
12655
+ "sourceLabel"
12656
+ ],
12657
+ additionalProperties: false
12658
+ }
12659
+ },
12660
+ latestUpdate: {
12661
+ anyOf: [
12662
+ {
12663
+ type: "object",
12664
+ properties: {
12665
+ updatedAt: {
12666
+ type: "string",
12667
+ format: "date-time",
12668
+ 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))$"
12669
+ },
12670
+ summary: {
12671
+ type: "string",
12672
+ minLength: 1,
12673
+ maxLength: 8000
12674
+ }
12675
+ },
12676
+ required: [
12677
+ "updatedAt",
12678
+ "summary"
12679
+ ],
12680
+ additionalProperties: false
12681
+ },
12682
+ {
12683
+ type: "null"
10980
12684
  }
10981
- },
10982
- required: [
10983
- "sourceKey",
10984
- "behaviorKey",
10985
- "label",
10986
- "eventSelection",
10987
- "status",
10988
- "evaluationMode",
10989
- "definitions"
10990
- ],
10991
- additionalProperties: false
12685
+ ]
10992
12686
  }
10993
12687
  },
10994
12688
  required: [
10995
- "created",
10996
- "metric"
12689
+ "id",
12690
+ "customer",
12691
+ "title",
12692
+ "priority",
12693
+ "evidenceCount",
12694
+ "lifecycle",
12695
+ "accountImportance",
12696
+ "preparedActionUrl",
12697
+ "whatChanged",
12698
+ "whyItMatters",
12699
+ "uncertainty",
12700
+ "priorityReason",
12701
+ "timeline",
12702
+ "evidence",
12703
+ "latestUpdate"
10997
12704
  ],
10998
12705
  additionalProperties: false
10999
12706
  }
@@ -11029,6 +12736,7 @@ Returns column definitions and example queries for each view.`,
11029
12736
  "outlit_list_users",
11030
12737
  "outlit_list_workspace_users",
11031
12738
  "outlit_get_customer",
12739
+ "outlit_get_customer_relationship",
11032
12740
  "outlit_assign_customer_owner",
11033
12741
  "outlit_grant_customer_access",
11034
12742
  "outlit_update_customer_access",
@@ -11057,13 +12765,20 @@ Returns column definitions and example queries for each view.`,
11057
12765
  "outlit_preview_customer_activation",
11058
12766
  "outlit_update_customer_activation",
11059
12767
  "outlit_get_workspace_settings",
11060
- "outlit_update_workspace_settings"
12768
+ "outlit_update_workspace_settings",
12769
+ "outlit_list_features",
12770
+ "outlit_create_feature",
12771
+ "outlit_archive_feature",
12772
+ "outlit_get_customer_features",
12773
+ "outlit_list_attention_items",
12774
+ "outlit_get_attention_item"
11061
12775
  ],
11062
12776
  cli: [
11063
12777
  "outlit_list_customers",
11064
12778
  "outlit_list_users",
11065
12779
  "outlit_list_workspace_users",
11066
12780
  "outlit_get_customer",
12781
+ "outlit_get_customer_relationship",
11067
12782
  "outlit_assign_customer_owner",
11068
12783
  "outlit_grant_customer_access",
11069
12784
  "outlit_update_customer_access",
@@ -11093,9 +12808,12 @@ Returns column definitions and example queries for each view.`,
11093
12808
  "outlit_update_customer_activation",
11094
12809
  "outlit_get_workspace_settings",
11095
12810
  "outlit_update_workspace_settings",
11096
- "outlit_list_behavior_metric_sources",
11097
- "outlit_list_behavior_metric_events",
11098
- "outlit_create_behavior_metric"
12811
+ "outlit_list_features",
12812
+ "outlit_create_feature",
12813
+ "outlit_archive_feature",
12814
+ "outlit_get_customer_features",
12815
+ "outlit_list_attention_items",
12816
+ "outlit_get_attention_item"
11099
12817
  ]
11100
12818
  };
11101
12819
  toolGatewayTransport = {
@@ -12522,24 +14240,159 @@ var exports_update = {};
12522
14240
  __export(exports_update, {
12523
14241
  default: () => update_default
12524
14242
  });
12525
- var update_default;
12526
- var init_update = __esm(() => {
14243
+ var update_default;
14244
+ var init_update = __esm(() => {
14245
+ init_dist();
14246
+ init_auth();
14247
+ init_output2();
14248
+ init_activation();
14249
+ init_api();
14250
+ update_default = defineCommand2({
14251
+ meta: {
14252
+ name: "update",
14253
+ description: [
14254
+ "Update the exact ordinary product event used for monotonic activation.",
14255
+ "",
14256
+ "Core applies the first matching product event to eligible contacts and their resolved",
14257
+ "company. Applications keep sending ordinary events; the CLI does not activate subjects.",
14258
+ "",
14259
+ "Examples:",
14260
+ " outlit activation update --event integration_connected --json",
14261
+ "",
14262
+ AGENT_JSON_HINT
14263
+ ].join(`
14264
+ `)
14265
+ },
14266
+ args: {
14267
+ ...authArgs,
14268
+ ...outputArgs,
14269
+ ...activationEventArg
14270
+ },
14271
+ async run({ args }) {
14272
+ const json = !!args.json;
14273
+ const eventName = parseActivationEvent(args, json);
14274
+ const client = await getClientOrExit(args["api-key"], json);
14275
+ return runTool(client, "outlit_update_customer_activation", { eventName }, json, {
14276
+ spinnerMessage: "Updating activation event..."
14277
+ });
14278
+ }
14279
+ });
14280
+ });
14281
+
14282
+ // src/commands/activation/disable.ts
14283
+ var exports_disable = {};
14284
+ __export(exports_disable, {
14285
+ default: () => disable_default
14286
+ });
14287
+ var disable_default;
14288
+ var init_disable = __esm(() => {
14289
+ init_dist();
14290
+ init_auth();
14291
+ init_output2();
14292
+ init_api();
14293
+ disable_default = defineCommand2({
14294
+ meta: {
14295
+ name: "disable",
14296
+ description: [
14297
+ "Disable future activation matching for contacts and companies.",
14298
+ "",
14299
+ "Existing contact and company activation timestamps remain unchanged.",
14300
+ "",
14301
+ "Examples:",
14302
+ " outlit activation disable --json",
14303
+ "",
14304
+ AGENT_JSON_HINT
14305
+ ].join(`
14306
+ `)
14307
+ },
14308
+ args: {
14309
+ ...authArgs,
14310
+ ...outputArgs
14311
+ },
14312
+ async run({ args }) {
14313
+ const json = !!args.json;
14314
+ const client = await getClientOrExit(args["api-key"], json);
14315
+ return runTool(client, "outlit_update_customer_activation", { eventName: null }, json, {
14316
+ spinnerMessage: "Disabling activation matching..."
14317
+ });
14318
+ }
14319
+ });
14320
+ });
14321
+
14322
+ // src/commands/activation/index.ts
14323
+ var exports_activation = {};
14324
+ __export(exports_activation, {
14325
+ default: () => activation_default
14326
+ });
14327
+ var activation_default;
14328
+ var init_activation2 = __esm(() => {
14329
+ init_dist();
14330
+ init_output2();
14331
+ activation_default = defineCommand2({
14332
+ meta: {
14333
+ name: "activation",
14334
+ description: [
14335
+ "Inspect, preview, and configure the product event used for activation.",
14336
+ "",
14337
+ "The same exact event activates eligible contacts and their resolved company.",
14338
+ "Core writes each activation timestamp once; later matches are no-ops.",
14339
+ "",
14340
+ "Commands:",
14341
+ " get Get the configured activation event",
14342
+ " preview Preview historical exact-event matches",
14343
+ " update Update the configured activation event",
14344
+ " disable Disable future activation matching",
14345
+ "",
14346
+ "Examples:",
14347
+ " outlit activation get --json",
14348
+ " outlit activation preview --event integration_connected --json",
14349
+ " outlit activation update --event integration_connected --json",
14350
+ " outlit activation disable --json",
14351
+ "",
14352
+ AGENT_JSON_HINT
14353
+ ].join(`
14354
+ `)
14355
+ },
14356
+ subCommands: {
14357
+ get: () => Promise.resolve().then(() => (init_get(), exports_get)).then((module) => module.default),
14358
+ preview: () => Promise.resolve().then(() => (init_preview(), exports_preview)).then((module) => module.default),
14359
+ update: () => Promise.resolve().then(() => (init_update(), exports_update)).then((module) => module.default),
14360
+ disable: () => Promise.resolve().then(() => (init_disable(), exports_disable)).then((module) => module.default)
14361
+ }
14362
+ });
14363
+ });
14364
+
14365
+ // src/commands/attention/list.ts
14366
+ var exports_list = {};
14367
+ __export(exports_list, {
14368
+ default: () => list_default
14369
+ });
14370
+ function isOneOf(values, value) {
14371
+ return value !== undefined && values.includes(value);
14372
+ }
14373
+ var statuses, list_default;
14374
+ var init_list = __esm(() => {
14375
+ init_dist4();
12527
14376
  init_dist();
12528
14377
  init_auth();
12529
14378
  init_output2();
12530
- init_activation();
12531
14379
  init_api();
12532
- update_default = defineCommand2({
14380
+ init_output();
14381
+ statuses = ["open", "resolved"];
14382
+ list_default = defineCommand2({
12533
14383
  meta: {
12534
- name: "update",
14384
+ name: "list",
12535
14385
  description: [
12536
- "Update the exact ordinary product event used for monotonic activation.",
14386
+ "List authorized open or resolved Attention items.",
12537
14387
  "",
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.",
14388
+ "The response is bounded and includes current priority, lifecycle, customer identity,",
14389
+ "Core-owned ARR importance, and a prepared-action URL when review is available. It does not include email drafts,",
14390
+ "evidence identifiers, raw source-quote fields, or internal agent state.",
12540
14391
  "",
12541
14392
  "Examples:",
12542
- " outlit activation update --event integration_connected --json",
14393
+ " outlit attention list",
14394
+ " outlit attention list --status resolved",
14395
+ " outlit attention list --customer-id 550e8400-e29b-41d4-a716-446655440000 --json",
12543
14396
  "",
12544
14397
  AGENT_JSON_HINT
12545
14398
  ].join(`
@@ -12548,40 +14401,73 @@ var init_update = __esm(() => {
12548
14401
  args: {
12549
14402
  ...authArgs,
12550
14403
  ...outputArgs,
12551
- ...activationEventArg
14404
+ status: {
14405
+ type: "string",
14406
+ description: "Lifecycle filter: open or resolved (Core default: open)"
14407
+ },
14408
+ "customer-id": {
14409
+ type: "string",
14410
+ description: "Filter by exact customer UUID"
14411
+ },
14412
+ limit: {
14413
+ type: "string",
14414
+ description: "Results per page (1-100; Core default: 25)"
14415
+ },
14416
+ cursor: {
14417
+ type: "string",
14418
+ description: "Opaque cursor from a previous response with the same filters"
14419
+ }
12552
14420
  },
12553
14421
  async run({ args }) {
12554
14422
  const json = !!args.json;
12555
- const eventName = parseActivationEvent(args, json);
14423
+ if (args.status !== undefined && !isOneOf(statuses, args.status)) {
14424
+ return outputError({ message: `--status must be one of: ${statuses.join(", ")}`, code: "invalid_input" }, json);
14425
+ }
14426
+ const params = {};
14427
+ if (args.status)
14428
+ params.status = args.status;
14429
+ if (args["customer-id"])
14430
+ params.customerId = args["customer-id"];
14431
+ if (args.limit) {
14432
+ const limit = Number(args.limit);
14433
+ if (!Number.isInteger(limit) || limit < 1 || limit > 100) {
14434
+ return outputError({ message: "--limit must be an integer between 1 and 100", code: "invalid_input" }, json);
14435
+ }
14436
+ params.limit = limit;
14437
+ }
14438
+ if (args.cursor)
14439
+ params.cursor = args.cursor;
12556
14440
  const client = await getClientOrExit(args["api-key"], json);
12557
- return runTool(client, "outlit_update_customer_activation", { eventName }, json, {
12558
- spinnerMessage: "Updating activation event..."
12559
- });
14441
+ return runTool(client, publicToolContracts.outlit_list_attention_items.toolName, params, json);
12560
14442
  }
12561
14443
  });
12562
14444
  });
12563
14445
 
12564
- // src/commands/activation/disable.ts
12565
- var exports_disable = {};
12566
- __export(exports_disable, {
12567
- default: () => disable_default
14446
+ // src/commands/attention/get.ts
14447
+ var exports_get2 = {};
14448
+ __export(exports_get2, {
14449
+ default: () => get_default2
12568
14450
  });
12569
- var disable_default;
12570
- var init_disable = __esm(() => {
14451
+ var get_default2;
14452
+ var init_get2 = __esm(() => {
14453
+ init_dist4();
12571
14454
  init_dist();
12572
14455
  init_auth();
12573
14456
  init_output2();
12574
14457
  init_api();
12575
- disable_default = defineCommand2({
14458
+ get_default2 = defineCommand2({
12576
14459
  meta: {
12577
- name: "disable",
14460
+ name: "get",
12578
14461
  description: [
12579
- "Disable future activation matching for contacts and companies.",
14462
+ "Get one authorized Attention item by exact ID.",
12580
14463
  "",
12581
- "Existing contact and company activation timestamps remain unchanged.",
14464
+ "Returns the bounded current assessment, timeline, evidence summaries, Core-owned ARR",
14465
+ "importance, and a prepared-action URL when review is available. It does not expose email drafts, evidence IDs,",
14466
+ "raw source-quote fields, or internal agent state.",
12582
14467
  "",
12583
14468
  "Examples:",
12584
- " outlit activation disable --json",
14469
+ " outlit attention get 550e8400-e29b-41d4-a716-446655440000",
14470
+ " outlit attention get 550e8400-e29b-41d4-a716-446655440000 --json",
12585
14471
  "",
12586
14472
  AGENT_JSON_HINT
12587
14473
  ].join(`
@@ -12589,57 +14475,47 @@ var init_disable = __esm(() => {
12589
14475
  },
12590
14476
  args: {
12591
14477
  ...authArgs,
12592
- ...outputArgs
14478
+ ...outputArgs,
14479
+ id: {
14480
+ type: "positional",
14481
+ description: "Exact Attention item UUID",
14482
+ required: true
14483
+ }
12593
14484
  },
12594
14485
  async run({ args }) {
12595
14486
  const json = !!args.json;
12596
14487
  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
- });
14488
+ return runTool(client, publicToolContracts.outlit_get_attention_item.toolName, { id: args.id }, json);
12600
14489
  }
12601
14490
  });
12602
14491
  });
12603
14492
 
12604
- // src/commands/activation/index.ts
12605
- var exports_activation = {};
12606
- __export(exports_activation, {
12607
- default: () => activation_default
14493
+ // src/commands/attention/index.ts
14494
+ var exports_attention = {};
14495
+ __export(exports_attention, {
14496
+ default: () => attention_default
12608
14497
  });
12609
- var activation_default;
12610
- var init_activation2 = __esm(() => {
14498
+ var attention_default;
14499
+ var init_attention = __esm(() => {
12611
14500
  init_dist();
12612
14501
  init_output2();
12613
- activation_default = defineCommand2({
14502
+ attention_default = defineCommand2({
12614
14503
  meta: {
12615
- name: "activation",
14504
+ name: "attention",
12616
14505
  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",
14506
+ "Inspect authorized customer Attention items.",
12627
14507
  "",
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",
14508
+ "Subcommands:",
14509
+ " list -- list open or resolved Attention items",
14510
+ " get -- get one Attention item by exact ID",
12633
14511
  "",
12634
14512
  AGENT_JSON_HINT
12635
14513
  ].join(`
12636
14514
  `)
12637
14515
  },
12638
14516
  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)
14517
+ list: () => Promise.resolve().then(() => (init_list(), exports_list)).then((module) => module.default),
14518
+ get: () => Promise.resolve().then(() => (init_get2(), exports_get2)).then((module) => module.default)
12643
14519
  }
12644
14520
  });
12645
14521
  });
@@ -12865,9 +14741,9 @@ var init_platform_input = __esm(() => {
12865
14741
  });
12866
14742
 
12867
14743
  // src/commands/customers/list.ts
12868
- var exports_list = {};
12869
- __export(exports_list, {
12870
- default: () => list_default
14744
+ var exports_list2 = {};
14745
+ __export(exports_list2, {
14746
+ default: () => list_default2
12871
14747
  });
12872
14748
  function normalizeCustomerListResult(data) {
12873
14749
  if (typeof data !== "object" || data === null || Array.isArray(data)) {
@@ -12896,8 +14772,8 @@ function normalizeCustomerListResult(data) {
12896
14772
  })
12897
14773
  };
12898
14774
  }
12899
- var list_default;
12900
- var init_list = __esm(() => {
14775
+ var list_default2;
14776
+ var init_list2 = __esm(() => {
12901
14777
  init_dist4();
12902
14778
  init_dist();
12903
14779
  init_auth();
@@ -12907,7 +14783,7 @@ var init_list = __esm(() => {
12907
14783
  init_api();
12908
14784
  init_output();
12909
14785
  init_platform_input();
12910
- list_default = defineCommand2({
14786
+ list_default2 = defineCommand2({
12911
14787
  meta: {
12912
14788
  name: "list",
12913
14789
  description: [
@@ -13039,38 +14915,190 @@ var init_list = __esm(() => {
13039
14915
  });
13040
14916
 
13041
14917
  // src/commands/customers/get.ts
13042
- var exports_get2 = {};
13043
- __export(exports_get2, {
13044
- default: () => get_default2
14918
+ var exports_get3 = {};
14919
+ __export(exports_get3, {
14920
+ default: () => get_default3
13045
14921
  });
13046
- var get_default2;
13047
- var init_get2 = __esm(() => {
14922
+ var get_default3;
14923
+ var init_get3 = __esm(() => {
13048
14924
  init_dist4();
13049
14925
  init_dist();
13050
14926
  init_auth();
13051
14927
  init_output2();
13052
14928
  init_api();
13053
14929
  init_config();
13054
- get_default2 = defineCommand2({
14930
+ get_default3 = defineCommand2({
14931
+ meta: {
14932
+ name: "get",
14933
+ description: [
14934
+ "Get details for a customer by ID, domain, or name.",
14935
+ "",
14936
+ "The customer argument accepts:",
14937
+ " - Customer domain (acme.com)",
14938
+ " - Customer ID (UUID)",
14939
+ " - Customer name (partial match)",
14940
+ "",
14941
+ 'The primary record is returned under "customer". --include users adds "users".',
14942
+ "",
14943
+ `Available include sections: ${customerIncludeSections.join(", ")}`,
14944
+ `Timeframes: ${customerTimeframes.join(", ")}`,
14945
+ "",
14946
+ "Examples:",
14947
+ " outlit customers get acme.com",
14948
+ " outlit customers get acme.com --include users,revenue",
14949
+ " outlit customers get acme.com --include users,revenue,recentTimeline --timeframe 90d",
14950
+ "",
14951
+ AGENT_JSON_HINT
14952
+ ].join(`
14953
+ `)
14954
+ },
14955
+ args: {
14956
+ ...authArgs,
14957
+ ...outputArgs,
14958
+ customer: {
14959
+ type: "positional",
14960
+ description: "Customer ID, domain (acme.com), or name",
14961
+ required: true
14962
+ },
14963
+ include: {
14964
+ type: "string",
14965
+ description: [
14966
+ "Comma-separated sections to include in response.",
14967
+ `Available: ${customerIncludeSections.join(", ")}`,
14968
+ 'Included sections use their contract keys, such as "users" and "revenue".'
14969
+ ].join(`
14970
+ `)
14971
+ },
14972
+ timeframe: {
14973
+ type: "string",
14974
+ description: "Timeframe for metrics (7d, 14d, 30d, 90d)",
14975
+ default: "30d"
14976
+ }
14977
+ },
14978
+ async run({ args }) {
14979
+ const json = !!args.json;
14980
+ const client = await getClientOrExit(args["api-key"], json);
14981
+ const params = {
14982
+ customer: args.customer,
14983
+ timeframe: args.timeframe
14984
+ };
14985
+ if (args.include) {
14986
+ params.include = splitCsv(args.include);
14987
+ }
14988
+ return runTool(client, publicToolContracts.outlit_get_customer.toolName, params, json);
14989
+ }
14990
+ });
14991
+ });
14992
+
14993
+ // src/commands/customers/relationship.ts
14994
+ var exports_relationship = {};
14995
+ __export(exports_relationship, {
14996
+ default: () => relationship_default
14997
+ });
14998
+ var relationship_default;
14999
+ var init_relationship = __esm(() => {
15000
+ init_dist4();
15001
+ init_dist();
15002
+ init_auth();
15003
+ init_output2();
15004
+ init_api();
15005
+ relationship_default = defineCommand2({
15006
+ meta: {
15007
+ name: "relationship",
15008
+ description: [
15009
+ "Get the bounded relationship for a customer.",
15010
+ "",
15011
+ "Returns the durable customer-detail read model: a relationship summary, up to eight categorized",
15012
+ "current statements, ISO observed-at timestamps when supported, source labels, and a compiled",
15013
+ "summary timestamp when available. It does not expand the compact customer get response, expose",
15014
+ "raw fact IDs or source quotes, or replace the chronological timeline.",
15015
+ "",
15016
+ "The customer argument accepts:",
15017
+ " - Customer domain (acme.com)",
15018
+ " - Customer ID (UUID)",
15019
+ " - Exact customer name",
15020
+ "",
15021
+ "Examples:",
15022
+ " outlit customers relationship acme.com",
15023
+ " outlit customers relationship acme.com --json",
15024
+ "",
15025
+ AGENT_JSON_HINT
15026
+ ].join(`
15027
+ `)
15028
+ },
15029
+ args: {
15030
+ ...authArgs,
15031
+ ...outputArgs,
15032
+ customer: {
15033
+ type: "positional",
15034
+ description: "Customer ID, domain (acme.com), or name",
15035
+ required: true
15036
+ }
15037
+ },
15038
+ async run({ args }) {
15039
+ const json = !!args.json;
15040
+ const client = await getClientOrExit(args["api-key"], json);
15041
+ return runTool(client, publicToolContracts.outlit_get_customer_relationship.toolName, { customer: args.customer }, json);
15042
+ }
15043
+ });
15044
+ });
15045
+
15046
+ // src/commands/features/input.ts
15047
+ function parseBoundedInteger2(value, fallback, flag, min, max, json) {
15048
+ const parsed = parseIntegerFlag(value, fallback, flag, json);
15049
+ if (parsed < min || parsed > max) {
15050
+ return outputError({ message: `${flag} must be an integer from ${min} to ${max}`, code: "invalid_input" }, json);
15051
+ }
15052
+ return parsed;
15053
+ }
15054
+ function parsePropertyFilters(value, json) {
15055
+ if (!value?.trim())
15056
+ return [];
15057
+ try {
15058
+ const parsed = JSON.parse(value);
15059
+ if (!Array.isArray(parsed)) {
15060
+ return outputError({ message: "--property-filters must be a JSON array", code: "invalid_input" }, json);
15061
+ }
15062
+ return parsed;
15063
+ } catch (error) {
15064
+ return outputError({
15065
+ message: `Invalid --property-filters JSON: ${errorMessage(error, "parse failed")}`,
15066
+ code: "invalid_input"
15067
+ }, json);
15068
+ }
15069
+ }
15070
+ var init_input = __esm(() => {
15071
+ init_output();
15072
+ init_platform_input();
15073
+ });
15074
+
15075
+ // src/commands/customers/features.ts
15076
+ var exports_features = {};
15077
+ __export(exports_features, {
15078
+ default: () => features_default
15079
+ });
15080
+ var features_default;
15081
+ var init_features = __esm(() => {
15082
+ init_dist4();
15083
+ init_dist();
15084
+ init_auth();
15085
+ init_output2();
15086
+ init_api();
15087
+ init_platform_input();
15088
+ init_input();
15089
+ features_default = defineCommand2({
13055
15090
  meta: {
13056
- name: "get",
15091
+ name: "features",
13057
15092
  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)",
15093
+ "Read exact historical Feature usage for one authorized customer.",
15094
+ "Unavailable source evidence remains distinct from no matches in the requested window.",
13064
15095
  "",
13065
- 'The primary record is returned under "customer". --include users adds "users".',
13066
- "",
13067
- `Available include sections: ${customerIncludeSections.join(", ")}`,
13068
- `Timeframes: ${customerTimeframes.join(", ")}`,
15096
+ "The customer argument accepts a customer domain, UUID, or exact name.",
13069
15097
  "",
13070
15098
  "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",
15099
+ " outlit customers features acme.com --json",
15100
+ " outlit customers features acme.com --weeks 6 --json",
15101
+ " outlit customers features acme.com --weeks 53 --weekly --json",
13074
15102
  "",
13075
15103
  AGENT_JSON_HINT
13076
15104
  ].join(`
@@ -13081,35 +15109,24 @@ var init_get2 = __esm(() => {
13081
15109
  ...outputArgs,
13082
15110
  customer: {
13083
15111
  type: "positional",
13084
- description: "Customer ID, domain (acme.com), or name",
15112
+ description: "Customer ID, domain (acme.com), or exact name",
13085
15113
  required: true
13086
15114
  },
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"
15115
+ weeks: { type: "string", description: "Historical usage window in weeks (1-53, default: 12)" },
15116
+ weekly: {
15117
+ type: "boolean",
15118
+ description: "Include ordered weekly event counts and active days",
15119
+ default: false
13100
15120
  }
13101
15121
  },
13102
15122
  async run({ args }) {
13103
15123
  const json = !!args.json;
13104
15124
  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);
15125
+ return runTool(client, publicToolContracts.outlit_get_customer_features.toolName, {
15126
+ customer: requiredTrimmedString(args.customer, "<customer>", json),
15127
+ weeks: parseBoundedInteger2(args.weeks, 12, "--weeks", 1, 53, json),
15128
+ ...args.weekly ? { includeWeeklyUsage: true } : {}
15129
+ }, json, { spinnerMessage: "Loading customer feature usage..." });
13113
15130
  }
13114
15131
  });
13115
15132
  });
@@ -13163,7 +15180,7 @@ var init_timeline = __esm(() => {
13163
15180
  " outlit customers timeline acme.com",
13164
15181
  " outlit customers timeline acme.com --timeframe 90d",
13165
15182
  " 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",
15183
+ " outlit customers timeline acme.com --start-date 2025-01-01T00:00:00Z --end-date 2025-03-01T23:59:59.999Z",
13167
15184
  " outlit customers timeline acme.com --event-types PAGE_VIEW,MEETING --limit 50",
13168
15185
  "",
13169
15186
  AGENT_JSON_HINT
@@ -13198,7 +15215,7 @@ var init_timeline = __esm(() => {
13198
15215
  },
13199
15216
  "end-date": {
13200
15217
  type: "string",
13201
- description: "End datetime for the event range (ISO 8601, e.g. 2025-03-01T23:59:59Z). When set, --timeframe is ignored."
15218
+ description: "End datetime for the event range (ISO 8601, e.g. 2025-03-01T23:59:59.999Z). When set, --timeframe is ignored."
13202
15219
  }
13203
15220
  },
13204
15221
  async run({ args }) {
@@ -13456,6 +15473,8 @@ var init_customers = __esm(() => {
13456
15473
  "Subcommands:",
13457
15474
  " list -- list customers with filters",
13458
15475
  " get -- get a specific customer by ID or domain",
15476
+ " relationship -- get the bounded relationship for a customer",
15477
+ " features -- get exact Feature usage for a customer",
13459
15478
  " timeline -- show activity timeline for a customer",
13460
15479
  " owner set -- assign a primary customer owner",
13461
15480
  " grant -- grant or change Viewer or Editor access",
@@ -13466,8 +15485,10 @@ var init_customers = __esm(() => {
13466
15485
  `)
13467
15486
  },
13468
15487
  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),
15488
+ list: () => Promise.resolve().then(() => (init_list2(), exports_list2)).then((m) => m.default),
15489
+ get: () => Promise.resolve().then(() => (init_get3(), exports_get3)).then((m) => m.default),
15490
+ relationship: () => Promise.resolve().then(() => (init_relationship(), exports_relationship)).then((m) => m.default),
15491
+ features: () => Promise.resolve().then(() => (init_features(), exports_features)).then((m) => m.default),
13471
15492
  timeline: () => Promise.resolve().then(() => (init_timeline(), exports_timeline)).then((m) => m.default),
13472
15493
  owner: () => Promise.resolve().then(() => (init_owner(), exports_owner)).then((m) => m.default),
13473
15494
  grant: () => Promise.resolve().then(() => (init_grant(), exports_grant)).then((m) => m.default),
@@ -13477,12 +15498,12 @@ var init_customers = __esm(() => {
13477
15498
  });
13478
15499
 
13479
15500
  // src/commands/users/list.ts
13480
- var exports_list2 = {};
13481
- __export(exports_list2, {
13482
- default: () => list_default2
15501
+ var exports_list3 = {};
15502
+ __export(exports_list3, {
15503
+ default: () => list_default3
13483
15504
  });
13484
- var list_default2;
13485
- var init_list2 = __esm(() => {
15505
+ var list_default3;
15506
+ var init_list3 = __esm(() => {
13486
15507
  init_dist4();
13487
15508
  init_dist();
13488
15509
  init_auth();
@@ -13491,7 +15512,7 @@ var init_list2 = __esm(() => {
13491
15512
  init_pagination();
13492
15513
  init_api();
13493
15514
  init_output();
13494
- list_default2 = defineCommand2({
15515
+ list_default3 = defineCommand2({
13495
15516
  meta: {
13496
15517
  name: "list",
13497
15518
  description: [
@@ -13594,15 +15615,15 @@ var init_users = __esm(() => {
13594
15615
  `)
13595
15616
  },
13596
15617
  subCommands: {
13597
- list: () => Promise.resolve().then(() => (init_list2(), exports_list2)).then((m) => m.default)
15618
+ list: () => Promise.resolve().then(() => (init_list3(), exports_list3)).then((m) => m.default)
13598
15619
  }
13599
15620
  });
13600
15621
  });
13601
15622
 
13602
15623
  // src/commands/ws-users/list.ts
13603
- var exports_list3 = {};
13604
- __export(exports_list3, {
13605
- default: () => list_default3
15624
+ var exports_list4 = {};
15625
+ __export(exports_list4, {
15626
+ default: () => list_default4
13606
15627
  });
13607
15628
  function isWorkspaceUserOrderField(value) {
13608
15629
  return typeof value === "string" && workspaceUserListOrderFields.some((field) => field === value);
@@ -13610,8 +15631,8 @@ function isWorkspaceUserOrderField(value) {
13610
15631
  function isOrderDirection(value) {
13611
15632
  return typeof value === "string" && orderDirections.some((direction) => direction === value);
13612
15633
  }
13613
- var orderDirections, workspaceUserOrderArgs, list_default3;
13614
- var init_list3 = __esm(() => {
15634
+ var orderDirections, workspaceUserOrderArgs, list_default4;
15635
+ var init_list4 = __esm(() => {
13615
15636
  init_dist4();
13616
15637
  init_dist();
13617
15638
  init_auth();
@@ -13632,7 +15653,7 @@ var init_list3 = __esm(() => {
13632
15653
  default: "desc"
13633
15654
  }
13634
15655
  };
13635
- list_default3 = defineCommand2({
15656
+ list_default4 = defineCommand2({
13636
15657
  meta: {
13637
15658
  name: "list",
13638
15659
  description: [
@@ -13740,7 +15761,7 @@ var init_ws_users = __esm(() => {
13740
15761
  `)
13741
15762
  },
13742
15763
  subCommands: {
13743
- list: () => Promise.resolve().then(() => (init_list3(), exports_list3)).then((m) => m.default)
15764
+ list: () => Promise.resolve().then(() => (init_list4(), exports_list4)).then((m) => m.default)
13744
15765
  }
13745
15766
  });
13746
15767
  });
@@ -14898,9 +16919,9 @@ var init_upgrade = __esm(() => {
14898
16919
  });
14899
16920
 
14900
16921
  // src/commands/facts/list.ts
14901
- var exports_list4 = {};
14902
- __export(exports_list4, {
14903
- default: () => list_default4
16922
+ var exports_list5 = {};
16923
+ __export(exports_list5, {
16924
+ default: () => list_default5
14904
16925
  });
14905
16926
  function parseCsvArg(value) {
14906
16927
  if (!value)
@@ -14918,7 +16939,7 @@ function normalizeSourceTypes(values) {
14918
16939
  return;
14919
16940
  return Array.from(new Set(values.map((value) => normalizeCustomerSourceType(value)))).filter((sourceType) => sourceType !== null);
14920
16941
  }
14921
- function isOneOf(values, value) {
16942
+ function isOneOf2(values, value) {
14922
16943
  return typeof value === "string" && values.includes(value);
14923
16944
  }
14924
16945
  function annotateFactFilterability(data) {
@@ -14939,15 +16960,15 @@ function annotateFactFilterability(data) {
14939
16960
  return {
14940
16961
  ...factRecord,
14941
16962
  filterability: {
14942
- factType: isOneOf(customerFactTypes, factRecord.factType) ? "public" : "internal",
14943
- factCategory: isOneOf(customerFactCategories, factRecord.factCategory) ? "public" : "internal"
16963
+ factType: isOneOf2(customerFactTypes, factRecord.factType) ? "public" : "internal",
16964
+ factCategory: isOneOf2(customerFactCategories, factRecord.factCategory) ? "public" : "internal"
14944
16965
  }
14945
16966
  };
14946
16967
  })
14947
16968
  };
14948
16969
  }
14949
- var sourceTypeDescription, list_default4;
14950
- var init_list4 = __esm(() => {
16970
+ var sourceTypeDescription, list_default5;
16971
+ var init_list5 = __esm(() => {
14951
16972
  init_dist4();
14952
16973
  init_dist();
14953
16974
  init_auth();
@@ -14957,7 +16978,7 @@ var init_list4 = __esm(() => {
14957
16978
  init_config();
14958
16979
  init_output();
14959
16980
  sourceTypeDescription = `${customerSourceTypes.join(", ")} (aliases: ${customerSourceTypeAliases.join(", ")})`;
14960
- list_default4 = defineCommand2({
16981
+ list_default5 = defineCommand2({
14961
16982
  meta: {
14962
16983
  name: "list",
14963
16984
  description: [
@@ -15016,11 +17037,11 @@ var init_list4 = __esm(() => {
15016
17037
  },
15017
17038
  async run({ args }) {
15018
17039
  const json = !!args.json;
15019
- const statuses = parseCsvArg(args.status);
17040
+ const statuses2 = parseCsvArg(args.status);
15020
17041
  const sourceTypes = parseCsvArg(args["source-types"]);
15021
17042
  const factTypes = parseCsvArg(args["fact-types"]);
15022
17043
  const factCategories = parseCsvArg(args["fact-categories"]);
15023
- const invalidStatuses = invalidValues(statuses, customerFactStatuses);
17044
+ const invalidStatuses = invalidValues(statuses2, customerFactStatuses);
15024
17045
  if (invalidStatuses.length > 0) {
15025
17046
  return outputError({
15026
17047
  message: `Unknown fact statuses: ${invalidStatuses.join(", ")}. Allowed: ${customerFactStatuses.join(", ")}`,
@@ -15082,8 +17103,8 @@ var init_list4 = __esm(() => {
15082
17103
  const params = {
15083
17104
  customer: args.customer
15084
17105
  };
15085
- if (statuses)
15086
- params.status = statuses;
17106
+ if (statuses2)
17107
+ params.status = statuses2;
15087
17108
  if (normalizedSourceTypes)
15088
17109
  params.sourceTypes = normalizedSourceTypes;
15089
17110
  if (factTypes)
@@ -15103,9 +17124,9 @@ var init_list4 = __esm(() => {
15103
17124
  });
15104
17125
 
15105
17126
  // src/commands/facts/get.ts
15106
- var exports_get3 = {};
15107
- __export(exports_get3, {
15108
- default: () => get_default3
17127
+ var exports_get4 = {};
17128
+ __export(exports_get4, {
17129
+ default: () => get_default4
15109
17130
  });
15110
17131
  function parseCsvArg2(value) {
15111
17132
  if (!value)
@@ -15113,15 +17134,15 @@ function parseCsvArg2(value) {
15113
17134
  const items = splitCsv(value).map((item) => item.trim()).filter(Boolean);
15114
17135
  return items.length > 0 ? items : undefined;
15115
17136
  }
15116
- var get_default3;
15117
- var init_get3 = __esm(() => {
17137
+ var get_default4;
17138
+ var init_get4 = __esm(() => {
15118
17139
  init_dist4();
15119
17140
  init_dist();
15120
17141
  init_auth();
15121
17142
  init_output2();
15122
17143
  init_api();
15123
17144
  init_config();
15124
- get_default3 = defineCommand2({
17145
+ get_default4 = defineCommand2({
15125
17146
  meta: {
15126
17147
  name: "get",
15127
17148
  description: [
@@ -15188,16 +17209,16 @@ var init_facts = __esm(() => {
15188
17209
  `)
15189
17210
  },
15190
17211
  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)
17212
+ list: () => Promise.resolve().then(() => (init_list5(), exports_list5)).then((m) => m.default),
17213
+ get: () => Promise.resolve().then(() => (init_get4(), exports_get4)).then((m) => m.default)
15193
17214
  }
15194
17215
  });
15195
17216
  });
15196
17217
 
15197
17218
  // src/commands/sources/list.ts
15198
- var exports_list5 = {};
15199
- __export(exports_list5, {
15200
- default: () => list_default5
17219
+ var exports_list6 = {};
17220
+ __export(exports_list6, {
17221
+ default: () => list_default6
15201
17222
  });
15202
17223
  function parseLimit(value, json) {
15203
17224
  if (!value)
@@ -15232,8 +17253,8 @@ function parseDateArg(name, value, json) {
15232
17253
  }
15233
17254
  return date;
15234
17255
  }
15235
- var sourceTypeDescription2, ISO_8601_UTC_DATE_TIME_REGEX, list_default5;
15236
- var init_list5 = __esm(() => {
17256
+ var sourceTypeDescription2, ISO_8601_UTC_DATE_TIME_REGEX, list_default6;
17257
+ var init_list6 = __esm(() => {
15237
17258
  init_dist4();
15238
17259
  init_dist();
15239
17260
  init_auth();
@@ -15242,7 +17263,7 @@ var init_list5 = __esm(() => {
15242
17263
  init_output();
15243
17264
  sourceTypeDescription2 = `${customerSourceTypes.join(", ")} (aliases: ${customerSourceTypeAliases.join(", ")})`;
15244
17265
  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({
17266
+ list_default6 = defineCommand2({
15246
17267
  meta: {
15247
17268
  name: "list",
15248
17269
  description: [
@@ -15366,12 +17387,12 @@ var init_list5 = __esm(() => {
15366
17387
  });
15367
17388
 
15368
17389
  // src/commands/sources/get.ts
15369
- var exports_get4 = {};
15370
- __export(exports_get4, {
15371
- default: () => get_default4
17390
+ var exports_get5 = {};
17391
+ __export(exports_get5, {
17392
+ default: () => get_default5
15372
17393
  });
15373
- var sourceTypeDescription3, get_default4;
15374
- var init_get4 = __esm(() => {
17394
+ var sourceTypeDescription3, get_default5;
17395
+ var init_get5 = __esm(() => {
15375
17396
  init_dist4();
15376
17397
  init_dist();
15377
17398
  init_auth();
@@ -15379,7 +17400,7 @@ var init_get4 = __esm(() => {
15379
17400
  init_api();
15380
17401
  init_output();
15381
17402
  sourceTypeDescription3 = `${customerSourceTypes.join(", ")} (aliases: ${customerSourceTypeAliases.join(", ")})`;
15382
- get_default4 = defineCommand2({
17403
+ get_default5 = defineCommand2({
15383
17404
  meta: {
15384
17405
  name: "get",
15385
17406
  description: [
@@ -15472,8 +17493,8 @@ var init_sources = __esm(() => {
15472
17493
  `)
15473
17494
  },
15474
17495
  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)
17496
+ list: () => Promise.resolve().then(() => (init_list6(), exports_list6)).then((m) => m.default),
17497
+ get: () => Promise.resolve().then(() => (init_get5(), exports_get5)).then((m) => m.default)
15477
17498
  }
15478
17499
  });
15479
17500
  });
@@ -15705,17 +17726,17 @@ var init_schema = __esm(() => {
15705
17726
  });
15706
17727
 
15707
17728
  // src/commands/destinations/list.ts
15708
- var exports_list6 = {};
15709
- __export(exports_list6, {
15710
- default: () => list_default6
17729
+ var exports_list7 = {};
17730
+ __export(exports_list7, {
17731
+ default: () => list_default7
15711
17732
  });
15712
- var list_default6;
15713
- var init_list6 = __esm(() => {
17733
+ var list_default7;
17734
+ var init_list7 = __esm(() => {
15714
17735
  init_dist();
15715
17736
  init_auth();
15716
17737
  init_output2();
15717
17738
  init_api();
15718
- list_default6 = defineCommand2({
17739
+ list_default7 = defineCommand2({
15719
17740
  meta: {
15720
17741
  name: "list",
15721
17742
  description: [
@@ -15756,17 +17777,17 @@ var init_list6 = __esm(() => {
15756
17777
  });
15757
17778
 
15758
17779
  // src/commands/destinations/get.ts
15759
- var exports_get5 = {};
15760
- __export(exports_get5, {
15761
- default: () => get_default5
17780
+ var exports_get6 = {};
17781
+ __export(exports_get6, {
17782
+ default: () => get_default6
15762
17783
  });
15763
- var get_default5;
15764
- var init_get5 = __esm(() => {
17784
+ var get_default6;
17785
+ var init_get6 = __esm(() => {
15765
17786
  init_dist();
15766
17787
  init_auth();
15767
17788
  init_output2();
15768
17789
  init_api();
15769
- get_default5 = defineCommand2({
17790
+ get_default6 = defineCommand2({
15770
17791
  meta: {
15771
17792
  name: "get",
15772
17793
  description: [
@@ -16121,8 +18142,8 @@ var init_destinations = __esm(() => {
16121
18142
  `)
16122
18143
  },
16123
18144
  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),
18145
+ list: () => Promise.resolve().then(() => (init_list7(), exports_list7)).then((m) => m.default),
18146
+ get: () => Promise.resolve().then(() => (init_get6(), exports_get6)).then((m) => m.default),
16126
18147
  create: () => Promise.resolve().then(() => (init_create(), exports_create)).then((m) => m.default),
16127
18148
  update: () => Promise.resolve().then(() => (init_update3(), exports_update2)).then((m) => m.default),
16128
18149
  enable: () => Promise.resolve().then(() => (init_enable(), exports_enable)).then((m) => m.default),
@@ -16132,69 +18153,88 @@ var init_destinations = __esm(() => {
16132
18153
  });
16133
18154
  });
16134
18155
 
16135
- // src/commands/metrics/sources.ts
16136
- var exports_sources2 = {};
16137
- __export(exports_sources2, {
16138
- default: () => sources_default2
18156
+ // src/commands/features/list.ts
18157
+ var exports_list8 = {};
18158
+ __export(exports_list8, {
18159
+ default: () => list_default8
16139
18160
  });
16140
- var sources_default2;
16141
- var init_sources2 = __esm(() => {
18161
+ var list_default8;
18162
+ var init_list8 = __esm(() => {
18163
+ init_dist4();
16142
18164
  init_dist();
16143
18165
  init_auth();
16144
18166
  init_output2();
16145
18167
  init_api();
16146
- sources_default2 = defineCommand2({
18168
+ init_platform_input();
18169
+ init_input();
18170
+ list_default8 = defineCommand2({
16147
18171
  meta: {
16148
- name: "sources",
18172
+ name: "list",
16149
18173
  description: [
16150
- "List product-event sources eligible for Behavior Metrics.",
18174
+ "List configured Features, their exact historical usage, and event candidates.",
18175
+ "When exactly one eligible source exists, Core selects it automatically.",
18176
+ "Candidate discovery returns ready or partial items, or an unavailable reason.",
18177
+ "Unavailable evidence remains distinct from zero usage.",
16151
18178
  "",
16152
- "Use the returned source key with `outlit metrics events --source <source-key>`.",
18179
+ "Examples:",
18180
+ " outlit features list --json",
18181
+ " outlit features list --source metric_source_v1_0123456789abcdef0123456789abcdef --weeks 4 --candidate-limit 20 --json",
16153
18182
  "",
16154
18183
  AGENT_JSON_HINT
16155
18184
  ].join(`
16156
18185
  `)
16157
18186
  },
16158
- args: { ...authArgs, ...outputArgs },
18187
+ args: {
18188
+ ...authArgs,
18189
+ ...outputArgs,
18190
+ source: { type: "string", description: "Optional product-event source key" },
18191
+ weeks: { type: "string", description: "Historical usage window in weeks (1-53, default: 12)" },
18192
+ "candidate-limit": {
18193
+ type: "string",
18194
+ description: "Maximum event candidates (1-100, default: 100)"
18195
+ }
18196
+ },
16159
18197
  async run({ args }) {
16160
18198
  const json = !!args.json;
16161
18199
  const client = await getClientOrExit(args["api-key"], json);
16162
- return runTool(client, "outlit_list_behavior_metric_sources", {}, json, {
16163
- spinnerMessage: "Loading Behavior Metric sources..."
18200
+ const input = {
18201
+ weeks: parseBoundedInteger2(args.weeks, 12, "--weeks", 1, 53, json),
18202
+ candidateLimit: parseBoundedInteger2(args["candidate-limit"], 100, "--candidate-limit", 1, 100, json)
18203
+ };
18204
+ const sourceKey = optionalTrimmedString(args.source);
18205
+ if (sourceKey)
18206
+ input.sourceKey = sourceKey;
18207
+ return runTool(client, publicToolContracts.outlit_list_features.toolName, input, json, {
18208
+ spinnerMessage: "Loading Features..."
16164
18209
  });
16165
18210
  }
16166
18211
  });
16167
18212
  });
16168
18213
 
16169
- // src/commands/metrics/events.ts
16170
- var exports_events = {};
16171
- __export(exports_events, {
16172
- default: () => events_default
18214
+ // src/commands/features/create.ts
18215
+ var exports_create2 = {};
18216
+ __export(exports_create2, {
18217
+ default: () => create_default2
16173
18218
  });
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(() => {
18219
+ var create_default2;
18220
+ var init_create2 = __esm(() => {
18221
+ init_dist4();
16183
18222
  init_dist();
16184
18223
  init_auth();
16185
18224
  init_output2();
16186
18225
  init_api();
16187
- init_output();
16188
18226
  init_platform_input();
16189
- events_default = defineCommand2({
18227
+ init_input();
18228
+ create_default2 = defineCommand2({
16190
18229
  meta: {
16191
- name: "events",
18230
+ name: "create",
16192
18231
  description: [
16193
- "List attributed event candidates for a Behavior Metric source.",
18232
+ "Create or idempotently return one Feature observed by one exact event rule.",
18233
+ "Outlit creates the supporting weekly event-count and active-days metrics internally.",
16194
18234
  "",
16195
18235
  "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",
18236
+ " outlit features create --source metric_source_v1_0123456789abcdef0123456789abcdef --event report_exported --key reports_exported --name 'Reports exported' --json",
18237
+ ` 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
18238
  "",
16199
18239
  AGENT_JSON_HINT
16200
18240
  ].join(`
@@ -16203,60 +18243,52 @@ var init_events = __esm(() => {
16203
18243
  args: {
16204
18244
  ...authArgs,
16205
18245
  ...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)" }
18246
+ source: { type: "string", description: "Product-event source key" },
18247
+ event: { type: "string", description: "Exact tracked event name" },
18248
+ key: { type: "string", description: "Stable lower_snake_case feature key" },
18249
+ name: { type: "string", description: "Human-readable Feature name" },
18250
+ "property-filters": {
18251
+ type: "string",
18252
+ description: "Optional JSON array of exact or exists property filters"
18253
+ }
16209
18254
  },
16210
18255
  async run({ args }) {
16211
18256
  const json = !!args.json;
16212
18257
  const client = await getClientOrExit(args["api-key"], json);
16213
- return runTool(client, "outlit_list_behavior_metric_events", {
18258
+ return runTool(client, publicToolContracts.outlit_create_feature.toolName, {
16214
18259
  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..." });
18260
+ eventName: requiredString(args.event, "--event", json),
18261
+ featureKey: requiredTrimmedString(args.key, "--key", json),
18262
+ name: requiredTrimmedString(args.name, "--name", json),
18263
+ propertyFilters: parsePropertyFilters(args["property-filters"], json)
18264
+ }, json, { spinnerMessage: "Creating Feature..." });
16218
18265
  }
16219
18266
  });
16220
18267
  });
16221
18268
 
16222
- // src/commands/metrics/create.ts
16223
- var exports_create2 = {};
16224
- __export(exports_create2, {
16225
- default: () => create_default2
18269
+ // src/commands/features/archive.ts
18270
+ var exports_archive2 = {};
18271
+ __export(exports_archive2, {
18272
+ default: () => archive_default2
16226
18273
  });
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(() => {
18274
+ var archive_default2;
18275
+ var init_archive2 = __esm(() => {
18276
+ init_dist4();
16245
18277
  init_dist();
16246
18278
  init_auth();
16247
18279
  init_output2();
16248
18280
  init_api();
16249
- init_output();
16250
18281
  init_platform_input();
16251
- create_default2 = defineCommand2({
18282
+ archive_default2 = defineCommand2({
16252
18283
  meta: {
16253
- name: "create",
18284
+ name: "archive",
16254
18285
  description: [
16255
- "Create an event-based Outlit Behavior Metric.",
18286
+ "Archive a Feature using its opaque id and current revision.",
18287
+ "Core rejects stale revisions and prevents archiving the final active feature.",
18288
+ "Self-service restore is not available in the MVP; retained historical usage is not deleted.",
16256
18289
  "",
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`,
18290
+ "Example:",
18291
+ " outlit features archive value_feature_v1_0123456789abcdef0123456789abcdef --revision value_feature_revision_v1_fedcba9876543210fedcba9876543210 --json",
16260
18292
  "",
16261
18293
  AGENT_JSON_HINT
16262
18294
  ].join(`
@@ -16265,81 +18297,66 @@ var init_create2 = __esm(() => {
16265
18297
  args: {
16266
18298
  ...authArgs,
16267
18299
  ...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
- }
18300
+ id: { type: "positional", description: "Opaque Feature id", required: true },
18301
+ revision: { type: "string", description: "Current opaque Feature revision" }
16276
18302
  },
16277
18303
  async run({ args }) {
16278
18304
  const json = !!args.json;
16279
18305
  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
- });
18306
+ return runTool(client, publicToolContracts.outlit_archive_feature.toolName, {
18307
+ id: requiredTrimmedString(args.id, "<id>", json),
18308
+ revision: requiredTrimmedString(args.revision, "--revision", json)
18309
+ }, json, { spinnerMessage: "Archiving Feature..." });
16290
18310
  }
16291
18311
  });
16292
18312
  });
16293
18313
 
16294
- // src/commands/metrics/index.ts
16295
- var exports_metrics = {};
16296
- __export(exports_metrics, {
16297
- default: () => metrics_default
18314
+ // src/commands/features/index.ts
18315
+ var exports_features2 = {};
18316
+ __export(exports_features2, {
18317
+ default: () => features_default2
16298
18318
  });
16299
- var metrics_default;
16300
- var init_metrics = __esm(() => {
18319
+ var features_default2;
18320
+ var init_features2 = __esm(() => {
16301
18321
  init_dist();
16302
18322
  init_output2();
16303
- metrics_default = defineCommand2({
18323
+ features_default2 = defineCommand2({
16304
18324
  meta: {
16305
- name: "metrics",
18325
+ name: "features",
16306
18326
  description: [
16307
- "Configure event-based Outlit Behavior Metrics.",
18327
+ "Configure workspace Features and inspect their exact historical usage.",
16308
18328
  "",
16309
18329
  "Commands:",
16310
- " sources List eligible event sources",
16311
- " events List event candidates for a source",
16312
- " create Create a Behavior Metric",
18330
+ " list Read features, evidence, sources, and event candidates",
18331
+ " create Create one event-based Feature",
18332
+ " archive <id> Archive a non-final Feature",
16313
18333
  "",
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",
18334
+ "Customer-level usage is available with `outlit customers features <customer>`.",
16318
18335
  "",
16319
18336
  AGENT_JSON_HINT
16320
18337
  ].join(`
16321
18338
  `)
16322
18339
  },
16323
18340
  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)
18341
+ list: () => Promise.resolve().then(() => (init_list8(), exports_list8)).then((module) => module.default),
18342
+ create: () => Promise.resolve().then(() => (init_create2(), exports_create2)).then((module) => module.default),
18343
+ archive: () => Promise.resolve().then(() => (init_archive2(), exports_archive2)).then((module) => module.default)
16327
18344
  }
16328
18345
  });
16329
18346
  });
16330
18347
 
16331
18348
  // src/commands/settings/get.ts
16332
- var exports_get6 = {};
16333
- __export(exports_get6, {
16334
- default: () => get_default6
18349
+ var exports_get7 = {};
18350
+ __export(exports_get7, {
18351
+ default: () => get_default7
16335
18352
  });
16336
- var get_default6;
16337
- var init_get6 = __esm(() => {
18353
+ var get_default7;
18354
+ var init_get7 = __esm(() => {
16338
18355
  init_dist();
16339
18356
  init_auth();
16340
18357
  init_output2();
16341
18358
  init_api();
16342
- get_default6 = defineCommand2({
18359
+ get_default7 = defineCommand2({
16343
18360
  meta: {
16344
18361
  name: "get",
16345
18362
  description: [
@@ -16439,7 +18456,7 @@ var init_settings = __esm(() => {
16439
18456
  `)
16440
18457
  },
16441
18458
  subCommands: {
16442
- get: () => Promise.resolve().then(() => (init_get6(), exports_get6)).then((m) => m.default),
18459
+ get: () => Promise.resolve().then(() => (init_get7(), exports_get7)).then((m) => m.default),
16443
18460
  update: () => Promise.resolve().then(() => (init_update4(), exports_update3)).then((m) => m.default)
16444
18461
  }
16445
18462
  });
@@ -17402,6 +19419,20 @@ var init_completions = __esm(() => {
17402
19419
  { name: "--timeframe", desc: "Metrics timeframe" }
17403
19420
  ]
17404
19421
  },
19422
+ {
19423
+ name: "relationship",
19424
+ desc: "Get a bounded customer relationship",
19425
+ flags: [...COMMON]
19426
+ },
19427
+ {
19428
+ name: "features",
19429
+ desc: "Get exact Feature usage for a customer",
19430
+ flags: [
19431
+ ...COMMON,
19432
+ { name: "--weeks", desc: "Historical usage window (1-53 weeks)" },
19433
+ { name: "--weekly", desc: "Include ordered weekly usage" }
19434
+ ]
19435
+ },
17405
19436
  {
17406
19437
  name: "timeline",
17407
19438
  desc: "Show activity timeline",
@@ -17441,6 +19472,22 @@ var init_completions = __esm(() => {
17441
19472
  }
17442
19473
  ]
17443
19474
  },
19475
+ {
19476
+ name: "attention",
19477
+ desc: "Inspect customer Attention items",
19478
+ subs: [
19479
+ {
19480
+ name: "list",
19481
+ desc: "List open or resolved Attention items",
19482
+ flags: [
19483
+ ...PAGINATED,
19484
+ { name: "--status", desc: "Lifecycle: open or resolved" },
19485
+ { name: "--customer-id", desc: "Filter by exact customer UUID" }
19486
+ ]
19487
+ },
19488
+ { name: "get", desc: "Get one Attention item by exact ID", flags: [...COMMON] }
19489
+ ]
19490
+ },
17444
19491
  {
17445
19492
  name: "activation",
17446
19493
  desc: "Configure contact and company activation",
@@ -17656,35 +19703,35 @@ var init_completions = __esm(() => {
17656
19703
  ]
17657
19704
  },
17658
19705
  {
17659
- name: "metrics",
17660
- desc: "Configure Behavior Metrics",
19706
+ name: "features",
19707
+ desc: "Configure Features",
17661
19708
  subs: [
17662
19709
  {
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",
19710
+ name: "list",
19711
+ desc: "Read workspace Features and usage evidence",
17670
19712
  flags: [
17671
19713
  ...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)" }
19714
+ { name: "--source", desc: "Optional product-event source key" },
19715
+ { name: "--weeks", desc: "Historical usage window (1-53 weeks)" },
19716
+ { name: "--candidate-limit", desc: "Maximum event candidates (1-100)" }
17675
19717
  ]
17676
19718
  },
17677
19719
  {
17678
19720
  name: "create",
17679
- desc: "Create an event-based Behavior Metric",
19721
+ desc: "Create one event-based Feature",
17680
19722
  flags: [
17681
19723
  ...COMMON,
17682
- { name: "--source", desc: "Behavior Metric source key" },
19724
+ { name: "--source", desc: "Product-event source key" },
17683
19725
  { 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" }
19726
+ { name: "--key", desc: "Stable lower_snake_case feature key" },
19727
+ { name: "--name", desc: "Human-readable Feature name" },
19728
+ { name: "--property-filters", desc: "Optional JSON exact or exists filters" }
17687
19729
  ]
19730
+ },
19731
+ {
19732
+ name: "archive",
19733
+ desc: "Archive a non-final Feature",
19734
+ flags: [...COMMON, { name: "--revision", desc: "Current opaque feature revision" }]
17688
19735
  }
17689
19736
  ]
17690
19737
  },
@@ -18486,34 +20533,39 @@ async function startCli() {
18486
20533
  meta: {
18487
20534
  name: "outlit",
18488
20535
  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.`
20536
+ description: [
20537
+ "Outlit CLI -- customer intelligence from the terminal.",
20538
+ "",
20539
+ "Usage examples:",
20540
+ " outlit onboard --agent codex --json",
20541
+ " outlit customers list --billing-status PAYING --no-activity-in 30d",
20542
+ " outlit customers get acme.com --include users,revenue",
20543
+ " outlit customers relationship acme.com",
20544
+ " outlit customers timeline acme.com --timeframe 90d",
20545
+ " outlit users list --journey-stage ENGAGED",
20546
+ " outlit ws-users list --role CSM --has-owned-customers",
20547
+ " outlit facts list acme.com --fact-types CHURN_RISK,EXPANSION",
20548
+ " outlit facts get --fact-id fact_123 --include evidence",
20549
+ " outlit sources get --source-type OPPORTUNITY --source-id opp_123",
20550
+ " outlit search 'pricing objections last quarter' --source-types CALL,OPPORTUNITY",
20551
+ " outlit sql 'SELECT * FROM activity LIMIT 10'",
20552
+ " outlit schema activity",
20553
+ " outlit activation get --json",
20554
+ " outlit activation preview --event integration_connected --json",
20555
+ " outlit destinations disable 10000000-0000-4000-8000-000000000003 --json",
20556
+ " outlit features list --json",
20557
+ " outlit features create --source metric_source_v1_0123456789abcdef0123456789abcdef --event report_exported --key reports_exported --name 'Reports exported' --json",
20558
+ " outlit customers features acme.com --weekly --json",
20559
+ " outlit doctor --json",
20560
+ "",
20561
+ "For AI agents: commands auto-output JSON when stdout is piped. No --json flag needed."
20562
+ ].join(`
20563
+ `)
18513
20564
  },
18514
20565
  subCommands: {
18515
20566
  auth: () => Promise.resolve().then(() => (init_auth2(), exports_auth)).then((m) => m.default),
18516
20567
  activation: () => Promise.resolve().then(() => (init_activation2(), exports_activation)).then((m) => m.default),
20568
+ attention: () => Promise.resolve().then(() => (init_attention(), exports_attention)).then((m) => m.default),
18517
20569
  customers: () => Promise.resolve().then(() => (init_customers(), exports_customers)).then((m) => m.default),
18518
20570
  users: () => Promise.resolve().then(() => (init_users(), exports_users)).then((m) => m.default),
18519
20571
  "ws-users": () => Promise.resolve().then(() => (init_ws_users(), exports_ws_users)).then((m) => m.default),
@@ -18526,7 +20578,7 @@ For AI agents: commands auto-output JSON when stdout is piped. No --json flag ne
18526
20578
  sql: () => Promise.resolve().then(() => (init_sql(), exports_sql)).then((m) => m.default),
18527
20579
  schema: () => Promise.resolve().then(() => (init_schema(), exports_schema)).then((m) => m.default),
18528
20580
  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),
20581
+ features: () => Promise.resolve().then(() => (init_features2(), exports_features2)).then((module) => module.default),
18530
20582
  settings: () => Promise.resolve().then(() => (init_settings(), exports_settings)).then((m) => m.default),
18531
20583
  integrations: () => Promise.resolve().then(() => (init_integrations(), exports_integrations)).then((m) => m.default),
18532
20584
  completions: () => Promise.resolve().then(() => (init_completions(), exports_completions)).then((m) => m.default),