@outlit/cli 3.2.3 → 3.2.4

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 +1834 -518
  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.2.3",
107
+ version: "3.2.4",
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.2.2",
150
+ "@outlit/tools": "^2.2.3",
151
151
  citty: "^0.2.1"
152
152
  },
153
153
  devDependencies: {
@@ -1764,7 +1764,11 @@ var init_dist4 = __esm(() => {
1764
1764
  "outlit_list_identity_merge_suggestions",
1765
1765
  "outlit_reject_identity_merge_suggestion",
1766
1766
  "outlit_merge_customers",
1767
- "outlit_get_customer_merge_status"
1767
+ "outlit_get_customer_merge_status",
1768
+ "outlit_list_scoped_repairs",
1769
+ "outlit_preview_scoped_repair",
1770
+ "outlit_execute_scoped_repair",
1771
+ "outlit_verify_scoped_repair"
1768
1772
  ];
1769
1773
  publicToolContracts = {
1770
1774
  outlit_list_customers: {
@@ -1773,7 +1777,7 @@ var init_dist4 = __esm(() => {
1773
1777
  commandVersion: 1,
1774
1778
  ownerDomain: "customers",
1775
1779
  title: "List Customers",
1776
- description: "Browse and filter customers. Use this to find customers by billing status, activity recency, revenue, or name. Returns a paginated list with summary info (MRR, last activity, status).",
1780
+ description: "Browse and filter customers. Use this to find customers by billing status, activity recency, revenue, or name. Returns a paginated list with summary info (MRR, last activity, status). currentMrr is in the billing provider's units for the customer's currency, which the result doesn't name. For USD, EUR, GBP and CAD this is cents: divide by 100 (e.g. 1234500 is $12,345 MRR, USD). Other currencies follow the provider's amount rules. ARR is 12 × currentMrr in the same units.",
1777
1781
  annotations: {
1778
1782
  readOnlyHint: true,
1779
1783
  destructiveHint: false
@@ -1820,12 +1824,12 @@ var init_dist4 = __esm(() => {
1820
1824
  ]
1821
1825
  },
1822
1826
  mrrAbove: {
1823
- description: "Minimum MRR in cents (e.g., 10000 = $100)",
1827
+ description: "Minimum MRR, in currentMrr's units (10000 is $100 for a customer billed in USD)",
1824
1828
  type: "number",
1825
1829
  minimum: 0
1826
1830
  },
1827
1831
  mrrBelow: {
1828
- description: "Maximum MRR in cents",
1832
+ description: "Maximum MRR, in currentMrr's units",
1829
1833
  type: "number",
1830
1834
  minimum: 0
1831
1835
  },
@@ -1988,7 +1992,8 @@ var init_dist4 = __esm(() => {
1988
1992
  {
1989
1993
  type: "null"
1990
1994
  }
1991
- ]
1995
+ ],
1996
+ description: "Monthly recurring revenue as an integer amount in the billing provider's units for the customer's currency, which this result doesn't name. For USD, EUR, GBP and CAD this is cents: divide by 100 (e.g. 1234500 is $12,345, USD). Other currencies follow the provider's amount rules (Stripe's currency docs), so don't assume a divisor for them. ARR is 12 × this value in the same units. Null unless mrrCalculationStatus is calculated."
1992
1997
  },
1993
1998
  mrrCalculationStatus: {
1994
1999
  type: "string",
@@ -2573,7 +2578,7 @@ var init_dist4 = __esm(() => {
2573
2578
  commandVersion: 1,
2574
2579
  ownerDomain: "customers",
2575
2580
  title: "Get Customer",
2576
- description: "Get full details for a single customer. Optionally include users, revenue, recent activity, engagement metrics, or company enrichment.",
2581
+ description: "Get full details for a single customer. Optionally include users, revenue, recent activity, engagement metrics, or company enrichment. Revenue amounts (currentMrr, lifetimeRevenue) are in the billing provider's units for the customer's currency, which the result doesn't name. For USD, EUR, GBP and CAD these are cents: divide by 100 (e.g. 1234500 is $12,345, USD). Other currencies follow the provider's amount rules. ARR is 12 × currentMrr in the same units.",
2577
2582
  annotations: {
2578
2583
  readOnlyHint: true,
2579
2584
  destructiveHint: false
@@ -2843,7 +2848,8 @@ var init_dist4 = __esm(() => {
2843
2848
  {
2844
2849
  type: "null"
2845
2850
  }
2846
- ]
2851
+ ],
2852
+ description: "Monthly recurring revenue as an integer amount in the billing provider's units for the customer's currency, which this result doesn't name. For USD, EUR, GBP and CAD this is cents: divide by 100 (e.g. 1234500 is $12,345, USD). Other currencies follow the provider's amount rules (Stripe's currency docs), so don't assume a divisor for them. ARR is 12 × this value in the same units. Null unless mrrCalculationStatus is calculated."
2847
2853
  },
2848
2854
  mrrCalculationStatus: {
2849
2855
  type: "string",
@@ -2854,7 +2860,8 @@ var init_dist4 = __esm(() => {
2854
2860
  ]
2855
2861
  },
2856
2862
  lifetimeRevenue: {
2857
- type: "number"
2863
+ type: "number",
2864
+ description: "Lifetime revenue in the billing provider's units for the currency it was billed in, like currentMrr: cents for USD, EUR, GBP and CAD, so divide by 100. Other currencies follow the provider's amount rules, so don't assume a divisor for them."
2858
2865
  },
2859
2866
  activeSubscriptions: {
2860
2867
  type: "integer",
@@ -6338,6 +6345,48 @@ CHAMPION_RISK: Historical broad relationship-risk fact retained for existing row
6338
6345
  score: {
6339
6346
  type: "number"
6340
6347
  },
6348
+ customer: {
6349
+ description: "The customer this result belongs to. Null when it can't be attributed to exactly one customer the caller can read.",
6350
+ anyOf: [
6351
+ {
6352
+ type: "object",
6353
+ properties: {
6354
+ id: {
6355
+ type: "string"
6356
+ },
6357
+ name: {
6358
+ anyOf: [
6359
+ {
6360
+ type: "string"
6361
+ },
6362
+ {
6363
+ type: "null"
6364
+ }
6365
+ ]
6366
+ },
6367
+ domain: {
6368
+ anyOf: [
6369
+ {
6370
+ type: "string"
6371
+ },
6372
+ {
6373
+ type: "null"
6374
+ }
6375
+ ]
6376
+ }
6377
+ },
6378
+ required: [
6379
+ "id",
6380
+ "name",
6381
+ "domain"
6382
+ ],
6383
+ additionalProperties: false
6384
+ },
6385
+ {
6386
+ type: "null"
6387
+ }
6388
+ ]
6389
+ },
6341
6390
  matchCount: {
6342
6391
  type: "integer",
6343
6392
  minimum: 0,
@@ -6868,6 +6917,48 @@ CHAMPION_RISK: Historical broad relationship-risk fact retained for existing row
6868
6917
  sourceId: {
6869
6918
  type: "string"
6870
6919
  },
6920
+ customer: {
6921
+ description: "The customer this result belongs to. Null when it can't be attributed to exactly one customer the caller can read.",
6922
+ anyOf: [
6923
+ {
6924
+ type: "object",
6925
+ properties: {
6926
+ id: {
6927
+ type: "string"
6928
+ },
6929
+ name: {
6930
+ anyOf: [
6931
+ {
6932
+ type: "string"
6933
+ },
6934
+ {
6935
+ type: "null"
6936
+ }
6937
+ ]
6938
+ },
6939
+ domain: {
6940
+ anyOf: [
6941
+ {
6942
+ type: "string"
6943
+ },
6944
+ {
6945
+ type: "null"
6946
+ }
6947
+ ]
6948
+ }
6949
+ },
6950
+ required: [
6951
+ "id",
6952
+ "name",
6953
+ "domain"
6954
+ ],
6955
+ additionalProperties: false
6956
+ },
6957
+ {
6958
+ type: "null"
6959
+ }
6960
+ ]
6961
+ },
6871
6962
  occurredAt: {
6872
6963
  anyOf: [
6873
6964
  {
@@ -14223,7 +14314,8 @@ Returns column definitions and example queries for each view.`,
14223
14314
  {
14224
14315
  type: "null"
14225
14316
  }
14226
- ]
14317
+ ],
14318
+ description: "Annual recurring revenue (12 × billing MRR) in the billing provider's units for the currency field. For USD, EUR, GBP and CAD this is cents: divide by 100 (e.g. 1234500 is $12,345, USD). For other currencies, use the provider's amount rules for that currency (Stripe's currency docs) rather than assuming a divisor."
14227
14319
  },
14228
14320
  currency: {
14229
14321
  anyOf: [
@@ -14523,7 +14615,8 @@ Returns column definitions and example queries for each view.`,
14523
14615
  {
14524
14616
  type: "null"
14525
14617
  }
14526
- ]
14618
+ ],
14619
+ description: "Annual recurring revenue (12 × billing MRR) in the billing provider's units for the currency field. For USD, EUR, GBP and CAD this is cents: divide by 100 (e.g. 1234500 is $12,345, USD). For other currencies, use the provider's amount rules for that currency (Stripe's currency docs) rather than assuming a divisor."
14527
14620
  },
14528
14621
  currency: {
14529
14622
  anyOf: [
@@ -15135,6 +15228,16 @@ Returns column definitions and example queries for each view.`,
15135
15228
  }
15136
15229
  ]
15137
15230
  },
15231
+ billingStatus: {
15232
+ anyOf: [
15233
+ {
15234
+ type: "string"
15235
+ },
15236
+ {
15237
+ type: "null"
15238
+ }
15239
+ ]
15240
+ },
15138
15241
  identifierCount: {
15139
15242
  type: "integer",
15140
15243
  minimum: 0,
@@ -15205,6 +15308,16 @@ Returns column definitions and example queries for each view.`,
15205
15308
  }
15206
15309
  ]
15207
15310
  },
15311
+ billingStatus: {
15312
+ anyOf: [
15313
+ {
15314
+ type: "string"
15315
+ },
15316
+ {
15317
+ type: "null"
15318
+ }
15319
+ ]
15320
+ },
15208
15321
  identifierCount: {
15209
15322
  type: "integer",
15210
15323
  minimum: 0,
@@ -15356,6 +15469,19 @@ Returns column definitions and example queries for each view.`,
15356
15469
  type: "integer",
15357
15470
  minimum: 0,
15358
15471
  maximum: 9007199254740991
15472
+ },
15473
+ analyticsAvailable: {
15474
+ type: "boolean"
15475
+ },
15476
+ opportunities: {
15477
+ type: "integer",
15478
+ minimum: 0,
15479
+ maximum: 9007199254740991
15480
+ },
15481
+ revenueSnapshots: {
15482
+ type: "integer",
15483
+ minimum: 0,
15484
+ maximum: 9007199254740991
15359
15485
  }
15360
15486
  },
15361
15487
  required: [
@@ -15373,321 +15499,1271 @@ Returns column definitions and example queries for each view.`,
15373
15499
  ],
15374
15500
  additionalProperties: false
15375
15501
  },
15376
- latestJob: {
15377
- anyOf: [
15378
- {
15502
+ scope: {
15503
+ type: "object",
15504
+ properties: {
15505
+ survivor: {
15379
15506
  type: "object",
15380
15507
  properties: {
15381
- id: {
15508
+ shape: {
15382
15509
  type: "string",
15383
- minLength: 1,
15384
- maxLength: 191
15510
+ enum: [
15511
+ "provisional",
15512
+ "established",
15513
+ "unknown"
15514
+ ]
15385
15515
  },
15386
- operationId: {
15516
+ billingStatus: {
15387
15517
  anyOf: [
15388
15518
  {
15389
- type: "string",
15390
- minLength: 1,
15391
- maxLength: 191
15519
+ type: "string"
15392
15520
  },
15393
15521
  {
15394
15522
  type: "null"
15395
15523
  }
15396
- ],
15397
- description: "Pass to outlit_get_customer_merge_status. Null when this job has no matching tracked operation."
15524
+ ]
15398
15525
  },
15399
- status: {
15526
+ hasIndependentCrmIdentity: {
15527
+ type: "boolean"
15528
+ },
15529
+ hasIndependentStripeIdentity: {
15530
+ type: "boolean"
15531
+ }
15532
+ },
15533
+ required: [
15534
+ "shape",
15535
+ "billingStatus",
15536
+ "hasIndependentCrmIdentity",
15537
+ "hasIndependentStripeIdentity"
15538
+ ],
15539
+ additionalProperties: false
15540
+ },
15541
+ duplicate: {
15542
+ type: "object",
15543
+ properties: {
15544
+ shape: {
15400
15545
  type: "string",
15401
15546
  enum: [
15402
- "QUEUED",
15403
- "RUNNING",
15404
- "COMPLETED",
15405
- "FAILED"
15547
+ "provisional",
15548
+ "established",
15549
+ "unknown"
15406
15550
  ]
15407
15551
  },
15408
- createdAt: {
15409
- type: "string",
15410
- format: "date-time",
15411
- 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))$"
15552
+ billingStatus: {
15553
+ anyOf: [
15554
+ {
15555
+ type: "string"
15556
+ },
15557
+ {
15558
+ type: "null"
15559
+ }
15560
+ ]
15412
15561
  },
15413
- updatedAt: {
15414
- type: "string",
15415
- format: "date-time",
15416
- 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))$"
15562
+ hasIndependentCrmIdentity: {
15563
+ type: "boolean"
15564
+ },
15565
+ hasIndependentStripeIdentity: {
15566
+ type: "boolean"
15417
15567
  }
15418
15568
  },
15419
15569
  required: [
15420
- "id",
15421
- "operationId",
15422
- "status",
15423
- "createdAt",
15424
- "updatedAt"
15570
+ "shape",
15571
+ "billingStatus",
15572
+ "hasIndependentCrmIdentity",
15573
+ "hasIndependentStripeIdentity"
15425
15574
  ],
15426
15575
  additionalProperties: false
15427
15576
  },
15428
- {
15429
- type: "null"
15430
- }
15431
- ]
15432
- },
15433
- jevEvidence: {
15434
- description: "Jev advisory model evidence scoped to this suggestion's customers. Uncalibrated and never part of eligibility, confidence, or recommended action.",
15435
- anyOf: [
15436
- {
15577
+ payingAccountsAffected: {
15578
+ anyOf: [
15579
+ {
15580
+ type: "integer",
15581
+ minimum: 0,
15582
+ maximum: 9007199254740991
15583
+ },
15584
+ {
15585
+ type: "null"
15586
+ }
15587
+ ]
15588
+ },
15589
+ availability: {
15437
15590
  type: "object",
15438
15591
  properties: {
15439
- computedAt: {
15440
- type: "string",
15441
- format: "date-time",
15442
- 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))$"
15443
- },
15444
- expiresAt: {
15445
- type: "string",
15446
- format: "date-time",
15447
- 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))$"
15592
+ currentCounts: {
15593
+ type: "boolean"
15448
15594
  },
15449
- expired: {
15595
+ analytics: {
15450
15596
  type: "boolean"
15597
+ }
15598
+ },
15599
+ required: [
15600
+ "currentCounts",
15601
+ "analytics"
15602
+ ],
15603
+ additionalProperties: false
15604
+ },
15605
+ moves: {
15606
+ type: "object",
15607
+ properties: {
15608
+ contacts: {
15609
+ type: "integer",
15610
+ minimum: 0,
15611
+ maximum: 9007199254740991
15451
15612
  },
15452
- pairs: {
15453
- minItems: 1,
15454
- type: "array",
15455
- items: {
15456
- type: "object",
15457
- properties: {
15458
- incoming: {
15459
- type: "object",
15460
- properties: {
15461
- id: {
15462
- type: "string",
15463
- minLength: 1,
15464
- maxLength: 191
15465
- },
15466
- name: {
15467
- type: "string",
15468
- minLength: 1,
15469
- maxLength: 500
15470
- },
15471
- domain: {
15472
- anyOf: [
15473
- {
15474
- type: "string",
15475
- minLength: 1,
15476
- maxLength: 500
15477
- },
15478
- {
15479
- type: "null"
15480
- }
15481
- ]
15482
- },
15483
- type: {
15484
- type: "string",
15485
- enum: [
15486
- "COMPANY",
15487
- "INDIVIDUAL"
15488
- ]
15489
- },
15490
- status: {
15491
- anyOf: [
15492
- {
15493
- type: "string",
15494
- enum: [
15495
- "PROVISIONAL",
15496
- "ACTIVE",
15497
- "CHURNED",
15498
- "MERGED"
15499
- ]
15500
- },
15501
- {
15502
- type: "null"
15503
- }
15504
- ]
15505
- },
15506
- identifierCount: {
15507
- type: "integer",
15508
- minimum: 0,
15509
- maximum: 9007199254740991
15510
- },
15511
- contactCount: {
15512
- type: "integer",
15513
- minimum: 0,
15514
- maximum: 9007199254740991
15515
- }
15516
- },
15517
- required: [
15518
- "id",
15519
- "name",
15520
- "domain",
15521
- "type",
15522
- "status",
15523
- "identifierCount",
15524
- "contactCount"
15525
- ],
15526
- additionalProperties: false
15527
- },
15528
- candidate: {
15529
- type: "object",
15530
- properties: {
15531
- id: {
15532
- type: "string",
15533
- minLength: 1,
15534
- maxLength: 191
15535
- },
15536
- name: {
15537
- type: "string",
15538
- minLength: 1,
15539
- maxLength: 500
15540
- },
15541
- domain: {
15542
- anyOf: [
15543
- {
15544
- type: "string",
15545
- minLength: 1,
15546
- maxLength: 500
15547
- },
15548
- {
15549
- type: "null"
15550
- }
15551
- ]
15552
- },
15553
- type: {
15554
- type: "string",
15555
- enum: [
15556
- "COMPANY",
15557
- "INDIVIDUAL"
15558
- ]
15559
- },
15560
- status: {
15561
- anyOf: [
15562
- {
15563
- type: "string",
15564
- enum: [
15565
- "PROVISIONAL",
15566
- "ACTIVE",
15567
- "CHURNED",
15568
- "MERGED"
15569
- ]
15570
- },
15571
- {
15572
- type: "null"
15573
- }
15574
- ]
15575
- },
15576
- identifierCount: {
15577
- type: "integer",
15578
- minimum: 0,
15579
- maximum: 9007199254740991
15580
- },
15581
- contactCount: {
15582
- type: "integer",
15583
- minimum: 0,
15584
- maximum: 9007199254740991
15585
- }
15586
- },
15587
- required: [
15588
- "id",
15589
- "name",
15590
- "domain",
15591
- "type",
15592
- "status",
15593
- "identifierCount",
15594
- "contactCount"
15595
- ],
15596
- additionalProperties: false
15597
- },
15598
- pSameEntity: {
15599
- type: "number",
15600
- minimum: 0,
15601
- maximum: 1
15602
- },
15603
- relation: {
15604
- anyOf: [
15605
- {
15606
- type: "string",
15607
- minLength: 1,
15608
- maxLength: 100
15609
- },
15610
- {
15611
- type: "null"
15612
- }
15613
- ]
15614
- },
15615
- relationProbability: {
15616
- anyOf: [
15617
- {
15618
- type: "number",
15619
- minimum: 0,
15620
- maximum: 1
15621
- },
15622
- {
15623
- type: "null"
15624
- }
15625
- ]
15626
- }
15613
+ analyticsEvents: {
15614
+ anyOf: [
15615
+ {
15616
+ type: "integer",
15617
+ minimum: 0,
15618
+ maximum: 9007199254740991
15627
15619
  },
15628
- required: [
15629
- "incoming",
15630
- "candidate",
15631
- "pSameEntity",
15632
- "relation",
15633
- "relationProbability"
15634
- ],
15635
- additionalProperties: false
15636
- }
15620
+ {
15621
+ type: "null"
15622
+ }
15623
+ ]
15624
+ },
15625
+ analyticsDimensions: {
15626
+ anyOf: [
15627
+ {
15628
+ type: "integer",
15629
+ minimum: 0,
15630
+ maximum: 9007199254740991
15631
+ },
15632
+ {
15633
+ type: "null"
15634
+ }
15635
+ ]
15636
+ },
15637
+ billingEvents: {
15638
+ type: "integer",
15639
+ minimum: 0,
15640
+ maximum: 9007199254740991
15641
+ },
15642
+ revenueSnapshots: {
15643
+ anyOf: [
15644
+ {
15645
+ type: "integer",
15646
+ minimum: 0,
15647
+ maximum: 9007199254740991
15648
+ },
15649
+ {
15650
+ type: "null"
15651
+ }
15652
+ ]
15653
+ },
15654
+ calls: {
15655
+ type: "integer",
15656
+ minimum: 0,
15657
+ maximum: 9007199254740991
15658
+ },
15659
+ facts: {
15660
+ type: "integer",
15661
+ minimum: 0,
15662
+ maximum: 9007199254740991
15663
+ },
15664
+ opportunities: {
15665
+ anyOf: [
15666
+ {
15667
+ type: "integer",
15668
+ minimum: 0,
15669
+ maximum: 9007199254740991
15670
+ },
15671
+ {
15672
+ type: "null"
15673
+ }
15674
+ ]
15675
+ },
15676
+ tickets: {
15677
+ type: "integer",
15678
+ minimum: 0,
15679
+ maximum: 9007199254740991
15637
15680
  }
15638
15681
  },
15639
15682
  required: [
15640
- "computedAt",
15641
- "expiresAt",
15642
- "expired",
15643
- "pairs"
15683
+ "contacts",
15684
+ "analyticsEvents",
15685
+ "analyticsDimensions",
15686
+ "billingEvents",
15687
+ "revenueSnapshots",
15688
+ "calls",
15689
+ "facts",
15690
+ "opportunities",
15691
+ "tickets"
15644
15692
  ],
15645
15693
  additionalProperties: false
15646
15694
  },
15695
+ conflicts: {
15696
+ type: "array",
15697
+ items: {
15698
+ type: "object",
15699
+ properties: {
15700
+ code: {
15701
+ type: "string"
15702
+ },
15703
+ message: {
15704
+ type: "string"
15705
+ },
15706
+ scope: {
15707
+ type: "string"
15708
+ },
15709
+ sourceIdentities: {
15710
+ type: "array",
15711
+ items: {
15712
+ type: "string"
15713
+ }
15714
+ },
15715
+ survivorIdentities: {
15716
+ type: "array",
15717
+ items: {
15718
+ type: "string"
15719
+ }
15720
+ }
15721
+ },
15722
+ required: [
15723
+ "code",
15724
+ "message",
15725
+ "scope",
15726
+ "sourceIdentities",
15727
+ "survivorIdentities"
15728
+ ],
15729
+ additionalProperties: false
15730
+ }
15731
+ },
15732
+ supportingEvidence: {
15733
+ type: "array",
15734
+ items: {
15735
+ type: "string"
15736
+ }
15737
+ }
15738
+ },
15739
+ required: [
15740
+ "survivor",
15741
+ "duplicate",
15742
+ "payingAccountsAffected",
15743
+ "availability",
15744
+ "moves",
15745
+ "conflicts",
15746
+ "supportingEvidence"
15747
+ ],
15748
+ additionalProperties: false
15749
+ },
15750
+ mergeBlockedReason: {
15751
+ anyOf: [
15752
+ {
15753
+ type: "string"
15754
+ },
15755
+ {
15756
+ type: "null"
15757
+ }
15758
+ ]
15759
+ },
15760
+ reviewedPairOptions: {
15761
+ type: "array",
15762
+ items: {
15763
+ type: "array",
15764
+ prefixItems: [
15765
+ {
15766
+ type: "string"
15767
+ },
15768
+ {
15769
+ type: "string"
15770
+ }
15771
+ ]
15772
+ }
15773
+ },
15774
+ candidateCustomers: {
15775
+ type: "array",
15776
+ items: {
15777
+ type: "object",
15778
+ properties: {
15779
+ id: {
15780
+ type: "string",
15781
+ minLength: 1,
15782
+ maxLength: 191
15783
+ },
15784
+ name: {
15785
+ type: "string",
15786
+ minLength: 1,
15787
+ maxLength: 500
15788
+ },
15789
+ domain: {
15790
+ anyOf: [
15791
+ {
15792
+ type: "string",
15793
+ minLength: 1,
15794
+ maxLength: 500
15795
+ },
15796
+ {
15797
+ type: "null"
15798
+ }
15799
+ ]
15800
+ },
15801
+ type: {
15802
+ type: "string",
15803
+ enum: [
15804
+ "COMPANY",
15805
+ "INDIVIDUAL"
15806
+ ]
15807
+ },
15808
+ status: {
15809
+ anyOf: [
15810
+ {
15811
+ type: "string",
15812
+ enum: [
15813
+ "PROVISIONAL",
15814
+ "ACTIVE",
15815
+ "CHURNED",
15816
+ "MERGED"
15817
+ ]
15818
+ },
15819
+ {
15820
+ type: "null"
15821
+ }
15822
+ ]
15823
+ },
15824
+ billingStatus: {
15825
+ anyOf: [
15826
+ {
15827
+ type: "string"
15828
+ },
15829
+ {
15830
+ type: "null"
15831
+ }
15832
+ ]
15833
+ },
15834
+ identifierCount: {
15835
+ type: "integer",
15836
+ minimum: 0,
15837
+ maximum: 9007199254740991
15838
+ },
15839
+ contactCount: {
15840
+ type: "integer",
15841
+ minimum: 0,
15842
+ maximum: 9007199254740991
15843
+ }
15844
+ },
15845
+ required: [
15846
+ "id",
15847
+ "name",
15848
+ "domain",
15849
+ "type",
15850
+ "status",
15851
+ "identifierCount",
15852
+ "contactCount"
15853
+ ],
15854
+ additionalProperties: false
15855
+ }
15856
+ },
15857
+ impactScope: {
15858
+ type: "string",
15859
+ enum: [
15860
+ "single_source",
15861
+ "cluster_sources"
15862
+ ]
15863
+ },
15864
+ latestJob: {
15865
+ anyOf: [
15866
+ {
15867
+ type: "object",
15868
+ properties: {
15869
+ id: {
15870
+ type: "string",
15871
+ minLength: 1,
15872
+ maxLength: 191
15873
+ },
15874
+ operationId: {
15875
+ anyOf: [
15876
+ {
15877
+ type: "string",
15878
+ minLength: 1,
15879
+ maxLength: 191
15880
+ },
15881
+ {
15882
+ type: "null"
15883
+ }
15884
+ ],
15885
+ description: "Pass to outlit_get_customer_merge_status. Null when this job has no matching tracked operation."
15886
+ },
15887
+ status: {
15888
+ type: "string",
15889
+ enum: [
15890
+ "QUEUED",
15891
+ "RUNNING",
15892
+ "COMPLETED",
15893
+ "FAILED"
15894
+ ]
15895
+ },
15896
+ createdAt: {
15897
+ type: "string",
15898
+ format: "date-time",
15899
+ 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))$"
15900
+ },
15901
+ updatedAt: {
15902
+ type: "string",
15903
+ format: "date-time",
15904
+ 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))$"
15905
+ }
15906
+ },
15907
+ required: [
15908
+ "id",
15909
+ "operationId",
15910
+ "status",
15911
+ "createdAt",
15912
+ "updatedAt"
15913
+ ],
15914
+ additionalProperties: false
15915
+ },
15916
+ {
15917
+ type: "null"
15918
+ }
15919
+ ]
15920
+ },
15921
+ jevEvidence: {
15922
+ description: "Jev advisory model evidence scoped to this suggestion's customers. Uncalibrated and never part of eligibility, confidence, or recommended action.",
15923
+ anyOf: [
15924
+ {
15925
+ type: "object",
15926
+ properties: {
15927
+ computedAt: {
15928
+ type: "string",
15929
+ format: "date-time",
15930
+ 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))$"
15931
+ },
15932
+ expiresAt: {
15933
+ type: "string",
15934
+ format: "date-time",
15935
+ 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))$"
15936
+ },
15937
+ expired: {
15938
+ type: "boolean"
15939
+ },
15940
+ pairs: {
15941
+ minItems: 1,
15942
+ type: "array",
15943
+ items: {
15944
+ type: "object",
15945
+ properties: {
15946
+ incoming: {
15947
+ type: "object",
15948
+ properties: {
15949
+ id: {
15950
+ type: "string",
15951
+ minLength: 1,
15952
+ maxLength: 191
15953
+ },
15954
+ name: {
15955
+ type: "string",
15956
+ minLength: 1,
15957
+ maxLength: 500
15958
+ },
15959
+ domain: {
15960
+ anyOf: [
15961
+ {
15962
+ type: "string",
15963
+ minLength: 1,
15964
+ maxLength: 500
15965
+ },
15966
+ {
15967
+ type: "null"
15968
+ }
15969
+ ]
15970
+ },
15971
+ type: {
15972
+ type: "string",
15973
+ enum: [
15974
+ "COMPANY",
15975
+ "INDIVIDUAL"
15976
+ ]
15977
+ },
15978
+ status: {
15979
+ anyOf: [
15980
+ {
15981
+ type: "string",
15982
+ enum: [
15983
+ "PROVISIONAL",
15984
+ "ACTIVE",
15985
+ "CHURNED",
15986
+ "MERGED"
15987
+ ]
15988
+ },
15989
+ {
15990
+ type: "null"
15991
+ }
15992
+ ]
15993
+ },
15994
+ billingStatus: {
15995
+ anyOf: [
15996
+ {
15997
+ type: "string"
15998
+ },
15999
+ {
16000
+ type: "null"
16001
+ }
16002
+ ]
16003
+ },
16004
+ identifierCount: {
16005
+ type: "integer",
16006
+ minimum: 0,
16007
+ maximum: 9007199254740991
16008
+ },
16009
+ contactCount: {
16010
+ type: "integer",
16011
+ minimum: 0,
16012
+ maximum: 9007199254740991
16013
+ }
16014
+ },
16015
+ required: [
16016
+ "id",
16017
+ "name",
16018
+ "domain",
16019
+ "type",
16020
+ "status",
16021
+ "identifierCount",
16022
+ "contactCount"
16023
+ ],
16024
+ additionalProperties: false
16025
+ },
16026
+ candidate: {
16027
+ type: "object",
16028
+ properties: {
16029
+ id: {
16030
+ type: "string",
16031
+ minLength: 1,
16032
+ maxLength: 191
16033
+ },
16034
+ name: {
16035
+ type: "string",
16036
+ minLength: 1,
16037
+ maxLength: 500
16038
+ },
16039
+ domain: {
16040
+ anyOf: [
16041
+ {
16042
+ type: "string",
16043
+ minLength: 1,
16044
+ maxLength: 500
16045
+ },
16046
+ {
16047
+ type: "null"
16048
+ }
16049
+ ]
16050
+ },
16051
+ type: {
16052
+ type: "string",
16053
+ enum: [
16054
+ "COMPANY",
16055
+ "INDIVIDUAL"
16056
+ ]
16057
+ },
16058
+ status: {
16059
+ anyOf: [
16060
+ {
16061
+ type: "string",
16062
+ enum: [
16063
+ "PROVISIONAL",
16064
+ "ACTIVE",
16065
+ "CHURNED",
16066
+ "MERGED"
16067
+ ]
16068
+ },
16069
+ {
16070
+ type: "null"
16071
+ }
16072
+ ]
16073
+ },
16074
+ billingStatus: {
16075
+ anyOf: [
16076
+ {
16077
+ type: "string"
16078
+ },
16079
+ {
16080
+ type: "null"
16081
+ }
16082
+ ]
16083
+ },
16084
+ identifierCount: {
16085
+ type: "integer",
16086
+ minimum: 0,
16087
+ maximum: 9007199254740991
16088
+ },
16089
+ contactCount: {
16090
+ type: "integer",
16091
+ minimum: 0,
16092
+ maximum: 9007199254740991
16093
+ }
16094
+ },
16095
+ required: [
16096
+ "id",
16097
+ "name",
16098
+ "domain",
16099
+ "type",
16100
+ "status",
16101
+ "identifierCount",
16102
+ "contactCount"
16103
+ ],
16104
+ additionalProperties: false
16105
+ },
16106
+ pSameEntity: {
16107
+ type: "number",
16108
+ minimum: 0,
16109
+ maximum: 1
16110
+ },
16111
+ relation: {
16112
+ anyOf: [
16113
+ {
16114
+ type: "string",
16115
+ minLength: 1,
16116
+ maxLength: 100
16117
+ },
16118
+ {
16119
+ type: "null"
16120
+ }
16121
+ ]
16122
+ },
16123
+ relationProbability: {
16124
+ anyOf: [
16125
+ {
16126
+ type: "number",
16127
+ minimum: 0,
16128
+ maximum: 1
16129
+ },
16130
+ {
16131
+ type: "null"
16132
+ }
16133
+ ]
16134
+ }
16135
+ },
16136
+ required: [
16137
+ "incoming",
16138
+ "candidate",
16139
+ "pSameEntity",
16140
+ "relation",
16141
+ "relationProbability"
16142
+ ],
16143
+ additionalProperties: false
16144
+ }
16145
+ }
16146
+ },
16147
+ required: [
16148
+ "computedAt",
16149
+ "expiresAt",
16150
+ "expired",
16151
+ "pairs"
16152
+ ],
16153
+ additionalProperties: false
16154
+ },
16155
+ {
16156
+ type: "null"
16157
+ }
16158
+ ]
16159
+ },
16160
+ canMerge: {
16161
+ type: "boolean"
16162
+ },
16163
+ canReject: {
16164
+ type: "boolean"
16165
+ }
16166
+ },
16167
+ required: [
16168
+ "id",
16169
+ "status",
16170
+ "proposalStatus",
16171
+ "confidence",
16172
+ "survivor",
16173
+ "duplicate",
16174
+ "reviewNotes",
16175
+ "reviewedAt",
16176
+ "reviewedByName",
16177
+ "appliedAt",
16178
+ "appliedByName",
16179
+ "createdAt",
16180
+ "explanation",
16181
+ "impact",
16182
+ "latestJob",
16183
+ "canMerge",
16184
+ "canReject"
16185
+ ],
16186
+ additionalProperties: false
16187
+ }
16188
+ },
16189
+ canManageIdentityMerges: {
16190
+ type: "boolean"
16191
+ },
16192
+ nextCursor: {
16193
+ default: null,
16194
+ anyOf: [
16195
+ {
16196
+ type: "string",
16197
+ minLength: 1,
16198
+ maxLength: 2000
16199
+ },
16200
+ {
16201
+ type: "null"
16202
+ }
16203
+ ]
16204
+ }
16205
+ },
16206
+ required: [
16207
+ "suggestions",
16208
+ "canManageIdentityMerges",
16209
+ "nextCursor"
16210
+ ],
16211
+ additionalProperties: false
16212
+ }
16213
+ },
16214
+ outlit_reject_identity_merge_suggestion: {
16215
+ toolName: "outlit_reject_identity_merge_suggestion",
16216
+ commandId: "identity.suggestions.reject",
16217
+ commandVersion: 1,
16218
+ ownerDomain: "identity",
16219
+ title: "Reject identity merge suggestion",
16220
+ description: "Reject a saved identity merge suggestion and optionally record why. Requires identity review permission. Keeps the customer profiles separate; does not merge or change customer identities. Outlit-owned agents cannot perform this operation.",
16221
+ annotations: {
16222
+ readOnlyHint: false,
16223
+ destructiveHint: false
16224
+ },
16225
+ inputSchema: {
16226
+ $schema: "https://json-schema.org/draft/2020-12/schema",
16227
+ type: "object",
16228
+ properties: {
16229
+ suggestionId: {
16230
+ type: "string",
16231
+ minLength: 1,
16232
+ maxLength: 191
16233
+ },
16234
+ reviewNotes: {
16235
+ type: "string",
16236
+ maxLength: 1e4
16237
+ }
16238
+ },
16239
+ required: [
16240
+ "suggestionId"
16241
+ ],
16242
+ additionalProperties: false
16243
+ },
16244
+ outputSchema: {
16245
+ $schema: "https://json-schema.org/draft/2020-12/schema",
16246
+ type: "object",
16247
+ properties: {
16248
+ suggestionId: {
16249
+ type: "string",
16250
+ minLength: 1,
16251
+ maxLength: 191
16252
+ },
16253
+ status: {
16254
+ type: "string",
16255
+ const: "REJECTED"
16256
+ }
16257
+ },
16258
+ required: [
16259
+ "suggestionId",
16260
+ "status"
16261
+ ],
16262
+ additionalProperties: false
16263
+ }
16264
+ },
16265
+ outlit_merge_customers: {
16266
+ toolName: "outlit_merge_customers",
16267
+ commandId: "customer.merge",
16268
+ commandVersion: 1,
16269
+ ownerDomain: "identity",
16270
+ title: "Merge customers",
16271
+ description: "DANGEROUS execution with no supported undo. Preview or execute a merge of two exact records into the specified survivor; defaults to preview (dryRun:true). Without suggestionId, both records must be COMPANY. Any pair involving an INDIVIDUAL requires an eligible saved suggestionId for that exact pair. Execute only when authorized and absolutely certain both records represent the same customer; two company records must represent the same company. Similar names, related domains, shared participants, parent/subsidiary relationships or a suggested match are insufficient. If uncertain, do not execute. Execution moves customer data and access relationships and requires the reviewed previewToken, stable requestId and explicit merge permission. A preview grants no execution authority. Reuse identical request inputs for retries. Execution is asynchronous; queued does not mean complete. Outlit-owned agents cannot perform this operation.",
16272
+ annotations: {
16273
+ readOnlyHint: false,
16274
+ destructiveHint: true
16275
+ },
16276
+ inputSchema: {
16277
+ $schema: "https://json-schema.org/draft/2020-12/schema",
16278
+ type: "object",
16279
+ properties: {
16280
+ survivingCustomerId: {
16281
+ type: "string",
16282
+ minLength: 1,
16283
+ maxLength: 191
16284
+ },
16285
+ duplicateCustomerId: {
16286
+ type: "string",
16287
+ minLength: 1,
16288
+ maxLength: 191
16289
+ },
16290
+ suggestionId: {
16291
+ type: "string",
16292
+ minLength: 1,
16293
+ maxLength: 191,
16294
+ description: "Eligible saved suggestion for this exact pair. Required if either record is INDIVIDUAL; optional for two COMPANY records."
16295
+ },
16296
+ reviewNotes: {
16297
+ type: "string",
16298
+ maxLength: 1e4
16299
+ },
16300
+ dryRun: {
16301
+ default: true,
16302
+ type: "boolean"
16303
+ },
16304
+ previewToken: {
16305
+ type: "string",
16306
+ minLength: 1,
16307
+ maxLength: 4096
16308
+ },
16309
+ requestId: {
16310
+ type: "string",
16311
+ minLength: 1,
16312
+ maxLength: 191
16313
+ }
16314
+ },
16315
+ required: [
16316
+ "survivingCustomerId",
16317
+ "duplicateCustomerId"
16318
+ ],
16319
+ additionalProperties: false
16320
+ },
16321
+ outputSchema: {
16322
+ $schema: "https://json-schema.org/draft/2020-12/schema",
16323
+ oneOf: [
16324
+ {
16325
+ type: "object",
16326
+ properties: {
16327
+ kind: {
16328
+ type: "string",
16329
+ const: "preview"
16330
+ },
16331
+ survivingCustomerId: {
16332
+ type: "string",
16333
+ minLength: 1,
16334
+ maxLength: 191
16335
+ },
16336
+ duplicateCustomerId: {
16337
+ type: "string",
16338
+ minLength: 1,
16339
+ maxLength: 191
16340
+ },
16341
+ previewToken: {
16342
+ type: "string",
16343
+ minLength: 1,
16344
+ maxLength: 4096
16345
+ },
16346
+ evaluatedAt: {
16347
+ type: "string",
16348
+ format: "date-time",
16349
+ 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)))$"
16350
+ },
16351
+ impact: {
16352
+ type: "object",
16353
+ properties: {
16354
+ identifiers: {
16355
+ type: "integer",
16356
+ minimum: 0,
16357
+ maximum: 9007199254740991
16358
+ },
16359
+ contacts: {
16360
+ type: "integer",
16361
+ minimum: 0,
16362
+ maximum: 9007199254740991
16363
+ },
16364
+ facts: {
16365
+ type: "integer",
16366
+ minimum: 0,
16367
+ maximum: 9007199254740991
16368
+ },
16369
+ communications: {
16370
+ type: "integer",
16371
+ minimum: 0,
16372
+ maximum: 9007199254740991
16373
+ },
16374
+ accessEntries: {
16375
+ type: "integer",
16376
+ minimum: 0,
16377
+ maximum: 9007199254740991
16378
+ }
16379
+ },
16380
+ required: [
16381
+ "identifiers",
16382
+ "contacts",
16383
+ "facts",
16384
+ "communications",
16385
+ "accessEntries"
16386
+ ],
16387
+ additionalProperties: false
16388
+ },
16389
+ warnings: {
16390
+ maxItems: 30,
16391
+ type: "array",
16392
+ items: {
16393
+ type: "object",
16394
+ properties: {
16395
+ code: {
16396
+ type: "string",
16397
+ minLength: 1,
16398
+ maxLength: 100
16399
+ },
16400
+ message: {
16401
+ type: "string",
16402
+ maxLength: 1000
16403
+ }
16404
+ },
16405
+ required: [
16406
+ "code",
16407
+ "message"
16408
+ ],
16409
+ additionalProperties: false
16410
+ }
16411
+ }
16412
+ },
16413
+ required: [
16414
+ "kind",
16415
+ "survivingCustomerId",
16416
+ "duplicateCustomerId",
16417
+ "previewToken",
16418
+ "evaluatedAt",
16419
+ "impact",
16420
+ "warnings"
16421
+ ],
16422
+ additionalProperties: false
16423
+ },
16424
+ {
16425
+ type: "object",
16426
+ properties: {
16427
+ kind: {
16428
+ type: "string",
16429
+ const: "operation"
16430
+ },
16431
+ operationId: {
16432
+ type: "string",
16433
+ minLength: 1,
16434
+ maxLength: 191
16435
+ },
16436
+ survivingCustomerId: {
16437
+ type: "string",
16438
+ minLength: 1,
16439
+ maxLength: 191
16440
+ },
16441
+ duplicateCustomerId: {
16442
+ type: "string",
16443
+ minLength: 1,
16444
+ maxLength: 191
16445
+ },
16446
+ status: {
16447
+ type: "string",
16448
+ enum: [
16449
+ "queued",
16450
+ "running",
16451
+ "completed",
16452
+ "failed"
16453
+ ]
16454
+ },
16455
+ phase: {
16456
+ type: "string",
16457
+ minLength: 1,
16458
+ maxLength: 100
16459
+ },
16460
+ error: {
16461
+ type: "object",
16462
+ properties: {
16463
+ code: {
16464
+ type: "string",
16465
+ minLength: 1,
16466
+ maxLength: 100
16467
+ },
16468
+ message: {
16469
+ type: "string",
16470
+ maxLength: 1000
16471
+ }
16472
+ },
16473
+ required: [
16474
+ "code",
16475
+ "message"
16476
+ ],
16477
+ additionalProperties: false
16478
+ }
16479
+ },
16480
+ required: [
16481
+ "kind",
16482
+ "operationId",
16483
+ "survivingCustomerId",
16484
+ "duplicateCustomerId",
16485
+ "status",
16486
+ "phase"
16487
+ ],
16488
+ additionalProperties: false
16489
+ }
16490
+ ]
16491
+ }
16492
+ },
16493
+ outlit_get_customer_merge_status: {
16494
+ toolName: "outlit_get_customer_merge_status",
16495
+ commandId: "customer.merge.status",
16496
+ commandVersion: 1,
16497
+ ownerDomain: "identity",
16498
+ title: "Get customer merge status",
16499
+ description: "Read a customer merge operation's current progress, completion or bounded failure information. Requires current read access; possession of an operation ID does not grant access. Queued or running operations are not complete. Does not retry, restart, cancel or undo the merge.",
16500
+ annotations: {
16501
+ readOnlyHint: true,
16502
+ destructiveHint: false
16503
+ },
16504
+ inputSchema: {
16505
+ $schema: "https://json-schema.org/draft/2020-12/schema",
16506
+ type: "object",
16507
+ properties: {
16508
+ operationId: {
16509
+ type: "string",
16510
+ minLength: 1,
16511
+ maxLength: 191
16512
+ }
16513
+ },
16514
+ required: [
16515
+ "operationId"
16516
+ ],
16517
+ additionalProperties: false
16518
+ },
16519
+ outputSchema: {
16520
+ $schema: "https://json-schema.org/draft/2020-12/schema",
16521
+ type: "object",
16522
+ properties: {
16523
+ kind: {
16524
+ type: "string",
16525
+ const: "operation"
16526
+ },
16527
+ operationId: {
16528
+ type: "string",
16529
+ minLength: 1,
16530
+ maxLength: 191
16531
+ },
16532
+ survivingCustomerId: {
16533
+ type: "string",
16534
+ minLength: 1,
16535
+ maxLength: 191
16536
+ },
16537
+ duplicateCustomerId: {
16538
+ type: "string",
16539
+ minLength: 1,
16540
+ maxLength: 191
16541
+ },
16542
+ status: {
16543
+ type: "string",
16544
+ enum: [
16545
+ "queued",
16546
+ "running",
16547
+ "completed",
16548
+ "failed"
16549
+ ]
16550
+ },
16551
+ phase: {
16552
+ type: "string",
16553
+ minLength: 1,
16554
+ maxLength: 100
16555
+ },
16556
+ error: {
16557
+ type: "object",
16558
+ properties: {
16559
+ code: {
16560
+ type: "string",
16561
+ minLength: 1,
16562
+ maxLength: 100
16563
+ },
16564
+ message: {
16565
+ type: "string",
16566
+ maxLength: 1000
16567
+ }
16568
+ },
16569
+ required: [
16570
+ "code",
16571
+ "message"
16572
+ ],
16573
+ additionalProperties: false
16574
+ }
16575
+ },
16576
+ required: [
16577
+ "kind",
16578
+ "operationId",
16579
+ "survivingCustomerId",
16580
+ "duplicateCustomerId",
16581
+ "status",
16582
+ "phase"
16583
+ ],
16584
+ additionalProperties: false
16585
+ }
16586
+ },
16587
+ outlit_list_scoped_repairs: {
16588
+ toolName: "outlit_list_scoped_repairs",
16589
+ commandId: "integrity.scoped_repair.list",
16590
+ commandVersion: 1,
16591
+ ownerDomain: "identity",
16592
+ title: "List scoped repair findings",
16593
+ description: "Read a bounded page of integrity findings visible to this caller, including finding IDs, fingerprints, compact source/target/evidence summaries, hasSavedCandidate, and plan state. The default page is 10 findings; maximum 20. Scan successive cursors until hasMore is false; one page is not complete discovery. When hasSavedCandidate is true and state is not blocked, call preview with findingId and expectedFingerprint and omit candidate to use the saved exact manifest. A blocked finding cannot be previewed; follow its reason. If no saved exact candidate exists, the finding is manual. Candidate manifests must be source-backed and exact: contact moves pin contactId/fromCustomerId/toCustomerId/expectedEmail/expectedUpdatedAt; Stripe pins identifierId/identifierValue/sourceScopeKey/preserveContacts; CRM and corpus require their domain-produced exact source manifests. Do not invent a manifest from a finding summary.",
16594
+ annotations: {
16595
+ readOnlyHint: true,
16596
+ destructiveHint: false
16597
+ },
16598
+ inputSchema: {
16599
+ $schema: "https://json-schema.org/draft/2020-12/schema",
16600
+ type: "object",
16601
+ properties: {
16602
+ limit: {
16603
+ default: 10,
16604
+ type: "integer",
16605
+ minimum: 1,
16606
+ maximum: 20
16607
+ },
16608
+ cursor: {
16609
+ type: "string",
16610
+ minLength: 1,
16611
+ maxLength: 191
16612
+ }
16613
+ },
16614
+ additionalProperties: false
16615
+ },
16616
+ outputSchema: {
16617
+ $schema: "https://json-schema.org/draft/2020-12/schema",
16618
+ type: "object",
16619
+ properties: {
16620
+ items: {
16621
+ maxItems: 20,
16622
+ type: "array",
16623
+ items: {
16624
+ type: "object",
16625
+ properties: {
16626
+ findingId: {
16627
+ type: "string",
16628
+ minLength: 1,
16629
+ maxLength: 191
16630
+ },
16631
+ fingerprint: {
16632
+ type: "string",
16633
+ minLength: 1,
16634
+ maxLength: 191
16635
+ },
16636
+ state: {
16637
+ type: "string",
16638
+ enum: [
16639
+ "manual",
16640
+ "ready",
16641
+ "admitted",
16642
+ "pending_verification",
16643
+ "recovery_needed",
16644
+ "blocked",
16645
+ "verified"
16646
+ ]
16647
+ },
16648
+ action: {
16649
+ anyOf: [
16650
+ {
16651
+ type: "string",
16652
+ enum: [
16653
+ "rehome_contact",
16654
+ "rehome_crm_account",
16655
+ "reattribute_stripe_customer",
16656
+ "rehome_source_corpus"
16657
+ ]
16658
+ },
15647
16659
  {
15648
16660
  type: "null"
15649
16661
  }
15650
16662
  ]
15651
16663
  },
15652
- canMerge: {
15653
- type: "boolean"
16664
+ sourceCustomerId: {
16665
+ anyOf: [
16666
+ {
16667
+ type: "string",
16668
+ minLength: 1,
16669
+ maxLength: 191
16670
+ },
16671
+ {
16672
+ type: "null"
16673
+ }
16674
+ ]
15654
16675
  },
15655
- canReject: {
16676
+ targetCustomerId: {
16677
+ anyOf: [
16678
+ {
16679
+ type: "string",
16680
+ minLength: 1,
16681
+ maxLength: 191
16682
+ },
16683
+ {
16684
+ type: "null"
16685
+ }
16686
+ ]
16687
+ },
16688
+ evidenceRef: {
16689
+ anyOf: [
16690
+ {
16691
+ type: "string",
16692
+ minLength: 1,
16693
+ maxLength: 191
16694
+ },
16695
+ {
16696
+ type: "null"
16697
+ }
16698
+ ]
16699
+ },
16700
+ hasSavedCandidate: {
15656
16701
  type: "boolean"
16702
+ },
16703
+ planDigest: {
16704
+ anyOf: [
16705
+ {
16706
+ type: "string",
16707
+ pattern: "^[a-f0-9]{64}$"
16708
+ },
16709
+ {
16710
+ type: "null"
16711
+ }
16712
+ ]
16713
+ },
16714
+ manualReason: {
16715
+ anyOf: [
16716
+ {
16717
+ type: "string",
16718
+ maxLength: 300
16719
+ },
16720
+ {
16721
+ type: "null"
16722
+ }
16723
+ ]
16724
+ },
16725
+ nextStep: {
16726
+ anyOf: [
16727
+ {
16728
+ type: "string",
16729
+ maxLength: 200
16730
+ },
16731
+ {
16732
+ type: "null"
16733
+ }
16734
+ ]
15657
16735
  }
15658
16736
  },
15659
16737
  required: [
15660
- "id",
15661
- "status",
15662
- "proposalStatus",
15663
- "confidence",
15664
- "survivor",
15665
- "duplicate",
15666
- "reviewNotes",
15667
- "reviewedAt",
15668
- "reviewedByName",
15669
- "appliedAt",
15670
- "appliedByName",
15671
- "createdAt",
15672
- "explanation",
15673
- "impact",
15674
- "latestJob",
15675
- "canMerge",
15676
- "canReject"
16738
+ "findingId",
16739
+ "fingerprint",
16740
+ "state",
16741
+ "action",
16742
+ "sourceCustomerId",
16743
+ "targetCustomerId",
16744
+ "evidenceRef",
16745
+ "hasSavedCandidate",
16746
+ "planDigest",
16747
+ "manualReason",
16748
+ "nextStep"
15677
16749
  ],
15678
16750
  additionalProperties: false
15679
16751
  }
15680
16752
  },
15681
- canManageIdentityMerges: {
16753
+ scannedCount: {
16754
+ type: "integer",
16755
+ minimum: 0,
16756
+ maximum: 9007199254740991
16757
+ },
16758
+ hasMore: {
15682
16759
  type: "boolean"
15683
16760
  },
15684
16761
  nextCursor: {
15685
- default: null,
15686
16762
  anyOf: [
15687
16763
  {
15688
16764
  type: "string",
15689
16765
  minLength: 1,
15690
- maxLength: 2000
16766
+ maxLength: 191
15691
16767
  },
15692
16768
  {
15693
16769
  type: "null"
@@ -15696,315 +16772,422 @@ Returns column definitions and example queries for each view.`,
15696
16772
  }
15697
16773
  },
15698
16774
  required: [
15699
- "suggestions",
15700
- "canManageIdentityMerges",
16775
+ "items",
16776
+ "scannedCount",
16777
+ "hasMore",
15701
16778
  "nextCursor"
15702
16779
  ],
15703
16780
  additionalProperties: false
15704
16781
  }
15705
16782
  },
15706
- outlit_reject_identity_merge_suggestion: {
15707
- toolName: "outlit_reject_identity_merge_suggestion",
15708
- commandId: "identity.suggestions.reject",
16783
+ outlit_preview_scoped_repair: {
16784
+ toolName: "outlit_preview_scoped_repair",
16785
+ commandId: "integrity.scoped_repair.preview",
15709
16786
  commandVersion: 1,
15710
16787
  ownerDomain: "identity",
15711
- title: "Reject identity merge suggestion",
15712
- description: "Reject a saved identity merge suggestion and optionally record why. Requires identity review permission. Keeps the customer profiles separate; does not merge or change customer identities. Outlit-owned agents cannot perform this operation.",
16788
+ title: "Preview scoped identity repair",
16789
+ description: "Preview and save one exact source-backed repair against a finding fingerprint. Obtain findingId and fingerprint from outlit_list_scoped_repairs. Supply an exact candidate manifest, or omit it when hasSavedCandidate is true to use the saved exact candidate server-side. If discovery reports no saved candidate, a domain-produced source manifest is required; a finding summary is insufficient. Requires identity write authority and access to every finding member and protected customer.",
15713
16790
  annotations: {
15714
- readOnlyHint: false,
15715
- destructiveHint: false
15716
- },
15717
- inputSchema: {
15718
- $schema: "https://json-schema.org/draft/2020-12/schema",
15719
- type: "object",
15720
- properties: {
15721
- suggestionId: {
15722
- type: "string",
15723
- minLength: 1,
15724
- maxLength: 191
15725
- },
15726
- reviewNotes: {
15727
- type: "string",
15728
- maxLength: 1e4
15729
- }
15730
- },
15731
- required: [
15732
- "suggestionId"
15733
- ],
15734
- additionalProperties: false
16791
+ readOnlyHint: false,
16792
+ destructiveHint: false
15735
16793
  },
15736
- outputSchema: {
16794
+ inputSchema: {
15737
16795
  $schema: "https://json-schema.org/draft/2020-12/schema",
15738
16796
  type: "object",
15739
16797
  properties: {
15740
- suggestionId: {
16798
+ findingId: {
15741
16799
  type: "string",
15742
16800
  minLength: 1,
15743
16801
  maxLength: 191
15744
16802
  },
15745
- status: {
16803
+ expectedFingerprint: {
15746
16804
  type: "string",
15747
- const: "REJECTED"
16805
+ minLength: 1,
16806
+ maxLength: 191
16807
+ },
16808
+ candidate: {
16809
+ type: "object",
16810
+ properties: {
16811
+ version: {
16812
+ type: "number",
16813
+ const: 1
16814
+ },
16815
+ action: {
16816
+ type: "string",
16817
+ enum: [
16818
+ "rehome_contact",
16819
+ "rehome_crm_account",
16820
+ "reattribute_stripe_customer",
16821
+ "rehome_source_corpus"
16822
+ ]
16823
+ },
16824
+ organizationId: {
16825
+ type: "string",
16826
+ minLength: 1,
16827
+ maxLength: 191
16828
+ },
16829
+ sourceCustomerId: {
16830
+ type: "string",
16831
+ minLength: 1,
16832
+ maxLength: 191
16833
+ },
16834
+ targetCustomerId: {
16835
+ type: "string",
16836
+ minLength: 1,
16837
+ maxLength: 191
16838
+ },
16839
+ evidenceRef: {
16840
+ type: "string",
16841
+ minLength: 1,
16842
+ maxLength: 191
16843
+ },
16844
+ provenance: {
16845
+ type: "string",
16846
+ const: "exact_source_manifest"
16847
+ },
16848
+ manifest: {}
16849
+ },
16850
+ required: [
16851
+ "version",
16852
+ "action",
16853
+ "organizationId",
16854
+ "sourceCustomerId",
16855
+ "targetCustomerId",
16856
+ "evidenceRef",
16857
+ "provenance",
16858
+ "manifest"
16859
+ ],
16860
+ additionalProperties: false
15748
16861
  }
15749
16862
  },
15750
16863
  required: [
15751
- "suggestionId",
15752
- "status"
16864
+ "findingId",
16865
+ "expectedFingerprint"
15753
16866
  ],
15754
16867
  additionalProperties: false
15755
- }
15756
- },
15757
- outlit_merge_customers: {
15758
- toolName: "outlit_merge_customers",
15759
- commandId: "customer.merge",
15760
- commandVersion: 1,
15761
- ownerDomain: "identity",
15762
- title: "Merge customers",
15763
- description: "DANGEROUS execution with no supported undo. Preview or execute a merge of two exact records into the specified survivor; defaults to preview (dryRun:true). Without suggestionId, both records must be COMPANY. Any pair involving an INDIVIDUAL requires an eligible saved suggestionId for that exact pair. Execute only when authorized and absolutely certain both records represent the same customer; two company records must represent the same company. Similar names, related domains, shared participants, parent/subsidiary relationships or a suggested match are insufficient. If uncertain, do not execute. Execution moves customer data and access relationships and requires the reviewed previewToken, stable requestId and explicit merge permission. A preview grants no execution authority. Reuse identical request inputs for retries. Execution is asynchronous; queued does not mean complete. Outlit-owned agents cannot perform this operation.",
15764
- annotations: {
15765
- readOnlyHint: false,
15766
- destructiveHint: true
15767
16868
  },
15768
- inputSchema: {
16869
+ outputSchema: {
15769
16870
  $schema: "https://json-schema.org/draft/2020-12/schema",
15770
16871
  type: "object",
15771
16872
  properties: {
15772
- survivingCustomerId: {
16873
+ findingId: {
15773
16874
  type: "string",
15774
16875
  minLength: 1,
15775
16876
  maxLength: 191
15776
16877
  },
15777
- duplicateCustomerId: {
16878
+ fingerprint: {
15778
16879
  type: "string",
15779
16880
  minLength: 1,
15780
16881
  maxLength: 191
15781
16882
  },
15782
- suggestionId: {
16883
+ state: {
15783
16884
  type: "string",
15784
- minLength: 1,
15785
- maxLength: 191,
15786
- description: "Eligible saved suggestion for this exact pair. Required if either record is INDIVIDUAL; optional for two COMPANY records."
16885
+ const: "ready"
15787
16886
  },
15788
- reviewNotes: {
16887
+ planDigest: {
15789
16888
  type: "string",
15790
- maxLength: 1e4
16889
+ pattern: "^[a-f0-9]{64}$"
15791
16890
  },
15792
- dryRun: {
15793
- default: true,
15794
- type: "boolean"
16891
+ action: {
16892
+ type: "string",
16893
+ enum: [
16894
+ "rehome_contact",
16895
+ "rehome_crm_account",
16896
+ "reattribute_stripe_customer",
16897
+ "rehome_source_corpus"
16898
+ ]
15795
16899
  },
15796
- previewToken: {
16900
+ sourceCustomerId: {
15797
16901
  type: "string",
15798
16902
  minLength: 1,
15799
- maxLength: 4096
16903
+ maxLength: 191
15800
16904
  },
15801
- requestId: {
16905
+ targetCustomerId: {
15802
16906
  type: "string",
15803
16907
  minLength: 1,
15804
16908
  maxLength: 191
15805
- }
15806
- },
15807
- required: [
15808
- "survivingCustomerId",
15809
- "duplicateCustomerId"
15810
- ],
15811
- additionalProperties: false
15812
- },
15813
- outputSchema: {
15814
- $schema: "https://json-schema.org/draft/2020-12/schema",
15815
- oneOf: [
15816
- {
16909
+ },
16910
+ impact: {
15817
16911
  type: "object",
15818
16912
  properties: {
15819
- kind: {
15820
- type: "string",
15821
- const: "preview"
15822
- },
15823
- survivingCustomerId: {
15824
- type: "string",
15825
- minLength: 1,
15826
- maxLength: 191
15827
- },
15828
- duplicateCustomerId: {
15829
- type: "string",
15830
- minLength: 1,
15831
- maxLength: 191
16913
+ movedCounts: {
16914
+ type: "object",
16915
+ propertyNames: {
16916
+ type: "string"
16917
+ },
16918
+ additionalProperties: {
16919
+ type: "integer",
16920
+ minimum: 0,
16921
+ maximum: 9007199254740991
16922
+ }
15832
16923
  },
15833
- previewToken: {
15834
- type: "string",
15835
- minLength: 1,
15836
- maxLength: 4096
16924
+ protectedCustomerIds: {
16925
+ type: "array",
16926
+ items: {
16927
+ type: "string",
16928
+ minLength: 1,
16929
+ maxLength: 191
16930
+ }
15837
16931
  },
15838
- evaluatedAt: {
15839
- type: "string",
15840
- format: "date-time",
15841
- 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)))$"
16932
+ conflictingProviderIdentities: {
16933
+ type: "array",
16934
+ items: {
16935
+ type: "string"
16936
+ }
15842
16937
  },
15843
- impact: {
16938
+ baselineContext: {
15844
16939
  type: "object",
15845
16940
  properties: {
15846
- identifiers: {
16941
+ v1MissingFacts: {
15847
16942
  type: "integer",
15848
16943
  minimum: 0,
15849
16944
  maximum: 9007199254740991
15850
16945
  },
15851
- contacts: {
15852
- type: "integer",
15853
- minimum: 0,
15854
- maximum: 9007199254740991
15855
- },
15856
- facts: {
16946
+ v1MissingSources: {
15857
16947
  type: "integer",
15858
16948
  minimum: 0,
15859
16949
  maximum: 9007199254740991
15860
16950
  },
15861
- communications: {
16951
+ v2MissingFacts: {
15862
16952
  type: "integer",
15863
16953
  minimum: 0,
15864
16954
  maximum: 9007199254740991
15865
16955
  },
15866
- accessEntries: {
16956
+ v2MissingSources: {
15867
16957
  type: "integer",
15868
16958
  minimum: 0,
15869
16959
  maximum: 9007199254740991
15870
16960
  }
15871
16961
  },
15872
16962
  required: [
15873
- "identifiers",
15874
- "contacts",
15875
- "facts",
15876
- "communications",
15877
- "accessEntries"
16963
+ "v1MissingFacts",
16964
+ "v1MissingSources",
16965
+ "v2MissingFacts",
16966
+ "v2MissingSources"
15878
16967
  ],
15879
16968
  additionalProperties: false
15880
- },
15881
- warnings: {
15882
- maxItems: 30,
15883
- type: "array",
15884
- items: {
15885
- type: "object",
15886
- properties: {
15887
- code: {
15888
- type: "string",
15889
- minLength: 1,
15890
- maxLength: 100
15891
- },
15892
- message: {
15893
- type: "string",
15894
- maxLength: 1000
15895
- }
15896
- },
15897
- required: [
15898
- "code",
15899
- "message"
15900
- ],
15901
- additionalProperties: false
15902
- }
15903
16969
  }
15904
16970
  },
15905
16971
  required: [
15906
- "kind",
15907
- "survivingCustomerId",
15908
- "duplicateCustomerId",
15909
- "previewToken",
15910
- "evaluatedAt",
15911
- "impact",
15912
- "warnings"
16972
+ "movedCounts",
16973
+ "protectedCustomerIds",
16974
+ "conflictingProviderIdentities"
15913
16975
  ],
15914
16976
  additionalProperties: false
16977
+ }
16978
+ },
16979
+ required: [
16980
+ "findingId",
16981
+ "fingerprint",
16982
+ "state",
16983
+ "planDigest",
16984
+ "action",
16985
+ "sourceCustomerId",
16986
+ "targetCustomerId",
16987
+ "impact"
16988
+ ],
16989
+ additionalProperties: false
16990
+ }
16991
+ },
16992
+ outlit_execute_scoped_repair: {
16993
+ toolName: "outlit_execute_scoped_repair",
16994
+ commandId: "integrity.scoped_repair.execute",
16995
+ commandVersion: 1,
16996
+ ownerDomain: "identity",
16997
+ title: "Execute scoped identity repair",
16998
+ description: "Execute only the saved exact plan identified by its digest. Requires identity write authority for a human or the customer_identity:merge API key grant, plus current access to every protected customer. Use resume:true only for the same admitted Stripe operation with a proven committed admission receipt, the same actor, and the same surface; it never reexecutes the SQL move. A pending or recovery_needed result is not verified. Outlit-hosted agents and internal apps cannot execute.",
16999
+ annotations: {
17000
+ readOnlyHint: false,
17001
+ destructiveHint: true
17002
+ },
17003
+ inputSchema: {
17004
+ $schema: "https://json-schema.org/draft/2020-12/schema",
17005
+ type: "object",
17006
+ properties: {
17007
+ findingId: {
17008
+ type: "string",
17009
+ minLength: 1,
17010
+ maxLength: 191
15915
17011
  },
15916
- {
15917
- type: "object",
15918
- properties: {
15919
- kind: {
15920
- type: "string",
15921
- const: "operation"
15922
- },
15923
- operationId: {
15924
- type: "string",
15925
- minLength: 1,
15926
- maxLength: 191
15927
- },
15928
- survivingCustomerId: {
15929
- type: "string",
15930
- minLength: 1,
15931
- maxLength: 191
15932
- },
15933
- duplicateCustomerId: {
17012
+ planDigest: {
17013
+ type: "string",
17014
+ pattern: "^[a-f0-9]{64}$"
17015
+ },
17016
+ reason: {
17017
+ type: "string",
17018
+ minLength: 10,
17019
+ maxLength: 2000
17020
+ },
17021
+ resume: {
17022
+ default: false,
17023
+ type: "boolean"
17024
+ }
17025
+ },
17026
+ required: [
17027
+ "findingId",
17028
+ "planDigest",
17029
+ "reason"
17030
+ ],
17031
+ additionalProperties: false
17032
+ },
17033
+ outputSchema: {
17034
+ $schema: "https://json-schema.org/draft/2020-12/schema",
17035
+ type: "object",
17036
+ properties: {
17037
+ findingId: {
17038
+ type: "string",
17039
+ minLength: 1,
17040
+ maxLength: 191
17041
+ },
17042
+ state: {
17043
+ type: "string",
17044
+ enum: [
17045
+ "ready",
17046
+ "admitted",
17047
+ "pending_verification",
17048
+ "recovery_needed",
17049
+ "manual_required",
17050
+ "blocked",
17051
+ "verified"
17052
+ ]
17053
+ },
17054
+ operationId: {
17055
+ anyOf: [
17056
+ {
15934
17057
  type: "string",
15935
17058
  minLength: 1,
15936
17059
  maxLength: 191
15937
17060
  },
15938
- status: {
15939
- type: "string",
15940
- enum: [
15941
- "queued",
15942
- "running",
15943
- "completed",
15944
- "failed"
15945
- ]
15946
- },
15947
- phase: {
17061
+ {
17062
+ type: "null"
17063
+ }
17064
+ ]
17065
+ },
17066
+ summary: {
17067
+ type: "string"
17068
+ },
17069
+ nextStep: {
17070
+ anyOf: [
17071
+ {
15948
17072
  type: "string",
15949
- minLength: 1,
15950
- maxLength: 100
17073
+ maxLength: 200
15951
17074
  },
15952
- error: {
17075
+ {
17076
+ type: "null"
17077
+ }
17078
+ ]
17079
+ },
17080
+ receipt: {
17081
+ anyOf: [
17082
+ {
15953
17083
  type: "object",
15954
17084
  properties: {
15955
- code: {
17085
+ disposition: {
15956
17086
  type: "string",
15957
- minLength: 1,
15958
- maxLength: 100
17087
+ enum: [
17088
+ "moved",
17089
+ "resumed",
17090
+ "noop",
17091
+ "partial",
17092
+ "refused",
17093
+ "failed"
17094
+ ]
15959
17095
  },
15960
- message: {
15961
- type: "string",
15962
- maxLength: 1000
17096
+ followThroughComplete: {
17097
+ type: "boolean"
17098
+ },
17099
+ admissionAuditIds: {
17100
+ type: "array",
17101
+ items: {
17102
+ type: "string",
17103
+ minLength: 1,
17104
+ maxLength: 191
17105
+ }
17106
+ },
17107
+ completionAuditIds: {
17108
+ type: "array",
17109
+ items: {
17110
+ type: "string",
17111
+ minLength: 1,
17112
+ maxLength: 191
17113
+ }
17114
+ },
17115
+ movedIds: {
17116
+ type: "object",
17117
+ propertyNames: {
17118
+ type: "string"
17119
+ },
17120
+ additionalProperties: {
17121
+ type: "array",
17122
+ items: {
17123
+ type: "string",
17124
+ minLength: 1,
17125
+ maxLength: 191
17126
+ }
17127
+ }
17128
+ },
17129
+ refusals: {
17130
+ type: "array",
17131
+ items: {
17132
+ type: "string"
17133
+ }
17134
+ },
17135
+ informationalObservations: {
17136
+ type: "array",
17137
+ items: {
17138
+ type: "string"
17139
+ }
15963
17140
  }
15964
17141
  },
15965
17142
  required: [
15966
- "code",
15967
- "message"
17143
+ "disposition",
17144
+ "followThroughComplete",
17145
+ "admissionAuditIds",
17146
+ "completionAuditIds",
17147
+ "movedIds"
15968
17148
  ],
15969
17149
  additionalProperties: false
17150
+ },
17151
+ {
17152
+ type: "null"
15970
17153
  }
15971
- },
15972
- required: [
15973
- "kind",
15974
- "operationId",
15975
- "survivingCustomerId",
15976
- "duplicateCustomerId",
15977
- "status",
15978
- "phase"
15979
- ],
15980
- additionalProperties: false
17154
+ ]
15981
17155
  }
15982
- ]
17156
+ },
17157
+ required: [
17158
+ "findingId",
17159
+ "state",
17160
+ "operationId",
17161
+ "summary",
17162
+ "nextStep",
17163
+ "receipt"
17164
+ ],
17165
+ additionalProperties: false
15983
17166
  }
15984
17167
  },
15985
- outlit_get_customer_merge_status: {
15986
- toolName: "outlit_get_customer_merge_status",
15987
- commandId: "customer.merge.status",
17168
+ outlit_verify_scoped_repair: {
17169
+ toolName: "outlit_verify_scoped_repair",
17170
+ commandId: "integrity.scoped_repair.verify",
15988
17171
  commandVersion: 1,
15989
17172
  ownerDomain: "identity",
15990
- title: "Get customer merge status",
15991
- description: "Read a customer merge operation's current progress, completion or bounded failure information. Requires current read access; possession of an operation ID does not grant access. Queued or running operations are not complete. Does not retry, restart, cancel or undo the merge.",
17173
+ title: "Verify scoped identity repair",
17174
+ description: "Read the current saved command progress and, after a completed receipt, run live ownership, audit, billing and index verification. Queued, admitted, blocked and pending verification are not complete. Requires current access to every protected customer.",
15992
17175
  annotations: {
15993
- readOnlyHint: true,
17176
+ readOnlyHint: false,
15994
17177
  destructiveHint: false
15995
17178
  },
15996
17179
  inputSchema: {
15997
17180
  $schema: "https://json-schema.org/draft/2020-12/schema",
15998
17181
  type: "object",
15999
17182
  properties: {
16000
- operationId: {
17183
+ findingId: {
16001
17184
  type: "string",
16002
17185
  minLength: 1,
16003
17186
  maxLength: 191
16004
17187
  }
16005
17188
  },
16006
17189
  required: [
16007
- "operationId"
17190
+ "findingId"
16008
17191
  ],
16009
17192
  additionalProperties: false
16010
17193
  },
@@ -16012,66 +17195,191 @@ Returns column definitions and example queries for each view.`,
16012
17195
  $schema: "https://json-schema.org/draft/2020-12/schema",
16013
17196
  type: "object",
16014
17197
  properties: {
16015
- kind: {
16016
- type: "string",
16017
- const: "operation"
16018
- },
16019
- operationId: {
16020
- type: "string",
16021
- minLength: 1,
16022
- maxLength: 191
16023
- },
16024
- survivingCustomerId: {
17198
+ findingId: {
16025
17199
  type: "string",
16026
17200
  minLength: 1,
16027
17201
  maxLength: 191
16028
17202
  },
16029
- duplicateCustomerId: {
16030
- type: "string",
16031
- minLength: 1,
16032
- maxLength: 191
16033
- },
16034
- status: {
17203
+ state: {
16035
17204
  type: "string",
16036
17205
  enum: [
16037
- "queued",
16038
- "running",
16039
- "completed",
16040
- "failed"
17206
+ "ready",
17207
+ "admitted",
17208
+ "pending_verification",
17209
+ "recovery_needed",
17210
+ "manual_required",
17211
+ "blocked",
17212
+ "verified"
16041
17213
  ]
16042
17214
  },
16043
- phase: {
16044
- type: "string",
16045
- minLength: 1,
16046
- maxLength: 100
16047
- },
16048
- error: {
16049
- type: "object",
16050
- properties: {
16051
- code: {
17215
+ operationId: {
17216
+ anyOf: [
17217
+ {
16052
17218
  type: "string",
16053
17219
  minLength: 1,
16054
- maxLength: 100
17220
+ maxLength: 191
16055
17221
  },
16056
- message: {
17222
+ {
17223
+ type: "null"
17224
+ }
17225
+ ]
17226
+ },
17227
+ summary: {
17228
+ type: "string"
17229
+ },
17230
+ nextStep: {
17231
+ anyOf: [
17232
+ {
16057
17233
  type: "string",
16058
- maxLength: 1000
17234
+ maxLength: 200
17235
+ },
17236
+ {
17237
+ type: "null"
16059
17238
  }
16060
- },
16061
- required: [
16062
- "code",
16063
- "message"
16064
- ],
16065
- additionalProperties: false
17239
+ ]
17240
+ },
17241
+ receipt: {
17242
+ anyOf: [
17243
+ {
17244
+ type: "object",
17245
+ properties: {
17246
+ disposition: {
17247
+ type: "string",
17248
+ enum: [
17249
+ "moved",
17250
+ "resumed",
17251
+ "noop",
17252
+ "partial",
17253
+ "refused",
17254
+ "failed"
17255
+ ]
17256
+ },
17257
+ followThroughComplete: {
17258
+ type: "boolean"
17259
+ },
17260
+ admissionAuditIds: {
17261
+ type: "array",
17262
+ items: {
17263
+ type: "string",
17264
+ minLength: 1,
17265
+ maxLength: 191
17266
+ }
17267
+ },
17268
+ completionAuditIds: {
17269
+ type: "array",
17270
+ items: {
17271
+ type: "string",
17272
+ minLength: 1,
17273
+ maxLength: 191
17274
+ }
17275
+ },
17276
+ movedIds: {
17277
+ type: "object",
17278
+ propertyNames: {
17279
+ type: "string"
17280
+ },
17281
+ additionalProperties: {
17282
+ type: "array",
17283
+ items: {
17284
+ type: "string",
17285
+ minLength: 1,
17286
+ maxLength: 191
17287
+ }
17288
+ }
17289
+ },
17290
+ refusals: {
17291
+ type: "array",
17292
+ items: {
17293
+ type: "string"
17294
+ }
17295
+ },
17296
+ informationalObservations: {
17297
+ type: "array",
17298
+ items: {
17299
+ type: "string"
17300
+ }
17301
+ }
17302
+ },
17303
+ required: [
17304
+ "disposition",
17305
+ "followThroughComplete",
17306
+ "admissionAuditIds",
17307
+ "completionAuditIds",
17308
+ "movedIds"
17309
+ ],
17310
+ additionalProperties: false
17311
+ },
17312
+ {
17313
+ type: "null"
17314
+ }
17315
+ ]
17316
+ },
17317
+ verification: {
17318
+ anyOf: [
17319
+ {
17320
+ type: "object",
17321
+ properties: {
17322
+ outcome: {
17323
+ type: "string",
17324
+ enum: [
17325
+ "verified",
17326
+ "inconclusive"
17327
+ ]
17328
+ },
17329
+ ownership: {
17330
+ type: "boolean"
17331
+ },
17332
+ derived: {
17333
+ type: "boolean"
17334
+ },
17335
+ indexed: {
17336
+ type: "boolean"
17337
+ },
17338
+ reconstruction: {
17339
+ type: "string",
17340
+ enum: [
17341
+ "complete",
17342
+ "pending",
17343
+ "baseline_gap"
17344
+ ]
17345
+ },
17346
+ warnings: {
17347
+ type: "array",
17348
+ items: {
17349
+ type: "string"
17350
+ }
17351
+ },
17352
+ informationalObservations: {
17353
+ type: "array",
17354
+ items: {
17355
+ type: "string"
17356
+ }
17357
+ }
17358
+ },
17359
+ required: [
17360
+ "outcome",
17361
+ "ownership",
17362
+ "derived",
17363
+ "indexed",
17364
+ "reconstruction",
17365
+ "warnings"
17366
+ ],
17367
+ additionalProperties: false
17368
+ },
17369
+ {
17370
+ type: "null"
17371
+ }
17372
+ ]
16066
17373
  }
16067
17374
  },
16068
17375
  required: [
16069
- "kind",
17376
+ "findingId",
17377
+ "state",
16070
17378
  "operationId",
16071
- "survivingCustomerId",
16072
- "duplicateCustomerId",
16073
- "status",
16074
- "phase"
17379
+ "summary",
17380
+ "nextStep",
17381
+ "receipt",
17382
+ "verification"
16075
17383
  ],
16076
17384
  additionalProperties: false
16077
17385
  }
@@ -16149,7 +17457,11 @@ Returns column definitions and example queries for each view.`,
16149
17457
  "outlit_list_identity_merge_suggestions",
16150
17458
  "outlit_reject_identity_merge_suggestion",
16151
17459
  "outlit_merge_customers",
16152
- "outlit_get_customer_merge_status"
17460
+ "outlit_get_customer_merge_status",
17461
+ "outlit_list_scoped_repairs",
17462
+ "outlit_preview_scoped_repair",
17463
+ "outlit_execute_scoped_repair",
17464
+ "outlit_verify_scoped_repair"
16153
17465
  ],
16154
17466
  cli: [
16155
17467
  "outlit_list_customers",
@@ -16198,7 +17510,11 @@ Returns column definitions and example queries for each view.`,
16198
17510
  "outlit_list_identity_merge_suggestions",
16199
17511
  "outlit_reject_identity_merge_suggestion",
16200
17512
  "outlit_merge_customers",
16201
- "outlit_get_customer_merge_status"
17513
+ "outlit_get_customer_merge_status",
17514
+ "outlit_list_scoped_repairs",
17515
+ "outlit_preview_scoped_repair",
17516
+ "outlit_execute_scoped_repair",
17517
+ "outlit_verify_scoped_repair"
16202
17518
  ]
16203
17519
  };
16204
17520
  toolGatewayTransport = {
@@ -18254,11 +19570,11 @@ var init_list2 = __esm(() => {
18254
19570
  },
18255
19571
  "mrr-above": {
18256
19572
  type: "string",
18257
- description: "Filter by MRR above threshold in cents (e.g. 10000 = $100/mo)"
19573
+ description: "Filter by MRR above threshold, in currentMrr's units: cents for USD, EUR, GBP and CAD (e.g. 10000 = $100/mo in USD)"
18258
19574
  },
18259
19575
  "mrr-below": {
18260
19576
  type: "string",
18261
- description: "Filter by MRR below threshold in cents"
19577
+ description: "Filter by MRR below threshold, in currentMrr's units"
18262
19578
  },
18263
19579
  "owner-id": {
18264
19580
  type: "string",
@@ -23445,8 +24761,8 @@ var init_completions = __esm(() => {
23445
24761
  ...ACTIVITY_ORDER,
23446
24762
  { name: "--trait", desc: "Filter by trait key=value pairs" },
23447
24763
  { name: "--billing-status", desc: "Filter by billing status" },
23448
- { name: "--mrr-above", desc: "MRR above threshold (cents)" },
23449
- { name: "--mrr-below", desc: "MRR below threshold (cents)" },
24764
+ { name: "--mrr-above", desc: "MRR above threshold (currentMrr units)" },
24765
+ { name: "--mrr-below", desc: "MRR below threshold (currentMrr units)" },
23450
24766
  { name: "--owner-id", desc: "Filter by owner user ID" },
23451
24767
  { name: "--owner-email", desc: "Filter by owner email" },
23452
24768
  { name: "--has-owner", desc: "Only customers with an owner" },